diff --git a/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.json b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.json new file mode 100644 index 000000000..6eaa8700d --- /dev/null +++ b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.json @@ -0,0 +1,739 @@ +{ + "hazard": "jax_pdip_nnls_nonconvergence", + "issue": "PyAutoLabs/PyAutoArray#571", + "generator": "autolens_profiling/scripts/imaging/hazards/mge_nnls_capture.py", + "date": "2026-09-24", + "model": "SLaM source_lp[1]: lens 2x20 MGE (sigma_min=pixel_scale/10) + source 20 MGE, free Isothermal + ExternalShear", + "dataset": "dataset/imaging/hst (mask 3.5 arcsec, radial over-sampling 4/2/2)", + "n_vectors": 48, + "seed": 1, + "box_half_width": 0.005, + "linear_columns": 60, + "solver_calls_per_likelihood": 1, + "versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "jax": "0.10.2", + "shas": { + "PyAutoArray": "7fa8d2714f", + "PyAutoGalaxy": "70a61e26cd", + "PyAutoLens": "86054bbc19", + "PyAutoFit": "a736840127" + } + }, + "device": "cpu:0", + "x64": true, + "counts": { + "unconverged_cap50": 14, + "unconverged_cap200": 5, + "log_likelihood_mismatch_gt_0p1": 14 + }, + "fixture_systems": [ + { + "key": 0, + "vector_index": 8, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -968061.2033273038 + }, + { + "key": 1, + "vector_index": 12, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -968856.398412642 + }, + { + "key": 2, + "vector_index": 23, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -969680.0402964512 + }, + { + "key": 3, + "vector_index": 28, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -969253.3251651743 + }, + { + "key": 4, + "vector_index": 36, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -964607.8550560902 + }, + { + "key": 5, + "vector_index": 37, + "category": "cap50_hit_converges_by_200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 1, + "pdip_iter_200": 195, + "objective_fnnls": -962812.9803829335 + }, + { + "key": 6, + "vector_index": 9, + "category": "cap50_hit_converges_by_200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 1, + "pdip_iter_200": 183, + "objective_fnnls": -967982.4459179591 + }, + { + "key": 7, + "vector_index": 26, + "category": "healthy", + "converged_50": 1, + "pdip_iter_50": 19, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_fnnls": -971415.3808369517 + } + ], + "rows": [ + { + "i": 0, + "log_likelihood_jax": 17796.588466372756, + "log_likelihood_numpy": 17796.588466372912, + "objective_fnnls": -964993.925680303, + "fnnls_n_positive": 22, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964993.925680303, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964993.925680303 + }, + { + "i": 1, + "log_likelihood_jax": 15583.421384265592, + "log_likelihood_numpy": 15583.421384266629, + "objective_fnnls": -962833.87086696, + "fnnls_n_positive": 23, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -962833.8708669603, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -962833.8708669603 + }, + { + "i": 2, + "log_likelihood_jax": -1.2633863797279752e+72, + "log_likelihood_numpy": 15848.502950758946, + "objective_fnnls": -963043.8430699409, + "fnnls_n_positive": 26, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 5.283555868491576e+64, + "converged_200": 1, + "pdip_iter_200": 143, + "objective_pdip_200": -963043.8430699409 + }, + { + "i": 3, + "log_likelihood_jax": 16988.632226608104, + "log_likelihood_numpy": 16988.632226609057, + "objective_fnnls": -964221.5712585532, + "fnnls_n_positive": 24, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964221.5712585534, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964221.5712585534 + }, + { + "i": 4, + "log_likelihood_jax": 19631.872692225024, + "log_likelihood_numpy": 19631.872692225494, + "objective_fnnls": -966805.5812423597, + "fnnls_n_positive": 22, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966805.5812423598, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966805.5812423598 + }, + { + "i": 5, + "log_likelihood_jax": 17385.44540432511, + "log_likelihood_numpy": 17392.556206209407, + "objective_fnnls": -964617.990860789, + "fnnls_n_positive": 27, + "converged_50": 1, + "pdip_iter_50": 39, + "objective_pdip_50": -964617.9908607892, + "converged_200": 1, + "pdip_iter_200": 39, + "objective_pdip_200": -964617.9908607892 + }, + { + "i": 6, + "log_likelihood_jax": 18626.985760225212, + "log_likelihood_numpy": 18626.985760225776, + "objective_fnnls": -965832.1449571181, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965832.1449571182, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965832.1449571182 + }, + { + "i": 7, + "log_likelihood_jax": 17664.82936137729, + "log_likelihood_numpy": 17664.829361378303, + "objective_fnnls": -964900.5991456762, + "fnnls_n_positive": 24, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964900.5991456764, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964900.5991456764 + }, + { + "i": 8, + "log_likelihood_jax": -1605370.9976337324, + "log_likelihood_numpy": 20864.621702607812, + "objective_fnnls": -968061.2033273038, + "fnnls_n_positive": 26, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 71911418.74985881, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 9, + "log_likelihood_jax": -1266715.150834104, + "log_likelihood_numpy": 20753.33560572409, + "objective_fnnls": -967982.4459179591, + "fnnls_n_positive": 22, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 1.602578703920426e+98, + "converged_200": 1, + "pdip_iter_200": 183, + "objective_pdip_200": -967982.445917959 + }, + { + "i": 10, + "log_likelihood_jax": 16442.72500934333, + "log_likelihood_numpy": 16442.725009343398, + "objective_fnnls": -963672.7469087103, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963672.7469087103, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963672.7469087103 + }, + { + "i": 11, + "log_likelihood_jax": 21012.56455457415, + "log_likelihood_numpy": 21012.56455457474, + "objective_fnnls": -968232.0450505874, + "fnnls_n_positive": 26, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -968232.0450505876, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -968232.0450505876 + }, + { + "i": 12, + "log_likelihood_jax": -213232.32446249557, + "log_likelihood_numpy": 21659.581360635166, + "objective_fnnls": -968856.398412642, + "fnnls_n_positive": 23, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": null, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 13, + "log_likelihood_jax": 13089.038373677242, + "log_likelihood_numpy": 13089.038373678202, + "objective_fnnls": -960306.8355710665, + "fnnls_n_positive": 22, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -960306.8355710667, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -960306.8355710667 + }, + { + "i": 14, + "log_likelihood_jax": 19099.409029285693, + "log_likelihood_numpy": 19099.409029286115, + "objective_fnnls": -966321.3094293209, + "fnnls_n_positive": 25, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966321.3094293207, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966321.3094293207 + }, + { + "i": 15, + "log_likelihood_jax": 18230.34252646718, + "log_likelihood_numpy": 18230.34252646816, + "objective_fnnls": -965486.0474200151, + "fnnls_n_positive": 23, + "converged_50": 1, + "pdip_iter_50": 32, + "objective_pdip_50": -965486.0474200151, + "converged_200": 1, + "pdip_iter_200": 32, + "objective_pdip_200": -965486.0474200151 + }, + { + "i": 16, + "log_likelihood_jax": 19397.413854700564, + "log_likelihood_numpy": 19397.413854700702, + "objective_fnnls": -966612.0106144757, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 14, + "objective_pdip_50": -966612.0106144754, + "converged_200": 1, + "pdip_iter_200": 14, + "objective_pdip_200": -966612.0106144754 + }, + { + "i": 17, + "log_likelihood_jax": 17917.8571189343, + "log_likelihood_numpy": 17917.857118934808, + "objective_fnnls": -965157.5458405592, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965157.5458405593, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965157.5458405593 + }, + { + "i": 18, + "log_likelihood_jax": 23915.26182703184, + "log_likelihood_numpy": 23915.261827031947, + "objective_fnnls": -971120.5362626247, + "fnnls_n_positive": 24, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -971120.5362626249, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -971120.5362626249 + }, + { + "i": 19, + "log_likelihood_jax": 18060.677023270342, + "log_likelihood_numpy": 18060.677023271, + "objective_fnnls": -965312.7323925456, + "fnnls_n_positive": 24, + "converged_50": 1, + "pdip_iter_50": 34, + "objective_pdip_50": -965312.7323925459, + "converged_200": 1, + "pdip_iter_200": 34, + "objective_pdip_200": -965312.7323925459 + }, + { + "i": 20, + "log_likelihood_jax": 21594.121670972407, + "log_likelihood_numpy": 21594.121670972898, + "objective_fnnls": -968834.9880518581, + "fnnls_n_positive": 20, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -968834.9880518581, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -968834.9880518581 + }, + { + "i": 21, + "log_likelihood_jax": -194957.0638911858, + "log_likelihood_numpy": 17088.676404784506, + "objective_fnnls": -964320.6774239056, + "fnnls_n_positive": 23, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -478268.836379013, + "converged_200": 1, + "pdip_iter_200": 120, + "objective_pdip_200": -964320.677423905 + }, + { + "i": 22, + "log_likelihood_jax": 19521.822972103397, + "log_likelihood_numpy": 19521.82297210349, + "objective_fnnls": -966761.2141538234, + "fnnls_n_positive": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966761.2141538236, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966761.2141538236 + }, + { + "i": 23, + "log_likelihood_jax": -1.09951956150616e+53, + "log_likelihood_numpy": 22443.251578641917, + "objective_fnnls": -969680.0402964512, + "fnnls_n_positive": 25, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 3383015.610899511, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 24, + "log_likelihood_jax": 17681.857694987084, + "log_likelihood_numpy": 17681.857694987608, + "objective_fnnls": -964929.3535227887, + "fnnls_n_positive": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964929.3535227884, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964929.3535227884 + }, + { + "i": 25, + "log_likelihood_jax": 22608.147012427766, + "log_likelihood_numpy": 22608.14701242786, + "objective_fnnls": -969854.0041124715, + "fnnls_n_positive": 23, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -969854.0041124715, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -969854.0041124715 + }, + { + "i": 26, + "log_likelihood_jax": 24167.758921399156, + "log_likelihood_numpy": 24167.75892139937, + "objective_fnnls": -971415.3808369517, + "fnnls_n_positive": 27, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -971415.3808369514, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -971415.3808369514 + }, + { + "i": 27, + "log_likelihood_jax": 20633.584642775415, + "log_likelihood_numpy": 20633.584642775582, + "objective_fnnls": -967867.1623021923, + "fnnls_n_positive": 23, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -636272.6455135276, + "converged_200": 1, + "pdip_iter_200": 72, + "objective_pdip_200": -967867.1623021924 + }, + { + "i": 28, + "log_likelihood_jax": -1.2880688419023687e+140, + "log_likelihood_numpy": 22028.45854349596, + "objective_fnnls": -969253.3251651743, + "fnnls_n_positive": 23, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 2.7413943546914318e+138, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": 2620252470289228.5 + }, + { + "i": 29, + "log_likelihood_jax": 19311.635475013773, + "log_likelihood_numpy": 19311.63547501427, + "objective_fnnls": -966526.5606209968, + "fnnls_n_positive": 27, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966526.5606209968, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966526.5606209968 + }, + { + "i": 30, + "log_likelihood_jax": -846247.1410328501, + "log_likelihood_numpy": 22851.53652345582, + "objective_fnnls": -970100.3787900353, + "fnnls_n_positive": 25, + "converged_50": 1, + "pdip_iter_50": 48, + "objective_pdip_50": -970100.378790035, + "converged_200": 1, + "pdip_iter_200": 48, + "objective_pdip_200": -970100.378790035 + }, + { + "i": 31, + "log_likelihood_jax": 14299.468107693967, + "log_likelihood_numpy": 14299.468107694414, + "objective_fnnls": -961541.261932633, + "fnnls_n_positive": 20, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -961541.2619326331, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -961541.2619326331 + }, + { + "i": 32, + "log_likelihood_jax": -453318.781934955, + "log_likelihood_numpy": 22396.980981205765, + "objective_fnnls": -969618.7453371203, + "fnnls_n_positive": 28, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -449183.50059971726, + "converged_200": 1, + "pdip_iter_200": 80, + "objective_pdip_200": -969618.7453371204 + }, + { + "i": 33, + "log_likelihood_jax": 19136.931491217463, + "log_likelihood_numpy": 19136.931491218435, + "objective_fnnls": -966402.5047963525, + "fnnls_n_positive": 23, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966402.5047963527, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966402.5047963527 + }, + { + "i": 34, + "log_likelihood_jax": 15864.841504951124, + "log_likelihood_numpy": 15864.84150495191, + "objective_fnnls": -963092.5485702187, + "fnnls_n_positive": 25, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963092.5485702193, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963092.5485702193 + }, + { + "i": 35, + "log_likelihood_jax": 18352.73069356705, + "log_likelihood_numpy": 18352.73069356713, + "objective_fnnls": -965585.3036975699, + "fnnls_n_positive": 20, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965585.30369757, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965585.30369757 + }, + { + "i": 36, + "log_likelihood_jax": -799419.2279182562, + "log_likelihood_numpy": 17435.071636742046, + "objective_fnnls": -964607.8550560902, + "fnnls_n_positive": 25, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 56913092.08182, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 37, + "log_likelihood_jax": -2.4884300492029222e+126, + "log_likelihood_numpy": 15584.618222380628, + "objective_fnnls": -962812.9803829335, + "fnnls_n_positive": 22, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 66171042.48442658, + "converged_200": 1, + "pdip_iter_200": 195, + "objective_pdip_200": -962812.9803829336 + }, + { + "i": 38, + "log_likelihood_jax": 21902.39288079377, + "log_likelihood_numpy": 21902.392880794345, + "objective_fnnls": -969149.5527512308, + "fnnls_n_positive": 20, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 630091.8539000177, + "converged_200": 1, + "pdip_iter_200": 76, + "objective_pdip_200": -969149.5527512305 + }, + { + "i": 39, + "log_likelihood_jax": 17877.882906365274, + "log_likelihood_numpy": 17877.882906365707, + "objective_fnnls": -965102.5327589812, + "fnnls_n_positive": 22, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965102.532758981, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965102.532758981 + }, + { + "i": 40, + "log_likelihood_jax": 14177.419739965979, + "log_likelihood_numpy": 14177.419739966648, + "objective_fnnls": -961352.3929829081, + "fnnls_n_positive": 20, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -961352.3929829078, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -961352.3929829078 + }, + { + "i": 41, + "log_likelihood_jax": 20057.81825658519, + "log_likelihood_numpy": 20057.81825658551, + "objective_fnnls": -967309.6898867099, + "fnnls_n_positive": 23, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -967309.6898867099, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -967309.6898867099 + }, + { + "i": 42, + "log_likelihood_jax": 21909.20510489, + "log_likelihood_numpy": 21909.205104890007, + "objective_fnnls": -969157.5521467926, + "fnnls_n_positive": 20, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -722773.1228347446, + "converged_200": 1, + "pdip_iter_200": 71, + "objective_pdip_200": -969157.5521467929 + }, + { + "i": 43, + "log_likelihood_jax": 18711.87588646273, + "log_likelihood_numpy": 18711.8758864633, + "objective_fnnls": -965904.8037930101, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965904.8037930096, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965904.8037930096 + }, + { + "i": 44, + "log_likelihood_jax": -206742.6254038103, + "log_likelihood_numpy": 16472.592008715277, + "objective_fnnls": -963631.8618560513, + "fnnls_n_positive": 24, + "converged_50": 1, + "pdip_iter_50": 37, + "objective_pdip_50": -963631.8618560517, + "converged_200": 1, + "pdip_iter_200": 37, + "objective_pdip_200": -963631.8618560517 + }, + { + "i": 45, + "log_likelihood_jax": 16410.404048061668, + "log_likelihood_numpy": 16410.40404806228, + "objective_fnnls": -963615.8628159417, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963615.8628159418, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963615.8628159418 + }, + { + "i": 46, + "log_likelihood_jax": 15793.705823217253, + "log_likelihood_numpy": 15793.705823218355, + "objective_fnnls": -962999.9490921487, + "fnnls_n_positive": 21, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -962999.9490921492, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -962999.9490921492 + }, + { + "i": 47, + "log_likelihood_jax": -377889.19271909795, + "log_likelihood_numpy": 13232.245936724983, + "objective_fnnls": -960464.1839266493, + "fnnls_n_positive": 22, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -133934.5331908604, + "converged_200": 1, + "pdip_iter_200": 79, + "objective_pdip_200": -960464.1839266492 + } + ] +} diff --git a/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.npz b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.npz new file mode 100644 index 000000000..a97768290 Binary files /dev/null and b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1.npz differ diff --git a/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1_postfix.json b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1_postfix.json new file mode 100644 index 000000000..52215d60d --- /dev/null +++ b/results/hazards/component/mge/nnls_capture_slam_hst_v2026.8.17.1_postfix.json @@ -0,0 +1,839 @@ +{ + "hazard": "jax_pdip_nnls_nonconvergence", + "issue": "PyAutoLabs/PyAutoArray#571", + "generator": "autolens_profiling/scripts/imaging/hazards/mge_nnls_capture.py", + "date": "2026-09-24", + "model": "SLaM source_lp[1]: lens 2x20 MGE (sigma_min=pixel_scale/10) + source 20 MGE, free Isothermal + ExternalShear", + "dataset": "dataset/imaging/hst (mask 3.5 arcsec, radial over-sampling 4/2/2)", + "n_vectors": 48, + "seed": 1, + "box_half_width": 0.005, + "linear_columns": 60, + "solver_calls_per_likelihood": 1, + "library_preconditioning": "raw", + "versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "jax": "0.10.2", + "shas": { + "PyAutoArray": "9d223748eb", + "PyAutoGalaxy": "70a61e26cd", + "PyAutoLens": "86054bbc19", + "PyAutoFit": "a736840127" + } + }, + "device": "cpu:0", + "x64": true, + "counts": { + "unconverged_cap50": 14, + "unconverged_cap200": 5, + "log_likelihood_mismatch_gt_0p1": 0, + "log_likelihood_mismatch_gt_1e-6": 0, + "library_unconverged": 0, + "max_abs_log_likelihood_diff": 5.557849362958223e-07 + }, + "fixture_systems": [ + { + "key": 0, + "vector_index": 8, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -968061.2033273038 + }, + { + "key": 1, + "vector_index": 12, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -968856.398412642 + }, + { + "key": 2, + "vector_index": 23, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -969680.0402964512 + }, + { + "key": 3, + "vector_index": 28, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -969253.3251651743 + }, + { + "key": 4, + "vector_index": 36, + "category": "never_converges_cap200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_fnnls": -964607.8550560902 + }, + { + "key": 5, + "vector_index": 37, + "category": "cap50_hit_converges_by_200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 1, + "pdip_iter_200": 195, + "objective_fnnls": -962812.9803829335 + }, + { + "key": 6, + "vector_index": 9, + "category": "cap50_hit_converges_by_200", + "converged_50": 0, + "pdip_iter_50": 50, + "converged_200": 1, + "pdip_iter_200": 183, + "objective_fnnls": -967982.4459179591 + }, + { + "key": 7, + "vector_index": 26, + "category": "healthy", + "converged_50": 1, + "pdip_iter_50": 19, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_fnnls": -971415.3808369517 + } + ], + "rows": [ + { + "i": 0, + "log_likelihood_jax": 17796.588466351233, + "log_likelihood_numpy": 17796.588466372912, + "objective_fnnls": -964993.925680303, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964993.925680303, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964993.925680303 + }, + { + "i": 1, + "log_likelihood_jax": 15583.421384313438, + "log_likelihood_numpy": 15583.421384266629, + "objective_fnnls": -962833.87086696, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -962833.8708669603, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -962833.8708669603 + }, + { + "i": 2, + "log_likelihood_jax": 15848.502951146813, + "log_likelihood_numpy": 15848.502950758946, + "objective_fnnls": -963043.8430699409, + "fnnls_n_positive": 26, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 5.283555868491576e+64, + "converged_200": 1, + "pdip_iter_200": 143, + "objective_pdip_200": -963043.8430699409 + }, + { + "i": 3, + "log_likelihood_jax": 16988.632226603193, + "log_likelihood_numpy": 16988.632226609057, + "objective_fnnls": -964221.5712585532, + "fnnls_n_positive": 24, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964221.5712585534, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964221.5712585534 + }, + { + "i": 4, + "log_likelihood_jax": 19631.872692205045, + "log_likelihood_numpy": 19631.872692225494, + "objective_fnnls": -966805.5812423597, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966805.5812423598, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966805.5812423598 + }, + { + "i": 5, + "log_likelihood_jax": 17392.55620625483, + "log_likelihood_numpy": 17392.556206209407, + "objective_fnnls": -964617.990860789, + "fnnls_n_positive": 27, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 39, + "objective_pdip_50": -964617.9908607892, + "converged_200": 1, + "pdip_iter_200": 39, + "objective_pdip_200": -964617.9908607892 + }, + { + "i": 6, + "log_likelihood_jax": 18626.985760214004, + "log_likelihood_numpy": 18626.985760225776, + "objective_fnnls": -965832.1449571181, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965832.1449571182, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965832.1449571182 + }, + { + "i": 7, + "log_likelihood_jax": 17664.829361369615, + "log_likelihood_numpy": 17664.829361378303, + "objective_fnnls": -964900.5991456762, + "fnnls_n_positive": 24, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964900.5991456764, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964900.5991456764 + }, + { + "i": 8, + "log_likelihood_jax": 20864.62170259432, + "log_likelihood_numpy": 20864.621702607812, + "objective_fnnls": -968061.2033273038, + "fnnls_n_positive": 26, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 71911418.74985881, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 9, + "log_likelihood_jax": 20753.33560572424, + "log_likelihood_numpy": 20753.33560572409, + "objective_fnnls": -967982.4459179591, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 1.602578703920426e+98, + "converged_200": 1, + "pdip_iter_200": 183, + "objective_pdip_200": -967982.445917959 + }, + { + "i": 10, + "log_likelihood_jax": 16442.725009318823, + "log_likelihood_numpy": 16442.725009343398, + "objective_fnnls": -963672.7469087103, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963672.7469087103, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963672.7469087103 + }, + { + "i": 11, + "log_likelihood_jax": 21012.56455458551, + "log_likelihood_numpy": 21012.56455457474, + "objective_fnnls": -968232.0450505874, + "fnnls_n_positive": 26, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -968232.0450505876, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -968232.0450505876 + }, + { + "i": 12, + "log_likelihood_jax": 21659.581360624587, + "log_likelihood_numpy": 21659.581360635166, + "objective_fnnls": -968856.398412642, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": null, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 13, + "log_likelihood_jax": 13089.03837339353, + "log_likelihood_numpy": 13089.038373678202, + "objective_fnnls": -960306.8355710665, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -960306.8355710667, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -960306.8355710667 + }, + { + "i": 14, + "log_likelihood_jax": 19099.40902928817, + "log_likelihood_numpy": 19099.409029286115, + "objective_fnnls": -966321.3094293209, + "fnnls_n_positive": 25, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966321.3094293207, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966321.3094293207 + }, + { + "i": 15, + "log_likelihood_jax": 18230.342525912376, + "log_likelihood_numpy": 18230.34252646816, + "objective_fnnls": -965486.0474200151, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 16, + "converged_50": 1, + "pdip_iter_50": 32, + "objective_pdip_50": -965486.0474200151, + "converged_200": 1, + "pdip_iter_200": 32, + "objective_pdip_200": -965486.0474200151 + }, + { + "i": 16, + "log_likelihood_jax": 19397.413854691586, + "log_likelihood_numpy": 19397.413854700702, + "objective_fnnls": -966612.0106144757, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 15, + "converged_50": 1, + "pdip_iter_50": 14, + "objective_pdip_50": -966612.0106144754, + "converged_200": 1, + "pdip_iter_200": 14, + "objective_pdip_200": -966612.0106144754 + }, + { + "i": 17, + "log_likelihood_jax": 17917.85711893063, + "log_likelihood_numpy": 17917.857118934808, + "objective_fnnls": -965157.5458405592, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 16, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965157.5458405593, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965157.5458405593 + }, + { + "i": 18, + "log_likelihood_jax": 23915.26182701424, + "log_likelihood_numpy": 23915.261827031947, + "objective_fnnls": -971120.5362626247, + "fnnls_n_positive": 24, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -971120.5362626249, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -971120.5362626249 + }, + { + "i": 19, + "log_likelihood_jax": 18060.677023253433, + "log_likelihood_numpy": 18060.677023271, + "objective_fnnls": -965312.7323925456, + "fnnls_n_positive": 24, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 34, + "objective_pdip_50": -965312.7323925459, + "converged_200": 1, + "pdip_iter_200": 34, + "objective_pdip_200": -965312.7323925459 + }, + { + "i": 20, + "log_likelihood_jax": 21594.121670965138, + "log_likelihood_numpy": 21594.121670972898, + "objective_fnnls": -968834.9880518581, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -968834.9880518581, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -968834.9880518581 + }, + { + "i": 21, + "log_likelihood_jax": 17088.676404986898, + "log_likelihood_numpy": 17088.676404784506, + "objective_fnnls": -964320.6774239056, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -478268.836379013, + "converged_200": 1, + "pdip_iter_200": 120, + "objective_pdip_200": -964320.677423905 + }, + { + "i": 22, + "log_likelihood_jax": 19521.822972073307, + "log_likelihood_numpy": 19521.82297210349, + "objective_fnnls": -966761.2141538234, + "fnnls_n_positive": 19, + "library_converged": 1, + "library_iterations": 16, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966761.2141538236, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966761.2141538236 + }, + { + "i": 23, + "log_likelihood_jax": 22443.251578647694, + "log_likelihood_numpy": 22443.251578641917, + "objective_fnnls": -969680.0402964512, + "fnnls_n_positive": 25, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 3383015.610899511, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 24, + "log_likelihood_jax": 17681.857694966413, + "log_likelihood_numpy": 17681.857694987608, + "objective_fnnls": -964929.3535227887, + "fnnls_n_positive": 19, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -964929.3535227884, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -964929.3535227884 + }, + { + "i": 25, + "log_likelihood_jax": 22608.14701243126, + "log_likelihood_numpy": 22608.14701242786, + "objective_fnnls": -969854.0041124715, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -969854.0041124715, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -969854.0041124715 + }, + { + "i": 26, + "log_likelihood_jax": 24167.758921393222, + "log_likelihood_numpy": 24167.75892139937, + "objective_fnnls": -971415.3808369517, + "fnnls_n_positive": 27, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -971415.3808369514, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -971415.3808369514 + }, + { + "i": 27, + "log_likelihood_jax": 20633.584642752052, + "log_likelihood_numpy": 20633.584642775582, + "objective_fnnls": -967867.1623021923, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -636272.6455135276, + "converged_200": 1, + "pdip_iter_200": 72, + "objective_pdip_200": -967867.1623021924 + }, + { + "i": 28, + "log_likelihood_jax": 22028.45854340039, + "log_likelihood_numpy": 22028.45854349596, + "objective_fnnls": -969253.3251651743, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 16, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 2.7413943546914318e+138, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": 2620252470289228.5 + }, + { + "i": 29, + "log_likelihood_jax": 19311.635475080715, + "log_likelihood_numpy": 19311.63547501427, + "objective_fnnls": -966526.5606209968, + "fnnls_n_positive": 27, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966526.5606209968, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966526.5606209968 + }, + { + "i": 30, + "log_likelihood_jax": 22851.536523440096, + "log_likelihood_numpy": 22851.53652345582, + "objective_fnnls": -970100.3787900353, + "fnnls_n_positive": 25, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 48, + "objective_pdip_50": -970100.378790035, + "converged_200": 1, + "pdip_iter_200": 48, + "objective_pdip_200": -970100.378790035 + }, + { + "i": 31, + "log_likelihood_jax": 14299.46810766602, + "log_likelihood_numpy": 14299.468107694414, + "objective_fnnls": -961541.261932633, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -961541.2619326331, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -961541.2619326331 + }, + { + "i": 32, + "log_likelihood_jax": 22396.980981201545, + "log_likelihood_numpy": 22396.980981205765, + "objective_fnnls": -969618.7453371203, + "fnnls_n_positive": 28, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -449183.50059971726, + "converged_200": 1, + "pdip_iter_200": 80, + "objective_pdip_200": -969618.7453371204 + }, + { + "i": 33, + "log_likelihood_jax": 19136.931491211, + "log_likelihood_numpy": 19136.931491218435, + "objective_fnnls": -966402.5047963525, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -966402.5047963527, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -966402.5047963527 + }, + { + "i": 34, + "log_likelihood_jax": 15864.841504927117, + "log_likelihood_numpy": 15864.84150495191, + "objective_fnnls": -963092.5485702187, + "fnnls_n_positive": 25, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963092.5485702193, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963092.5485702193 + }, + { + "i": 35, + "log_likelihood_jax": 18352.730693556547, + "log_likelihood_numpy": 18352.73069356713, + "objective_fnnls": -965585.3036975699, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965585.30369757, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965585.30369757 + }, + { + "i": 36, + "log_likelihood_jax": 17435.071636721343, + "log_likelihood_numpy": 17435.071636742046, + "objective_fnnls": -964607.8550560902, + "fnnls_n_positive": 25, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 56913092.08182, + "converged_200": 0, + "pdip_iter_200": 200, + "objective_pdip_200": null + }, + { + "i": 37, + "log_likelihood_jax": 15584.618222362133, + "log_likelihood_numpy": 15584.618222380628, + "objective_fnnls": -962812.9803829335, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 66171042.48442658, + "converged_200": 1, + "pdip_iter_200": 195, + "objective_pdip_200": -962812.9803829336 + }, + { + "i": 38, + "log_likelihood_jax": 21902.392880761356, + "log_likelihood_numpy": 21902.392880794345, + "objective_fnnls": -969149.5527512308, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": 630091.8539000177, + "converged_200": 1, + "pdip_iter_200": 76, + "objective_pdip_200": -969149.5527512305 + }, + { + "i": 39, + "log_likelihood_jax": 17877.88290635203, + "log_likelihood_numpy": 17877.882906365707, + "objective_fnnls": -965102.5327589812, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 18, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965102.532758981, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965102.532758981 + }, + { + "i": 40, + "log_likelihood_jax": 14177.419739827084, + "log_likelihood_numpy": 14177.419739966648, + "objective_fnnls": -961352.3929829081, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -961352.3929829078, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -961352.3929829078 + }, + { + "i": 41, + "log_likelihood_jax": 20057.818256567727, + "log_likelihood_numpy": 20057.81825658551, + "objective_fnnls": -967309.6898867099, + "fnnls_n_positive": 23, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -967309.6898867099, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -967309.6898867099 + }, + { + "i": 42, + "log_likelihood_jax": 21909.205104847613, + "log_likelihood_numpy": 21909.205104890007, + "objective_fnnls": -969157.5521467926, + "fnnls_n_positive": 20, + "library_converged": 1, + "library_iterations": 16, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -722773.1228347446, + "converged_200": 1, + "pdip_iter_200": 71, + "objective_pdip_200": -969157.5521467929 + }, + { + "i": 43, + "log_likelihood_jax": 18711.875886459882, + "log_likelihood_numpy": 18711.8758864633, + "objective_fnnls": -965904.8037930101, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -965904.8037930096, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -965904.8037930096 + }, + { + "i": 44, + "log_likelihood_jax": 16472.592008729953, + "log_likelihood_numpy": 16472.592008715277, + "objective_fnnls": -963631.8618560513, + "fnnls_n_positive": 24, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 37, + "objective_pdip_50": -963631.8618560517, + "converged_200": 1, + "pdip_iter_200": 37, + "objective_pdip_200": -963631.8618560517 + }, + { + "i": 45, + "log_likelihood_jax": 16410.404048057622, + "log_likelihood_numpy": 16410.40404806228, + "objective_fnnls": -963615.8628159417, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -963615.8628159418, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -963615.8628159418 + }, + { + "i": 46, + "log_likelihood_jax": 15793.705823188964, + "log_likelihood_numpy": 15793.705823218355, + "objective_fnnls": -962999.9490921487, + "fnnls_n_positive": 21, + "library_converged": 1, + "library_iterations": 17, + "converged_50": 1, + "pdip_iter_50": 19, + "objective_pdip_50": -962999.9490921492, + "converged_200": 1, + "pdip_iter_200": 19, + "objective_pdip_200": -962999.9490921492 + }, + { + "i": 47, + "log_likelihood_jax": 13232.245936683517, + "log_likelihood_numpy": 13232.245936724983, + "objective_fnnls": -960464.1839266493, + "fnnls_n_positive": 22, + "library_converged": 1, + "library_iterations": 19, + "converged_50": 0, + "pdip_iter_50": 50, + "objective_pdip_50": -133934.5331908604, + "converged_200": 1, + "pdip_iter_200": 79, + "objective_pdip_200": -960464.1839266492 + } + ] +} diff --git a/scripts/imaging/hazards/README.md b/scripts/imaging/hazards/README.md index 5eb1ae48c..b618071d9 100644 --- a/scripts/imaging/hazards/README.md +++ b/scripts/imaging/hazards/README.md @@ -45,3 +45,17 @@ write semantic findings: python scripts/imaging/hazards/pixelization.py python scripts/misc/hazards/scan.py --subject likelihood ``` + +`mge_nnls_capture.py` captures the positive-only linear systems the JAX +likelihood hands to `reconstruction_positive_only_from` for the SLaM +`source_lp[1]` MGE model (2 x 20 lens Gaussians + 20 source Gaussians, free +Isothermal + ExternalShear) at 48 seeded near-truth vectors on the HST dataset, +and records whether the Jacobi-preconditioned PDIP solve converges at caps 50 +and 200 against `fnnls_cholesky` (PyAutoArray#571). It writes +`results/hazards/component/mge/nnls_capture_slam_hst_v.json` plus an +8-system `.npz` that PyAutoArray uses as a regression fixture. The unlabelled +JSON is the pre-fix capture (14/48 unconverged at cap 50, 5/48 at cap 200). +`--label postfix` re-runs it against the fixed library (mapper-less inversions +use the raw-forward PDIP mode) and writes +`nnls_capture_slam_hst_v_postfix.json`: 0/48 unconverged and a JAX vs +NumPy log-likelihood difference of at most 6e-7 on all 48 vectors. diff --git a/scripts/imaging/hazards/mge_nnls_capture.py b/scripts/imaging/hazards/mge_nnls_capture.py new file mode 100644 index 000000000..535317257 --- /dev/null +++ b/scripts/imaging/hazards/mge_nnls_capture.py @@ -0,0 +1,414 @@ +""" +Hazard capture: JAX PDIP NNLS non-convergence on the SLaM MGE model +==================================================================== + +Captures the exact positive-only linear systems ``(curvature_reg_matrix, +data_vector)`` that the JAX likelihood hands to +``autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from`` +for the SLaM ``source_lp[1]`` model (PyAutoArray#571), so the solver failure can +be reproduced as a small library regression fixture without rebuilding a lens +model. + +Model (mirrors ``autolens_workspace/scripts/imaging/features/pixelization/slam.py`` +``source_lp``): lens light = 2 bases x 20 Gaussians with +``sigma_min = pixel_scale / 10``, source = 20 Gaussians, free Isothermal + +ExternalShear (60 linear columns). The free mass/shear priors are centred on the +simulator truth of the profiling HST dataset (``dataset/imaging/hst``), and 48 +parameter vectors are drawn from a seeded +/-0.005 box around a generic +near-truth point (the 2026-09-24 MGE audit recipe). + +For each vector the script records the system on the JAX path (the solver +function is wrapped so its inputs are returned from the jitted likelihood -- +post-regularisation, pre-Jacobi), then off-line: + +- the Jacobi-preconditioned PDIP solve (``autoarray.util.jax_nnls.solve_nnls``, + exactly as ``inversion_util`` scales it) at iteration caps 50 and 200: + ``converged`` and ``pdip_iter``; +- the NumPy ``fnnls_cholesky`` solution; +- the NNLS objective ``0.5 x^T Q x - q^T x`` of each solution; +- the JAX and NumPy log-likelihoods of the full fit. + +Output +------ + +``results/hazards/component/mge/nnls_capture_slam_hst_v{al_version}.json`` -- the +per-vector summary (no matrices), and a compressed ``.npz`` of the same basename +holding 8 systems (5 never converging at cap 200, 2 hitting cap 50 but +converging by 200, 1 healthy) as ``Q_`` / ``q_`` plus a ``meta`` JSON +string. The ``.npz`` is the fixture copied to PyAutoArray +``test_autoarray/inversion/inversion/files/mge_slam_nnls_systems.npz``. + +Each row also records what the library's own JAX solve reported (``library_converged`` / +``library_iterations``, ``-1`` before PyAutoArray#571 surfaced them) and the summary records the +``library_preconditioning`` it used. ``--label postfix`` re-runs against a fixed library and writes +``..._postfix.json`` only (the per-row ``converged_50`` / ``converged_200`` columns always score the +Jacobi-preconditioned solve, i.e. the pre-fix behaviour). + +Run from the repo root on CPU fp64:: + + python scripts/imaging/hazards/mge_nnls_capture.py +""" + +from __future__ import annotations + +import datetime +import json +import os +import subprocess +import sys +from pathlib import Path + + +def _profiling_root() -> Path: + for path in Path(__file__).resolve().parents: + if (path / "ruff.toml").is_file(): + return path + raise RuntimeError("autolens_profiling root (ruff.toml) not found") + + +REPO_ROOT = _profiling_root() +MISC_ROOT = REPO_ROOT / "scripts" / "misc" +if str(MISC_ROOT) not in sys.path: + sys.path.insert(0, str(MISC_ROOT)) + +import jax # noqa: E402 + +jax.config.update("jax_enable_x64", True) + +import autofit as af # noqa: E402 +import autolens as al # noqa: E402 +import jax.numpy as jnp # noqa: E402 +import numpy as np # noqa: E402 +from autoarray.inversion.inversion import inversion_util # noqa: E402 + +if os.environ.get("AUTOLENS_PROFILING_SMOKE") == "1": + print(f"[smoke] {__file__}: imports + module setup OK; exiting.") + raise SystemExit(0) + +N_VECTORS = 48 +SEED = 1 +BOX = 0.01 # full width: +/-0.005 around the near-truth point +CAPS = (50, 200) +N_NEVER, N_SLOW, N_HEALTHY = 5, 2, 1 + +OUT_DIR = REPO_ROOT / "results" / "hazards" / "component" / "mge" + + +def _dataset(): + dataset_path = REPO_ROOT / "dataset" / "imaging" / "hst" + dataset = al.Imaging.from_fits( + data_path=dataset_path / "data.fits", + psf_path=dataset_path / "psf.fits", + noise_map_path=dataset_path / "noise_map.fits", + pixel_scales=0.05, + ) + mask_radius = 3.5 + mask = al.Mask2D.circular( + shape_native=dataset.shape_native, + pixel_scales=dataset.pixel_scales, + radius=mask_radius, + ) + dataset = dataset.apply_mask(mask=mask) + over_sample_size = al.util.over_sample.over_sample_size_via_radial_bins_from( + grid=dataset.grid, + sub_size_list=[4, 2, 2], + radial_list=[0.3, 0.6], + centre_list=[(0.0, 0.0)], + ) + return dataset.apply_over_sampling(over_sample_size_lp=over_sample_size), mask_radius + + +def _slam_source_lp_model(dataset, mask_radius): + lens_bulge = al.model_util.mge_model_from( + mask_radius=mask_radius, + total_gaussians=20, + gaussian_per_basis=2, + centre_prior_is_uniform=True, + sigma_min=dataset.pixel_scales[0] / 10.0, + ) + mass = af.Model(al.mp.Isothermal) + mass.centre.centre_0 = af.GaussianPrior(mean=0.0, sigma=0.05) + mass.centre.centre_1 = af.GaussianPrior(mean=0.0, sigma=0.05) + mass.einstein_radius = af.GaussianPrior(mean=1.6, sigma=0.1) + ell_comps = al.convert.ell_comps_from(axis_ratio=0.9, angle=45.0) + mass.ell_comps.ell_comps_0 = af.GaussianPrior(mean=ell_comps[0], sigma=0.05) + mass.ell_comps.ell_comps_1 = af.GaussianPrior(mean=ell_comps[1], sigma=0.05) + shear = af.Model(al.mp.ExternalShear) + shear.gamma_1 = af.GaussianPrior(mean=0.05, sigma=0.02) + shear.gamma_2 = af.GaussianPrior(mean=0.05, sigma=0.02) + # Created last on purpose: autofit orders the parameter vector by prior creation, so this + # order fixes which parameter each entry of the sampled vectors (below) perturbs. + source_bulge = al.model_util.mge_model_from( + mask_radius=mask_radius, total_gaussians=20, centre_prior_is_uniform=False + ) + return af.Collection( + galaxies=af.Collection( + lens=af.Model(al.Galaxy, redshift=0.5, bulge=lens_bulge, mass=mass), + source=af.Model(al.Galaxy, redshift=1.0, bulge=source_bulge), + ), + fields=af.Model(al.MassField, redshift=0.5, shear=shear), + ) + + +def _vectors(model): + medians = np.asarray(model.physical_values_from_prior_medians, dtype=float) + # A generic point: ell_comps = (0, 0) exactly has a NaN d(angle)/d(e). + centre = medians + 0.013 * np.sin(np.arange(medians.size) + 1.0) + rng = np.random.default_rng(SEED) + return np.stack([centre + BOX * (rng.random(centre.size) - 0.5) for _ in range(N_VECTORS)]) + + +_CAPTURED: list = [] +_ORIGINAL = inversion_util.reconstruction_positive_only_from + + +def _recording_solver(data_vector, curvature_reg_matrix, *args, **kwargs): + xp = kwargs.get("xp", args[1] if len(args) > 1 else np) + if not xp.__name__.startswith("jax"): + return _ORIGINAL(data_vector, curvature_reg_matrix, *args, **kwargs) + stats = kwargs.pop("stats", None) + stats = {} if stats is None else stats + x = _ORIGINAL(data_vector, curvature_reg_matrix, *args, stats=stats, **kwargs) + # `converged` / `iterations` exist from PyAutoArray#571's fix on; -1 = not reported. + _CAPTURED.append( + ( + curvature_reg_matrix, + data_vector, + stats.get("converged", -1), + stats.get("iterations", -1), + stats.get("preconditioning", "jacobi"), + ) + ) + return x + + +def _objective(Q, q, x): + return float(0.5 * x @ Q @ x - q @ x) + + +def _git_sha(module) -> str: + try: + return subprocess.check_output( + ["git", "rev-parse", "--short=10", "HEAD"], + cwd=Path(module.__file__).resolve().parents[1], + text=True, + stderr=subprocess.DEVNULL, + ).strip() + except (OSError, subprocess.CalledProcessError): + return "unknown" + + +def main() -> int: + import argparse + + import autoarray as aa + + parser = argparse.ArgumentParser(description=__doc__.splitlines()[1]) + parser.add_argument( + "--label", + default="", + help="Suffix for a re-run's summary JSON (e.g. 'postfix'); a labelled run writes no .npz.", + ) + args = parser.parse_args() + from autoarray.util.fnnls import fnnls_cholesky + from autoarray.util.jax_nnls import solve_nnls + + dataset, mask_radius = _dataset() + model = _slam_source_lp_model(dataset, mask_radius) + vectors = _vectors(model) + + analysis_jax = al.AnalysisImaging(dataset=dataset, use_jax=True) + analysis_np = al.AnalysisImaging(dataset=dataset, use_jax=False) + + def likelihood_and_system(vector): + _CAPTURED.clear() + instance = model.instance_from_vector(vector, xp=jnp) + log_likelihood = analysis_jax.log_likelihood_function(instance=instance) + calls = len(_CAPTURED) + Q, q, converged, iterations, _ = _CAPTURED[0] + return ( + log_likelihood, + jnp.asarray(Q), + jnp.asarray(q), + jnp.asarray(converged), + jnp.asarray(iterations), + calls, + ) + + inversion_util.reconstruction_positive_only_from = _recording_solver + try: + traced = jax.jit(lambda v: likelihood_and_system(v)[:5]) + calls_per_trace = None + rows, systems = [], [] + solvers = { + cap: jax.jit(lambda Q, q, cap=cap: solve_nnls(Q, q, max_iter=cap)) for cap in CAPS + } + for i, vector in enumerate(vectors): + log_likelihood_jax, Q, q, lib_converged, lib_iterations = traced(jnp.asarray(vector)) + if calls_per_trace is None: + calls_per_trace = len(_CAPTURED) + library_preconditioning = _CAPTURED[0][4] + log_likelihood_np = float( + analysis_np.log_likelihood_function(instance=model.instance_from_vector(vector)) + ) + Q = np.asarray(Q, dtype=float) + q = np.asarray(q, dtype=float) + D = 1.0 / np.sqrt(np.diag(Q)) + Q_pc = Q * D[:, None] * D[None, :] + q_pc = q * D + + x_fnnls = np.asarray( + fnnls_cholesky(Q, q, P_initial=np.linalg.solve(Q, q) > 0), dtype=float + ) + row = { + "i": i, + "log_likelihood_jax": float(log_likelihood_jax), + "log_likelihood_numpy": log_likelihood_np, + "objective_fnnls": _objective(Q, q, x_fnnls), + "fnnls_n_positive": int(np.sum(x_fnnls > 0)), + "library_converged": int(lib_converged), + "library_iterations": int(lib_iterations), + } + for cap, solver in solvers.items(): + x, _, _, converged, iterations = solver(jnp.asarray(Q_pc), jnp.asarray(q_pc)) + x = np.asarray(x) * D + row[f"converged_{cap}"] = int(converged) + row[f"pdip_iter_{cap}"] = int(iterations) + row[f"objective_pdip_{cap}"] = ( + _objective(Q, q, x) if np.all(np.isfinite(x)) else None + ) + rows.append(row) + systems.append((Q, q)) + print( + i, + f"ll jax/np {row['log_likelihood_jax']:.4g} {log_likelihood_np:.4g}", + "cap50", + row["converged_50"], + row["pdip_iter_50"], + "cap200", + row["converged_200"], + row["pdip_iter_200"], + flush=True, + ) + finally: + inversion_util.reconstruction_positive_only_from = _ORIGINAL + + never = [r["i"] for r in rows if r["converged_200"] == 0] + slow = sorted( + (r for r in rows if r["converged_50"] == 0 and r["converged_200"] == 1), + key=lambda r: -r["pdip_iter_200"], + ) + slow = [r["i"] for r in slow] + healthy = sorted((r for r in rows if r["converged_50"] == 1), key=lambda r: r["pdip_iter_50"]) + healthy = [healthy[len(healthy) // 2]["i"]] if healthy else [] + chosen = ( + [(i, "never_converges_cap200") for i in never[:N_NEVER]] + + [(i, "cap50_hit_converges_by_200") for i in slow[:N_SLOW]] + + [(i, "healthy") for i in healthy[:N_HEALTHY]] + ) + + import autofit + import autogalaxy + + versions = { + "autolens": al.__version__, + "autoarray": aa.__version__, + "jax": jax.__version__, + "shas": { + "PyAutoArray": _git_sha(aa), + "PyAutoGalaxy": _git_sha(autogalaxy), + "PyAutoLens": _git_sha(al), + "PyAutoFit": _git_sha(autofit), + }, + } + generator = "autolens_profiling/scripts/imaging/hazards/mge_nnls_capture.py" + date = datetime.date.today().isoformat() + + npz_meta = { + "generator": generator, + "date": date, + "issue": "PyAutoLabs/PyAutoArray#571", + "versions": versions, + "device": str(jax.devices()[0]), + "x64": bool(jax.config.jax_enable_x64), + "note": "Q = curvature_reg_matrix, q = data_vector as passed to " + "reconstruction_positive_only_from on the JAX path (pre-Jacobi).", + "systems": [], + } + arrays = {} + for k, (i, category) in enumerate(chosen): + Q, q = systems[i] + arrays[f"Q_{k}"] = Q + arrays[f"q_{k}"] = q + r = rows[i] + npz_meta["systems"].append( + { + "key": k, + "vector_index": i, + "category": category, + "converged_50": r["converged_50"], + "pdip_iter_50": r["pdip_iter_50"], + "converged_200": r["converged_200"], + "pdip_iter_200": r["pdip_iter_200"], + "objective_fnnls": r["objective_fnnls"], + } + ) + arrays["meta"] = np.asarray(json.dumps(npz_meta)) + + summary = { + "hazard": "jax_pdip_nnls_nonconvergence", + "issue": "PyAutoLabs/PyAutoArray#571", + "generator": generator, + "date": date, + "model": "SLaM source_lp[1]: lens 2x20 MGE (sigma_min=pixel_scale/10) + " + "source 20 MGE, free Isothermal + ExternalShear", + "dataset": "dataset/imaging/hst (mask 3.5 arcsec, radial over-sampling 4/2/2)", + "n_vectors": N_VECTORS, + "seed": SEED, + "box_half_width": BOX / 2, + "linear_columns": int(systems[0][0].shape[0]), + "solver_calls_per_likelihood": calls_per_trace, + "library_preconditioning": library_preconditioning, + "versions": versions, + "device": npz_meta["device"], + "x64": npz_meta["x64"], + "counts": { + "unconverged_cap50": sum(1 - r["converged_50"] for r in rows), + "unconverged_cap200": sum(1 - r["converged_200"] for r in rows), + "log_likelihood_mismatch_gt_0p1": sum( + 1 + for r in rows + if not np.isfinite(r["log_likelihood_jax"]) + or abs(r["log_likelihood_jax"] - r["log_likelihood_numpy"]) > 0.1 + ), + "log_likelihood_mismatch_gt_1e-6": sum( + 1 + for r in rows + if not np.isfinite(r["log_likelihood_jax"]) + or abs(r["log_likelihood_jax"] - r["log_likelihood_numpy"]) > 1.0e-6 + ), + "library_unconverged": sum(1 for r in rows if r["library_converged"] == 0), + "max_abs_log_likelihood_diff": max( + abs(r["log_likelihood_jax"] - r["log_likelihood_numpy"]) for r in rows + ), + }, + "fixture_systems": npz_meta["systems"], + "rows": rows, + } + + OUT_DIR.mkdir(parents=True, exist_ok=True) + basename = f"nnls_capture_slam_hst_v{al.__version__}" + if args.label: + # A labelled re-run (e.g. against a fixed library) writes only its summary; the + # unlabelled capture owns the .npz fixture. + basename = f"{basename}_{args.label}" + (OUT_DIR / f"{basename}.json").write_text(json.dumps(summary, indent=1) + "\n") + if not args.label: + np.savez_compressed(OUT_DIR / f"{basename}.npz", **arrays) + print(json.dumps(summary["counts"]), "fixture", [c for _, c in chosen]) + print("WROTE", OUT_DIR / f"{basename}.json") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())