|
RadCluster
Graph-based cluster dynamics for irradiated materials
|
Functions | |
| list[list[float]] | latin_hypercube (int n, int d, random.Random rng) |
| int | main (argv=None) |
Variables | |
| HERE = Path(__file__).resolve().parent | |
| dict | SAMPLED |
| dict | ORIGINAL_PRIOR |
Generate a SPACE-FILLING calibration design for the T8 experiment match.
WHY NOT SALTELLI. T2/T3 used a Saltelli A/B/AB_j design because the question
was the RELATIVE RANKING of parameters (Sobol indices), which needs that exact
pairing and costs N*(p+2) rows to buy it. The question now is different: find
parameter vectors whose loop character and mean size match the measurement.
That is estimation, not attribution -- the pairing buys nothing, and a Latin
hypercube covers the box far better per row. At p = 7 a Saltelli design would
need 9 rows per base sample; this needs 1.
WHY THESE SEVEN. Screened on the T3 campaign (1008 rows) against the two
observables the campaign never screened -- f_100_tem_1 and the loop diameters --
because <100> was withheld under bin_moment:
parameter rho(d_100) rho(d_111) rho(pile_100) rho(f_100)
L_hat -0.540 +0.011 -0.699 +0.004
E_a0_conv +0.650 +0.268 +0.119 -0.583
phi_max_junc +0.322 +0.267 -0.019 -0.556
Z_i +0.420 +0.270 +0.015 -0.590
f_cl_v -0.337 -0.251 +0.136 +0.605
f_cl_i +0.343 -0.031 +0.284 +0.013
dH2_abs_conv +0.323 +0.113 +0.430 -0.183
L_hat is the one lever that is strong on the <100> axis and ORTHOGONAL to
d_111 (rho = +0.011), so it de-saturates the grid without disturbing the
1/2<111> size that sets the character. Every other parameter trades the two
against each other. It is sampled HIGH by default: all four grid-clean
full-dose rows in T3 had L_hat >= 1016, and the L_hat < 100 half of the campaign
has median pile_100 = 1.000, i.e. totally saturated.
THE TARGET is the 85 grid-clean rows (pile_100 < 0.05, 8.4 % of T3), where the
model already reproduces the experiment qualitatively: median f_100_tem_1 =
0.331 against a "< 0.5" datum, median d_111 = 2.31 nm against 3.4 nm, and
d_100 down to 1.61 nm. This design searches that region rather than the full
prior box.
Every non-sampled parameter is pinned to a BASE ROW rather than the workbook, so
the design sits at a point already known to be grid-clean, conserving and cheap
(T3 row 38: pile_100 = 1e-17, delta_FP = 4.6e-3, 1852 s to full dose).
Usage:
python make_calib_design.py --n 64 --condition C_330_G6 --out design/T8_calib.csv
| list[list[float]] make_calib_design.latin_hypercube | ( | int | n, |
| int | d, | ||
| random.Random | rng | ||
| ) |
Stratified sample in [0,1)^d: one point per stratum per dimension. Plain uniform sampling leaves gaps and clumps that matter at n = 64 over 7 dimensions; the LHS guarantees each parameter's marginal is covered evenly, which is what makes a small design usable for estimation.
Definition at line 110 of file make_calib_design.py.
| int make_calib_design.main | ( | argv = None | ) |
Definition at line 125 of file make_calib_design.py.
| make_calib_design.HERE = Path(__file__).resolve().parent |
Definition at line 55 of file make_calib_design.py.
| dict make_calib_design.ORIGINAL_PRIOR |
Definition at line 100 of file make_calib_design.py.
| dict make_calib_design.SAMPLED |
Definition at line 86 of file make_calib_design.py.