% === 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 = 2; dsp_options.max_occurences = 1; dsp_options.debug_plots = false; dsp_options.database_type = "mysql"; dsp_options.dataBase = "labor"; dsp_options.storage_path = "W:\labdata\ECOC Silas\ecoc_2025"; dsp_options.server = "192.168.178.192"; dsp_options.port = 3306; dsp_options.user = "silas"; dsp_options.password = "silas"; db = DBHandler("dataBase", [dsp_options.dataBase],... "type", dsp_options.database_type,... "server", dsp_options.server,... "user", dsp_options.user, "password", dsp_options.password); %% fp = QueryFilter(); fp.where('Runs','run_id','GREATER_EQUAL',3153); fp.where('Runs', 'symbolrate', 'EQUALS', 112e9); 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', 4); % fp.where('Runs', 'v_bias', 'EQUALS', 2.65); [dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); % [~, uniqueSirRows] = unique(dataTable.sir, "stable"); % dataTable = dataTable(uniqueSirRows, :); [~, sortIdx] = sort(dataTable.sir, 'descend'); dataTable = dataTable(sortIdx, :); dataTable = dataTable(1, :); run_ids = dataTable.run_id; if isempty(run_ids) error("run_minimal_recipe:MissingRunIds", ... "Set run_ids to one or more known run IDs before running this example."); end %% === Warehouse setup === dsp_options.userParameters = struct(); % dsp_options.userParameters.smoothing_length = [0,linspace(100,1000,10),2500,5000,10000]; 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.serial, ... "wh", wh, ... "waitbar", true); %% Analyze storageNames = fieldnames(wh.sto); result = wh.sto.(storageNames{1}); 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 = dataTable.sir(:).'; if numel(x) ~= numel(ber) x = 1:numel(ber); end figure(2026); clf; hold on plot(x,ber); for k = 1:numel(x) scatter(repmat(x(k),maxPackages,1),ber_mat(:,k)) end beautifyBERplot("logscale",true,"setcolors",false,"setmarkers",true);