{
  "meta": {
    "seeds": {
      "viz_check": 141,
      "rhs_1d": 142
    },
    "tol": 1e-10,
    "leaf": 64,
    "ranks": [
      1,
      2,
      4,
      8,
      16
    ],
    "n": 32,
    "N": 1024,
    "h": 0.030303030303030304,
    "kappa_A": 440.6885603836583
  },
  "checks": [
    {
      "name": "kappa(A) at n=32 equals the house number 440.69 (measured 440.69)",
      "pass": true
    },
    {
      "name": "cg_err reproduces pcg.pcg's residual history (max dev 0.0e+00 over 77 entries)",
      "pass": true
    },
    {
      "name": "no precision edges cross the separator: nnz(A_LR) = 0 (GMRF Markov property, report 13 SS3)",
      "pass": true
    },
    {
      "name": "rank bound identity Sigma_LR == Sigma_LI Sigma_II^-1 Sigma_IR holds to machine precision (max rel dev 1.0e-15) => rank(Sigma_LR) <= |I| = 64",
      "pass": true
    },
    {
      "name": "and the bound bites: s_65/s_1 of the 480x480 Sigma_LR = 3.0e-17 (numerical rank at 1e-10 = 32 <= 64)",
      "pass": true
    },
    {
      "name": "1-D (n=64): contiguous split has a SINGLE-node separator => off-diag block of A1^-1 is rank 1 EXACTLY (s2/s1 = 9.5e-17 < 1e-14)",
      "pass": true
    },
    {
      "name": "...and the block IS report 13's semiseparable identity h x_i (1-x_j) (max rel dev 4.1e-15)",
      "pass": true
    },
    {
      "name": "a-priori bound holds EXACTLY at every level: rank(block) <= 32, s33/s1 <= 4.6e-16 (machine-precision cliff at the separator width)",
      "pass": true
    },
    {
      "name": "weak admissibility is TIGHT: numerical rank at BOTH 1e-6 and 1e-10 EQUALS the bound 32 for every adjacent block (slow 'logarithmic teeth' decay above the cliff -- compression comes from the separator bound, not from spectral decay)",
      "pass": true
    },
    {
      "name": "report-13 continuity: FAR 256x256 block (grid rows 0-7 x 24-31) has numerical rank 11 at 1e-8 (vs 32 for adjacent blocks: distance from the separator is what creates decay)",
      "pass": true
    },
    {
      "name": "1-D n=1024: dense inverse matches the exact semiseparable formula h min(x_i,x_j)(1-max(x_i,x_j)) (max rel dev 3.3e-13)",
      "pass": true
    },
    {
      "name": "1-D N=1024: EVERY off-diagonal block (15 upper blocks, sizes 512..64) has rank exactly 1 at 1e-14 (max s2/s1 = 1.1e-15) -- separator size 1 vs 32: why 1-D is semiseparable and 2-D is 'low-rank with logarithmic teeth'",
      "pass": true
    },
    {
      "name": "plain CG baseline matches report 13's ladder: 73 its to rel l2 err 1e-10 (house number 73); 75 its to rel A-norm err 1e-10",
      "pass": true
    },
    {
      "name": "block-Jacobi(2) baseline reproduces report 13: kappa(M^-1 A) = 19.29 (house number 19.29); 12 PCG its to rel err 1e-10 (ladder house number 12)",
      "pass": true
    },
    {
      "name": "M_r is EXACTLY symmetric by construction (symmetrized S2 leaves + lower block = transpose of the upper's truncation; max asym over all r = 0.0e+00) -- no extra symmetrization needed",
      "pass": true
    },
    {
      "name": "all five M_r are SPD (min eig from 1.33e-04 at r=1, all > 0) -- PCG is legitimate at every rank",
      "pass": true
    },
    {
      "name": "spectral error ||M_r - A^-1||_2/||A^-1||_2 decreases monotonically with rank: r=1: 3.2e-01, r=2: 1.5e-01, r=4: 4.8e-02, r=8: 1.1e-02, r=16: 2.2e-03",
      "pass": true
    },
    {
      "name": "kappa(M_r A) decreases monotonically: 46.58, 23.42, 9.64, 3.85, 1.95 (vs kappa(A) = 440.69)",
      "pass": true
    },
    {
      "name": "PCG iterations decrease monotonically with rank: r=1: 45, r=2: 36, r=4: 27, r=8: 18, r=16: 11 (plain CG 73, block-Jacobi(2) 12)",
      "pass": true
    },
    {
      "name": "all PCG runs converged and match spsolve (max final rel err 8.3e-11 <= 1e-10)",
      "pass": true
    },
    {
      "name": "kappa race vs block-Jacobi(2): M_4 already beats it on conditioning (9.64 < 19.29) and M_16 edges it on iterations too (11 < 12)",
      "pass": true
    },
    {
      "name": "HONEST: block-Jacobi(2) wins the raw iteration race (12 its at kappa 19.29 vs M_8's 18 at kappa 3.85) because its spectrum is CLUSTERED: 960 of 1024 eigenvalues of M^-1 A are EXACTLY 1 (= N - 2*32 interface pairs; report 13's clustering-beats-kappa lesson) -- the HODLR M_r spread their spectra across [lam_min, lam_max], so kappa is the honest predictor for them",
      "pass": true
    },
    {
      "name": "HONEST: undamped Richardson rho(I - M_r A) > 1 for r <= 8 (r=1: 8.486, r=2: 5.260, r=4: 2.703, r=8: 1.153, r=16: 0.443) -- lam_max(M_r A) > 2 even though kappa is small; only r=16 converges undamped",
      "pass": true
    },
    {
      "name": "...but optimally damped Richardson (omega = 2/(lmin+lmax)) converges for EVERY r at rho = (kappa-1)/(kappa+1): 0.958, 0.918, 0.812, 0.588, 0.322",
      "pass": true
    },
    {
      "name": "1-D n=1024: rank-1 HODLR inverse == EXACT inverse (||M - A1^-1||_2/||A1^-1||_2 = 7.9e-16)",
      "pass": true
    },
    {
      "name": "1-D punchline: Richardson converges in ONE iteration (rel err after 1 step = 1.8e-15; rho(I - M A1) = 4.6e-11) -- in 1-D the hierarchical structure is not an approximation",
      "pass": true
    },
    {
      "name": "results/hodlr_viz_data.json written: 2.61 MB < 5 MB (46 + 46 blocks)",
      "pass": true
    },
    {
      "name": "viz JSON faithful: python reimplementation of the JS apply rule reproduces M_r x on 3 random vectors (max rel dev 2.4e-07 < 1e-6, ranks 2 and 8, after 7-significant-digit rounding)",
      "pass": true
    },
    {
      "name": "figures/anim14_hodlr_pcg.gif (0.39 MB < 2.5 MB, 28 frames, fps 4, dpi 90)",
      "pass": true
    },
    {
      "name": "flops column self-consistent: apply cost recounted from the exported viz block lists (dense 2mn + low-rank 2k(m+nc)) matches 2 x storage for r = 2 and 8",
      "pass": true
    },
    {
      "name": "HONEST flops race at N=1024: total solve flops fall monotonically with rank (r=1: 7.79M, r=2: 6.87M, r=4: 6.11M, r=8: 5.38M, r=16: 4.97M) \u2014 iterations drop faster than the apply grows \u2014 yet plain CG (1.63M) undercuts every HODLR rank: kappa 440.69 is too benign to amortize a 18x costlier per-iteration apply at this N",
      "pass": true
    }
  ],
  "figures": [
    "hierarchical_sval_decay.png",
    "hierarchical_precond_sweep.png",
    "anim14_hodlr_pcg.gif",
    "anim14_hodlr_pcg_frames.png"
  ],
  "deviations": [
    "task asked rank tables for block sizes 512/256/128; the level-3 (size-64) blocks of the same partition are included too for completeness -- same bound 32, same behavior.",
    "undamped Richardson diverges for r in {1,2,4,8} (rho > 1); reported honestly with the optimally damped variant alongside. PCG is unaffected (all M_r are SPD).",
    "the task hypothesized M_8 would beat block-Jacobi(2) on iterations; measured block-Jacobi(2) = 12 its (960 eigenvalues exactly 1 -- clustered spectrum), so only M_16 (11 its) beats it iteration-wise while kappa favors HODLR from r=4. Reported honestly with the clustering explanation.",
    "storage/flop counts include BOTH the upper and the mirrored lower off-diagonal factors, matching the viz-JSON apply rule; symmetric storage would halve the off-diagonal part."
  ],
  "part_a": {
    "separator_2d": {
      "split_cols": [
        [
          0,
          14
        ],
        [
          15,
          16
        ],
        [
          17,
          31
        ]
      ],
      "sep_size": 64,
      "A_LR_nnz": 0,
      "identity_rel_dev": 1.0312384794742473e-15,
      "sv_LR_first20": [
        0.014408542331059933,
        0.00416444596414813,
        0.0015706123899828204,
        0.0007287378539720047,
        0.0003842058367000418,
        0.00022021145787298982,
        0.00013394758686504076,
        8.525651517722325e-05,
        5.6284863379599393e-05,
        3.8318507739435357e-05,
        2.6794863865785107e-05,
        1.9190873067858787e-05,
        1.404885425673628e-05,
        1.0495772395534561e-05,
        7.992682216654238e-06,
        6.198129671288935e-06,
        4.890823352682104e-06,
        3.924435798031295e-06,
        3.2004466762496225e-06,
        2.651428927139697e-06
      ],
      "s65_over_s1": 2.97462935838195e-17,
      "numrank_1e-10": 32
    },
    "separator_1d_n64": {
      "s2_over_s1": 9.53485359375612e-17,
      "sv_first5": [
        0.041656804733727675,
        3.9719153431978026e-18,
        2.9845170161633674e-18,
        1.341876168320155e-18,
        1.0617580045091184e-18
      ],
      "formula_rel_dev": 4.070787404944972e-15
    },
    "rank_table_2d": {
      "0": {
        "block_size": 512,
        "n_blocks_upper": 1,
        "bound": 32,
        "numrank_1e-6_max": 32,
        "numrank_1e-6_mean": 32.0,
        "numrank_1e-10_max": 32,
        "numrank_1e-10_mean": 32.0,
        "s33_over_s1_max": 4.582152244905976e-16,
        "sval_curve_first40": [
          1.0,
          0.3340806253888677,
          0.1507799948609147,
          0.08411171883249796,
          0.053190016153802255,
          0.036426331159346514,
          0.02635409438798786,
          0.01985047641827449,
          0.015422625381159672,
          0.012283601718331113,
          0.009986454009313481,
          0.008261955360180812,
          0.006940043593726535,
          0.005909014221891916,
          0.0050930629353883785,
          0.004439313641937901,
          0.003910010636124795,
          0.0034776494685121668,
          0.003121845461699021,
          0.0028272647716720656,
          0.0025822247441614067,
          0.002377727145077467,
          0.002206778070266261,
          0.0020639018242945353,
          0.001944788631310221,
          0.001846036373744444,
          0.001764959537626366,
          0.001699447010539378,
          0.0016478560130154388,
          0.0016089332696906384,
          0.0015817571788872662,
          0.001565696622828811,
          4.582152244905976e-16,
          1.901753732518877e-16,
          1.5872139451908595e-16,
          1.4845340279273046e-16,
          1.2929731094839502e-16,
          8.823154432510472e-17,
          7.573510456817868e-17,
          7.573510456817868e-17
        ]
      },
      "1": {
        "block_size": 256,
        "n_blocks_upper": 2,
        "bound": 32,
        "numrank_1e-6_max": 32,
        "numrank_1e-6_mean": 32.0,
        "numrank_1e-10_max": 32,
        "numrank_1e-10_mean": 32.0,
        "s33_over_s1_max": 1.9092003520566991e-16,
        "sval_curve_first40": [
          1.0,
          0.4263118208275442,
          0.2138889875053254,
          0.12326879192627885,
          0.07865213019458409,
          0.05399107686316966,
          0.039086242098000976,
          0.02944544471512765,
          0.02287835609571917,
          0.018222066258970715,
          0.014814423618972105,
          0.01225622615079109,
          0.01029523508140377,
          0.008765751467941549,
          0.007555325465853726,
          0.006585518440759764,
          0.005800321707979802,
          0.005158933728217232,
          0.004631114782299421,
          0.0041941178202076785,
          0.003830612161201698,
          0.0035272493377597343,
          0.0032736542136091356,
          0.0030617038454312817,
          0.002885004878152449,
          0.0027385104261716735,
          0.0026182366524993947,
          0.0025210518185433176,
          0.002444518936191829,
          0.002386778828834326,
          0.0023464643425849473,
          0.0023226392431229107,
          1.9092003520566991e-16,
          1.358358603312573e-16,
          1.084847642722061e-16,
          7.64665732877669e-17,
          7.64665732877669e-17,
          7.64665732877669e-17,
          7.64665732877669e-17,
          7.64665732877669e-17
        ]
      },
      "2": {
        "block_size": 128,
        "n_blocks_upper": 4,
        "bound": 32,
        "numrank_1e-6_max": 32,
        "numrank_1e-6_mean": 32.0,
        "numrank_1e-10_max": 32,
        "numrank_1e-10_mean": 32.0,
        "s33_over_s1_max": 1.102745610088138e-16,
        "sval_curve_first40": [
          1.0,
          0.5886349033621578,
          0.36454147210034765,
          0.23774419537972516,
          0.16249441458216618,
          0.11574919465274526,
          0.08545027289359702,
          0.06503854877573202,
          0.050807494491457154,
          0.04058334786937906,
          0.033044938091513036,
          0.02736164970273116,
          0.02299452959674776,
          0.019583582025211283,
          0.01688194236665741,
          0.014716288878509055,
          0.01296235763864967,
          0.011529392136487756,
          0.01035001968638956,
          0.009373508221795864,
          0.008561179617182729,
          0.007883229986091115,
          0.007316487373771933,
          0.006842806316748094,
          0.006447903072364006,
          0.006120501067795047,
          0.005851698386199467,
          0.005634496809787947,
          0.005463450440161729,
          0.005334404508952344,
          0.0052443037391052315,
          0.005191055837635795,
          1.0838083047948802e-16,
          6.784789632227158e-17,
          6.784789632227158e-17,
          6.784789632227158e-17,
          6.784789632227158e-17,
          6.784789632227158e-17,
          6.784789632227158e-17,
          6.784789632227158e-17
        ]
      },
      "3": {
        "block_size": 64,
        "n_blocks_upper": 8,
        "bound": 32,
        "numrank_1e-6_max": 32,
        "numrank_1e-6_mean": 32.0,
        "numrank_1e-10_max": 32,
        "numrank_1e-10_mean": 32.0,
        "s33_over_s1_max": 1.1532876869790633e-16,
        "sval_curve_first40": [
          1.0,
          0.7318094807505909,
          0.5421744654544317,
          0.4076044216308087,
          0.3110426734994436,
          0.24092179528477894,
          0.18936549866956917,
          0.15097801196494867,
          0.12203505437257857,
          0.09994375024338667,
          0.0828816596376331,
          0.06955478872046224,
          0.05903461270244502,
          0.0506476594796638,
          0.043900175519474297,
          0.038426319442210234,
          0.03395222813112884,
          0.030270865171841407,
          0.027224250496269052,
          0.0246907852932831,
          0.022576125404713047,
          0.020806548799980326,
          0.01932409266716564,
          0.018082958260672837,
          0.01704683295628885,
          0.016186882653281557,
          0.015480239340073147,
          0.014908858655700826,
          0.014458657541936487,
          0.014118867236684717,
          0.013881555061775398,
          0.013741281873130283,
          1.0268968207068342e-16,
          5.770139013318642e-17,
          5.770139013318642e-17,
          5.770139013318642e-17,
          5.770139013318642e-17,
          5.770139013318642e-17,
          5.770139013318642e-17,
          5.770139013318642e-17
        ]
      }
    },
    "far_block": {
      "numrank_1e-8": 11,
      "sv_first20": [
        0.0017574625160307375,
        0.0002236919360774156,
        2.734277203389176e-05,
        3.674947742056541e-06,
        5.508736128920303e-07,
        9.120153275475828e-08,
        1.649017097043781e-08,
        3.2302664651817197e-09,
        6.821421159015051e-10,
        1.548277303413789e-10,
        3.770477323657792e-11,
        9.841059773614041e-12,
        2.7507812640384756e-12,
        8.229515604812097e-13,
        2.633609461326043e-13,
        9.010291379126114e-14,
        3.293627615033807e-14,
        1.2855280954402362e-14,
        5.3538804099207424e-15,
        2.377593482672244e-15
      ],
      "rows": [
        0,
        7
      ],
      "cols_rows": [
        24,
        31
      ]
    },
    "rank_table_1d": {
      "0": {
        "block_size": 512,
        "n_blocks_upper": 1,
        "bound": 1,
        "numrank_1e-14_max": 1,
        "s2_over_s1_max": 6.876971320499608e-16
      },
      "1": {
        "block_size": 256,
        "n_blocks_upper": 2,
        "bound": 1,
        "numrank_1e-14_max": 1,
        "s2_over_s1_max": 1.1337549132169931e-15
      },
      "2": {
        "block_size": 128,
        "n_blocks_upper": 4,
        "bound": 1,
        "numrank_1e-14_max": 1,
        "s2_over_s1_max": 2.924233327142542e-16
      },
      "3": {
        "block_size": 64,
        "n_blocks_upper": 8,
        "bound": 1,
        "numrank_1e-14_max": 1,
        "s2_over_s1_max": 2.1770868064225407e-16
      }
    },
    "formula_dev_1d_n1024": 3.347260553086188e-13
  },
  "part_b": {
    "baselines": {
      "cg_iters_l2": 73,
      "cg_iters_Anorm": 75,
      "cg_rel2_curve": [
        1.0,
        0.955703145291733,
        0.8867301304062112,
        0.812004079343605,
        0.7228579403413045,
        0.6426421608679739,
        0.5584346744048838,
        0.502736922641037,
        0.4634874135292009,
        0.4264546855916099,
        0.38283503205513497,
        0.34577560870487584,
        0.30261895239256964,
        0.2639399304061975,
        0.22927677391698165,
        0.1998638813675961,
        0.17293110087937033,
        0.14471123543580203,
        0.11713812738901397,
        0.09139358469983658,
        0.06588002909445188,
        0.047599983325790386,
        0.03395606630860213,
        0.024325109265354104,
        0.017368636467903667,
        0.012937070661786555,
        0.010285501594457003,
        0.008374368336536604,
        0.006726041434335071,
        0.005436827512619445,
        0.004434698321220509,
        0.0034342305530507874,
        0.002523011428566642,
        0.0018427208005700503,
        0.0013222837597010458,
        0.0009748312022083309,
        0.0007050691364799177,
        0.0005341345823307148,
        0.00040523236035587876,
        0.00028731490415872905,
        0.00019769452541244415,
        0.00013958217968059258,
        0.0001013912254836795,
        7.16278929786853e-05,
        4.619052277916925e-05,
        3.0322169974830267e-05,
        2.0478378337690806e-05,
        1.3310879770725596e-05,
        8.882606326198144e-06,
        6.291900460830455e-06,
        4.2180371345837865e-06,
        2.7574414281289963e-06,
        1.9185667416930103e-06,
        1.2988553514277723e-06,
        8.5079748584682e-07,
        5.464924507395858e-07,
        3.5356373082921146e-07,
        2.218459293940211e-07,
        1.3626993661532025e-07,
        8.758910083723461e-08,
        5.8553987274053396e-08,
        4.2900832276512934e-08,
        3.1719463644119256e-08,
        2.1789949483433654e-08,
        1.273178631656243e-08,
        6.22080162156494e-09,
        3.141681313554017e-09,
        1.900076686867275e-09,
        1.1989796918708257e-09,
        8.011240984592383e-10,
        4.859984101073448e-10,
        2.7973989693897185e-10,
        1.5033615094109999e-10,
        8.833869254585133e-11
      ],
      "blockjacobi2_kappa": 19.2930724493778,
      "blockjacobi2_iters_l2": 12,
      "blockjacobi2_n_unit_eigs": 960,
      "blockjacobi2_rel2_curve": [
        1.0,
        0.10572748380347616,
        0.09057211402977078,
        0.002696257174214999,
        0.0013939820389475656,
        3.399683852783595e-05,
        1.9934249661403726e-05,
        1.0182555048175685e-06,
        5.220182505348945e-07,
        1.3377888045752407e-08,
        1.023749524576147e-09,
        1.2340545130050588e-10,
        2.1583918370357438e-11
      ]
    },
    "sweep": {
      "1": {
        "rank": 1,
        "asym": 0.0,
        "rel_err_2": 0.3174232732628983,
        "storage_floats": 73728,
        "storage_frac_N2": 0.0703125,
        "compression_factor": 14.222222222222221,
        "apply_flops": 147456,
        "dense_apply_flops": 2097152,
        "apply_speedup": 14.222222222222221,
        "min_eig_M": 0.00013291546086445342,
        "spd": true,
        "lam_min_MA": 0.20363924727755361,
        "lam_max_MA": 9.485996103632786,
        "kappa_MA": 46.582356939788156,
        "rho_richardson": 8.485996103632786,
        "omega_opt": 0.2064061161818747,
        "rho_richardson_damped": 0.9579676138672397,
        "pcg_iters_l2": 45,
        "pcg_final_relerr": 8.322781963658855e-11,
        "per_iter_flops": 169728,
        "solve_flops_to_1e10": 7787264,
        "pcg_rel2_curve": [
          1.0,
          0.5515498111134938,
          0.48032427686008766,
          0.4056068998116246,
          0.2902277098053791,
          0.1994764565468722,
          0.16832192386126885,
          0.13919807056840072,
          0.0957108062091382,
          0.062361157737571865,
          0.04134432081596572,
          0.02469341811560267,
          0.012705893644213475,
          0.008531750945191792,
          0.005061068600787187,
          0.0030213658439800506,
          0.0015602508099441291,
          0.0010357010374054437,
          0.0006531261126088051,
          0.00023105509642863673,
          0.00011778310567679222,
          7.816116726167485e-05,
          3.987886221650157e-05,
          1.9537328540813064e-05,
          1.0267916938677117e-05,
          6.996281553161756e-06,
          4.81520738742628e-06,
          2.9582005016196867e-06,
          1.6392822965295242e-06,
          9.238375176326433e-07,
          6.060626798375523e-07,
          4.381727109845439e-07,
          2.3639029072894883e-07,
          1.5704687820630517e-07,
          1.2927897817100537e-07,
          7.22451652769395e-08,
          3.2563437781471315e-08,
          1.664755744362173e-08,
          7.400525065522975e-09,
          4.785183268111086e-09,
          1.9993281885953807e-09,
          1.3900760837066804e-09,
          7.364329875032675e-10,
          3.0439109804746706e-10,
          1.367441700974835e-10,
          8.322781963658855e-11
        ]
      },
      "2": {
        "rank": 2,
        "asym": 0.0,
        "rel_err_2": 0.14671699591849982,
        "storage_floats": 81920,
        "storage_frac_N2": 0.078125,
        "compression_factor": 12.8,
        "apply_flops": 163840,
        "dense_apply_flops": 2097152,
        "apply_speedup": 12.8,
        "min_eig_M": 0.00013291546086445331,
        "spd": true,
        "lam_min_MA": 0.26725954451804895,
        "lam_max_MA": 6.259664613676092,
        "kappa_MA": 23.42166909310644,
        "rho_richardson": 5.259664613676092,
        "omega_opt": 0.3064230488244798,
        "rho_richardson_damped": 0.9181055155413377,
        "pcg_iters_l2": 36,
        "pcg_final_relerr": 7.232314749227596e-11,
        "per_iter_flops": 186112,
        "solve_flops_to_1e10": 6865920,
        "pcg_rel2_curve": [
          1.0,
          0.34369184649879553,
          0.2761783074296394,
          0.16078632603799814,
          0.0753626154057263,
          0.053421262238378016,
          0.02773767031520051,
          0.013621057990927776,
          0.007780117247160799,
          0.005708529951108523,
          0.003416544876592595,
          0.001315661146150821,
          0.0008172245507919628,
          0.00045212029590065703,
          0.00022094014676553683,
          7.936961260607053e-05,
          5.281372010017578e-05,
          3.0070298649135663e-05,
          1.5714818380084656e-05,
          9.457098177247744e-06,
          6.505140145458878e-06,
          3.839034754539127e-06,
          2.0148169972356203e-06,
          1.0740051221556715e-06,
          5.237109878815148e-07,
          1.7111193833084357e-07,
          8.689130389273918e-08,
          4.7474908885557955e-08,
          2.148444908636351e-08,
          1.1552635763815086e-08,
          5.656453022015207e-09,
          2.102507581387782e-09,
          1.2596340598801459e-09,
          6.460282328656252e-10,
          2.5050584485660157e-10,
          1.2232062438936782e-10,
          7.232314749227596e-11
        ]
      },
      "4": {
        "rank": 4,
        "asym": 0.0,
        "rel_err_2": 0.04804285039675881,
        "storage_floats": 98304,
        "storage_frac_N2": 0.09375,
        "compression_factor": 10.666666666666666,
        "apply_flops": 196608,
        "dense_apply_flops": 2097152,
        "apply_speedup": 10.666666666666666,
        "min_eig_M": 0.0001329154608644534,
        "spd": true,
        "lam_min_MA": 0.38408157468592197,
        "lam_max_MA": 3.702942333732338,
        "kappa_MA": 9.641030910582925,
        "rho_richardson": 2.702942333732338,
        "omega_opt": 0.4893536335523983,
        "rho_richardson_damped": 0.8120482858469172,
        "pcg_iters_l2": 27,
        "pcg_final_relerr": 3.781853903490157e-11,
        "per_iter_flops": 218880,
        "solve_flops_to_1e10": 6108416,
        "pcg_rel2_curve": [
          1.0,
          0.11382962646312227,
          0.0443178925552692,
          0.019821723916607456,
          0.013412560629270777,
          0.005946769599163597,
          0.0020440268142011453,
          0.0010189751837513213,
          0.00044020294612382067,
          0.00015560112790785418,
          8.382751214451139e-05,
          4.5854819657798704e-05,
          1.5513584719639998e-05,
          6.469524973109275e-06,
          3.633746236869843e-06,
          1.3462114666663392e-06,
          6.830752138839904e-07,
          3.8227906482179724e-07,
          1.3959596002089118e-07,
          6.408894291630177e-08,
          3.1471730881922994e-08,
          1.0888151555396104e-08,
          3.3329763627512785e-09,
          1.4421683561711633e-09,
          5.545898003803427e-10,
          2.5248432094448677e-10,
          1.17136973032114e-10,
          3.781853903490157e-11
        ]
      },
      "8": {
        "rank": 8,
        "asym": 0.0,
        "rel_err_2": 0.0113906879014933,
        "storage_floats": 131072,
        "storage_frac_N2": 0.125,
        "compression_factor": 8.0,
        "apply_flops": 262144,
        "dense_apply_flops": 2097152,
        "apply_speedup": 8.0,
        "min_eig_M": 0.00013291546086445296,
        "spd": true,
        "lam_min_MA": 0.5589130036278921,
        "lam_max_MA": 2.1527290394716045,
        "kappa_MA": 3.851635273286339,
        "rho_richardson": 1.1527290394716045,
        "omega_opt": 0.7375604774566534,
        "rho_richardson_damped": 0.5877678581874797,
        "pcg_iters_l2": 18,
        "pcg_final_relerr": 2.272100609441034e-11,
        "per_iter_flops": 284416,
        "solve_flops_to_1e10": 5383680,
        "pcg_rel2_curve": [
          1.0,
          0.06228699236236569,
          0.007812931703988783,
          0.003006647248016309,
          0.0007986463949513045,
          0.00021181429682986015,
          9.0540483449428e-05,
          2.095968214740372e-05,
          6.694515058617555e-06,
          2.169288193666623e-06,
          4.7634757657274774e-07,
          1.652032232516258e-07,
          6.007921692490722e-08,
          1.4749449792228304e-08,
          5.39012214080148e-09,
          1.3808560476380727e-09,
          3.675667544664273e-10,
          1.4268287575755933e-10,
          2.272100609441034e-11
        ]
      },
      "16": {
        "rank": 16,
        "asym": 0.0,
        "rel_err_2": 0.0022286102415789307,
        "storage_floats": 196608,
        "storage_frac_N2": 0.1875,
        "compression_factor": 5.333333333333333,
        "apply_flops": 393216,
        "dense_apply_flops": 2097152,
        "apply_speedup": 5.333333333333333,
        "min_eig_M": 0.00013291546086445302,
        "spd": true,
        "lam_min_MA": 0.7405456891800904,
        "lam_max_MA": 1.4427731135749433,
        "kappa_MA": 1.9482567175191279,
        "rho_richardson": 0.4427731135749433,
        "omega_opt": 0.9160366307825902,
        "rho_richardson_damped": 0.32163302194289867,
        "pcg_iters_l2": 11,
        "pcg_final_relerr": 1.6693601895683918e-11,
        "per_iter_flops": 415488,
        "solve_flops_to_1e10": 4965632,
        "pcg_rel2_curve": [
          1.0,
          0.017938673242657417,
          0.0006298633576063031,
          0.00015746145280012787,
          1.0724912577522946e-05,
          2.337798927261183e-06,
          3.575075069717256e-07,
          4.521894697960863e-08,
          8.685959376456302e-09,
          9.097280831385509e-10,
          1.96861540766831e-10,
          1.6693601895683918e-11
        ]
      }
    },
    "punchline_1d": {
      "n": 1024,
      "rel_err_M_vs_inv": 7.936248068743994e-16,
      "storage_floats": 73728,
      "compression_factor": 14.222222222222221,
      "richardson_1iter_rel_err": 1.8491467156912093e-15,
      "rho_richardson": 4.6424530886213233e-11
    },
    "cost_note": {
      "text": "All M_r here are assembled from the exact dense A^{-1} (O(N^3) offline) -- pedagogy, not production. Real H-matrix arithmetic (H-LU, HSS, recursive skeletonization, hierarchical interpolative factorization) constructs equivalent operators in O(N log N)-ish time directly from A.",
      "references": [
        "W. Hackbusch, 'A sparse matrix arithmetic based on H-matrices. Part I', Computing 62(2):89-108, 1999",
        "L. Grasedyck, W. Hackbusch, 'Construction and arithmetics of H-matrices', Computing 70(4):295-334, 2003",
        "P.-G. Martinsson, V. Rokhlin, 'A fast direct solver for boundary integral equations in two dimensions', J. Comput. Phys. 205(1):1-23, 2005",
        "K. L. Ho, L. Ying, 'Hierarchical interpolative factorization for elliptic operators: differential equations', Comm. Pure Appl. Math. 69(8):1415-1451, 2016"
      ]
    },
    "flops": {
      "convention": "1 MAC = 2 flops; per iter = 2*nnz(A) + 12N + 2*storage; setup = one M-apply + 2N; offline M_r construction excluded",
      "nnz_A": 4992,
      "vector_flops_per_iter": 12288,
      "cg_per_iter_flops": 22272,
      "cg_solve_flops_to_1e10": 1627904
    }
  },
  "viz": {
    "file": "results/hodlr_viz_data.json",
    "size_mb": 2.6073427200317383,
    "apply_max_rel_dev": 2.4169174248003624e-07,
    "n_blocks_rank2": 46,
    "n_blocks_rank8": 46
  },
  "anim": {
    "gif_mb": 0.3945131301879883,
    "frames": 28,
    "kmax": 24,
    "rel_err_at_k24": {
      "plain GD": 0.6237097616141377,
      "CG": 0.017368636467903667,
      "PCG + HODLR $M_2$": 5.237109878815148e-07,
      "PCG + HODLR $M_8$": 1.1901943678544951e-14
    }
  }
}