Skip to content
Snippets Groups Projects
Commit 0da6fdc2 authored by Marina Kreme's avatar Marina Kreme
Browse files

delete files

parent 7a4defb3
Branches
Tags
No related merge requests found
Showing
with 0 additions and 679 deletions
function [eigs_norm, arrfevdn_norm, rrfevdn_norm]= compute_error_operator_norm(file_name, n_exp)
eigs_norm = zeros(length(file_name), n_exp);
arrfevdn_norm = zeros(length(file_name), n_exp);
rrfevdn_norm = zeros(length(file_name), n_exp);
for k=1:n_exp
rep_dir = ['exp',num2str(k)];
for l =1: 3%length(file_name)
data_folder = dir(fullfile(rep_dir,'*.mat'));
file = [data_folder(l).folder,filesep, file_name{l}];
upload_file = load(file);
eigs_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_eigs);
arrfevdn_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_nystrom_Qadaptative);
rrfevdn_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_nystrom);
end
end
end
\ No newline at end of file
function q_with = estimated_rank(file_name, n_exp)
q_with = zeros(length(file_name), n_exp);
for k=1:n_exp
rep_dir = ['exp',num2str(k)];
for l =1:length(file_name)
data_folder = dir(fullfile(rep_dir,'*.mat'));
file = [data_folder(l).folder,filesep, file_name{l}];
upload_file = load(file);
q_with(l,k) = size(upload_file.svd_result_eigs.D,1);
end
end
end
\ No newline at end of file
clc; clear; close all;
%%
setting='full';
exp = get_experiment(setting);
%%
param = exp.data_params;
t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}];
f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}];
win_type = exp.problem_params.win_type;
t_arrf = zeros(length(param) ,1);
t_rrf = zeros(length(param) ,1);
t_arrfevdn = zeros(length(param) ,1);
t_rrfevdn = zeros(length(param) ,1);
t_eigs = zeros(length(param) ,1);
%%
n_runs = 1;%0;
fprintf('je ferai au total %.1f runs\n\n',n_runs);
%%
for l=1:n_runs
fprintf("C'est partie pour le %.1f run\n\n",l);
%%
tic;
for k = 1:1%length(param)
k=5;
fprintf('je suis a la %.1f ieme iteration patiente\n',k);
param_pow = param{k};
problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type);
tolerance = exp.solver_params.tolerance;
r = exp.solver_params.r;
mask = problem_data.mask;
dgt_params = problem_data.dgt_params;
signal_params = problem_data.signal_params;
[gab_mul, direct_stft, adjoint_stft, q_mat_arrf, arrf_time,....,
q_mat_rrf, rrf_time, svd_res_arrf,arrfevdn_time, svd_res_rrf,....,
rrfevdn_time, svd_res_eigs, eigs_time, eigs_norm, arrfevdn_norm, ...,
rrfevdn_norm,q_with] =solver(tolerance, r, mask, dgt_params, signal_params);
t_arrf(k) = arrf_time;
t_rrf(k) = rrf_time;
t_arrfevdn(k) = arrfevdn_time;
t_rrfevdn(k) = rrfevdn_time;
t_eigs(k) = eigs_time;
filename = ['gabmul_eig_dgtvar_', num2str(signal_params.sig_len),'.mat'];
mkdir(['exp_gabmul_eig_running_times_',num2str(l)]);
warning('off', 'MATLAB:MKDIR:DirectoryExists');
path_name = ['exp_gabmul_eig_running_times_',num2str(l)];
save(fullfile(path_name,filename),'setting','exp','problem_data', 'q_mat_arrf',....,
'arrf_time', 'q_mat_rrf', 'rrf_time', 'svd_res_arrf','arrfevdn_time',...,
'svd_res_rrf', 'rrfevdn_time', 'svd_res_eigs', 'eigs_time',...,
'eigs_norm','arrfevdn_norm','rrfevdn_norm','q_with','t_arrf','t_rrf','t_arrfevdn',...,
't_rrfevdn','t_eigs');
end
toc;
end
%%
\ No newline at end of file
function exp = get_experiment(setting)
%create experiment parameter
switch setting
case 'full'
param_pow = {0, 1, 2, 3, 4};
data_params = param_pow;
case 'light'
param_pow = {0,1,2};
data_params = param_pow;
otherwise
error('Unknown setting: ')
end
t_min = 0.3; t_max = 0.5; f_min = 0.1; f_max =0.2;
t_val = {t_min, t_max};
f_val={f_min, f_max};
problem_params.win_type = 'hann';
problem_params.t_val = t_val;
problem_params.f_val = f_val;
tolerance = 1e-6;
r = 15;
solver_params.tolerance = tolerance;
solver_params.r = r;
exp.data_params=data_params;
exp.problem_params=problem_params;
exp.solver_params=solver_params;
end
function [mask_area, varargout] = get_mask_area(mask)
%compute mask area
mask_area = sum(mask(:));
mask_area_ratio = mask_area/ (size(mask,1)*size(mask,2));
varargout{1} = mask_area_ratio;
end
function problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type)
% generate problem data for tf filtering
sig_len = 256*4^param_pow;
win_len = 8*2^param_pow;
hop = 2*2^param_pow;
nbins = 32*2^param_pow;
fs=1;
approx_win_len = win_len;
dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len);
signal_params = generate_signal_parameters(fs, sig_len);
mask = generate_rectangular_mask(nbins, hop, sig_len, t_lim, f_lim);
problem_data.dgt_params= dgt_params;
problem_data.signal_params = signal_params;
problem_data.hop = hop;
problem_data.mask = mask;
end
\ No newline at end of file
function [ratio_arrf_time_over_eigs,ratio_rrf_time_over_eigs,...,
ratio_evdnarrf_over_eigs,ratio_evdnrrf_over_eigs]= get_ratio_of_eigs_running_times(arrf_time, rrf_time, evdnarrf_time, evdnrrf_time,eigs_time)
ratio_arrf_time_over_eigs = arrf_time./eigs_time;
ratio_rrf_time_over_eigs = rrf_time./eigs_time;
ratio_evdnarrf_over_eigs = evdnarrf_time./eigs_time;
ratio_evdnrrf_over_eigs = evdnrrf_time./eigs_time ;
end
\ No newline at end of file
function [arrf_time, rrf_time, eigs_time, evdnrrf_time, evdnarrf_time,...,
arrf_time_mean, rrf_time_mean, evdnrrf_time_mean, evdnarrf_time_mean,...,
evdarrrf_mean, evdrrf_mean,eigs_mean, arrf_time_std, rrf_time_std,...,
evdnrrf_time_std, evdnarrf_time_std, evdarrrf_std, ....,
evdrrf_std, eigs_std] = perf_measures(file_name, n_exp)
arrf_time=[];
rrf_time = [];
eigs_time = [];
evdnrrf_time = [];
evdnarrf_time = [];
for k=1:n_exp
upload_file = load(fullfile((['exp',num2str(k)]),file_name{5}));
arrf_time = [arrf_time, upload_file.time_adaptative_Q];
arrf_time = squeeze(arrf_time);
rrf_time = [rrf_time, upload_file.time_randomized_Q];
rrf_time = squeeze(rrf_time);
eigs_time = [eigs_time, upload_file.time_EVD_eigs];
eigs_time = squeeze(eigs_time);
evdnrrf_time = [evdnrrf_time, upload_file.time_EVD_nystrom];
evdnrrf_time = squeeze(evdnrrf_time);
evdnarrf_time = [evdnarrf_time, upload_file.time_EVD_nystrom_Qadapt];
evdnarrf_time = squeeze(evdnarrf_time);
end
% mean
arrf_time_mean = mean(arrf_time,2); % temps moyen adaptative randomized range finder
rrf_time_mean = mean(rrf_time,2); % temps moyen randomized range finder
evdnrrf_time_mean = mean(evdnrrf_time,2);
evdnarrf_time_mean = mean(evdnarrf_time,2);
evdarrrf_mean = mean(arrf_time+ evdnarrf_time,2); % arrf + evd/nystrom
evdrrf_mean = mean(rrf_time+ evdnrrf_time,2); % rrf +evd/nystom
eigs_mean = mean(eigs_time,2); % temps moyen eigs
%std
arrf_time_std = std(arrf_time, 0,2); % temps moyen adaptative randomized range finder
rrf_time_std = std(rrf_time, 0, 2); % temps moyen randomized range finder
evdnrrf_time_std = std(evdnrrf_time,0, 2);
evdnarrf_time_std = std(evdnarrf_time, 0, 2);
evdarrrf_std = std(arrf_time+ evdnarrf_time, 0,2); % arrf + evd/nystrom
evdrrf_std = std(rrf_time+ evdnrrf_time, 0, 2); % rrf +evd/nystom
eigs_std = std(eigs_time,0, 2); % temps moyen eigs
end
\ No newline at end of file
function plot_results()
%%
pwd;
pathname ='GabMulEigRunTimeExperiment';
if ~exist('GabMulEigRunTimeExperiment','dir')
mkdir('GabMulEigRunTimeExperiment');
end
addpath('GabMulEigRunTimeExperiment')
%%
% fichier .mat
file_name = {'time_halko_vs_eigs256.mat', 'time_halko_vs_eigs1024.mat',...,
'time_halko_vs_eigs4096.mat', 'time_halko_vs_eigs16384.mat',....,
'time_halko_vs_eigs65536.mat'};
%%
mask_area_list = zeros(length(file_name),1);
mask_area_ratio_list = zeros(length(file_name),1);
sig_len_list = zeros(length(file_name),1);
for k =1:1
rep_dir = ['exp',num2str(k)];
for l=1:length(file_name)
figure(l)
data_folder = dir(fullfile(rep_dir,'*.mat'));
file = [data_folder(l).folder,filesep, file_name{l}];
upload_file = load(file);
sig_len_list(l) = upload_file.signal_params.sig_len;
% figure mask
plot_mask(upload_file.mask, upload_file.dgt_params.hop, upload_file.dgt_params.nbins, upload_file.fs);
axis tight;
saveas(gcf,fullfile(pathname,['mask_',num2str(upload_file.signal_params.sig_len),'.png']));
% figure window
plot_win(upload_file.dgt_params.win, upload_file.fs, upload_file.signal_params.sig_len, upload_file.dgt_params.win_type);
axis tight;
saveas(gcf,fullfile(pathname,['win_',num2str(upload_file.signal_params.sig_len),'.png']));
% mask area
mask = 1- upload_file.mask;
[mask_area, mask_area_ratio] = get_mask_area(mask);
mask_area_list(l) = mask_area;
mask_area_ratio_list(l) = mask_area_ratio;
end
end
%%
% mask area
figure;
plot(sig_len_list, mask_area_list,'LineWidth',2.5);
grid()
set(gca,'YScale','log','XScale','log');
xlabel('Signal length')
ylabel('# time-frequency coefficients')
title('Mask area')
set(gca, 'FontSize', 15, 'fontName','Times');
saveas(gcf,fullfile(pathname, 'mask_area.pdf'));
% mask area ratio
figure;
plot(sig_len_list, mask_area_ratio_list,'LineWidth',2.5)
grid()
set(gca,'XScale','log');
xlabel('Signal length')
ylabel('%')
title('Mask area ratio')
set(gca, 'FontSize', 15, 'fontName','Times');
saveas(gcf,fullfile(pathname, 'mask_area_ratio.pdf'));
%% Computation time, mean and std
n_exp = 10;
[arrf_time, rrf_time, eigs_time, evdnrrf_time, evdnarrf_time,...,
arrf_time_mean, rrf_time_mean, evdnrrf_time_mean, evdnarrf_time_mean,...,
evdarrrf_mean, evdrrf_mean,eigs_mean, arrf_time_std, rrf_time_std,...,
evdnrrf_time_std, evdnarrf_time_std, evdarrrf_std, ....,
evdrrf_std, eigs_std] = perf_measures(file_name,n_exp);
%% figure;
% comparaisons temps de calcul des 3 algos
figure;
errorbar(sig_len_list, evdarrrf_mean, evdarrrf_std,'b-*','LineWidth',2.5); hold on;
errorbar(sig_len_list, eigs_mean, eigs_std, 'r-*','LineWidth',2.5);
errorbar(sig_len_list, evdrrf_mean, evdrrf_std,'m-*','LineWidth',2.5 );
xlabel('signal length');
ylabel('Computation time (s)')
legend('Adaptative Range Finder + EVD/Nystrm', 'eigs','Fixed Range Finder + EVD/Nystrm',...,
'Location','northwest')
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca,'YScale','log','XScale','log');
grid('on');
axis tight;
saveas(gcf,fullfile(pathname,['running_times','.png']));
%%
% comparaisons temps de calcul de tous les algos
figure;
errorbar(sig_len_list, arrf_time_mean, arrf_time_std,'LineWidth',2.5); hold on;
errorbar(sig_len_list, rrf_time_mean, rrf_time_std,'LineWidth',2.5);
errorbar(sig_len_list, eigs_mean, eigs_std, 'LineWidth',2.5);
errorbar(sig_len_list, evdnarrf_time_mean, evdnarrf_time_std, 'LineWidth',2.5);
errorbar(sig_len_list, evdnrrf_time_mean, evdnrrf_time_std, 'LineWidth',2.5);
legend('Adaptative Range Finder','Fixed Range Finder','eigs',...,
'EVD/Nystrm(ARRF)','EVD/Nystrm(RRF)','Location','northwest')
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca,'YScale','log','XScale','log');
grid('on');
axis tight;
xlabel('Signal length')
ylabel('Running time (s)')
saveas(gcf,fullfile(pathname,['running_times_by_step','.png']));
%% Step by step: ratio of eigs running times (pas juste a revoir)
% ratio
[ratio_arrf_time_over_eigs,ratio_rrf_time_over_eigs,...,
ratio_evdnarrf_over_eigs,ratio_evdnrrf_over_eigs]= get_ratio_of_eigs_running_times(arrf_time, rrf_time, evdnarrf_time, evdnrrf_time,eigs_time);
%mean ratio
ratio_arrf_time_over_eigs_mean = mean(ratio_arrf_time_over_eigs,2)*100;
ratio_rrf_time_over_eigs_mean = mean(ratio_rrf_time_over_eigs,2)*100;
ratio_evdnarrf_over_eigs_mean = mean(ratio_evdnarrf_over_eigs, 2)*100;
ratio_evdnrrf_over_eigs_mean = mean(ratio_evdnrrf_over_eigs, 2)*100;
% std
ratio_arrf_time_over_eigs_std = std(ratio_arrf_time_over_eigs,0,2)*100;
ratio_rrf_time_over_eigs_std = std(ratio_rrf_time_over_eigs,0,2)*100;
ratio_evdnarrf_over_eigs_std = std(ratio_evdnarrf_over_eigs, 0,2)*100;
ratio_evdnrrf_over_eigs_std = std(ratio_evdnrrf_over_eigs, 0,2)*100;
figure;
errorbar(sig_len_list, ratio_arrf_time_over_eigs_mean, ratio_arrf_time_over_eigs_std,'LineWidth',2.5); hold on;
errorbar(sig_len_list, ratio_rrf_time_over_eigs_mean, ratio_rrf_time_over_eigs_std,'LineWidth',2.5);
errorbar(sig_len_list, ratio_evdnarrf_over_eigs_mean, ratio_evdnarrf_over_eigs_std, 'LineWidth',2.5);
errorbar(sig_len_list, ratio_evdnrrf_over_eigs_mean, ratio_evdnrrf_over_eigs_std, 'LineWidth',2.5);
legend('Adaptative Range Finder','Fixed Range Finder',...,
'EVD/Nystrm(ARRF)','EVD/Nystrm(RRF)','Location','northwest')
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca,'XScale','log');
grid('on');
axis tight;
xlabel('Signal length')
ylabel('Ratio of eigs running time (%)')
saveas(gcf,fullfile(pathname,['running_times_ratio_by_step','.png']));
%% error operator norm (erreur a revoir)
[eigs_norm, arrfevdn_norm, rrfevdn_norm]= compute_error_operator_norm(file_name, n_exp);
eigs_norm_mean = mean(eigs_norm,2);
arrfevdn_norm_mean = mean(arrfevdn_norm,2);
rrfevdn_norm_mean = mean(rrfevdn_norm, 2);
eigs_norm_std = std(eigs_norm,0,2);
arrfevdn_norm_std = std(arrfevdn_norm, 0, 2);
rrfevdn_norm_std = std(rrfevdn_norm, 0, 2);
figure;
errorbar(sig_len_list, eigs_norm_mean , eigs_norm_std,'LineWidth',2.5); hold on;
errorbar(sig_len_list, arrfevdn_norm_mean, arrfevdn_norm_std,'LineWidth',2.5);
errorbar(sig_len_list, rrfevdn_norm_mean, rrfevdn_norm_std, 'LineWidth',2.5);
legend('eigs','Adaptative Range Finder + EVD/Nystrm(ARRF)',...,
'Fixed Range Finder + EVD/Nystrm(RRF)','Location','northwest')
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca,'YScale','log','XScale','log');
grid('on');
axis tight;
xlabel('Signal length')
ylabel('Operator estimation error')
saveas(gcf,fullfile(pathname, 'operator_error.pdf'));
%% Estimated rank
q_with = estimated_rank(file_name, n_exp);
q_with_mean = mean(q_with, 2);
q_with_std = std(q_with, 0, 2);
figure;
errorbar(sig_len_list, q_with_mean, q_with_std,'LineWidth',2)
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca, 'YScale','log','XScale','log')
xlabel('Signal length')
ylabel('Estimated rank')
grid('on');
legend('Estimated rank','Location','northwest');
saveas(gcf,fullfile(pathname,'rank_estimation.pdf'));
%% Estimated rank / sig length
rank_ratio = q_with./sig_len_list;
rank_ratio_mean = mean(rank_ratio,2)*100;
rank_ratio_std = std(rank_ratio_mean,0,2)*100;
figure;
errorbar(sig_len_list, rank_ratio_mean, rank_ratio_std,'LineWidth',2)
set(gca, 'FontSize', 15, 'fontName','Times');
set(gca,'XScale','log')
xlabel('Signal length')
ylabel('Estimated rank / signal length')
grid('on');
legend('Estimated rank');
saveas(gcf,fullfile(pathname,'rank_estimation_over_siglen.pdf'));
end
\ No newline at end of file
function [gab_mul, direct_stft, adjoint_stft, q_mat_arrf, arrf_time,....,
q_mat_rrf, rrf_time, svd_res_arrf,arrfevdn_time, svd_res_rrf,....,
rrfevdn_time, svd_res_eigs, eigs_time, eigs_norm, arrfevdn_norm, ...,
rrfevdn_norm,q_with] =solver(tolerance, r, mask, dgt_params, signal_params)
[direct_stft, adjoint_stft] = get_stft_operators(dgt_params, signal_params);
gab_mul = gen_gabmul_operator(direct_stft, adjoint_stft, mask);
tic;
q_mat_arrf = adaptative_randomized_range_finder(gab_mul ,signal_params.sig_len, tolerance, r);
arrf_time = toc;
tic;
q_mat_rrf = randomized_range_finder(gab_mul, signal_params.sig_len, size(q_mat_arrf,2));
rrf_time = toc;
tic;
svd_res_arrf = EVD_nystrom(gab_mul, q_mat_arrf);
arrfevdn_time= toc;
tic;
svd_res_rrf = EVD_nystrom(gab_mul, q_mat_rrf);
rrfevdn_time= toc;
tic;
svd_res_eigs = EVD_eigs(gab_mul, signal_params.sig_len, size(q_mat_arrf,2) );
eigs_time = toc;
eigs_norm = error_operator_norm(gab_mul, svd_res_eigs);
arrfevdn_norm = error_operator_norm(gab_mul, svd_res_arrf);
rrfevdn_norm = error_operator_norm(gab_mul, svd_res_rrf);
q_with = size(q_mat_arrf,2);
end
\ No newline at end of file
clc ; clear; close all;
%%
pwd;
pathname ='figures_JSTSP';
if ~exist('figures_JSTSP','dir')
mkdir('figures_JSTSP');
end
addpath('figures_JSTSP')
%%
ind_loc = 5;
ind_wd = 3;
deb_ind_loc = 0;
deb_ind_wd=0;
resampling_fs = 8000;
sig_len = 16384;
%%
param_gauss = get_win_gauss_param();
win_len = param_gauss.win_len;
win_type = param_gauss.win_type;
alpha = param_gauss.alpha;
seuil = param_gauss.seuil;
radius = param_gauss.radius;
%%
sig_loc = load_localized_signal(ind_loc, resampling_fs, sig_len, deb_ind_loc);
sig_wd = load_wideband_signal(ind_wd, resampling_fs, sig_len, deb_ind_wd);
signals = generate_mix_signal(sig_wd, sig_loc);
fs = resampling_fs;
sig_len = length(sig_loc);
signal_params = generate_signal_parameters(fs, sig_len);
%% dgt
dgt_params = generate_dgt_parameters(win_type, win_len);
dgt_params.hop = 32; %
dgt_params.nbins = 512;%
[dgt, idgt] = get_stft_operators(dgt_params, signal_params);
tf_mat_wb = compute_dgt(signals.target, dgt );
tf_mat_loc = compute_dgt(signals.noise, dgt );
%% Etape 1
figure;
subplot(131)
set(gcf,'position',[1, 1, 1000 400]);
mask = and(abs(tf_mat_wb)<alpha*abs(tf_mat_loc), abs(tf_mat_loc)>seuil);
%figure('name','mask');
plot_spectrogram(mask, dgt_params,signal_params, dgt );
axis square;
set(gca, 'FontSize', 20, 'fontName','Times');
%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_1.png'));
%Etape 2
se = strel('disk',radius);
mask = imclose(mask,se);
%figure('name','mask');
subplot(132)
plot_spectrogram(mask, dgt_params,signal_params, dgt );
set(gca, 'FontSize', 20, 'fontName','Times');
axis square;
%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_2.png'));
subplot(133)
mask = imopen(mask,se);
%figure('name','mask');
plot_spectrogram(mask, dgt_params,signal_params, dgt );
set(gca, 'FontSize', 20, 'fontName','Times');
axis square;
%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_3.png'));
saveas(gcf,fullfile(pathname, 'mask_step.png'));
clc; clear; close all;
%%
setting='full';
exp = get_experiment(setting);
param = exp.data_params;
t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}];
f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}];
win_type = exp.problem_params.win_type;
%%
param_pow = param{4};
problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type);
%%
dgt_params = problem_data.dgt_params;
signal_params = problem_data.signal_params;
mask = problem_data.mask;
[direct_stft, adjoint_stft] = get_stft_operators(dgt_params, signal_params);
gab_mul = gen_gabmul_operator(direct_stft, adjoint_stft, mask);
%%
figure; imagesc(mask)
x = randn(signal_params.sig_len,1);
A = gab_mul(x);
figure; plot(x);
figure; plot(A);
figure; sgram(A,'dynrange',90)
clc; close all;
%%
setting='full';
exp = get_experiment(setting);
%%
param = exp.data_params;
t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}];
f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}];
win_type = exp.problem_params.win_type;
%%
figure;
for k = 1:length(param)
param_pow = param{k};
problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type);
figure(k);
plot_mask(problem_data.mask, problem_data.hop, problem_data.dgt_params.nbins, problem_data.signal_params.fs)
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment