% === DSP settings === dsp_options = struct(); dsp_options.mode = "run_id"; dsp_options.recipe = @mpi_recipe_dev; dsp_options.append_to_db = false; dsp_options.start_occurence = 1; dsp_options.max_occurences = 1; dsp_options.debug_plots = true; write_mpi_reduction_db = 0; stream_mpi_reduction_db = 0; mpi_reduction_study_name = "block_update_sweep"; mpi_reduction_writer_path = fullfile(fileparts(mfilename('fullpath')),"db"); addpath(mpi_reduction_writer_path); dsp_options.database_type = "mysql"; dsp_options.dataBase = "labor"; if ismac dsp_options.storage_path = "/Volumes/media/labdata/ECOC Silas/ecoc_2025"; else dsp_options.storage_path = "W:\labdata\ECOC Silas\ecoc_2025"; end dsp_options.server = "192.168.178.192"; dsp_options.port = 3306; dsp_options.user = "silas"; dsp_options.password = "silas"; dsp_options.append_mpi_reduction_db = write_mpi_reduction_db && stream_mpi_reduction_db; dsp_options.mpi_reduction_study_name = mpi_reduction_study_name; dsp_options.mpi_reduction_writer_path = mpi_reduction_writer_path; db = DBHandler("dataBase", [dsp_options.dataBase],... "type", dsp_options.database_type,... "server", dsp_options.server,... "user", dsp_options.user, "password", dsp_options.password); %% pamformats = [4,6,8]; baudrates = [112e9,96e9,72e9]; for i = 1 B = baudrates(i); M = pamformats(i); fp = QueryFilter(); fp.where('Runs','run_id','GREATER_EQUAL',3153); fp.where('Runs', 'symbolrate', 'EQUALS', B); % 72 96 112 fp.where('Runs', 'fiber_length', 'EQUALS', 0); fp.where('Runs', 'interference_path_length', 'EQUALS', 1000); % fp.where('Runs', 'sir', 'LESS_EQUAL', 20); fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"'); % fp.where('Runs', 'is_mpi', 'EQUALS', 1); fp.where('Runs', 'pam_level', 'EQUALS', M); % fp.where('Runs', 'v_bias', 'EQUALS', 2.65); [dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); [~, sortIdx] = sort(dataTable.sir, 'descend'); dataTable = dataTable(sortIdx, :); % dataTable = dataTable(1,:); run_ids = dataTable.run_id; %% === Warehouse setup === dsp_options.userParameters = struct(); dsp_options.userParameters.block_update = 1;%[1,2,4,8,16,32,64,112,224,448,448*2,1024,2048,4096,8192,16384];%%logspace(-3.8,-1,22);%[linspace(2,4096,22)]; % dsp_options.userParameters.block_update = linspace(1,224,22); wh = DataStorage(dsp_options.userParameters); %% n_realizations = (dsp_options.max_occurences - dsp_options.start_occurence + 1); n_userparams = prod(wh.dim); n_run_ids = numel(run_ids); parallel_jobs = n_userparams * n_run_ids; queried_jobs = n_realizations * n_userparams * n_run_ids; fprintf("-> [ %d run_id(s) × %d userParam combination(s) = %d parallel job(s) ] × %d realizations = %d total jobs \n", ... n_run_ids, n_userparams, parallel_jobs, n_realizations, queried_jobs); %% === Run === % submitJobs returns the raw per-job results and the filled Warehouse. For a % single run_id and remove_dc = [0, 1], results is a 2-by-1 cell array. [results, wh] = submitJobs(run_ids, dsp_options, processingMode.parallel, ... "wh", wh, ... "waitbar", true); %% if write_mpi_reduction_db && ~stream_mpi_reduction_db db.refresh(); appendMpiReductionWarehouse(db, wh, run_ids, dsp_options, ... "study_name", mpi_reduction_study_name); end % savepath = fullfile("C:","Users","Silas","Documents","MATLAB","imdd_simulation","projects","Diss","MPI_revisit","algorithms",sprintf("pam_%d_results.mat",M)); % save(wh,savepath) end %% Analyze storageNames = fieldnames(wh.sto); x_base = dataTable.sir(:).'; % x_base = dsp_options.userParameters.block_update; figure(2026); clf; hold on for storage_idx = 1:numel(storageNames) storageName = storageNames{storage_idx}; result = wh.sto.(storageName); result = result(:).'; % Each stored entry is a package cell containing one or more occurrences. ber_all = cell(1,numel(result)); for result_idx = 1:numel(result) packageCell = result{result_idx}; if isempty(packageCell) ber_all{result_idx} = NaN; continue end ber_values = nan(1,numel(packageCell)); for package_idx = 1:numel(packageCell) if isstruct(packageCell{package_idx}) && isfield(packageCell{package_idx},"metrics") ber_values(package_idx) = packageCell{package_idx}.metrics.BER; end end ber_all{result_idx} = ber_values; end maxPackages = max(cellfun(@numel,ber_all)); ber_mat = nan(maxPackages,numel(ber_all)); for k = 1:numel(ber_all) ber_mat(1:numel(ber_all{k}),k) = ber_all{k}; end ber = mean(ber_mat,1,"omitnan"); x = x_base; if numel(x) ~= numel(ber) x = 1:numel(ber); end h = plot(x,ber,"DisplayName",storageName); for k = 1:numel(x) scatter(repmat(x(k),maxPackages,1),ber_mat(:,k), ... "MarkerEdgeColor",h.Color, ... "HandleVisibility","off"); end end beautifyBERplot("logscale",true,"setcolors",false,"setmarkers",true); legend("Location","best","Interpreter","none");