From 1879441999ad8a0940eddccc53ee10e8e21554e5 Mon Sep 17 00:00:00 2001 From: Silas Oettinghaus Date: Wed, 8 Jul 2026 21:36:08 +0200 Subject: [PATCH] more and more --- Classes/04_DSP/Equalizer/FFE.m | 4 +- Functions/EQ_blocks/preprocessSignal.m | 2 +- Functions/EQ_recipes/mpi_recipe_dev.m | 88 ++- Functions/EQ_visuals/showEQNoisePSD.m | 3 +- Functions/EQ_visuals/showLevelHistogram.m | 21 +- Functions/EQ_visuals/showLevelScatter.m | 100 ++- Functions/Job_Processing/runBatch.m | 106 ++- Functions/beautifyBERplot.m | 91 ++- Functions/mat2tikz_improved.m | 8 +- .../MPI_revisit/algorithms/ffe_baseline.fig | Bin 0 -> 108052 bytes .../algorithms/wh_ffe_baseline.mat | Bin 0 -> 173729 bytes .../analytic_mpi_evaluation_with_levels.m | 261 +++++++ .../MPI_revisit/calculate_and_store_std.m | 135 ++++ .../Diss/MPI_revisit/investigate_database.m | 155 ++++ .../MPI_revisit/investigate_mpi_algorithms.m | 62 +- .../Diss/MPI_revisit/investigate_results.m | 86 +++ .../Diss/MPI_revisit/plot_mpi_timesignal.m | 453 ++++++++++++ .../Diss/MPI_revisit/verify_mpi_noise_power.m | 663 ++++++++++++++++++ .../ECOC_2025_MPI/load_signal_standalone.m | 29 +- .../plots_from_database/bias_vs_ber.m | 84 ++- .../plot_bias_awg_vs_ber.m | 20 +- workerError.mat | Bin 1057 -> 1412 bytes 22 files changed, 2197 insertions(+), 174 deletions(-) create mode 100644 projects/Diss/MPI_revisit/algorithms/ffe_baseline.fig create mode 100644 projects/Diss/MPI_revisit/algorithms/wh_ffe_baseline.mat create mode 100644 projects/Diss/MPI_revisit/analytic_mpi_evaluation_with_levels.m create mode 100644 projects/Diss/MPI_revisit/calculate_and_store_std.m create mode 100644 projects/Diss/MPI_revisit/investigate_database.m create mode 100644 projects/Diss/MPI_revisit/investigate_results.m create mode 100644 projects/Diss/MPI_revisit/plot_mpi_timesignal.m create mode 100644 projects/Diss/MPI_revisit/verify_mpi_noise_power.m diff --git a/Classes/04_DSP/Equalizer/FFE.m b/Classes/04_DSP/Equalizer/FFE.m index 9ac0ebd..d38c425 100644 --- a/Classes/04_DSP/Equalizer/FFE.m +++ b/Classes/04_DSP/Equalizer/FFE.m @@ -313,7 +313,7 @@ classdef FFE < handle end obj.mu_optimization_iter = 0; obj.mu_optimization = bayesopt(@(p)obj.muObjective(p,x,d),vars, ... - "MaxObjectiveEvaluations",10, ... + "MaxObjectiveEvaluations",20, ... "AcquisitionFunctionName","expected-improvement-plus", ... "IsObjectiveDeterministic",false, ... "Verbose",0, ... @@ -341,7 +341,7 @@ classdef FFE < handle end end - function objective = muObjective(obj,params,x,d) + function objective_db = muObjective(obj,params,x,d) old_debug = obj.save_debug; old_mu_dc = obj.mu_dc; obj.save_debug = 1; diff --git a/Functions/EQ_blocks/preprocessSignal.m b/Functions/EQ_blocks/preprocessSignal.m index 2161b2f..679fbb0 100644 --- a/Functions/EQ_blocks/preprocessSignal.m +++ b/Functions/EQ_blocks/preprocessSignal.m @@ -33,7 +33,7 @@ switch preprocessMode error('preprocessSignal:InvalidMode', 'Unsupported preprocessing mode "%s".', preprocessMode); end -[Scpe_sig, Scpe_cell] = Scpe_sig.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", options.debug_plots); +[Scpe_sig, Scpe_cell, inverted] = Scpe_sig.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", options.debug_plots); % Scpe_sig = Scpe_cell{1}; % Apply Gaussian filter diff --git a/Functions/EQ_recipes/mpi_recipe_dev.m b/Functions/EQ_recipes/mpi_recipe_dev.m index 5e5abfa..0321960 100644 --- a/Functions/EQ_recipes/mpi_recipe_dev.m +++ b/Functions/EQ_recipes/mpi_recipe_dev.m @@ -21,18 +21,14 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options) "debug_plots", options.debug_plots); - mu_dc = 0; % 1e-5 - dc_buffer_len = 0; - ffe_buffer_len = 0; - smoothing_buffer_length = options.userParameters.smoothing_length; - smoothing_buffer_update = 1; + mu_dc = 0.005;%1e-5; eq_settings = { ... "epochs_tr", 5, ... - "epochs_dd", 5, ... + "epochs_dd", 3, ... "len_tr", 4096*2, ... - "mu_dd", 1e-1, ... - "mu_tr", 0.4, ... + "mu_dd",3.005e-03, ... + "mu_tr",1.063e-01, ... "order", 25, ... "sps", 2, ... "decide", 0, ... @@ -43,36 +39,54 @@ function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options) eq_ffe = FFE(eq_settings{:}); - % showLevelScatter(Scpe_sig_raw, Symbols, ... - % "fsym", options.fsym, ... - % "fignum", options.dataTable.run_id, ... - % "normalize", true); + showLevelScatter(Scpe_sig_raw, Symbols, ... + "fsym", options.fsym, ... + "fignum", 400, ... + "normalize", true); - %% - % tic - % ffe_results = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... - % "precode_mode", options.duob_mode, ... - % 'showAnalysis', options.debug_plots, ... - % "postFFE", [], ... - % "eth_style_symbol_mapping", 0); - % toc - % ffe_results.metrics.print("description",'FFE'); - % output.ffe_package = ffe_results; + % Scpe_sig_raw.spectrum("normalizeTo0dB",1,"fft_length",4096*4,"fignum",401); - %% - eq_ffe_dcr = FFE_DCremoval_adaptive_mu(eq_settings{:}, ... - "dc_buffer_len",dc_buffer_len, ... - "ffe_buffer_len",ffe_buffer_len,... - "smoothing_buffer_length",smoothing_buffer_length,... - "smoothing_buffer_update",smoothing_buffer_update); - tic - ffe_results_dcr = ffe(eq_ffe_dcr, options.M, Scpe_sig, Symbols, Tx_bits, ... - "precode_mode", options.duob_mode, ... - 'showAnalysis', options.debug_plots, ... - "postFFE", [], ... - "eth_style_symbol_mapping", 0); - toc - ffe_results_dcr.metrics.print("description",'FFE DCR'); - output.ffe_dcr_package = ffe_results_dcr; + %options.dataTable.sir; + %% NORMAL FFE + if 1 + + ffe_results = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... + "precode_mode", options.duob_mode, ... + 'showAnalysis', options.debug_plots, ... + "postFFE", [], ... + "eth_style_symbol_mapping", 0); + + ffe_results.metrics.print("description",sprintf('Normal FFE; SIR %d dB',options.dataTable.sir)); + output.ffe_package = ffe_results; + + end + + %% MPI Reduction + if 1 + + % dc_buffer_len = 0; + % ffe_buffer_len = 0; + % smoothing_buffer_length = options.userParameters.smoothing_length; + % smoothing_buffer_update = 1; + + % eq_ffe_dcr = FFE_DCremoval_adaptive_mu(eq_settings{:}, ... + % "dc_buffer_len",dc_buffer_len, ... + % "ffe_buffer_len",ffe_buffer_len,... + % "smoothing_buffer_length",smoothing_buffer_length,... + % "smoothing_buffer_update",smoothing_buffer_update); + + eq_ = FFE_DCremoval("epochs_tr",5,"epochs_dd",3,"len_tr",4096*2,"mu_dd",... + 0.0002,"mu_tr",0,"order",25,"sps",2,"decide",0,... + "mu_dc",0.005,"dc_buffer_len",1); + + ffe_results_dcr = ffe(eq_, options.M, Scpe_sig, Symbols, Tx_bits, ... + "precode_mode", options.duob_mode, ... + 'showAnalysis', options.debug_plots, ... + "postFFE", [], ... + "eth_style_symbol_mapping", 0); + + ffe_results_dcr.metrics.print("description",'FFE DCR'); + output.ffe_dcr_package = ffe_results_dcr; + end end diff --git a/Functions/EQ_visuals/showEQNoisePSD.m b/Functions/EQ_visuals/showEQNoisePSD.m index bfb0a12..1a16831 100644 --- a/Functions/EQ_visuals/showEQNoisePSD.m +++ b/Functions/EQ_visuals/showEQNoisePSD.m @@ -23,7 +23,8 @@ end end % Ensure the figure is ready before calling spectrum - eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 1,"color",options.color); + eq_noise = eq_noise - mean(eq_noise.signal); + eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 0,"color",options.color,"fft_length",4096*2); if ~isnan(options.postfilter_taps) % Hold on to the figure for further plotting diff --git a/Functions/EQ_visuals/showLevelHistogram.m b/Functions/EQ_visuals/showLevelHistogram.m index 6ef093d..c86828d 100644 --- a/Functions/EQ_visuals/showLevelHistogram.m +++ b/Functions/EQ_visuals/showLevelHistogram.m @@ -38,6 +38,8 @@ end eq_signal = max(min(eq_signal,3),-3); + eq_signal = eq_signal .* -1; + %%% histogram clf if isempty(ref_symbol_uncoded) @@ -47,6 +49,15 @@ end received_sd = NaN(numel(constellation),numel(ref_symbols)); lvlcol = linspecer(numel(constellation)); + lvlcol = cbrewer2('RdBu',numel(constellation)+4); + + % remove 4 colors from the middle to avoid the bright central colors + mid = ceil(size(lvlcol,1)/2); + rm_idx = mid + (-1:2); % two before mid and two after (2x2 removal centered) + rm_idx = max(1,min(size(lvlcol,1),rm_idx)); + lvlcol(rm_idx,:) = []; + lvlcol = lvlcol(1:numel(constellation),:); + for lvl = 1:numel(constellation) class_mask = ref_symbols == constellation(lvl); received_sd(lvl,class_mask) = eq_signal(class_mask); @@ -71,7 +82,15 @@ end % DB lobe is drawn separately so the DB-level structure stays visible. db_constellation = unique(ref_symbols); classes = unique(ref_symbol_uncoded); - lvlcol = linspecer(numel(classes)); + % lvlcol = linspecer(numel(classes)); + lvlcol = cbrewer2('RdBu',numel(classes)+4); + + % remove 4 colors from the middle to avoid the bright central colors + mid = ceil(size(lvlcol,1)/2); + rm_idx = mid + (-1:2); % two before mid and two after (2x2 removal centered) + rm_idx = max(1,min(size(lvlcol,1),rm_idx)); + lvlcol(rm_idx,:) = []; + lvlcol = lvlcol(1:numel(sir_group_labels),:); for db_lvl = 1:numel(db_constellation) db_mask = ref_symbols == db_constellation(db_lvl); diff --git a/Functions/EQ_visuals/showLevelScatter.m b/Functions/EQ_visuals/showLevelScatter.m index 1565487..7b3b62d 100644 --- a/Functions/EQ_visuals/showLevelScatter.m +++ b/Functions/EQ_visuals/showLevelScatter.m @@ -21,15 +21,19 @@ arguments options.clear (1,1) logical = true options.windowLength (1,1) double {mustBePositive, mustBeInteger} = 500 options.xLimits double = [] - options.yLimits (1,2) double = [-3 3] + options.yLimits (1,2) double = [-2.5 2.5] options.showStdAnnotations (1,1) logical = true + options.scatterAlpha (1,1) double {mustBeGreaterThanOrEqual(options.scatterAlpha, 0), mustBeLessThanOrEqual(options.scatterAlpha, 1)} = 0.2 + options.scatterSize (1,1) double {mustBePositive} = 1 + options.avgLineMaxPoints (1,1) double {mustBePositive, mustBeInteger} = 1000 + options.avgLineSmoothWindow (1,1) double {mustBePositive, mustBeInteger} = 1 end fsym = resolveSymbolRate(rxInput, refSymbols, options); [symbols_for_lvl, avg_for_lvl, xAxisUs, info] = prepareLevelScatterData(rxInput, refSymbols, fsym, options); if options.showPlot - plotLevelScatter(symbols_for_lvl, avg_for_lvl, refSymbols, xAxisUs, options); + info.plot = plotLevelScatter(symbols_for_lvl, avg_for_lvl, refSymbols, xAxisUs, options); end end @@ -73,6 +77,7 @@ info.shifts = []; info.fsym = fsym; info.shiftFs = fsym; info.varianceByLevel = []; +info.plot = struct(); end function [symbols_for_lvl, avg_for_lvl, info] = prepareSignalInput(rxSignal, refSymbols, fsym, options, info) @@ -250,50 +255,95 @@ else end end -function plotLevelScatter(symbols_for_lvl, avg_for_lvl, refSymbols, xAxisUs, options) +function plotInfo = plotLevelScatter(symbols_for_lvl, avg_for_lvl, refSymbols, xAxisUs, options) +plotInfo = struct(); if isempty(symbols_for_lvl) return end if isnan(options.fignum) - figure; + figHandle = figure; else - figure(options.fignum); + figHandle = figure(options.fignum); if options.clear clf; end end -hold on +ax = gca; +hold(ax, "on"); numLevels = size(symbols_for_lvl, 1); -cols = cbrewer2("Paired", 2*numLevels); +cols = cbrewer2("RdBu", numLevels); +% cols = linspecer(numLevels); +xLimits = getXLimits(options.xLimits, xAxisUs, symbols_for_lvl); -for levelIdx = 1:numLevels - scatter(xAxisUs, symbols_for_lvl(levelIdx, :), 10, ".", ... - "MarkerEdgeColor", cols((2*levelIdx)-1, :), ... - "MarkerEdgeAlpha", 0.5); +if 1 + for levelIdx = numLevels:-1:1 + scatter(ax, xAxisUs, symbols_for_lvl(levelIdx, :), options.scatterSize, ".", ... + "MarkerEdgeColor", cols(levelIdx, :), ... + "MarkerEdgeAlpha", options.scatterAlpha); + end end for levelIdx = 1:numLevels - plot(xAxisUs, avg_for_lvl(levelIdx, :), ... - "LineWidth", 1, ... - "Color", cols(2*levelIdx, :)); + [xReduced, yReduced] = reduceAverageLineForPlot( ... + xAxisUs, avg_for_lvl(levelIdx, :), ... + options.avgLineMaxPoints, options.avgLineSmoothWindow); + plot(ax, xReduced, yReduced, ... + "LineWidth", 2, ... + "Color", cols(levelIdx, :)); end -refValues = numericSignal(refSymbols); -yline(unique(refValues), "HandleVisibility", "off"); +% refValues = unique(numericSignal(refSymbols)); +% for refIdx = 1:numel(refValues) +% yline(ax, refValues(refIdx), "--", ... +% "Color", [0.35 0.35 0.35], ... +% "LineWidth", 0.75, ... +% "HandleVisibility", "off"); +% end + if options.showStdAnnotations annotateLevelStd(symbols_for_lvl, avg_for_lvl, xAxisUs, options.xLimits); end -xlabel('Time in $\mu$s'); -ylabel('Normalized Amplitude'); -xlim(getXLimits(options.xLimits, xAxisUs, symbols_for_lvl)); -ylim(options.yLimits); -grid on +xlabel(ax, 'Time in $\mu$s'); +ylabel(ax, 'Normalized Amplitude'); +xlim(ax, xLimits); +ylim(ax, options.yLimits); +grid(ax, "on"); +figure(figHandle); drawnow; end +function [xReduced, yReduced] = reduceAverageLineForPlot(xAxisUs, yTrace, maxPoints, smoothWindow) +valid = isfinite(xAxisUs) & isfinite(yTrace); +xValid = xAxisUs(valid); +yValid = yTrace(valid); + +if isempty(xValid) + xReduced = []; + yReduced = []; + return +end + +[xValid, uniqueIdx] = unique(xValid, "stable"); +yValid = yValid(uniqueIdx); + +if smoothWindow > 1 + yValid = smoothdata(yValid, "movmean", smoothWindow); +end + +numOut = min(maxPoints, numel(xValid)); +if numOut >= numel(xValid) + xReduced = xValid; + yReduced = yValid; + return +end + +xReduced = linspace(xValid(1), xValid(end), numOut); +yReduced = interp1(xValid, yValid, xReduced, "pchip"); +end + function xLimits = getXLimits(configuredLimits, xAxisUs, symbols_for_lvl) if ~isempty(configuredLimits) xLimits = configuredLimits; @@ -308,12 +358,12 @@ end lastFilledColumn = find(filledColumns, 1, "last"); xMax = xAxisUs(lastFilledColumn); -xLimits = [0, 1.05*xMax]; +xLimits = [0, 1*xMax]; end function annotateLevelStd(symbols_for_lvl, avg_for_lvl, xAxisUs, configuredXLimits) xLimits = getXLimits(configuredXLimits, xAxisUs, symbols_for_lvl); -xText = xLimits(1) + 0.96*diff(xLimits); +xText = xLimits(1) + 0.2*diff(xLimits); for levelIdx = 1:size(symbols_for_lvl, 1) levelSamples = symbols_for_lvl(levelIdx, :); @@ -328,9 +378,9 @@ for levelIdx = 1:size(symbols_for_lvl, 1) yText = median(levelSamples(~isnan(levelSamples)), 'omitnan'); end - label = ['std = ', sprintf('%.3f', levelStd)]; + label = ['$\sigma^2_',sprintf('%d', levelIdx),'$ = ', sprintf('%.3f', levelStd)]; text(xText, yText, label, ... - 'Interpreter', 'none', ... + 'Interpreter', 'latex', ... 'HorizontalAlignment', 'right', ... 'VerticalAlignment', 'middle', ... 'FontSize', 10, ... diff --git a/Functions/Job_Processing/runBatch.m b/Functions/Job_Processing/runBatch.m index b37d675..e091f99 100644 --- a/Functions/Job_Processing/runBatch.m +++ b/Functions/Job_Processing/runBatch.m @@ -25,6 +25,10 @@ function batchResults = runBatch(workerFcn, jobs, options) jobs = normalizeJobs(jobs); nJobs = numel(jobs); batchResults = cell(1, nJobs); + jobDurations = nan(1, nJobs); + lastJobDuration = nan; + batchStart = tic; + effectiveWorkerCount = 1; h = []; if nJobs == 0 @@ -34,28 +38,45 @@ function batchResults = runBatch(workerFcn, jobs, options) if options.waitbar h = waitbar(0, char(options.waitbarMessage)); cleanupWaitbar = onCleanup(@() closeWaitbar(h)); + updateWaitbar(options.waitbar, h, 0, nJobs, jobDurations, ... + lastJobDuration, 0, effectiveWorkerCount); end switch mode case processingMode.parallel pool = setupParallelPool(options.numWorkers, options.idleTimeout, options.cancelExistingQueue); + effectiveWorkerCount = min(pool.NumWorkers, nJobs); futures = parallel.FevalFuture.empty(nJobs, 0); for jobIdx = 1:nJobs fprintf('[%s] Submitted.\n', jobs(jobIdx).label); - futures(jobIdx) = parfeval(pool, workerFcn, 1, jobs(jobIdx).args{:}); + futures(jobIdx) = parfeval(pool, @runTimedJob, 3, workerFcn, jobs(jobIdx).args); end consumedIdx = false(nJobs, 1); for completedCount = 1:nJobs try - [jobIdx, jobResult] = fetchNext(futures); + [jobIdx, jobResult, jobRuntime, jobError] = fetchNext(futures); consumedIdx(jobIdx) = true; - batchResults{jobIdx} = jobResult; - fprintf('[%s] Completed (%d/%d).\n', jobs(jobIdx).label, completedCount, nJobs); + jobDurations(jobIdx) = jobRuntime; + lastJobDuration = jobRuntime; - if ~isempty(options.resultHandler) - options.resultHandler(jobResult, jobs(jobIdx), jobIdx); + if isempty(jobError) + batchResults{jobIdx} = jobResult; + fprintf('[%s] Completed (%d/%d, runtime %s).\n', ... + jobs(jobIdx).label, completedCount, nJobs, formatDuration(jobRuntime)); + + if ~isempty(options.resultHandler) + options.resultHandler(jobResult, jobs(jobIdx), jobIdx); + end + else + batchResults{jobIdx} = jobError; + + if ~isempty(options.errorHandler) + options.errorHandler(jobError, jobs(jobIdx), jobIdx); + else + defaultErrorHandler(jobError, jobs(jobIdx), jobIdx); + end end catch fetchErr errorJobIdx = findErroredFuture(futures, consumedIdx); @@ -74,21 +95,28 @@ function batchResults = runBatch(workerFcn, jobs, options) end end - updateWaitbar(options.waitbar, h, completedCount, nJobs); + updateWaitbar(options.waitbar, h, completedCount, nJobs, ... + jobDurations, lastJobDuration, toc(batchStart), effectiveWorkerCount); end case processingMode.serial for jobIdx = 1:nJobs + jobStart = tic; try fprintf('[%s] Running.\n', jobs(jobIdx).label); jobResult = workerFcn(jobs(jobIdx).args{:}); + jobDurations(jobIdx) = toc(jobStart); + lastJobDuration = jobDurations(jobIdx); batchResults{jobIdx} = jobResult; - fprintf('[%s] Completed (%d/%d).\n', jobs(jobIdx).label, jobIdx, nJobs); + fprintf('[%s] Completed (%d/%d, runtime %s).\n', ... + jobs(jobIdx).label, jobIdx, nJobs, formatDuration(jobDurations(jobIdx))); if ~isempty(options.resultHandler) options.resultHandler(jobResult, jobs(jobIdx), jobIdx); end catch ME + jobDurations(jobIdx) = toc(jobStart); + lastJobDuration = jobDurations(jobIdx); batchResults{jobIdx} = ME; if ~isempty(options.errorHandler) @@ -98,7 +126,8 @@ function batchResults = runBatch(workerFcn, jobs, options) end end - updateWaitbar(options.waitbar, h, jobIdx, nJobs); + updateWaitbar(options.waitbar, h, jobIdx, nJobs, ... + jobDurations, lastJobDuration, toc(batchStart), effectiveWorkerCount); end otherwise @@ -149,16 +178,69 @@ function jobs = normalizeJobs(jobs) end end -function updateWaitbar(useWaitbar, h, completedCount, totalCount) +function [jobResult, jobRuntime, jobError] = runTimedJob(workerFcn, jobArgs) + jobStart = tic; + jobError = []; + + try + jobResult = workerFcn(jobArgs{:}); + catch ME + jobResult = []; + jobError = ME; + end + + jobRuntime = toc(jobStart); +end + +function updateWaitbar(useWaitbar, h, completedCount, totalCount, jobDurations, lastJobDuration, elapsedSeconds, effectiveWorkerCount) if ~useWaitbar || ~isgraphics(h) return end - waitbar(completedCount / totalCount, h, ... - sprintf('Completed %d/%d jobs', completedCount, totalCount)); + completedDurations = jobDurations(~isnan(jobDurations)); + if isempty(completedDurations) + averageJobTimeText = 'calculating...'; + lastJobTimeText = 'calculating...'; + remainingTimeText = 'calculating...'; + else + averageJobSeconds = mean(completedDurations); + remainingJobs = totalCount - completedCount; + remainingSeconds = averageJobSeconds * remainingJobs / max(1, effectiveWorkerCount); + averageJobTimeText = formatDuration(averageJobSeconds); + lastJobTimeText = formatDuration(lastJobDuration); + remainingTimeText = formatDuration(remainingSeconds); + end + + message = sprintf(['Completed %d/%d jobs\n' ... + 'Elapsed total: %s\n' ... + 'Last job time: %s\n' ... + 'Avg. time/job: %s\n' ... + 'Estimated remaining: %s'], ... + completedCount, totalCount, formatDuration(elapsedSeconds), ... + lastJobTimeText, averageJobTimeText, remainingTimeText); + + waitbar(completedCount / totalCount, h, message); drawnow; end +function text = formatDuration(seconds) + if isempty(seconds) || isnan(seconds) || isinf(seconds) + text = 'unknown'; + return + end + + seconds = max(0, seconds); + hours = floor(seconds / 3600); + minutes = floor(mod(seconds, 3600) / 60); + wholeSeconds = floor(mod(seconds, 60)); + + if hours > 0 + text = sprintf('%d:%02d:%02d', hours, minutes, wholeSeconds); + else + text = sprintf('%02d:%02d', minutes, wholeSeconds); + end +end + function closeWaitbar(h) if isgraphics(h) delete(h); diff --git a/Functions/beautifyBERplot.m b/Functions/beautifyBERplot.m index 8857161..5f84673 100644 --- a/Functions/beautifyBERplot.m +++ b/Functions/beautifyBERplot.m @@ -19,66 +19,85 @@ end ax = gca; % --------------------------------------------------------- -% Extract *only* real data lines from ax.Children +% Extract real data objects from ax.Children % --------------------------------------------------------- children = ax.Children; isLine = arrayfun(@(h) isa(h,'matlab.graphics.chart.primitive.Line'), children); -lines = children(isLine); +isScatter = arrayfun(@(h) isa(h,'matlab.graphics.chart.primitive.Scatter'), children); % Remove helper lines (e.g. yline, fit overlays) -lines = lines(~strcmp({lines.Tag},'ConstantLine')); +isConstantLine = arrayfun(@(h) isprop(h,'Tag') && strcmp(h.Tag,'ConstantLine'), children); -n = numel(lines); -if n == 0 - return -end +dataObjects = children((isLine | isScatter) & ~isConstantLine); +n = numel(dataObjects); % --------------------------------------------------------- % Fixed color palette (deterministic across figures) % --------------------------------------------------------- -try - cmap = linspecer(n); -catch - cmap = lines(n).Color; %#ok - cmap = linespecer_fallback(n); +if n > 0 + try + cmap = linspecer(n); + catch + cmap = linespecer_fallback(n); + end end markers = {'o','s','o','o','^','v','d','>'}; lw = 0.8; -ms = 4; +ms = 2; % --------------------------------------------------------- -% Apply line + marker styling +% Apply line/scatter + marker styling % --------------------------------------------------------- for i = 1:n - ln = lines(n-i+1); % preserve plotting order - ln.LineWidth = lw; - - if options.setcolors - ln.Color = cmap(i,:); - end + dataObj = dataObjects(n-i+1); % preserve plotting order + + if isa(dataObj,'matlab.graphics.chart.primitive.Line') + dataObj.LineWidth = lw; - if options.setmarkers - if strcmp(ln.Marker,'none') - ln.Marker = markers{mod(i-1,numel(markers))+1}; - end - ln.MarkerSize = ms; if options.setcolors - ln.MarkerEdgeColor = cmap(i,:); + dataObj.Color = cmap(i,:); + end + + if options.setmarkers + if strcmp(dataObj.Marker,'none') + dataObj.Marker = markers{mod(i-1,numel(markers))+1}; + end + dataObj.MarkerSize = ms; + if options.setcolors + dataObj.MarkerEdgeColor = cmap(i,:); + end + dataObj.MarkerFaceColor = [1 1 1]; + end + elseif isa(dataObj,'matlab.graphics.chart.primitive.Scatter') + if options.setcolors + dataObj.CData = cmap(i,:); + dataObj.MarkerEdgeColor = cmap(i,:); + markerFaceColor = dataObj.MarkerFaceColor; + hasNoFace = ischar(markerFaceColor) && strcmp(markerFaceColor,'none'); + if ~hasNoFace + dataObj.MarkerFaceColor = cmap(i,:); + end + end + + if options.setmarkers + if strcmp(dataObj.Marker,'none') + dataObj.Marker = markers{mod(i-1,numel(markers))+1}; + end + dataObj.SizeData = ms^2; end - ln.MarkerFaceColor = [1 1 1]; end end % --------------------------------------------------------- % Optional smoothing / fitting overlay % --------------------------------------------------------- -if options.polyfit +if options.polyfit && n > 0 hold on for i = 1:n - ln = lines(n-i+1); - x = ln.XData(:); - y = ln.YData(:); + dataObj = dataObjects(n-i+1); + x = dataObj.XData(:); + y = dataObj.YData(:); valid = isfinite(x) & isfinite(y); if sum(valid) < options.polyorder+1 @@ -112,7 +131,15 @@ if options.polyfit yf = polyval(p,xf); end - lightcol = ln.Color + 0.4*(1-ln.Color); + if isa(dataObj,'matlab.graphics.chart.primitive.Line') + basecol = dataObj.Color; + else + basecol = dataObj.CData(1,:); + if numel(basecol) ~= 3 + basecol = cmap(i,:); + end + end + lightcol = basecol + 0.4*(1-basecol); lightcol(lightcol>1)=1; plot(xf,yf,'-','Color',lightcol,... diff --git a/Functions/mat2tikz_improved.m b/Functions/mat2tikz_improved.m index 345f057..0ba1c6d 100644 --- a/Functions/mat2tikz_improved.m +++ b/Functions/mat2tikz_improved.m @@ -3,9 +3,13 @@ arguments % Default to the path in your example if no argument is provided filename (1,1) string = 'C:\Users\Silas\Documents\Dissertation\00_Examples\tikz\textfig.tikz'; options.cleanfigure = false; + options.cleanTargetResolution = 600; + options.cleanScalePrecision (1,1) double = 1; end if options.cleanfigure - cleanfigure; + cleanfigure( ... + 'targetResolution', options.cleanTargetResolution, ... + 'scalePrecision', options.cleanScalePrecision); end matlab2tikz(char(filename), ... 'width', '\fwidth', ... @@ -38,4 +42,4 @@ matlab2tikz(char(filename), ... % 'tick label style={/pgf/number format/fixed, /pgf/number format/1000 sep={}}' ... % }); -end \ No newline at end of file +end diff --git a/projects/Diss/MPI_revisit/algorithms/ffe_baseline.fig b/projects/Diss/MPI_revisit/algorithms/ffe_baseline.fig new file mode 100644 index 0000000000000000000000000000000000000000..b0f2e067797f4c3242fce5b3c729e1a53036e096 GIT binary patch literal 108052 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ʼ>;5BPIz+-sgQNaUz%^1{Q$QKBXt@))~w%^rr* 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

iBpGEI5Of`4Ek6Qdx}05z;e*X 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

Je<2QKu?# znh{)=Rlp+aG~~d^HqWann`7-Kl~1rWSxZ8v%gU5&Nc};=uP&H%blne;tJKFJlee)b z=FCD6DW>YbPH~LGorSAtE>3Izk}!v!N?HYN4UQCtSSrR$$2e7I{1ob>Ov62=Z;Ybg zcx2`6MtpLO)<%#6Y-OXQKKvjL#@;&8|I|{HJ$zw zyA=LLXXy{!9(Hiqpls=MUuba_TOk&o9@OGQSwYHn14ov!b@iP@VRmA_YO$!&-W;lZ zs<`iD8^f0Njx2W?1Gx&0%DlD0JEkcDYgtecig|`M7VLti@dZnMo1E@QYlNn{Z9Mk1WyjuG}aJsGT_8CM{7uG=Eq=&5V9XK%GuAh<>0u zh`vu!c;6H#y#J%<=S>}}GVe0a^uOh{X|rXWpON*Aq8KI^!oU&gkjXFwh}d`qgxK&@ z@YtcTAW2hmQQ!}AF^YPGpSAT-KTWDcX@}{<2p1!8yybue%gGK74sk}+E9S1eBYeye zT(a7&H81-z#`i;G4)wMsSaWH>VH<*Ra~ko&cO|hk;H$kjcFiSPOPo5>u)Y zs$(OlKM`Q*;Jg+Rob35E_O=mu`|0#~mn)}8`8aJPc;h;^-cHWf_7Ljx%}z?Y9SGPPQSVu896ZQU~3QW2H1ea=2O?j zjM#5C$GX%=s`H)7-Op1Q3O|e-cs%NDBe(!gMq8VXD!Z@RbDxeoD^tlnM>8b;O}AM( zqkpN|ufTSdV|0=<)D?xOz1qVOvuQl73rK8o?cAC?`Dxpf*jyG}A*$3d#W^l?J0`Lt zvoH<|VJ?3QRK;~_OQlJ1F?7+SiS~!1nL?Cw5A`9a$Iupr)TQZX2oT1M%O>Q?w^0Sn zSyV0X)K}$b2hnxU{E)n{8AvGAoxU5}YdaWhB&fO$MtzwIaDVs_U|UhvFD6rgedmHARc@3fh>?vf3Z?M@*Q>Nm|y<$&EWWGAU0d?HBV0J($$v#@&h*MljLq>GL43U~}~S_J5Y#FGW+X#+RZA`^eg9 zBZTpWZPWg5XlUob+vKYi

|1EVgI_xY@j_?B#j+id}0rL;eB#SoJp9yk% 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

m9 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

rocV{lQ+uYr189h*0U?dem(IfT%K~xkJWl@Q> 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 KkGQp5)9XKGRtMAo literal 0 HcmV?d00001 diff --git a/projects/Diss/MPI_revisit/analytic_mpi_evaluation_with_levels.m b/projects/Diss/MPI_revisit/analytic_mpi_evaluation_with_levels.m new file mode 100644 index 0000000..df09e81 --- /dev/null +++ b/projects/Diss/MPI_revisit/analytic_mpi_evaluation_with_levels.m @@ -0,0 +1,261 @@ +%% MPI level-dependent variance: analytic + Monte-Carlo PAM-4 + +% clear; clc; + +%% Parameters +df = 1e6; % Laser linewidth [Hz] +SIR_dB = 20; % Interference attenuation [dB], field attenuation +alpha = 10^(-SIR_dB/20); % Field attenuation [linear] +n_fiber = 1.467; +c = physconst('lightspeed'); + +L = linspace(0,250,50); % Interference delay [m] +tau = n_fiber./c.*L; % Delay [s] + +tau_c = 1/(pi*df); +L_c = (c/n_fiber)*tau_c; + +%% PAM-4 optical power levels + +M = 4; +ER_dB = 10; +r_ER = 10^(ER_dB/10); % P3/P0 + +% Equally spaced optical powers with finite ER +P0 = 1/(r_ER - 1); +P_levels = P0 + (0:M-1).'/(M-1); % optical powers +Pavg = mean(P_levels); + +level_axis = (0:M-1).'; + +%% Analytic level-dependent variance + +coh_factor = (1 - exp(-2*pi*df.*tau)).^2; + +var_levels_analytic = zeros(M, length(tau)); + +for m = 1:M + var_levels_analytic(m,:) = ... + 2 * alpha^2 * P_levels(m) * Pavg .* coh_factor; +end +var_levels_saturation = 2 * alpha^2 * P_levels * Pavg; + +sigma_levels_analytic = sqrt(var_levels_analytic); + +slope_vs_index_analytic = zeros(1, length(tau)); + +for k = 1:length(tau) + p_k = polyfit(level_axis, var_levels_analytic(:,k), 1); + slope_vs_index_analytic(k) = p_k(1); +end + +%% Monte-Carlo simulation + +fs = 100e9; % Sampling rate [Hz] +Tsim = 100e-6; % Simulation duration [s] +N = round(Tsim*fs); +max_delay_samples = round(max(tau)*fs); +phase_noise_std = sqrt(2*pi*df/fs); + +num_realizations = 50; + +use_rms_normalize = false; % false: comparable to analytic model + +mc_var_levels = zeros(num_realizations, M, length(L)); +mc_sigma_levels = zeros(num_realizations, M, length(L)); +mc_slope = zeros(num_realizations, length(L)); + +parfor rr = 1:num_realizations + + % Random PAM symbols + sym_idx = randi(M, N + max_delay_samples, 1); % column + P_seq = P_levels(sym_idx); % column + A_seq = sqrt(P_seq); % column + + % Laser phase noise random walk + dphi = phase_noise_std * randn(N + max_delay_samples, 1); % column + phi = cumsum(dphi); % column + + P_direct = P_seq(max_delay_samples+1 : max_delay_samples+N); + A_direct = A_seq(max_delay_samples+1 : max_delay_samples+N); + phi_direct = phi(max_delay_samples+1 : max_delay_samples+N); + + varlev_k = zeros(M, length(L)); + slope_k = zeros(1, length(L)); + + for kk = 1:length(tau) + + nd = round(tau(kk)*fs); + + A_delayed = A_seq(max_delay_samples+1-nd : max_delay_samples+N-nd); + A_delayed = sqrt(Pavg) * ones(N,1); + phi_delayed = phi(max_delay_samples+1-nd : max_delay_samples+N-nd); + + onlybeating = 0; + if ~onlybeating + E = A_direct .* exp(1j*phi_direct) + ... + alpha .* A_delayed .* exp(1j*phi_delayed); + + responsivity = 1; + I = abs(E).^2 .* responsivity; + else + I_B = 2 * alpha .* A_direct .* A_delayed .* ... + cos(phi_direct - phi_delayed); + + I = I_B; + end + + if use_rms_normalize + I = I - mean(I); + I = I ./ rms(I); + end + + % Remove deterministic level means before variance estimation + for m = 1:M + mask = sym_idx(max_delay_samples+1 : max_delay_samples+N).' == m; + + I_m = I(mask); + I_m = I_m - mean(I_m, 'omitnan'); + + varlev_k(m,kk) = var(I_m, 0, 'omitnan'); + end + + p_k = polyfit(level_axis, varlev_k(:,kk), 1); + slope_k(kk) = p_k(1); + end + + mc_var_levels(rr,:,:) = varlev_k; + mc_sigma_levels(rr,:,:) = sqrt(varlev_k); + mc_slope(rr,:) = slope_k; +end + +avg_mc_var_levels = squeeze(mean(mc_var_levels, 1)); +std_mc_var_levels = squeeze(std(mc_var_levels, 0, 1)); +avg_mc_sigma_levels = squeeze(mean(mc_sigma_levels, 1)); +std_mc_sigma_levels = squeeze(std(mc_sigma_levels, 0, 1)); + +avg_mc_slope = mean(mc_slope, 1); +std_mc_slope = std(mc_slope, 0, 1); + +%% Plot 1: variance per PAM level + +script_dir = fileparts(mfilename('fullpath')); +if isempty(script_dir) + repo_root = pwd; +else + repo_root = fileparts(fileparts(fileparts(script_dir))); +end +addpath(genpath(fullfile(repo_root, 'Libs', 'boundedlines'))); + +cols = flip(cbrewer2('RdBu',4)); +x_norm = L./L_c; +bound_alpha = 0.32; + +figure; hold on; + +for m = 1:M + showLegendEntry = m == 1; + + hAnalytic = plot(x_norm, var_levels_analytic(m,:), ... + 'LineWidth', 2, ... + 'Color', cols(m,:), ... + 'DisplayName', 'Analytic'); + if ~showLegendEntry + set(hAnalytic, 'HandleVisibility', 'off'); + end + + [hl, hp] = boundedline(x_norm, avg_mc_var_levels(m,:), std_mc_var_levels(m,:), '-o', ... + 'alpha', ... + 'transparency', bound_alpha, ... + 'Color', cols(m,:), ... + 'LineWidth', 1.2); + set(hl, 'DisplayName', 'Simulation', 'Marker','o', 'MarkerFaceColor', cols(m,:), 'MarkerSize',2); + if ~showLegendEntry + set(hl, 'HandleVisibility', 'off'); + end + set(hp, 'HandleVisibility', 'off'); + + hSat = yline(var_levels_saturation(m), '-.k', ... + 'LineWidth', 1.2, ... + 'DisplayName', 'Saturation $= 2\alpha^2 A^2 A_m^2$'); + if ~showLegendEntry + set(hSat, 'HandleVisibility', 'off'); + end + + text(x_norm(end) * 0.98, var_levels_saturation(m), sprintf('$m = %d$', m), ... + 'Interpreter', 'latex', ... + 'HorizontalAlignment', 'right', ... + 'VerticalAlignment', 'bottom', ... + 'Color', 'k', ... + 'FontSize', 10); +end + +grid on; +xlabel('$L/L_c$', 'Interpreter', 'latex'); +ylabel('$\sigma_m^2$', 'Interpreter', 'latex'); +title(sprintf('MPI-induced PAM-4 level variance, SIR = %d dB, ER = %g dB', SIR_dB, ER_dB)); +legend('Location', 'northwest', 'Interpreter', 'latex'); + +%% Plot 2: standard deviation per PAM level + +figure; hold on; + +for m = 1:M + showLegendEntry = m == 1; + + hAnalytic = plot(x_norm, sigma_levels_analytic(m,:), ... + 'LineWidth', 2, ... + 'Color', cols(m,:), ... + 'DisplayName', 'Analytic'); + if ~showLegendEntry + set(hAnalytic, 'HandleVisibility', 'off'); + end + + [hl, hp] = boundedline(x_norm, avg_mc_sigma_levels(m,:), std_mc_sigma_levels(m,:), '-o', ... + 'alpha', ... + 'transparency', bound_alpha, ... + 'Color', cols(m,:), ... + 'LineWidth', 1.2); + set(hl, 'DisplayName', 'Simulation', 'Marker','o', 'MarkerFaceColor', cols(m,:), 'MarkerSize',2); + if ~showLegendEntry + set(hl, 'HandleVisibility', 'off'); + end + set(hp, 'HandleVisibility', 'off'); + + text(x_norm(end) * 0.98, sigma_levels_analytic(m,end), sprintf('$m = %d$', m), ... + 'Interpreter', 'latex', ... + 'HorizontalAlignment', 'right', ... + 'VerticalAlignment', 'bottom', ... + 'Color', cols(m,:), ... + 'FontSize', 10); +end + +grid on; +xlabel('$L/L_c$', 'Interpreter', 'latex'); +ylabel('$\sigma_m$', 'Interpreter', 'latex'); +title(sprintf('MPI-induced PAM-4 level standard deviation, SIR = %d dB, ER = %g dB', SIR_dB, ER_dB)); +legend('Location', 'northwest', 'Interpreter', 'latex'); + +%% Plot 3: slope of level variance + +figure; hold on; + +plot(x_norm, slope_vs_index_analytic, ... + 'LineWidth', 2, ... + 'DisplayName', 'Analytic'); +bound_alpha =0.1; +[hl, hp] = boundedline(x_norm, avg_mc_slope, std_mc_slope, '-o', ... + 'alpha', ... + 'transparency', bound_alpha, ... + 'LineWidth', 1.2); +set(hl, 'DisplayName', 'Monte Carlo'); +set(hp, 'HandleVisibility', 'off'); + +grid on; +xlabel('$L/L_c$', 'Interpreter', 'latex'); +ylabel('Slope of level variance'); +title('MPI-induced variance slope'); +legend('Location', 'southeast'); + +%% +% mat2tikz_improved("C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\mpi\analytical_mpi_variance_per_level_v2.tikz"); \ No newline at end of file diff --git a/projects/Diss/MPI_revisit/calculate_and_store_std.m b/projects/Diss/MPI_revisit/calculate_and_store_std.m new file mode 100644 index 0000000..f86efb6 --- /dev/null +++ b/projects/Diss/MPI_revisit/calculate_and_store_std.m @@ -0,0 +1,135 @@ +function calculate_and_store_std() + + + db = DBHandler("type","mysql","dataBase",'labor'); + savePath = 'W:\labdata\ECOC Silas\ecoc_2025\'; + + fp = QueryFilter(); + M = 4; + % fp.where('Runs', 'pam_level','EQUALS', M); + % fp.where('Runs', 'symbolrate','EQUALS', 112e9); + fp.where('Runs', 'fiber_length','EQUALS', 0); + % fp.where('Runs', 'is_mpi','EQUALS', 1); + % fp.where('Runs','run_id','GREATER_EQUAL',3153); + fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"'); + + [dataTable, ~] = db.queryDB(fp, db.getTableFieldNames('Runs')); + + [~, uniqueIdx] = unique(dataTable.run_id); + dataTable = dataTable(uniqueIdx,:); + + nRuns = height(dataTable); + + std_levels = nan(M, nRuns); + mean_levels = nan(M, nRuns); + p = nan(2, nRuns); % p(1,:) slope, p(2,:) offset + + parfor i = 1:nRuns + + dataTable_ = dataTable(i,:); + run_id = dataTable_.run_id; + + if ~rawLevelStatsAreNaN(dataTable_) + fprintf('Skipped run_id %d (%d/%d): raw level stats already stored\n', run_id, i, nRuns); + continue + end + + fsym = dataTable_.symbolrate; + % Optional, only if needed later + % duob_mode = db_mode.(strrep(char(dataTable_.db_mode),'"','')); + + % Load TX symbols + try + Symbols_tmp = load(fullfile(savePath, char(dataTable_.tx_symbols_path))); + Symbols = Symbols_tmp.Symbols; + + + % Load RX raw signal + rxPath = char(dataTable_.rx_raw_path); + Scpe_tmp = load(fullfile(savePath, rxPath)); + Scpe_sig_raw = Scpe_tmp.Scpe_sig_raw; + + [separated_levels_sig, ~] = showLevelScatter(Scpe_sig_raw, Symbols, ... + "fsym", fsym, ... + "syncFs", 2*fsym, ... + "fignum", 400, ... + "normalize", true, ... + "debug_plots", false, ... + "showPlot", false); + + separated_levels_sig = flip(separated_levels_sig,1); + + std_i = std(separated_levels_sig, 0, 2, 'omitnan'); + mean_i = mean(separated_levels_sig, 2, 'omitnan'); + + db_local = DBHandler("type","mysql","dataBase",'labor'); + updateRawLevelStats(db_local, run_id, std_i, mean_i); + + fprintf('Added to db: run_id %d (%d/%d)\n', run_id, i, nRuns); + catch + fprintf('Failed run_id %d (%d/%d)\n', run_id, i, nRuns); + continue + end + + end + + + + %% + + for i = 1:nRuns + % Fit variance over empirical level means + p(:,i) = polyfit(mean_levels(:,i), std_levels(:,i), 1).'; + end + + var_slope = p(1,:).'; + var_offset = p(2,:).'; + +end + +function updateRawLevelStats(db, run_id, std_i, mean_i) + stdJson = escapeSqlString(jsonencode(std_i(:).')); + meanJson = escapeSqlString(jsonencode(mean_i(:).')); + + query = sprintf([ ... + 'UPDATE Runs ' ... + 'SET std_rawlevels = ''%s'', mean_rawlevels = ''%s'' ' ... + 'WHERE run_id = %d'], ... + stdJson, meanJson, run_id); + + db.executeSQL(query); +end + +function escaped = escapeSqlString(value) + escaped = strrep(char(value), '''', ''''''); +end + +function answer = rawLevelStatsAreNaN(runRow) + answer = isDbNaN(runRow.std_rawlevels) || isDbNaN(runRow.mean_rawlevels); +end + +function answer = isDbNaN(value) + if iscell(value) + if isempty(value) + answer = true; + return + end + value = value{1}; + end + + if isempty(value) + answer = true; + elseif isnumeric(value) + answer = isempty(value) || all(isnan(value), 'all'); + elseif isstring(value) || ischar(value) + value = strtrim(string(value)); + answer = value == "" || strcmpi(value, "NaN") || strcmpi(value, "null"); + else + try + answer = any(ismissing(value), 'all'); + catch + answer = false; + end + end +end + diff --git a/projects/Diss/MPI_revisit/investigate_database.m b/projects/Diss/MPI_revisit/investigate_database.m new file mode 100644 index 0000000..a39b629 --- /dev/null +++ b/projects/Diss/MPI_revisit/investigate_database.m @@ -0,0 +1,155 @@ + + +dsp_options.database_type = "mysql"; +dsp_options.dataBase = "labor"; +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, "port", dsp_options.port, ... + "user", dsp_options.user, "password", dsp_options.password); + +fp = QueryFilter(); +% fp.where('Runs', 'symbolrate','EQUALS', 112e9); +[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); + +%% TOTAL RUNS + +totalRuns = height(dataTable); + +%% Difference between "opti" and not opti (before and after run_id = 2661) + +fp = QueryFilter(); +fp.where('Runs','run_id','LESS_THAN',3153); +fp.where('Runs', 'db_mode','EQUALS', '"no_db"'); +% fp.where('Runs', 'interference_path_length','EQUALS', 300); +[dataTable_1,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); + +fp = QueryFilter(); +fp.where('Runs','run_id','GREATER_EQUAL',3153); +% fp.where('Runs', 'interference_path_length','EQUALS', 300); +[dataTable_2,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); + +%% prepare x/y and plotting without forcing datetime priority for x +% simplified: assume columns exist and no datetime special cases +xCol = 'symbolrate'; +yCol = 'v_awg'; + +% get x and y (fallback to NaN vectors of appropriate length) +if ismember(xCol, dataTable_1.Properties.VariableNames) + x1 = dataTable_1.(xCol); +else + x1 = NaN(height(dataTable_1),1); +end +if ismember(xCol, dataTable_2.Properties.VariableNames) + x2 = dataTable_2.(xCol); +else + x2 = NaN(height(dataTable_2),1); +end + +if ismember(yCol, dataTable_1.Properties.VariableNames) + y1 = dataTable_1.(yCol); +else + y1 = NaN(height(dataTable_1),1); +end +if ismember(yCol, dataTable_2.Properties.VariableNames) + y2 = dataTable_2.(yCol); +else + y2 = NaN(height(dataTable_2),1); +end + +% convert text to numeric where needed +toNum = @(v) double(string(v)); +if iscell(x1) || isstring(x1) || ischar(x1), x1 = toNum(x1); end +if iscell(x2) || isstring(x2) || ischar(x2), x2 = toNum(x2); end +if iscell(y1) || isstring(y1) || ischar(y1), y1 = toNum(y1); end +if iscell(y2) || isstring(y2) || ischar(y2), y2 = toNum(y2); end + +% simple scatter plots side-by-side +figure; +subplot(1,2,1); +scatter(x1, y1, 36, 'b', 'filled'); +xlabel(xCol); ylabel(yCol); title('dataTable\_1'); grid on; + +subplot(1,2,2); +scatter(x2, y2, 36, 'r', 'filled'); +xlabel(xCol); ylabel(yCol); title('dataTable\_2'); grid on; + +linkaxes(findall(gcf,'Type','axes'),'y'); + +%% Count interference path lengths by PAM and symbolrate + +pamCol = 'pam_level'; +iplCol = 'interference_path_length'; +rateCol = 'symbolrate'; +pamLevels = [2, 4, 6, 8]; + +% Current analysis uses only the post-opti/post-threshold runs. +% Use [dataTable_1; dataTable_2] here if the pre-threshold runs should be included. +allData = dataTable_2; + +requiredCols = {pamCol, iplCol, rateCol}; +missingCols = setdiff(requiredCols, allData.Properties.VariableNames); +if ~isempty(missingCols) + error('Missing required column(s): %s', strjoin(missingCols, ', ')); +end + +pam = double(string(allData.(pamCol))); +ipl = double(string(allData.(iplCol))); +symbolrate = double(string(allData.(rateCol))); + +validRows = ~isnan(pam) & ~isnan(ipl) & ~isnan(symbolrate); +iplValues = unique(ipl(validRows)); +symbolrateValues = unique(symbolrate(validRows)); + +if isempty(iplValues) || isempty(symbolrateValues) + error('No valid rows found for PAM/interference_path_length/symbolrate plotting.'); +end + +iplCategories = categorical(string(iplValues), string(iplValues), string(iplValues)); +symbolrateLabels = compose('%.0f GBd', symbolrateValues*1e-9); + +figure('Units', 'normalized', 'Position', [0.05 0.1 0.9 0.7]); +tiledlayout(1, 5, 'TileSpacing', 'compact', 'Padding', 'compact'); + +for k = 1:numel(pamLevels) + ax = nexttile; + pamMask = validRows & pam == pamLevels(k); + counts = zeros(numel(iplValues), numel(symbolrateValues)); + for rateIdx = 1:numel(symbolrateValues) + for iplIdx = 1:numel(iplValues) + counts(iplIdx, rateIdx) = sum(pamMask ... + & ipl == iplValues(iplIdx) ... + & symbolrate == symbolrateValues(rateIdx)); + end + end + + bar(ax, iplCategories, counts, 'stacked'); + xlabel(ax, 'interference\_path\_length'); + ylabel(ax, 'count'); + title(ax, sprintf('PAM %d', pamLevels(k))); + xtickangle(ax, 45); + grid(ax, 'on'); +end + +axAll = nexttile; +countsAll = zeros(numel(iplValues), numel(symbolrateValues)); +for rateIdx = 1:numel(symbolrateValues) + for iplIdx = 1:numel(iplValues) + countsAll(iplIdx, rateIdx) = sum(validRows ... + & ipl == iplValues(iplIdx) ... + & symbolrate == symbolrateValues(rateIdx)); + end +end + +bar(axAll, iplCategories, countsAll, 'stacked'); +xlabel(axAll, 'interference\_path\_length'); +ylabel(axAll, 'count'); +title(axAll, 'All PAMs'); +xtickangle(axAll, 45); +grid(axAll, 'on'); + +lgd = legend(axAll, symbolrateLabels, 'Location', 'eastoutside'); +title(lgd, 'symbolrate'); diff --git a/projects/Diss/MPI_revisit/investigate_mpi_algorithms.m b/projects/Diss/MPI_revisit/investigate_mpi_algorithms.m index 04fd076..ca17bf2 100644 --- a/projects/Diss/MPI_revisit/investigate_mpi_algorithms.m +++ b/projects/Diss/MPI_revisit/investigate_mpi_algorithms.m @@ -3,9 +3,9 @@ dsp_options = struct(); dsp_options.mode = "run_id"; dsp_options.recipe = @mpi_recipe_dev; dsp_options.append_to_db = false; -dsp_options.max_occurences = 3; dsp_options.start_occurence = 1; -dsp_options.debug_plots = true; +dsp_options.max_occurences = 10; +dsp_options.debug_plots = false; dsp_options.database_type = "mysql"; @@ -24,21 +24,21 @@ db = DBHandler("dataBase", [dsp_options.dataBase],... %% 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', 'EQUALS', 23); -% fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"'); +fp.where('Runs', 'sir', 'LESS_EQUAL', 30); +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', 'wavelength', 'EQUALS', 1310); -fp.where('Runs', 'v_bias', 'EQUALS', 2.65); +% fp.where('Runs', 'v_bias', 'EQUALS', 2.65); [dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); -[~, uniqueSirRows] = unique(dataTable.sir, "stable"); -dataTable = dataTable(uniqueSirRows, :); -% sort rows by sir (ascending) and extract run_ids +% [~, uniqueSirRows] = unique(dataTable.sir, "stable"); +% dataTable = dataTable(uniqueSirRows, :); + [~, sortIdx] = sort(dataTable.sir, 'descend'); dataTable = dataTable(sortIdx, :); run_ids = dataTable.run_id; @@ -50,27 +50,55 @@ end %% === Warehouse setup === dsp_options.userParameters = struct(); -dsp_options.userParameters.smoothing_length = logspace(1,5.5,5); - +% 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.parallel, ... +[results, wh] = submitJobs(run_ids, dsp_options, processingMode.serial, ... "wh", wh, ... "waitbar", true); %% Analyze storageNames = fieldnames(wh.sto); -x_vars = dsp_options.userParameters.smoothing_length; +x_vars = run_ids;%dsp_options.userParameters.smoothing_length; +x_vars = reshape(x_vars,1,[]); figure(2026);hold on for i = 1:numel(run_ids) disp(run_ids(i)) - result = wh.getStoValue(storageNames{1},x_vars); - ber = cellfun(@(packageCell) packageCell{1}.metrics.BER, result); - plot(x_vars,ber); - beautifyBERplot("logscale",true,"setcolors",true,"setmarkers",true); + result = wh.getStoValue(storageNames{1}, x_vars); + % Each cell in result is a cell array (packageCell) containing multiple packages. + % Extract BERs from all packages and, for example, average them per x_var. + ber_all = cellfun(@(packageCell) cellfun(@(pkg) pkg.metrics.BER, packageCell), result, 'UniformOutput', false); + % Convert to numeric matrix (rows = packages, cols = x_vars) by padding if needed + 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 + % Choose aggregation: mean across packages (ignore NaNs) + ber = mean(ber_mat, 1, 'omitnan'); + + + x = dataTable.sir; + y = ber; + + plot(x,ber); + scatter(x,ber_mat) + beautifyBERplot("logscale",true,"setcolors",false,"setmarkers",true); end + diff --git a/projects/Diss/MPI_revisit/investigate_results.m b/projects/Diss/MPI_revisit/investigate_results.m new file mode 100644 index 0000000..d7f01d1 --- /dev/null +++ b/projects/Diss/MPI_revisit/investigate_results.m @@ -0,0 +1,86 @@ +% === DSP settings === +dsp_options.database_type = "mysql"; +dsp_options.dataBase = "labor"; +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, "port", dsp_options.port, ... + "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', 300); +% fp.where('Runs', 'sir', 'EQUALS', 23); +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('mpi_superview')); +dataTable_save = dataTable; + +%% + +% No compensation method +dataTable = dataTable(dataTable.dc_buffer_len == 1, :); +dataTable = dataTable(dataTable.ffe_buffer_len == 1, :); +dataTable = dataTable(dataTable.smoothing_buffer_len == 0, :); +dataTable = dataTable(dataTable.smoothing_buffer_update == 0, :); +dataTable = dataTable(dataTable.DCmu == 0, :); + +% BER over SIR +plotTable = sortrows(dataTable, 'sir'); +validBer = ~isnan(plotTable.sir) & ~isnan(plotTable.BER) & plotTable.BER > 0 & plotTable.BER < 0.1; + +figure; +hold on; +scatter(plotTable.sir(validBer), plotTable.BER(validBer), 36, ... + 'filled', ... + 'DisplayName', 'BER'); + +xlabel('SIR [dB]'); +ylabel('BER'); +title(sprintf('BER over SIR (%d filtered rows)', height(dataTable))); +legend('Location', 'best'); +beautifyBERplot("setcolors", true, "setmarkers", true,"logscale",true,"polyfit",false); + +%% + + +% Any Value over SIR +varname = 'BER'; +groupvar = 'pam_level'; +requiredCols = {'sir', varname, groupvar}; +missingCols = setdiff(requiredCols, dataTable.Properties.VariableNames); +if ~isempty(missingCols) + error('Missing required column(s) for grouped plot: %s', strjoin(missingCols, ', ')); +end + +plotTable = sortrows(dataTable, 'sir'); +validline = ~isnan(plotTable.sir) ... + & ~isnan(plotTable.(varname)) ... + & ~isnan(plotTable.(groupvar));% & plotTable.BER > 0 & plotTable.BER < 0.1; +groupValues = unique(plotTable.(groupvar)(validline)); + +figure; +hold on; +for groupIdx = 1:numel(groupValues) + currentGroup = groupValues(groupIdx); + groupRows = validline & plotTable.(groupvar) == currentGroup; + + scatter(plotTable.sir(groupRows), plotTable.(varname)(groupRows), 36, ... + 'filled', ... + 'DisplayName', sprintf('PAM %g', currentGroup)); +end + +xlabel('SIR [dB]'); +ylabel(varname); +title(sprintf('%s over SIR grouped by %s (%d filtered rows)', varname, groupvar, height(dataTable))); +legend('Location', 'best'); +beautifyBERplot("setcolors", true, "setmarkers", true,"logscale",true,"polyfit",false); diff --git a/projects/Diss/MPI_revisit/plot_mpi_timesignal.m b/projects/Diss/MPI_revisit/plot_mpi_timesignal.m new file mode 100644 index 0000000..ec3462c --- /dev/null +++ b/projects/Diss/MPI_revisit/plot_mpi_timesignal.m @@ -0,0 +1,453 @@ + +% Diesen PLot habe ich in der Diss als Tabelle + +% Create a compact 3-column by 4-row MPI time-signal figure table in LaTeX. +% +% Use these plots from 04_Experimental_Evaluation/tikz/mpi/: +% - columns: SIR = 20 dB, 30 dB, 50 dB +% - rows: path length = 1 m, 20 m, 300 m, 1000 m +% - file pattern: mpi_timesignal_m__db.tikz +% +% Use a tabular layout with thin black table gridlines: +% - \arrayrulewidth = 0.2pt +% - \arrayrulecolor{black} +% - vertical and horizontal rules around all cells +% - rotated row labels for 1 m, 20 m, 300 m, 1000 m +% - center the rotated row labels vertically against the plot cells +% - use a dedicated left-column macro so the SIR 20 dB plots are slightly wider: +% - left column fwidth = 0.255\textwidth +% - inner columns fwidth = 0.240\textwidth +% - all fheight = 0.102\textheight +% +% For the TikZ plot files used in the table: +% - leftmost/SIR 20 dB plots keep the y-label: +% ylabel={Norm. Amplitude} +% - SIR 30 dB and 50 dB plots have no y-label: +% ylabel={} +% - SIR 30 dB and 50 dB plots hide y ticks: +% ytick=\empty +% - axis labels and tick labels use scriptsize: +% every axis/.append style={font=\scriptsize} +% xlabel style={font=\color{white!15!black}\scriptsize} +% ylabel style={font=\color{white!15!black}\scriptsize} +% - sigma annotation node boxes use tiny: +% \node[font=\tiny, ...] +% - node boxes: +% inner sep=0.5pt +% at (axis cs:10,...) +% sigma labels use normal math subscripts, e.g. $\sigma^2_2$, not $\sigma^2\_2$ +% - all plotted line widths and grid style widths were normalized as needed: +% addplot line width=1.0pt +% - grid should be visually off: +% remove xmajorgrids and ymajorgrids +% keep style definitions available: +% grid style={line width=0.4pt, solid, color=black!20} +% minor grid style={line width=0.2pt, solid, color=black!10} +% +% db = DBHandler("type","mysql","dataBase",'labor'); +% savePath = 'W:\labdata\ECOC Silas\ecoc_2025\'; + + +for sirval = [20,30,50] + for pathlen = [1,20,300,1000] + + fp = QueryFilter(); + % fp.where('Runs', 'run_id','EQUALS', 987); + M = 4; + fp.where('Runs', 'pam_level','EQUALS', M); + % fp.where('Runs', 'symbolrate','NOT_EQUAL', 112e9); + fp.where('Runs', 'fiber_length','EQUALS', 0); + fp.where('Runs', 'is_mpi','EQUALS', 1); + + fp.where('Runs', 'interference_path_length','EQUALS', pathlen); + % fp.where('Runs', 'loop_id','GREATER_THAN', 11); + + fp.where('Runs', 'sir','GREATER_EQUAL',sirval); + fp.where('Runs','run_id','GREATER_EQUAL',3153); + + % Sort results by SIR value ascending and reorder corresponding rows + [dataTable,sql_query] = db.queryDB(fp, db.getTableFieldNames('Runs')); + [~, idx] = sort(dataTable.sir, 'ascend', 'MissingPlacement', 'last'); + dataTable = dataTable(idx, :); + + dataTable = dataTable(1,:); + dataTable_ = dataTable; + [~, uniqueIdx] = unique(dataTable.run_id); % Get unique run_id indices + + % dataTable.SIR = -7 - round(dataTable.power_mpi_interference); + + fsym = dataTable.symbolrate; + M = double(dataTable_.pam_level); + duob_mode = db_mode.(strrep(char(dataTable_.db_mode),'"','')); + + Tx_signal = load([savePath, char(dataTable_.tx_signal_path),'.mat']); + Tx_signal = Tx_signal.Digi_sig; + + Tx_bits = load([savePath, char(dataTable_.tx_bits_path)]); + Tx_bits = Tx_bits.Bits; + Symbols_mapped = PAMmapper(M,0).map(Tx_bits); + Symbols_mapped.fs = dataTable_.symbolrate; + + Symbols = load([savePath, char(dataTable_.tx_symbols_path)]); + Symbols = Symbols.Symbols; + + Scpe_sig_raw = load([savePath, char(dataTable_.rx_raw_path(1))]); + Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw; + Scpe_sig_raw = Scpe_sig_raw.normalize("mode","rms"); + % Scpe_sig_raw.plot("displayname",['Scope Signal (Run ID: ',num2str(dataTable_.run_id)],"fignum",dataTable_.run_id,"clear",0); + % + % Scpe_sig_raw.spectrum("normalizeTo0dB",1); + + + disp(num2str(dataTable_.interference_path_length)); + + % Scpe_sig_raw.eye(dataTable.symbolrate,dataTable.pam_level); + + [separated_levels_sig, avg_sig, plotInfo] = showLevelScatter(Scpe_sig_raw, Symbols, ... + "fsym", fsym, ... + "syncFs", 2*fsym, ... + "fignum", sirval+pathlen, ... + "normalize", true, ... + "debug_plots", false, ... + "showPlot", true, ... + "showStdAnnotations", true, ... + "yLimits", [-2.5 2.5], ... + "xLimits",[0 25],... + "scatterAlpha", 0.25, ... + "scatterSize", 1, ... + "avgLineMaxPoints", 500, ... + "avgLineSmoothWindow", 5); + + title(sprintf("%d m, %d db", pathlen,sirval)); + + exportDir = "C:/Users/Silas/Documents/6971e0b65b380ca6d71c837f/04_Experimental_Evaluation/tikz/mpi"; + exportName = string(sprintf("mpi_timesignal_v2_%dm_%d_db", pathlen,sirval)); + pngFile = fullfile(exportDir, exportName + "-1.png"); + tikzFile = fullfile(exportDir, exportName + ".tikz"); + pngTikzPath = "04_Experimental_Evaluation/tikz/mpi/" + exportName + "-1.png"; + + figure(sirval + pathlen); + exportNakedPlotWithTikz(gca, pngFile, tikzFile, pngTikzPath, 150); + + end +end +%% + + + +% std_levels = std(separated_levels_sig,0,2,'omitnan'); +% mean_levels = mean(separated_levels_sig,2,'omitnan'); +% std_tot = std(Scpe_sig_raw.signal,0,1,'omitnan'); +% +% var_levels = std_levels.^2; +% p = polyfit(mean_levels, var_levels, 1); +% +% var_slope = p(1); +% var_offset = p(2);c + +function exportNakedPlotWithTikz(sourceAx, pngFile, tikzFile, pngTikzPath, resolutionDpi) +outputDir = fileparts(pngFile); +if ~exist(outputDir, "dir") + mkdir(outputDir); +end + +exportScatterLayerPng(sourceAx, pngFile, resolutionDpi); + +linePlots = collectTikzLinePlots(sourceAx); +textAnnotations = collectTikzTextAnnotations(sourceAx); +writeTikzPngAxis(tikzFile, pngTikzPath, sourceAx, linePlots, textAnnotations); +end + +function exportScatterLayerPng(sourceAx, pngFile, resolutionDpi) +sourceFig = ancestor(sourceAx, "figure"); +xLimits = sourceAx.XLim; +yLimits = sourceAx.YLim; +scatterHandles = findGraphicsObjectsByType(sourceAx, "scatter"); + +exportFig = figure( ... + "Visible", "off", ... + "Color", "white", ... + "Units", sourceFig.Units, ... + "Position", sourceFig.Position); +cleanupFigure = onCleanup(@() close(exportFig)); + +exportAx = copyobj(sourceAx, exportFig); +exportAx.Units = "normalized"; +exportAx.Position = [0 0 1 1]; +exportAx.XLim = xLimits; +exportAx.YLim = yLimits; +exportAx.XLimMode = "manual"; +exportAx.YLimMode = "manual"; +stripAxesToScatterOnly(exportAx); +hideAxesInkForRasterExport(exportAx); + +fprintf("Exporting scatter PNG with XLim=[%g %g], YLim=[%g %g], scatter objects=%d: %s\n", ... + xLimits(1), xLimits(2), yLimits(1), yLimits(2), numel(scatterHandles), pngFile); +drawnow; +exportFig.PaperPositionMode = "auto"; +print(exportFig, char(pngFile), "-dpng", sprintf("-r%d", resolutionDpi)); +end + +function stripAxesToScatterOnly(ax) +plotObjects = findall(ax); +for objIdx = 1:numel(plotObjects) + obj = plotObjects(objIdx); + if obj == ax || ~isvalid(obj) + continue + end + + objType = string(get(obj, "Type")); + if lower(objType) ~= "scatter" + delete(obj); + end +end +end + +function hideAxesInkForRasterExport(ax) +ax.Visible = "on"; +ax.Color = "white"; +ax.Box = "off"; +ax.XGrid = "off"; +ax.YGrid = "off"; +ax.XMinorGrid = "off"; +ax.YMinorGrid = "off"; +ax.XTick = []; +ax.YTick = []; +ax.XColor = "white"; +ax.YColor = "white"; +ax.Title.String = ""; +ax.XLabel.String = ""; +ax.YLabel.String = ""; +end + +function handles = findGraphicsObjectsByType(parentHandle, objectType) +allHandles = findall(parentHandle); +matches = false(size(allHandles)); +for handleIdx = 1:numel(allHandles) + currentHandle = allHandles(handleIdx); + if ~isvalid(currentHandle) + continue + end + + matches(handleIdx) = lower(string(get(currentHandle, "Type"))) == lower(string(objectType)); +end + +handles = allHandles(matches); +end + +function linePlots = collectTikzLinePlots(sourceAx) +lineHandles = findGraphicsObjectsByType(sourceAx, "line"); +lineHandles = flipud(lineHandles(:)); + +linePlots = repmat(struct( ... + "xData", [], ... + "yData", [], ... + "color", [], ... + "lineWidth", []), numel(lineHandles), 1); +validLineCount = 0; + +for lineIdx = 1:numel(lineHandles) + lineHandle = lineHandles(lineIdx); + xData = lineHandle.XData(:); + yData = lineHandle.YData(:); + validSamples = isfinite(xData) & isfinite(yData); + + if ~any(validSamples) + continue + end + + validLineCount = validLineCount + 1; + linePlots(validLineCount).xData = xData(validSamples); + linePlots(validLineCount).yData = yData(validSamples); + linePlots(validLineCount).color = lineHandle.Color; + linePlots(validLineCount).lineWidth = lineHandle.LineWidth; +end + +linePlots = linePlots(1:validLineCount); +end + +function textAnnotations = collectTikzTextAnnotations(sourceAx) +textHandles = findGraphicsObjectsByType(sourceAx, "text"); +textHandles = flipud(textHandles(:)); +xLimits = sourceAx.XLim; +yLimits = sourceAx.YLim; + +textAnnotations = repmat(struct( ... + "x", [], ... + "y", [], ... + "text", "", ... + "anchor", "center"), numel(textHandles), 1); +validTextCount = 0; + +for textIdx = 1:numel(textHandles) + textHandle = textHandles(textIdx); + labelText = string(textHandle.String); + if strlength(strtrim(labelText)) == 0 + continue + end + + textPosition = textHandle.Position; + if textPosition(1) < xLimits(1) || textPosition(1) > xLimits(2) || ... + textPosition(2) < yLimits(1) || textPosition(2) > yLimits(2) + continue + end + + validTextCount = validTextCount + 1; + textAnnotations(validTextCount).x = textPosition(1); + textAnnotations(validTextCount).y = textPosition(2); + textAnnotations(validTextCount).text = labelText; + textAnnotations(validTextCount).anchor = matlabTextAlignmentToTikzAnchor( ... + textHandle.HorizontalAlignment, textHandle.VerticalAlignment); +end + +textAnnotations = textAnnotations(1:validTextCount); +end + +function writeTikzPngAxis(tikzFile, pngTikzPath, sourceAx, linePlots, textAnnotations) +outputDir = fileparts(tikzFile); +if ~exist(outputDir, "dir") + mkdir(outputDir); +end + +xLimits = sourceAx.XLim; +yLimits = sourceAx.YLim; +fid = fopen(tikzFile, "w"); +if fid < 0 + error("plot_mpi_timesignal:TikzOpenFailed", ... + "Could not open TikZ export file: %s", tikzFile); +end +cleanupFile = onCleanup(@() fclose(fid)); + +axisOptions = { + " every axis/.append style={font=\scriptsize}," + "width=\fwidth," + "height=\fheight," + "at={(0\fwidth,0\fheight)}," + "scale only axis," + "axis on top," + "xmin=" + formatPgfNumber(xLimits(1)) + "," + "xmax=" + formatPgfNumber(xLimits(2)) + "," + "xlabel style={font=\color{white!15!black}\small}," + "xlabel={Time in $\mu$s}," + "ymin=" + formatPgfNumber(yLimits(1)) + "," + "ymax=" + formatPgfNumber(yLimits(2)) + "," + "ylabel style={font=\color{white!15!black}\small}," + "ylabel={Normalized Amplitude}," + "axis background/.style={fill=white}," + "xmajorgrids," + "ymajorgrids," + "grid style={line width=0.4pt, dotted, color=black!20}," + "scaled ticks=false," + "tick label style={/pgf/number format/fixed, /pgf/number format/1000 sep={}}," + "legend columns=1" + }; + +fprintf(fid, "%% This file was generated by plot_mpi_timesignal.m.\n"); +fprintf(fid, "%%\n"); +for lineIdx = 1:numel(linePlots) + fprintf(fid, "%s\n", formatTikzColorDefinition(lineIdx, linePlots(lineIdx).color)); +end +if ~isempty(linePlots) + fprintf(fid, "%%\n"); +end +fprintf(fid, "%s\n\n", "\begin{tikzpicture}"); +fprintf(fid, "%s\n", "\begin{axis}[%"); +for optionIdx = 1:numel(axisOptions) + fprintf(fid, "%s\n", axisOptions{optionIdx}); +end +fprintf(fid, "%s\n", "]"); + +graphicsLine = sprintf( ... + "\\addplot [forget plot] graphics [xmin=%s, xmax=%s, ymin=%s, ymax=%s] {%s};", ... + formatPgfNumber(xLimits(1)), ... + formatPgfNumber(xLimits(2)), ... + formatPgfNumber(yLimits(1)), ... + formatPgfNumber(yLimits(2)), ... + char(strrep(pngTikzPath, "\", "/"))); +fprintf(fid, "%s\n\n", graphicsLine); +writeTikzLinePlots(fid, linePlots); +writeTikzTextAnnotations(fid, textAnnotations); +fprintf(fid, "%s\n\n", "\end{axis}"); +fprintf(fid, "%s", "\end{tikzpicture}%"); +end + +function valueText = formatPgfNumber(value) +valueText = string(sprintf("%.15g", value)); +end + +function colorDefinition = formatTikzColorDefinition(colorIdx, rgbColor) +colorDefinition = sprintf( ... + "\\definecolor{mycolor%d}{rgb}{%.5f,%.5f,%.5f}%%", ... + colorIdx, rgbColor(1), rgbColor(2), rgbColor(3)); +end + +function writeTikzLinePlots(fid, linePlots) +for lineIdx = 1:numel(linePlots) + fprintf(fid, "\\addplot [color=mycolor%d, line width=%.1fpt, forget plot]\n", ... + lineIdx, linePlots(lineIdx).lineWidth); + fprintf(fid, " table[row sep=crcr]{%%\n"); + + for sampleIdx = 1:numel(linePlots(lineIdx).xData) + fprintf(fid, "%s\t%s\\\\\n", ... + formatPgfNumber(linePlots(lineIdx).xData(sampleIdx)), ... + formatPgfNumber(linePlots(lineIdx).yData(sampleIdx))); + end + + fprintf(fid, "};\n\n"); +end +end + +function writeTikzTextAnnotations(fid, textAnnotations) +for textIdx = 1:numel(textAnnotations) + fprintf(fid, "\\node[font=\\scriptsize, anchor=%s, fill=white, draw=black!40, rounded corners=2pt, inner sep=2pt]\n", ... + textAnnotations(textIdx).anchor); + fprintf(fid, " at (axis cs:%s,%s) {%s};\n\n", ... + formatPgfNumber(textAnnotations(textIdx).x), ... + formatPgfNumber(textAnnotations(textIdx).y), ... + escapeTikzText(textAnnotations(textIdx).text)); +end +end + +function anchor = matlabTextAlignmentToTikzAnchor(horizontalAlignment, verticalAlignment) +horizontalAlignment = string(horizontalAlignment); +verticalAlignment = string(verticalAlignment); + +if horizontalAlignment == "left" + horizontalAnchor = "west"; +elseif horizontalAlignment == "right" + horizontalAnchor = "east"; +else + horizontalAnchor = ""; +end + +if verticalAlignment == "top" + verticalAnchor = "north"; +elseif verticalAlignment == "bottom" + verticalAnchor = "south"; +else + verticalAnchor = ""; +end + +if strlength(horizontalAnchor) > 0 && strlength(verticalAnchor) > 0 + anchor = verticalAnchor + " " + horizontalAnchor; +elseif strlength(horizontalAnchor) > 0 + anchor = horizontalAnchor; +elseif strlength(verticalAnchor) > 0 + anchor = verticalAnchor; +else + anchor = "center"; +end +end + +function textOut = escapeTikzText(textIn) +textOut = char(textIn); +% textOut = strrep(textOut, "\", "\textbackslash{}"); +textOut = strrep(textOut, "{", "\{"); +textOut = strrep(textOut, "}", "\}"); +textOut = strrep(textOut, "%", "\%"); +textOut = strrep(textOut, "&", "\&"); +textOut = strrep(textOut, "#", "\#"); +textOut = strrep(textOut, "_", "\_"); +% textOut = strrep(textOut, "$", "\$"); +end + diff --git a/projects/Diss/MPI_revisit/verify_mpi_noise_power.m b/projects/Diss/MPI_revisit/verify_mpi_noise_power.m new file mode 100644 index 0000000..44598b5 --- /dev/null +++ b/projects/Diss/MPI_revisit/verify_mpi_noise_power.m @@ -0,0 +1,663 @@ +%% Investigate stored std values per PAM level +% Assumes mpi_superview contains: +% run_id, pam_level, sir, interference_path_length, std_rawlevels, mean_rawlevels +% std_rawlevels / mean_rawlevels stored as JSON arrays, e.g. [0.1,0.2,0.3,0.4] + +dsp_options.database_type = "mysql"; +dsp_options.dataBase = "labor"; +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, "port", dsp_options.port, ... + "user", dsp_options.user, "password", dsp_options.password); + + + + + +%% Query +fp = QueryFilter(); +% fp.where('Runs','run_id','GREATER_EQUAL',3153); +fp.where('Runs', 'fiber_length', 'EQUALS', 0); +fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"'); +fp.where('Runs', 'interference_path_length', 'NOT_EQUAL', 0); +fp.where('Runs', 'symbolrate', 'EQUALS', 112e9); +fp.where('Runs', 'pam_level','EQUALS', 4); +[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs')); + + +% Basic filtering + +% Keep only rows with available level statistics +valid = hasStoredLevelStats(dataTable); + +dataTable = dataTable(valid,:); + +% % Optional analysis filters +% dataTable = dataTable(dataTable.sir < 25, :); +% dataTable = dataTable(dataTable.pam_level == 4, :); + +nRuns = height(dataTable); +M = 8; + +std_levels = nan(M,nRuns); +mean_levels = nan(M,nRuns); +var_levels = nan(M,nRuns); +std_slope = nan(nRuns,1); +var_slope = nan(nRuns,1); +var_offset = nan(nRuns,1); +gamma = nan(nRuns,1); + +% Decode JSON arrays and compute variance slopes + +for i = 1:nRuns + + std_i = jsondecode(char(dataTable.std_rawlevels(i))); + mean_i = jsondecode(char(dataTable.mean_rawlevels(i))); + + std_i = std_i(:); + mean_i = mean_i(:); + + % Keep only valid entries + valid_i = isfinite(std_i) & isfinite(mean_i); + + if ~sum(valid_i) + continue + end + std_i = std_i(valid_i); + mean_i = mean_i(valid_i); + + % Sort by measured level mean + [mean_i, idx] = sort(mean_i, 'ascend'); + std_i = std_i(idx); + + var_i = std_i.^2; + + % Store + std_levels(1:numel(std_i),i) = std_i; + mean_levels(1:numel(mean_i),i) = mean_i; + var_levels(1:numel(var_i),i) = var_i; + + % 1) Fit variance over measured raw level mean + p_k = polyfit(mean_i, var_i, 1); + + % 2) Normalized x-axis slope, better cross-PAM comparable + x_i = (mean_i - min(mean_i)) ./ (max(mean_i) - min(mean_i)); + p_std = polyfit(x_i, std_i, 1); + std_slope(i) = p_std(1); + + var_slope(i) = p_k(1); + var_offset(i) = p_k(2); + + gamma(i) = std_i(end) / std_i(1); +end + +% Add calculated values to table +dataTable.var_slope_calc = var_slope; +dataTable.std_slope_calc = std_slope; +dataTable.var_offset_calc = var_offset; +dataTable.gamma_calc = gamma; + +dataTable.sir = -7 - dataTable.power_mpi_interference; + + + + +%% Plot 1: variance per level at fixed path length, grouped by PAM level + +% NICHT GENUTZT +path_length_filter = -1; +idx_path = dataTable.interference_path_length > path_length_filter; +pam_levels = unique(dataTable.pam_level(idx_path)); +cols = linspecer(numel(pam_levels)); +figure; hold on; +sir_values_plot = dataTable.sir(idx_path & isfinite(dataTable.sir)); +if isempty(sir_values_plot) + sir_limits = [0, 1]; +else + sir_limits = [min(sir_values_plot), max(sir_values_plot)]; +end +if diff(sir_limits) == 0 + sir_limits = sir_limits + [-0.5, 0.5]; +end +sir_cmap = cbrewer2('RdBu',256);%parula(256); +colormap(sir_cmap); +caxis(sir_limits); +mkr = ['+','o','*','square']; +for g = 1:numel(pam_levels) + + pamLevel = pam_levels(g); + idx_g = idx_path & dataTable.pam_level == pamLevel; + + mean_g = mean_levels(:,idx_g); + var_g = std_levels(:,idx_g); + run_sir_g = dataTable.sir(idx_g); + sir_g = repmat(dataTable.sir(idx_g).', M, 1); + run_id_g = repmat(dataTable.run_id(idx_g).', M, 1); + path_length_g = repmat(dataTable.interference_path_length(idx_g).', M, 1); + pam_level_g = repmat(dataTable.pam_level(idx_g).', M, 1); + + % Scatter all runs + hScatter = scatter(mean_g(:), var_g(:), 5, sir_g(:), ... + 'filled', ... + 'MarkerFaceAlpha', 0.55, ... + 'MarkerEdgeAlpha', 0.35, ... + 'HandleVisibility','off'); + + for runIdx = 1:5:size(mean_g, 2) + if isfinite(run_sir_g(runIdx)) + sirColorIdx = round(interp1(sir_limits, [1, size(sir_cmap,1)], run_sir_g(runIdx), 'linear', 'extrap')); + sirColorIdx = min(max(sirColorIdx, 1), size(sir_cmap,1)); + lineColor = sir_cmap(sirColorIdx,:); + else + lineColor = [0.5, 0.5, 0.5]; + end + + hLine = plot(mean_g(:,runIdx), var_g(:,runIdx), ... + 'LineWidth', 0.1, ... + 'LineStyle', '-', ... + 'Marker', 'none', ... + 'HandleVisibility', 'off'); + try + hLine.Color = [lineColor, 0.25]; + catch + hLine.Color = lineColor; + end + end + + hScatter.DataTipTemplate.DataTipRows(1).Label = 'mean level'; + hScatter.DataTipTemplate.DataTipRows(2).Label = 'variance'; + hScatter.DataTipTemplate.DataTipRows(3).Label = 'SIR'; + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('run id', run_id_g(:)); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('interference length', path_length_g(:)); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('pam_level', pam_level_g(:)); + + % Group mean curve + mean_level_g = mean(mean_g, 2, 'omitnan'); + mean_var_g = mean(var_g, 2, 'omitnan'); + + plot(mean_level_g, mean_var_g, '-o', ... + 'Color', [0,0,0], ... + 'LineWidth', 2, ... + 'MarkerFaceColor', cols(g,:), ... + 'MarkerEdgeColor', cols(g,:), ... + 'DisplayName', sprintf('PAM %.0f', pamLevel), 'MarkerSize', 5,'Marker','o'); +end + +grid on; +xlabel('Mean raw level'); +ylabel('Stored level variance'); +title(sprintf('Level variance at %.0f m path length, grouped by PAM level', path_length_filter)); +legend('Location','best'); +cb = colorbar; +ylabel(cb, 'SIR / dB'); + +%% Plot 1b: variance per level at fixed path length, grouped by SIR + +sir_filter_max_slope = 60; +idx_path_sir = idx_path ... + & isfinite(dataTable.sir) ... + & dataTable.sir < sir_filter_max_slope; + +sir_group_edges = [-inf,17.5 20, 22.5, 25, 30, 40, inf]; +sir_group_labels = {'SIR < 17.5 dB','17.5 < SIR < 20 dB', '20 < SIR < 22.5 dB','22.5 < SIR < 25 dB', '25 < SIR < 30 dB', '30 < SIR < 40 dB', sprintf('40 < SIR < %.0f dB', sir_filter_max_slope)}; +sir_group_cols = cbrewer2('RdBu',numel(sir_group_labels)); +pam_marker_styles = {'o','square','diamond','^','v','>','<','pentagram','hexagram'}; + +figure; hold on; +pam_levels_plot = unique(dataTable.pam_level(idx_path_sir)); +max_slope_lines = numel(sir_group_labels) * numel(pam_levels_plot); +slope_annotation_lines = cell(max_slope_lines, 1); +slope_annotation_idx = 0; +fit_line_x = cell(max_slope_lines, 1); +fit_line_y = cell(max_slope_lines, 1); +fit_line_color = cell(max_slope_lines, 1); +fit_line_label = cell(max_slope_lines, 1); +mean_point_x = cell(max_slope_lines, 1); +mean_point_y = cell(max_slope_lines, 1); +mean_point_marker = cell(max_slope_lines, 1); +fit_text_x = nan(max_slope_lines, 1); +fit_text_y = nan(max_slope_lines, 1); +fit_text_label = cell(max_slope_lines, 1); +fit_line_idx = 0; + +for sirGroupIdx = numel(sir_group_labels):-1:1 + idx_sir_group = idx_path_sir ... + & dataTable.sir > sir_group_edges(sirGroupIdx) ... + & dataTable.sir < sir_group_edges(sirGroupIdx+1); + + if ~any(idx_sir_group) + continue + end + + pam_levels_sir = unique(dataTable.pam_level(idx_sir_group)); + for pamIdx = 1:numel(pam_levels_sir) + pamLevel = pam_levels_sir(pamIdx); + idx_sir_pam = idx_sir_group & dataTable.pam_level == pamLevel; + markerStyle = pam_marker_styles{mod(pamIdx-1,numel(pam_marker_styles))+1}; + + mean_g = mean_levels(:,idx_sir_pam); + var_g = std_levels(:,idx_sir_pam); + sir_g = repmat(dataTable.sir(idx_sir_pam).', M, 1); + run_id_g = repmat(dataTable.run_id(idx_sir_pam).', M, 1); + path_length_g = repmat(dataTable.interference_path_length(idx_sir_pam).', M, 1); + pam_level_g = repmat(dataTable.pam_level(idx_sir_pam).', M, 1); + + hScatter = scatter(mean_g(:), var_g(:), 5, sir_group_cols(sirGroupIdx,:), markerStyle, ... + 'filled', ... + 'MarkerFaceAlpha', 0.25, ... + 'MarkerEdgeAlpha', 0.20, ... + 'HandleVisibility','off'); + + hScatter.DataTipTemplate.DataTipRows(1).Label = 'mean level'; + hScatter.DataTipTemplate.DataTipRows(2).Label = 'std'; + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('SIR', sir_g(:)); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('run id', run_id_g(:)); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('interference length', path_length_g(:)); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('pam_level', pam_level_g(:)); + + mean_level_g = mean(mean_g, 2, 'omitnan'); + mean_std_g = mean(var_g, 2, 'omitnan'); + valid_mean_curve = isfinite(mean_level_g) & isfinite(mean_std_g); + + if nnz(valid_mean_curve) >= 2 + p_mean_slope = polyfit(mean_level_g(valid_mean_curve), mean_std_g(valid_mean_curve), 1); + fit_x_g = linspace(min(mean_level_g(valid_mean_curve)), max(mean_level_g(valid_mean_curve)), 100); + fit_y_g = polyval(p_mean_slope, fit_x_g); + slope_text_g = strrep(sprintf('%.2f', p_mean_slope(1)), '.', ','); + label_x_g = fit_x_g(end); + label_y_g = fit_y_g(end); + else + fit_x_g = []; + fit_y_g = []; + slope_text_g = 'NaN'; + label_x_g = NaN; + label_y_g = NaN; + end + slope_annotation_idx = slope_annotation_idx + 1; + slope_annotation_lines{slope_annotation_idx} = sprintf('%s, PAM %.0f: %s', sir_group_labels{sirGroupIdx}, pamLevel, slope_text_g); + + fit_line_idx = fit_line_idx + 1; + mean_point_x{fit_line_idx} = mean_level_g; + mean_point_y{fit_line_idx} = mean_std_g; + mean_point_marker{fit_line_idx} = markerStyle; + fit_line_x{fit_line_idx} = fit_x_g; + fit_line_y{fit_line_idx} = fit_y_g; + fit_line_color{fit_line_idx} = sir_group_cols(sirGroupIdx,:); + fit_line_label{fit_line_idx} = sprintf('%s, PAM %.0f', sir_group_labels{sirGroupIdx}, pamLevel); + fit_text_x(fit_line_idx) = label_x_g; + fit_text_y(fit_line_idx) = label_y_g; + fit_text_label{fit_line_idx} = sprintf(' m=%s', slope_text_g); + end +end + +for lineIdx = 1:fit_line_idx + plot(mean_point_x{lineIdx}, mean_point_y{lineIdx}, ... + 'LineStyle', 'none', ... + 'Color', fit_line_color{lineIdx}, ... + 'Marker', 'x', ... + 'MarkerFaceColor', fit_line_color{lineIdx}, ... + 'MarkerEdgeColor', fit_line_color{lineIdx}, ... + 'HandleVisibility', 'off', ... + 'MarkerSize', 3); + + plot(fit_line_x{lineIdx}, fit_line_y{lineIdx}, '-', ... + 'Color', fit_line_color{lineIdx}, ... + 'LineWidth', 0.8, ... + 'DisplayName', fit_line_label{lineIdx}); + + text(fit_text_x(lineIdx), fit_text_y(lineIdx), fit_text_label{lineIdx}, ... + 'Color', fit_line_color{lineIdx}, ... + 'FontSize', 8, ... + 'VerticalAlignment', 'middle', ... + 'HorizontalAlignment', 'left', ... + 'Interpreter', 'none'); +end + +grid on; +xlabel('Mean raw level'); +ylabel('Stored level std'); +title(sprintf('Mean level-std curves at %.0f m path length, grouped by SIR and PAM level', path_length_filter)); +legend('Location','eastoutside'); +slope_annotation_lines = slope_annotation_lines(1:slope_annotation_idx); + + +%% Plot 2: slope vs interference path length + +figure; hold on; +valid = dataTable.interference_path_length > 0; +scatter(dataTable.interference_path_length(valid), dataTable.var_slope_calc(valid), ... + 45, dataTable.sir(valid), 'filled'); + +grid on; +xlabel('Interference path length / m'); +ylabel('Slope of level variance'); +title('Level-variance slope vs. interference path length'); +cb = colorbar; +ylabel(cb, 'SIR / dB'); + +%% Plot 3: + +figure; hold on; + +valid = dataTable.interference_path_length > 50; + +sir_group_edges = [-inf,20, 30, inf]; +for sirGroupIdx = 1:numel(sir_group_edges)-1 + idx_sir_group = validSlopeSir ... + & dataTable.sir > sir_group_edges(sirGroupIdx) ... + & dataTable.sir < sir_group_edges(sirGroupIdx+1)... + & dataTable.interference_path_length > 50; + + scatter(dataTable.sir(idx_sir_group), ... + dataTable.var_slope_calc(idx_sir_group), ... + 8, 'filled', ... + 'MarkerFaceColor', sir_group_cols(sirGroupIdx,:), ... + 'MarkerEdgeColor', sir_group_cols(sirGroupIdx,:), ... + 'MarkerFaceAlpha', 1, ... + 'MarkerEdgeAlpha', 1, ... + 'HandleVisibility','off'); +end + +set(gca, 'YScale', 'log'); +grid on; +xlabel('SIR'); +ylabel('Slope of level variance'); + + +%% Plot 4: + +sir_filter_max_slope = 60; +validSlopeSir = isfinite(dataTable.interference_path_length) ... + & isfinite(dataTable.var_slope_calc) ... + & isfinite(dataTable.sir) ... + & dataTable.sir < sir_filter_max_slope ... + & dataTable.interference_path_length > 0 ... + & dataTable.var_slope_calc > 0; + +path_lengths_slope = unique(dataTable.interference_path_length(validSlopeSir)); + +sir_group_edges = [-inf,20, 30, inf]; +sir_group_labels = {'SIR < 20 dB','20 < SIR < 30 dB', sprintf('30 < SIR < %.0f dB', sir_filter_max_slope)}; +tmp_cols = cbrewer2('RdBu', numel(sir_group_labels)+4); +% remove 4 colors from the middle to avoid the bright central colors +mid = ceil(size(tmp_cols,1)/2); +rm_idx = mid + (-1:2); % two before mid and two after (2x2 removal centered) +rm_idx = max(1,min(size(tmp_cols,1),rm_idx)); +tmp_cols(rm_idx,:) = []; +sir_group_cols = tmp_cols(1:numel(sir_group_labels),:); + + +figure(6);clf; hold on; + +% Plot raw values first. Use one single-color scatter object per SIR group +% so matlab2tikz does not need unsupported RGB scatter CData. +for sirGroupIdx = 1:numel(sir_group_labels) + idx_sir_group = validSlopeSir ... + & dataTable.sir > sir_group_edges(sirGroupIdx) ... + & dataTable.sir < sir_group_edges(sirGroupIdx+1); + + scatter(dataTable.interference_path_length(idx_sir_group), ... + dataTable.var_slope_calc(idx_sir_group), ... + 8, 'filled', ... + 'MarkerFaceColor', sir_group_cols(sirGroupIdx,:), ... + 'MarkerEdgeColor', sir_group_cols(sirGroupIdx,:), ... + 'MarkerFaceAlpha', 0.35, ... + 'MarkerEdgeAlpha', 0.35, ... + 'HandleVisibility','off'); +end + +% Plot grouped averages on top of the raw points. +for sirGroupIdx = 1:numel(sir_group_labels) + idx_sir_group = validSlopeSir ... + & dataTable.sir > sir_group_edges(sirGroupIdx) ... + & dataTable.sir < sir_group_edges(sirGroupIdx+1); + + mean_slope = nan(numel(path_lengths_slope),1); + + for g = 1:numel(path_lengths_slope) + idx_g = idx_sir_group ... + & dataTable.interference_path_length == path_lengths_slope(g); + slope_g = dataTable.var_slope_calc(idx_g); + slope_g = slope_g(isfinite(slope_g)); + if numel(slope_g) >= 3 + slope_g = slope_g(~isoutlier(slope_g, 'median')); + end + mean_slope(g) = mean(slope_g, 'omitnan'); + end + + valid_mean_slope = isfinite(mean_slope) & mean_slope > 0; + plot(path_lengths_slope(valid_mean_slope), mean_slope(valid_mean_slope), ... + '-o', ... + 'Color', sir_group_cols(sirGroupIdx,:), ... + 'MarkerFaceColor', sir_group_cols(sirGroupIdx,:), ... + 'MarkerEdgeColor', sir_group_cols(sirGroupIdx,:), ... + 'LineWidth', 1, ... + 'DisplayName', sir_group_labels{sirGroupIdx}); +end + +xlim([10,1000]) +ylim([0.006,0.1]) +set(gca, 'XScale', 'log'); +set(gca, 'YScale', 'log'); +grid on; +xlabel('Interference path length / m'); +ylabel('Mean slope of level variance'); +title(sprintf('Grouped level-variance slope vs. interference path length, SIR < %.0f dB', sir_filter_max_slope)); +xticks(path_lengths_slope); +xticklabels(compose('%.0f', path_lengths_slope)); +legend('Location','northwest'); +beautifyBERplot("setcolors",false) +% mat2tikz_improved('C:/Users/Silas/Documents/6971e0b65b380ca6d71c837f/04_Experimental_Evaluation/tikz/mpi/interference_path_len_vs_slope_logdomain.tikz'); + + +%% Optional: slope vs SIR sanity check + +figure; hold on; +sir_cmap = cbrewer2('RdBu',256); + +validSlopeCategory = isfinite(dataTable.interference_path_length) ... + & isfinite(dataTable.std_slope_calc) ... + & isfinite(dataTable.sir); +path_lengths_plot = unique(dataTable.interference_path_length(validSlopeCategory)); +sir_values_plot = dataTable.sir(validSlopeCategory); +if isempty(sir_values_plot) + sir_limits = [0, 1]; +else + sir_limits = [min(sir_values_plot), max(sir_values_plot)]; +end +if diff(sir_limits) == 0 + sir_limits = sir_limits + [-0.5, 0.5]; +end +colormap(sir_cmap); +caxis(sir_limits); +has_symbolrate = ismember('symbolrate', dataTable.Properties.VariableNames); + +for g = 1:numel(path_lengths_plot) + idx_g = validSlopeCategory ... + & dataTable.interference_path_length == path_lengths_plot(g); + n_g = sum(idx_g); + sir_g = dataTable.sir(idx_g); + slope_g = dataTable.var_slope_calc(idx_g); + run_id_g = dataTable.run_id(idx_g); + pam_level_g = dataTable.pam_level(idx_g); + if has_symbolrate + symbolrate_g = dataTable.symbolrate(idx_g); + else + symbolrate_g = nan(n_g,1); + end + + if n_g == 1 || range(sir_g) == 0 + x_g = g * ones(n_g,1); + else + x_g = g + 0.9 * ((sir_g - min(sir_g)) ./ range(sir_g) - 0.5); + end + + hScatter = scatter(x_g, slope_g, ... + 5, sir_g, 'filled', ... + 'DisplayName', sprintf('%.0f m', path_lengths_plot(g))); + hScatter.DataTipTemplate.DataTipRows(1).Label = 'interference path category'; + hScatter.DataTipTemplate.DataTipRows(2).Label = 'slope'; + hScatter.DataTipTemplate.DataTipRows(3).Label = 'SIR'; + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('run id', run_id_g); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('PAM format', pam_level_g); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('symbol rate', symbolrate_g); +end + +grid on; +xlabel('Interference path length / m'); +ylabel('Slope of level variance'); +title('Level-variance slope grouped by interference path length'); +xticks(1:numel(path_lengths_plot)); +xticklabels(compose('%.0f', path_lengths_plot)); +cb = colorbar; +ylabel(cb, 'SIR / dB'); + +%% Optional: 3D slope vs SIR by interference path length + +figure(7);clf; hold on; +sir_cmap_3d = cbrewer2('RdBu',256); + +validSlope3D = isfinite(dataTable.interference_path_length) ... + & isfinite(dataTable.var_slope_calc) ... + & isfinite(dataTable.sir); +path_lengths_3d = unique(dataTable.interference_path_length(validSlope3D)); +path_categories_3d = 0:numel(path_lengths_3d)-1; +sir_values_3d = dataTable.sir(validSlope3D); +if isempty(sir_values_3d) + sir_limits_3d = [0, 1]; +else + sir_limits_3d = [min(sir_values_3d), max(sir_values_3d)]; +end +if diff(sir_limits_3d) == 0 + sir_limits_3d = sir_limits_3d + [-0.5, 0.5]; +end +colormap(gca, sir_cmap_3d); +clim(sir_limits_3d); +has_symbolrate = ismember('symbolrate', dataTable.Properties.VariableNames); + +for g = 1:numel(path_lengths_3d) + idx_g = validSlope3D ... + & dataTable.interference_path_length == path_lengths_3d(g); + n_g = sum(idx_g); + sir_g = dataTable.sir(idx_g); + slope_g = dataTable.var_slope_calc(idx_g); + path_length_g = dataTable.interference_path_length(idx_g); + run_id_g = dataTable.run_id(idx_g); + pam_level_g = dataTable.pam_level(idx_g); + if has_symbolrate + symbolrate_g = dataTable.symbolrate(idx_g); + else + symbolrate_g = nan(n_g,1); + end + + path_category_g = path_categories_3d(g) * ones(n_g,1); + hScatter = scatter3(path_category_g, sir_g, slope_g, ... + 8, sir_g, 'filled', ... + 'DisplayName', sprintf('%.0f m', path_lengths_3d(g))); + hScatter.DataTipTemplate.DataTipRows(1).Label = 'interference path category'; + hScatter.DataTipTemplate.DataTipRows(2).Label = 'SIR'; + hScatter.DataTipTemplate.DataTipRows(3).Label = 'slope'; + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('interference path length', path_length_g); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('run id', run_id_g); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('PAM format', pam_level_g); + hScatter.DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('symbol rate', symbolrate_g); +end + +set(gca, 'XScale', 'lin'); +set(gca, 'YScale', 'lin'); +set(gca, 'ZScale', 'log'); +grid on; +box on; +xlabel('Interference path length / m'); +ylabel('SIR / dB'); +zlabel('Slope'); +title('Level-variance slope vs. SIR by interference path length'); +xticks(path_categories_3d); +xticklabels(compose('%.0f', path_lengths_3d)); +view([-35 20]); +cb = colorbar; +ylabel(cb, 'SIR / dB'); + + +%% + + + +sir_all = -7 - dataTable.power_mpi_interference; +% for i = 1:height(dataTable) +% sigma_all(i,:) = jsondecode(char(dataTable.std_rawlevels(i)))'; +% end +slope_var = dataTable.var_slope_calc; +slope_std = dataTable.std_slope_calc; +pl = dataTable.interference_path_length; +col = cbrewer2('RdBu',256); +% map path lengths to colormap indices +pl_unique = unique(pl(isfinite(pl))); +if isempty(pl_unique) + pl_idx = ones(size(pl)); +else + % normalize pl to [1, size(col,1)] + pl_norm = (pl - min(pl_unique)) ./ max(1, (max(pl_unique)-min(pl_unique))); + pl_idx = round(1 + pl_norm * (size(col,1)-1)); + pl_idx(~isfinite(pl_idx)) = 1; +end + +figure(); hold on; +% scatter slope_var colored by path length +for i = 1:numel(sir_all) + scatter(sir_all(i), slope_var(i), 30, col(pl_idx(i),:), '.', 'MarkerEdgeColor', col(pl_idx(i),:)); +end +% scatter slope_std colored by path length with different marker edge brightness +for i = 1:numel(sir_all) + scatter(sir_all(i), slope_std(i), 30, col(pl_idx(i),:), '.', 'MarkerEdgeColor', col(pl_idx(i),:)); +end +cb = colorbar; +colormap(col); +caxis([min(pl_unique), max(pl_unique)]); +ylabel(cb, 'Interference path length / m'); + +function valid = hasStoredLevelStats(dataTable) +valid = ~cellfun(@isempty, cellstr(string(dataTable.std_rawlevels))) & ... + ~cellfun(@isempty, cellstr(string(dataTable.mean_rawlevels))); +end + +function [stdLevels, meanLevels] = decodeStoredLevelStats(dataTable) +nRuns = height(dataTable); +numLevels = 0; +stdCells = cell(nRuns, 1); +meanCells = cell(nRuns, 1); + +for i = 1:nRuns + std_i = jsondecode(char(dataTable.std_rawlevels(i))); + mean_i = jsondecode(char(dataTable.mean_rawlevels(i))); + + std_i = std_i(:); + mean_i = mean_i(:); + + valid_i = isfinite(std_i) & isfinite(mean_i); + std_i = std_i(valid_i); + mean_i = mean_i(valid_i); + + [mean_i, idx] = sort(mean_i, 'ascend'); + std_i = std_i(idx); + + stdCells{i} = std_i; + meanCells{i} = mean_i; + numLevels = max(numLevels, numel(std_i)); +end + +stdLevels = nan(numLevels, nRuns); +meanLevels = nan(numLevels, nRuns); + +for i = 1:nRuns + std_i = stdCells{i}; + mean_i = meanCells{i}; + stdLevels(1:numel(std_i), i) = std_i; + meanLevels(1:numel(mean_i), i) = mean_i; +end +end + diff --git a/projects/ECOC_2025_MPI/load_signal_standalone.m b/projects/ECOC_2025_MPI/load_signal_standalone.m index b27238a..bf98730 100644 --- a/projects/ECOC_2025_MPI/load_signal_standalone.m +++ b/projects/ECOC_2025_MPI/load_signal_standalone.m @@ -7,19 +7,19 @@ fp = QueryFilter(); % fp.where('Runs', 'run_id','EQUALS', 987); M = 4; fp.where('Runs', 'pam_level','EQUALS', M); -fp.where('Runs', 'symbolrate','EQUALS', 112e9); +% fp.where('Runs', 'symbolrate','NOT_EQUAL', 112e9); fp.where('Runs', 'fiber_length','EQUALS', 0); fp.where('Runs', 'is_mpi','EQUALS', 1); fp.where('Runs', 'interference_path_length','EQUALS', 1000); % fp.where('Runs', 'loop_id','GREATER_THAN', 11); -fp.where('Runs', 'sir','EQUALS',20); - +fp.where('Runs', 'sir','LESS_EQUAL',20); +% fp.where('Runs','run_id','GREATER_EQUAL',3153); [dataTable,sql_query] = db.queryDB(fp, db.getTableFieldNames('Runs')); [~, uniqueIdx] = unique(dataTable.run_id); % Get unique run_id indices -dataTable.SIR = -7 - round(dataTable.power_mpi_interference); +% dataTable.SIR = -7 - round(dataTable.power_mpi_interference); %% for i = 1:size(dataTable,1) @@ -41,16 +41,29 @@ for i = 1:size(dataTable,1) Symbols = Symbols.Symbols; Scpe_sig_raw = load([savePath, char(dataTable_.rx_raw_path(1))]); - Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw.normalize("mode","rms"); + Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw; + % Scpe_sig_raw = Scpe_sig_raw.normalize("mode","rms"); Scpe_sig_raw.plot("displayname",['Scope Signal (Run ID: ',num2str(dataTable_.run_id)],"fignum",dataTable_.run_id,"clear",0); + Scpe_sig_raw.spectrum("normalizeTo0dB",1); + disp(num2str(dataTable_.interference_path_length)); - [sep_sig, avg_sig] = showLevelScatter(Scpe_sig_raw, Symbols, ... + [separated_levels_sig, avg_sig] = showLevelScatter(Scpe_sig_raw, Symbols, ... "fsym", fsym, ... "syncFs", 2*fsym, ... "fignum", 400, ... "normalize", true, ... - "debug_plots", false); - var(sep_sig,0,2,'omitnan') + "debug_plots", false,"showPlot",true,"showStdAnnotations",false,"yLimits",[-3 3]); + + std_levels = std(separated_levels_sig,0,2,'omitnan'); + mean_levels = mean(separated_levels_sig,2,'omitnan'); + std_tot = std(Scpe_sig_raw.signal,0,1,'omitnan'); + + var_levels = std_levels.^2; + p = polyfit(mean_levels, var_levels, 1); + + var_slope = p(1); + var_offset = p(2);c + end diff --git a/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m b/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m index 8941c82..06a8b70 100644 --- a/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m +++ b/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m @@ -4,43 +4,68 @@ % database_name = 'ecoc2025.db'; % database = DBHandler("pathToDB", [basePath, database_name],"type",'mysql'); -database = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192"); +% database = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192"); +% +% filterParams = database.tables; +% filterParams.Configurations = struct( ... +% 'symbolrate', 112e9, ... %[224,336,360,390,420,448] +% 'fiber_length', 0, ... +% 'db_mode', '"no_db"', ... +% 'interference_attenuation', [], ... +% 'interference_path_length', [], ... +% 'is_mpi', 1, ... +% 'pam_level', 4, ... +% 'wavelength', 1310, ... +% 'precomp_amp', -64, ... +% 'signal_attenuation', '0', ... +% 'v_awg', [], ... +% 'v_bias', [] ... +% ); +% +% % filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded); +% % filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle); +% +% selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'... +% 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ... +% 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ... +% 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'}; +% +% [dataTable,sql_query] = database.queryDB(filterParams, selectedFields); -filterParams = database.tables; -filterParams.Configurations = struct( ... - 'symbolrate', 112e9, ... %[224,336,360,390,420,448] - 'fiber_length', 0, ... - 'db_mode', '"no_db"', ... - 'interference_attenuation', [], ... - 'interference_path_length', [], ... - 'is_mpi', 1, ... - 'pam_level', 4, ... - 'wavelength', 1310, ... - 'precomp_amp', -64, ... - 'signal_attenuation', '0', ... - 'v_awg', [], ... - 'v_bias', [] ... - ); -% filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded); -% filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle); +%% -selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'... - 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ... - 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ... - 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'}; -[dataTable,sql_query] = database.queryDB(filterParams, selectedFields); +dsp_options = []; db = DBHandler("dataBase","labor","type","mysql","server","192.168.178.192","port",3306,"user","silas","password","silas"); + +fp = QueryFilter(); +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', 'EQUALS', 23); +% 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', 'wavelength', 'EQUALS', 1310); +% fp.where('Runs', 'v_bias', 'EQUALS', 2.65); + +[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('mpi_superview')); + +%% dataTable = cleanUpTable(dataTable); % Filter by time -startTime = datetime('2025-04-11 13:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); -stopTime = datetime('2025-04-11 14:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); -dataTable.date_of_run = datetime(dataTable.date_of_run, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSSSSS'); -dataTable.date_of_processing = datetime(dataTable.date_of_processing, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSSSSS'); -dataTable = dataTable(dataTable.date_of_processing > startTime, :); -dataTable = dataTable(dataTable.date_of_processing < stopTime, :); + +dataTable.date_of_run = datetime(dataTable.date_of_run, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +dataTable.date_of_processing = datetime(dataTable.date_of_processing, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); %.SSSSSS + +% startTime = datetime('2025-04-11 13:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +% stopTime = datetime('2025-04-11 14:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +% dataTable = dataTable(dataTable.date_of_processing > startTime, :); +% dataTable = dataTable(dataTable.date_of_processing < stopTime, :); + +%% % Group by smth y_var = 'SNR'; @@ -52,6 +77,7 @@ dataTableGrpd = groupIt(fixedVars,dataTable); plotRealizations = 1; +%% % Create a new figure mkr = 'x'; diff --git a/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m b/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m index 30b2657..01b1234 100644 --- a/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m +++ b/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m @@ -46,13 +46,17 @@ fn = [db.getTableFieldNames('mpi_superview')]; dataTable = cleanUpTable(dataTable); -% Filter by time -startTime = datetime('2025-04-11 13:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); -stopTime = datetime('2025-04-11 14:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); -dataTable.date_of_run = datetime(dataTable.date_of_run, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSSSSS'); -dataTable.date_of_processing = datetime(dataTable.date_of_processing, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSSSSS'); -dataTable = dataTable(dataTable.date_of_processing > startTime, :); -dataTable = dataTable(dataTable.date_of_processing < stopTime, :); + +%% Filter by time + +dataTable.date_of_run = datetime(dataTable.date_of_run, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +dataTable.date_of_processing = datetime(dataTable.date_of_processing, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); + +%% +% startTime = datetime('2025-04-11 13:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +% stopTime = datetime('2025-04-11 14:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); +% dataTable = dataTable(dataTable.date_of_processing > startTime, :); +% dataTable = dataTable(dataTable.date_of_processing < stopTime, :); % Group by smth y_var = 'BER'; @@ -62,6 +66,8 @@ loop_var = 'eq_id'; fixedVars = {'eq_id',loop_var}; dataTableGrpd = groupIt(fixedVars,dataTable); + +%% plotRealizations = 1; % Create a new figure diff --git a/workerError.mat b/workerError.mat index a9bdfa3b6c4b40e7645583c617cfe27b7190297c..d0ec0483ea3ffe6d1779cfc5e1f8fb60bac315d0 100644 GIT binary patch delta 1241 zcmV;~1Sb2T2!soeG#FQ9WFSg)Y#<;wATc;PF*Z6iI3O}GGB%M>BavVQk#uQ)qXYl| zc%1B6L2uML5O$V*rCULPBX9{fo`fn`3EoqML}_WIg)XnKt)4)Uf;aK*8WJapooc!5 zkt0Wr969n6`V%;EPu>}FOnc+MPG;w`Ik9s|jyJ|_JsB(H z^PIP^hyIUX7^29wrT#lbe==VxpVRyh<3AX);~pB*<7=|7&f6uQ2 zfHQj?A~1k-9U-y->|Q&52Fb9h*H=`z(qY6dyF#ZyaI>}AaRg?n@TY1$39n} zU?Yekji3K6ame?IA7c4zyJ$bbVxD}ktobA4X;W4IE05;F zWmofKw-PQ7gRad}iNi||O!}5fLpzEIb|?F!2$#G(IW{Bvt9>t9bK%m_{OBAeEL=NU-{73-kU+HaJnexGwxdHq|J*5ma2R_^?ET9kpV%N~@>Uik*>2c`e8;ahCAIy{8k*V{jc;(%H|`gVaSZAcrf2&%o&E3)Am`$A0v90ol(A<%4KnXa8WBIUoQ4vz1QQ DF1~&2 delta 883 zcmV-(1C0EH3!w;*G#E{9ZXil^ZXhx;ATc&NH8DCfH6SuDGB%M>BavVQk#uQ)Kmz~( zc%1DRO;6N7bXw}l5?lo}CY}f<4~7^|hKnqV8!)aC7tuqLGPJY16WVFhX$jmsdgSQQ zBS(IUKf$9%e}XfeDLY%*Eo_mG#FxBG-^{$%_t}}(24L_IfEpX78Pm(P4nV0Mb>2 zNDIdOK?JaaNQ8SBg}_6U!af2H>cQBJXawy&fXDz68##i4VL$d50|hOAKMau_VV{7` zn*$pK$)gQpia;*Z^QT8Z%c0e|X>itlUD8v^njuGB`Yv6sDeHH^Fy5)$+Bx(K6onef z_yZKjIn_mt^DAY4EoZ-KXI;(<`13l+Z-w8;;Wrfi2aKX{A923*622!Re1h&Yx85~Z zm$``LeHgy?qqZLtC$VFHvqaw0j66o$R;coPs6%)$2E*dzRj9Yzu2o>TO` z_Po6%^*wpsKUyh&J9ko0?YS}Wxh3C~$>Y0TDL((dXZhc=$>aH|QarAjZ*n^?hkufL zq=RW>`(9w7edxyQOtAO~5<$8*l)IzI&AXRp`>%`MtN9H!%a^r31=araeaB<;OM8Z* zz9Fx#1tW5df66~wqHorI&i`G%T6>@A`c=^Ce<$@mQRTlA Jhrj1cvIltvyNdt-