Simulation preps for high speed.

This commit is contained in:
Silas Oettinghaus
2025-11-14 11:45:13 +01:00
parent 0080cb2264
commit 888cbbd23e
9 changed files with 384 additions and 535 deletions

View File

@@ -1,6 +1,6 @@
% === SETTINGS ===
dsp_options.append_to_db = 1;
dsp_options.max_occurences = 2;
dsp_options.append_to_db = 0;
dsp_options.max_occurences = 15;
experiment = "highspeed_2024";
dsp_options.mode = "load_run_id"; % 'simulate' & 'load_files'
@@ -39,19 +39,19 @@ end
% === Get Run ID's ===
fp = QueryFilter();
% fp.where('Runs', 'run_id','EQUALS', 987);
% fp.where('Runs', 'run_id','EQUALS', 2776);
M = 4;
fp.where('Runs', 'pam_level','EQUALS', M);
fp.where('Runs', 'bitrate','EQUALS', 300e9);%360,390
% fp.where('Runs', 'bitrate','EQUALS', 300e9);%360,390
% fp.where('Runs', 'symbolrate','EQUALS', 195e9);
% fp.where('Runs', 'fiber_length','EQUALS', 1);
fp.where('Runs', 'is_mpi','EQUALS', 0);
fp.where('Runs', 'fiber_length','EQUALS', 2);
% fp.where('Runs', 'is_mpi','EQUALS', 0);
% fp.where('Runs', 'interference_path_length','EQUALS', 1000);
% fp.where('Runs', 'loop_id','GREATER_THAN', 11);
% fp.where('Runs', 'sir','EQUALS',18);
fp.where('Runs', 'wavelength','EQUAL', 1310);
fp.where('Runs', 'db_mode','EQUALS', 1);
% fp.where('Runs', 'rop_attenuation','EQUAL', 0);
fp.where('Runs', 'rop_attenuation','EQUAL', 0);
% fp.where('Runs', 'power_pd_in','GREATER_THAN', 7);
[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
@@ -72,203 +72,115 @@ wh.addStorage("mlmlse_package");
[results,wh] = submitJobs(dataTable.run_id(:), dsp_options, "serial", 'wh', wh, 'waitbar', true);
%%
results_db = results(dataTable.db_mode==1);
results_nodb = results(dataTable.db_mode==0);
%BER for ML based MLSE
for i = 1:length(results_db)
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.mlmlse_package);
[BER_MLMLSE_pre_emph(i), ~] = min(ber_m);
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_nodb{1,i}.mlmlse_package);
[BER_MLMLSE(i), ~] = min(ber_m);
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_nodb{1,i}.mlmlse_package);
[BER_MLMLSE(i), ~] = min(ber_m);
baudrate(i) = dataTable.symbolrate(i);
rop_db(i) = dataTable.power_rop((2*i)-1);
%% =========================================================================
% LOAD METADATA
% =========================================================================
[dataTable, ~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
results = results(:).'; % ensure row vector
N = numel(results);
% =========================================================================
% PREALLOCATE METRIC ARRAYS
% =========================================================================
BER_VNLE = nan(1,N);
BER_MLSE = nan(1,N);
BER_DB = nan(1,N);
BER_DB_PREC = nan(1,N);
BER_MLMLSE = nan(1,N);
BER_MLMLSE_PREC = nan(1,N);
% =========================================================================
% EXTRACT METRICS (ONE LOOP, ROBUST)
% =========================================================================
for i = 1:N
r = results{i};
% ---- VNLE (no-DB mode) ----
if isfield(r, 'vnle_package') && ~isempty(r.vnle_package)
pkg = r.vnle_package;
BER_VNLE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
end
% ---- Classical MLSE (DB mode) ----
if isfield(r, 'mlse_package') && ~isempty(r.mlse_package)
pkg = r.mlse_package;
BER_MLSE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
BER_MLSE_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
end
% ---- DB Target (DB mode) ----
if isfield(r, 'dbtgt_package') && ~isempty(r.dbtgt_package)
pkg = r.dbtgt_package;
BER_DB(i) = min(cellfun(@(c) c.metrics.BER, pkg));
BER_DB_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
end
% ---- ML-based MLSE (both modes) ----
if isfield(r, 'mlmlse_package') && ~isempty(r.mlmlse_package)
pkg = r.mlmlse_package;
% raw BER
BER_MLMLSE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
% precoded BER
if isfield(pkg{1}.metrics, 'BER_precoded')
BER_MLMLSE_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
end
end
end
figure(11);hold on
plot(sort(rop_db),sort(BER_MLMLSE_pre_emph))
plot(sort(rop_db),sort(BER_MLMLSE))
beautifyBERplot
%% =========================================================================
% METADATA (ALWAYS INDEX-ALIGNED WITH RESULTS)
% =========================================================================
bitrate = dataTable.bitrate(:).';
baudrate = dataTable.symbolrate(:).';
%%
results_db = results(dataTable.db_mode==1);
results_nodb = results(dataTable.db_mode==0);
rop_atten = dataTable.rop_attenuation(2:2:end).';
rop_pre = dataTable.power_rop(1:2:end).';
rop = dataTable.power_rop(2:2:end).';
for i = 1:numel(results_nodb)
% =========================================================================
% PLOT STYLE
% =========================================================================
STYLE_BASE = 2;
MARKER_SIZE = STYLE_BASE;
LINE_WIDTH = max(2, STYLE_BASE/3);
% VNLE (from results_nodb)
gmi_v = cellfun(@(c) c.metrics.GMI, results_nodb{1,i}.vnle_package);
ber_v = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.vnle_package);
air_v = cellfun(@(c) c.metrics.AIR, results_nodb{1,i}.vnle_package);
snr_v = cellfun(@(c) c.metrics.SNR, results_nodb{1,i}.vnle_package);
[BER_VNLE(i), idx_ber] = min(ber_v);
GMI_VNLE(i) = gmi_v(idx_ber);
AIR_VNLE(i) = air_v(idx_ber);
SNR_VNLE(i) = max(snr_v);
idx_gmi_min_vnle(i) = find(gmi_v == min(gmi_v), 1);
idx_air_max_vnle(i) = find(air_v == max(air_v), 1);
cols = cbrewer2('Paired', 8);
% MLSE (from results_db)
gmi_m = cellfun(@(c) c.metrics.GMI, results_db{1,i}.mlse_package);
ber_m = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.mlse_package);
air_m = cellfun(@(c) c.metrics.AIR, results_db{1,i}.mlse_package);
[BER_MLSE(i), idx_ber] = min(ber_m);
GMI_MLSE(i) = gmi_m(idx_ber);
AIR_MLSE(i) = air_m(idx_ber);
idx_gmi_min_mlse(i) = find(gmi_m == min(gmi_m), 1);
idx_air_max_mlse(i) = find(air_m == max(air_m), 1);
cm.VNLE = cols(1,:);
cm.MLSE = cols(2,:);
cm.DB_PREC = cols(3,:);
cm.DB = cols(4,:);
cm.ML_MLSE = cols(6,:);
% DB (from results_db, BER_precoded)
gmi_db = cellfun(@(c) c.metrics.GMI, results_db{1,i}.dbtgt_package);
ber_db = cellfun(@(c) c.metrics.BER, results_db{1,i}.dbtgt_package);
ber_db_prec = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.dbtgt_package);
air_db = cellfun(@(c) c.metrics.AIR, results_db{1,i}.dbtgt_package);
[BER_DB(i), idx_ber] = min(ber_db);
[BER_DB_PREC(i), idx_ber] = min(ber_db_prec);
mk = @(col,shape) {'Marker',shape,'MarkerFaceColor',col,'MarkerEdgeColor',col,'MarkerSize',MARKER_SIZE};
GMI_DB(i) = gmi_db(idx_ber);
AIR_DB(i) = air_db(idx_ber);
idx_gmi_min_db(i) = find(gmi_db == min(gmi_db), 1);
idx_air_max_db(i) = find(air_db == max(air_db), 1);
%BER for ML based MLSE
ber_m = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.mlmlse_package);
[BER_MLMLSE(i), idx_ber] = min(ber_m);
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.mlmlse_package);
[BER_MLMLSE_PREC(i), idx_ber] = min(ber_m);
% metadata
bitrate(i) = dataTable.bitrate(i);
baudrate(i) = dataTable.symbolrate(i);
rop_atten(i) = dataTable.rop_attenuation(2*i);
rop_pre(i) = dataTable.power_rop((2*i)-1);
rop(i) = dataTable.power_rop((2*i));
end
%%
STYLE_BASE = 2; % adjust this single number to scale markers & lines
MARKER_SIZE = STYLE_BASE; % marker size (MATLAB MarkerSize)
LINE_WIDTH = max(2, STYLE_BASE/3); % line width (keeps lines reasonable when STYLE_BASE large)
% --- color map / method -> color assignment (keeps colors consistent) ---
cols = cbrewer2('Paired',8);
cols = linspecer(6);
d = 0;
cm.VNLE = cols(1 + d, :);
cm.MLSE = cols(2 + d, :);
cm.DB_precode = cols(3 + d, :);
cm.DB = cols(4 + d, :); % duobinary
cm.ML_MLSE = cols(6 + d, :);
% prepare x values in GBd
xGHz = baudrate .* 1e-9;
xticks_vals = xGHz;
xtick_labels = arrayfun(@(v) sprintf('%d', round(v)), xticks_vals, 'UniformOutput', false);
% common marker settings (filled, same face+edge color)
mk.VNLE = {'Marker','o','MarkerFaceColor',cm.VNLE,'MarkerEdgeColor',cm.VNLE,'MarkerSize',MARKER_SIZE};
mk.MLSE = {'Marker','*','MarkerFaceColor',cm.MLSE,'MarkerEdgeColor',cm.MLSE,'MarkerSize',MARKER_SIZE};
mk.DB_precode = {'Marker','^','MarkerFaceColor',cm.DB_precode,'MarkerEdgeColor',cm.DB_precode,'MarkerSize',MARKER_SIZE};
mk.DB = {'Marker','d','MarkerFaceColor',cm.DB,'MarkerEdgeColor',cm.DB,'MarkerSize',MARKER_SIZE};
mk.ML_MLSE = {'Marker','^','MarkerFaceColor',cm.ML_MLSE,'MarkerEdgeColor',cm.ML_MLSE,'MarkerSize',MARKER_SIZE};
% ---------------- FIGURE : BER ----------------
% =========================================================================
% FIGURE 1: BER vs BAUDRATE
% =========================================================================
figure(112+M); clf; hold on;
plot(xGHz, BER_VNLE, ...
'DisplayName','VNLE', ...
mk.VNLE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
plot(xGHz, BER_MLSE, ...
'DisplayName','MLSE', ...
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
plot(xGHz, BER_DB_PREC, ...
'DisplayName','Diff. Precode + DB tgt.', ...
mk.DB{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB);
plot(xGHz, BER_MLMLSE_PREC, ...
'DisplayName','ML-based MLSE (L=2)', ...
mk.ML_MLSE{:}, 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.ML_MLSE);
xGHz = baudrate * 1e-9;
plot(xGHz, BER_VNLE, 'DisplayName','VNLE', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
plot(xGHz, BER_MLSE, 'DisplayName','MLSE', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
% plot(xGHz, BER_MLSE_PREC, 'DisplayName','MLSE', 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
plot(xGHz, BER_DB_PREC, 'DisplayName','Diff. Precode + DB', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB_PREC);
plot(xGHz, BER_MLMLSE_PREC, 'DisplayName','ML-based MLSE', 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.ML_MLSE);
yline(2e-2,'LineWidth',1,'HandleVisibility','off');
yline(4.85e-3,'LineWidth',1,'HandleVisibility','off');
yline(2.2e-4,'LineWidth',1,'HandleVisibility','off');
xlabel('Baudrate in GBd');
ylabel('BER');
set(gca, 'yscale', 'log');
set(gca, 'XTick', xticks_vals(1:end), 'XTickLabel', xtick_labels(1:end));
grid on;
legend('Location','best');
beautifyBERplot
%%
%%
STYLE_BASE = 2; % adjust this single number to scale markers & lines
MARKER_SIZE = STYLE_BASE; % marker size (MATLAB MarkerSize)
LINE_WIDTH = max(2, STYLE_BASE/3); % line width (keeps lines reasonable when STYLE_BASE large)
% --- color map / method -> color assignment (keeps colors consistent) ---
cols = cbrewer2('Paired',8);
cols = linspecer(6);
d = 0;
cm.VNLE = cols(1 + d, :);
cm.MLSE = cols(2 + d, :);
cm.DB_precode = cols(3 + d, :);
cm.DB = cols(4 + d, :); % duobinary
cm.ML_MLSE = cols(6 + d, :);
% prepare x values in GBd
xdbm = flip(sort(rop));
xticks_vals = xdbm;
xtick_labels = arrayfun(@(v) sprintf('%d', round(v)), xticks_vals, 'UniformOutput', false);
% common marker settings (filled, same face+edge color)
mk.VNLE = {'Marker','o','MarkerFaceColor',cm.VNLE,'MarkerEdgeColor',cm.VNLE,'MarkerSize',MARKER_SIZE};
mk.MLSE = {'Marker','*','MarkerFaceColor',cm.MLSE,'MarkerEdgeColor',cm.MLSE,'MarkerSize',MARKER_SIZE};
mk.DB_precode = {'Marker','^','MarkerFaceColor',cm.DB_precode,'MarkerEdgeColor',cm.DB_precode,'MarkerSize',MARKER_SIZE};
mk.DB = {'Marker','d','MarkerFaceColor',cm.DB,'MarkerEdgeColor',cm.DB,'MarkerSize',MARKER_SIZE};
mk.ML_MLSE = {'Marker','^','MarkerFaceColor',cm.ML_MLSE,'MarkerEdgeColor',cm.ML_MLSE,'MarkerSize',MARKER_SIZE};
% ---------------- FIGURE : BER ----------------
figure(112+M); clf; hold on;
plot(flip(sort(rop)), sort(BER_VNLE), ...
'DisplayName','VNLE', ...
mk.VNLE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
plot(flip(sort(rop)), sort(BER_MLSE), ...
'DisplayName','MLSE', ...
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
plot(flip(sort(rop)), sort(BER_MLSE), ...
'DisplayName','MLSE', ...
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
plot(flip(sort(rop_pre)), sort(BER_DB_PREC), ...
'DisplayName','Diff. Precode + DB tgt.', ...
mk.DB{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB);
plot(flip(sort(rop_pre)), sort(BER_MLMLSE_PREC), ...
'DisplayName','ML-based MLSE Diff. Prec. (L=2)', ...
mk.ML_MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.ML_MLSE);
plot(flip(sort(rop_pre)), sort(BER_MLMLSE), ...
'DisplayName','ML-based MLSE (L=2)', ...
mk.ML_MLSE{:}, 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.DB_precode);
yline(2e-2,'LineWidth',1,'HandleVisibility','off');
yline(4.85e-3,'LineWidth',1,'HandleVisibility','off');
yline(2.2e-4,'LineWidth',1,'HandleVisibility','off');
xlabel('ROP in dBm');
ylabel('BER');
set(gca, 'yscale', 'log');
% set(gca, 'XTick', xticks_vals(1:end), 'XTickLabel', xtick_labels(1:end));
grid on;
legend('Location','best');
beautifyBERplot
%%
set(gca, 'YScale', 'log'); grid on; legend('Location','best');
% beautifyBERplot;
@@ -283,7 +195,10 @@ beautifyBERplot
% ---------------- FIGURE 15 : GMI ----------------
%% ---------------- FIGURE 15 : GMI ----------------
figure(113+M); clf; hold on;
plot(xGHz, GMI_VNLE, ...
'DisplayName','VNLE', ...

View File

@@ -5,16 +5,16 @@ db = DBHandler("dataBase", [dataBase], "type", database_type);
M = 4;
fp = QueryFilter();
% fp.where('Runs', 'run_id','EQUALS', 987);
% fp.where('Runs', 'pam_level','EQUALS', M);
fp.where('Runs', 'pam_level','EQUALS', M);
% fp.where('Runs', 'symbolrate','EQUALS', 165e9); %150, 165, 180, 195, 210, 225, 240
% fp.where('Runs', 'fiber_length','EQUALS', 10);
fp.where('Runs', 'fiber_length','EQUALS', 10);
% fp.where('Runs', 'is_mpi','EQUALS', 0);
% fp.where('Runs', 'power_pd_in','GREATER_THAN', 7);
% fp.where('Runs', 'interference_path_length','EQUALS', 1000);
% fp.where('Runs', 'loop_id','GREATER_THAN', 11);
% fp.where('Runs', 'sir','EQUALS',18);
% fp.where('Runs', 'wavelength','EQUALS', 1310);
fp.where('Runs', 'db_mode','EQUALS', 2); % 0 == high preemphasis // 1 == low preemphasis
fp.where('Runs', 'wavelength','EQUALS', 1310);
fp.where('Runs', 'db_mode','EQUALS', 1); % 0 == high preemphasis // 1 == low preemphasis
% fp.where('Runs', 'rop_attenuation','EQUALS', 0);
fields = db.getTableFieldNames('power_state_info');
@@ -25,15 +25,15 @@ fields = [fields; db.getTableFieldNames('dashboard_ungrouped_new')];
cfg = struct;
cfg.x_axis = 'symbolrate'; % 'symbolrate' | 'bitrate' | 'wavelength'
cfg.y_axis = 'BER'; % 'BER' | 'GMI' | 'AIR' | ...
cfg.group_by = {'wavelength'};
cfg.filters = struct('is_mpi',0,'pam_level',M,'equalizer_structure',[equalizer_structure.vnle_db_mlse]);%,equalizer_structure.ffe,equalizer_structure.vnle_pf_mlse,equalizer_structure.vnle_db_mlse,equalizer_structure.dfe]);
cfg.group_by = {'wavelength','equalizer_structure','pre_emph'};
cfg.filters = struct('is_mpi',0,'pam_level',M,'equalizer_structure',[equalizer_structure.ml_mlse,equalizer_structure.vnle,equalizer_structure.vnle_pf_mlse,equalizer_structure.vnle_db_mlse,equalizer_structure.dfe]);
cfg.y_scale = 'auto'; % auto -> log for BER*, linear otherwise
cfg.outlier = 'mad'; % simple, robust; 'none' or 'pctl' also available
cfg.show_raw = true;
cfg.show_spread = 'iqr'; % 'none' or 'iqr'
cfg.show_spread = 'none'; % 'none' or 'iqr'
cfg.agg = 'mean'; % or 'median'
cfg.show_precoded = 0;
cfg.show_precoded = 1;
cfg.fec_lines = [2.2e-4 4.85e-3 2e-2]; % optional
% New styling knobs
@@ -46,4 +46,6 @@ cfg.plot.scatterAlpha = 0.35;
cfg.plot.legendLocation = 'best';
cfg.plot.fecLineWidth = 2.4; % thicker FEC limits
plot_measurements_gpt(dataTable, cfg);
plot_measurements_gpt(dataTable, cfg);
% beautifyBERplot()