Generator

Numbers stored per unknown, against the size of the matrix, at 10⁻⁸

One function in the hodlr library, called 70 times across 11 essays. Below: what it draws at its defaults, what it draws at every value an essay asks for, the 63 claims it put to the test while drawing them, and where it stands against the rule this site is named for.

At its defaults it draws numbers stored per unknown, against the size of the matrix, at 10⁻⁸. The dense matrix stores n numbers per unknown, which is the straight line through the origin and doubles whenever n does. The hierarchical representations store 54, 79, 106, 133 and 50, 70, 94, 120, adding about 26 per doubling — a constant per doubling is a logarithm, and it is the whole claim. At n = 512 that is 26 and 23 per cent of the dense matrix, and the share falls at every size. The exponent between consecutive sizes is 1.55, 1.42, 1.33, falling towards one and never arriving, which is what a logarithm looks like from inside.

storage-size is one function in lib/figures/hodlr.js — the partition — a rule that reads four numbers a pair and no entry of the matrix. Everything below came out of it during this build, at arguments taken from the essays rather than invented for this page. A figure here is the figure a reader meets in an essay, and if the generator changes, this page changes with it.

At its defaults

Drawn even though every essay passes arguments — which on this site is every essay, at 100% of placements since the standard pass. A default nothing exercises is a trap for the next essay to call this with none, and this is the page where a default that has drifted from the figures around it becomes visible.

Numbers stored per unknown, against the size of the matrix, at 10⁻⁸The dense matrix stores n numbers per unknown, which is the straight line through the origin and doubles whenever n does. The hierarchical representations store 54, 79, 106, 133 and 50, 70, 94, 120, adding about 26 per doubling — a constant per doubling is a logarithm, and it is the whole claim. At n = 512 that is 26 and 23 per cent of the dense matrix, and the share falls at every size. The exponent between consecutive sizes is 1.55, 1.42, 1.33, falling towards one and never arriving, which is what a logarithm looks like from inside.56789100108216324432log₂ nstored per unknowndenseweak: every off-diagonal blockstrong: only the admissible onesa constant per doublingstrong, n = 5126.8·10⁴weak, n = 5126.1·10⁴dense, n = 5122.6·10⁵per doubling26relative compression error3.8·10⁻¹⁰the dense line doublesand the other two add a constant

The dense matrix stores n numbers per unknown, which is the straight line through the origin and doubles whenever n does. The hierarchical representations store 54, 79, 106, 133 and 50, 70, 94, 120, adding about 26 per doubling — a constant per doubling is a logarithm, and it is the whole claim. At n = 512 that is 26 and 23 per cent of the dense matrix, and the share falls at every size. The exponent between consecutive sizes is 1.55, 1.42, 1.33, falling towards one and never arriving, which is what a logarithm looks like from inside.

show: "eta"

The arguments are the ones A geometry setting that is a second accuracy passes. A value nobody placed would be a picture no essay asked for and no claim was ever checked against.

The separation constant moves the block count and the rank together, at 10⁻⁸Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 3.25 to 8.94 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 224.9 to 120.0 per unknown, and the error against the dense matrix rises from 3.27·10⁻¹⁰ to 1.13·10⁻⁹ although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.n = 512, leaf 16blocks, tightest to loosest592and at the loosest94mean rank, tightest3.3and at the loosest8.9052104156208260the separation constantstored per unknown0.20.30.40.50.951.4stored per unknownmean rank, compressed blocksboth curves move togetherwhich is what the other two knobs never do

Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 3.25 to 8.94 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 224.9 to 120.0 per unknown, and the error against the dense matrix rises from 3.27·10⁻¹⁰ to 1.13·10⁻⁹ although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.

show: "rank"

The arguments are the ones A geometry setting that is a second accuracy passes. A value nobody placed would be a picture no essay asked for and no claim was ever checked against.

What moves the storage slope: the rank, not the partitionThe growth in numbers stored per unknown per doubling, against the mean rank of the low-rank blocks, at six tolerances from 10⁻² to 10⁻¹². The partition is identical at every one — 250 blocks, 156 low-rank and 94 dense — because it is decided by geometry before any tolerance is applied. The mean rank rises by one per two decades of accuracy: 1.67, 2.67, 3.67, 4.67, 5.67, 6.67. The slopes are 10.9, 16.0, 21.1, 26.3, 31.4, 36.5, and the line through them has gradient 5.13 numbers per unknown per doubling per unit of rank, with a worst residual of 0.00.six tolerancesblocks, every tolerance250slope per unit of rank5.1worst residual3.6·10⁻¹⁵234567010203040mean rank of the low-rank blocksnumbers per doubling2 digits4 digits6 digits8 digits10 digits12 digitsthe partition is the same at every toleranceand the rank rises one per two decades

The growth in numbers stored per unknown per doubling, against the mean rank of the low-rank blocks, at six tolerances from 10⁻² to 10⁻¹². The partition is identical at every one — 250 blocks, 156 low-rank and 94 dense — because it is decided by geometry before any tolerance is applied. The mean rank rises by one per two decades of accuracy: 1.67, 2.67, 3.67, 4.67, 5.67, 6.67. The slopes are 10.9, 16.0, 21.1, 26.3, 31.4, 36.5, and the line through them has gradient 5.13 numbers per unknown per doubling per unit of rank, with a worst residual of 0.00.

show: "eta", logEps: -12

The arguments are the ones A geometry setting that is a second accuracy passes. A value nobody placed would be a picture no essay asked for and no claim was ever checked against.

The separation constant moves the block count and the rank together, at 10⁻¹²Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 4.90 to 11.68 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 270.3 to 156.0 per unknown, and the error against the dense matrix rises from 1.09·10⁻¹⁴ to 1.57·10⁻¹³ although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.n = 512, leaf 16blocks, tightest to loosest592and at the loosest94mean rank, tightest4.9and at the loosest12063126189252the separation constantstored per unknown0.20.30.40.50.951.4stored per unknownmean rank, compressed blocksboth curves move togetherwhich is what the other two knobs never do

Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 4.90 to 11.68 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 270.3 to 156.0 per unknown, and the error against the dense matrix rises from 1.09·10⁻¹⁴ to 1.57·10⁻¹³ although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.

show: "eta", logEps: -2

The arguments are the ones A geometry setting that is a second accuracy passes. A value nobody placed would be a picture no essay asked for and no claim was ever checked against.

The separation constant moves the block count and the rank together, at 0.01Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 1.00 to 3.10 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 161.8 to 50.0 per unknown, and the error against the dense matrix rises from 2.15·10⁻⁴ to 0.00183 although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.n = 512, leaf 16blocks, tightest to loosest592and at the loosest94mean rank, tightest1and at the loosest3.1050100150the separation constantstored per unknown0.20.30.40.50.951.4stored per unknownmean rank, compressed blocksboth curves move togetherwhich is what the other two knobs never do

Against the constant that decides how far apart two clusters must be before their block may be compressed, at n = 512 and a leaf of 16: the numbers stored per unknown, and the mean rank of the compressed blocks drawn on the same axis as a fraction of its height. Loosening it from 0.2 to 1.4 takes the block count from 592 to 94 and the mean rank from 1.00 to 3.10 — both at once, which is what neither of the other two settings does. The storage falls the whole way, from 161.8 to 50.0 per unknown, and the error against the dense matrix rises from 2.15·10⁻⁴ to 0.00183 although the tolerance never changed. The curve is a staircase rather than a slope because the ratios a balanced tree over evenly spaced points can offer are a discrete set.

show: "plateaus"

The arguments are the ones A geometry setting that is a second accuracy passes. A value nobody placed would be a picture no essay asked for and no claim was ever checked against.

Every partition the separation constant can select, and how much of its range each one holdsThe number of blocks against the separation constant, over the whole range the constant is allowed. There are 58 genuinely different partitions in it and the curve between them is flat, so the constant is a selector rather than a dial. They are not evenly spread: the widest runs from 0.996 upward and holds 50 per cent of the range at 94 blocks, the next holds 22 per cent at 250, and the two together hold 72 per cent. The remaining 56 are crammed below the middle of the range, so a sweep on an even grid returns two answers three times in four and never sees the rest.00.250.50.7511.251.51.75202004006008001000the separation constantblocks in the partition50% of the range22%over the whole rangedistinct partitions58widest, share of the range0.5two widest together0.72the curve is flat between the stepsand two treads hold three quarters of it

The number of blocks against the separation constant, over the whole range the constant is allowed. There are 58 genuinely different partitions in it and the curve between them is flat, so the constant is a selector rather than a dial. They are not evenly spread: the widest runs from 0.996 upward and holds 50 per cent of the range at 94 blocks, the next holds 22 per cent at 250, and the two together hold 72 per cent. The remaining 56 are crammed below the middle of the range, so a sweep on an even grid returns two answers three times in four and never sees the rest.

What it checked while drawing

Every figure above checked its own claims on the way to being drawn, and a claim that failed would have stopped the picture rather than shipped a wrong one. Those checks used to leave no trace at all: a passing one returned true and the only evidence the figure had checked anything was that nothing crashed. The list below is what they actually said, collected by running this generator with an observer installed — not a description of what it is believed to check.

63 distinct claims across 6 sets of arguments, grouped below by shape — because most of them are one sentence with a different number in it, and how many separate times that sentence was put to the test is the informative part.

the partition is the same at ε = 0.01 — checked 6 times

the mean rank rises by one from 2 digits to 4 — checked 5 times

the product reads every stored number once at leaf 4 — checked 5 times

and every size is still the matrix at n = 64 — checked 4 times

leaf 32 overtakes leaf 16 only at a positive overhead — checked 2 times

no positive overhead makes leaf 4 beat leaf 8 — checked 2 times

a cell the probe measures

a frequency the offsets are measured at

a guess this figure draws

a kernel this file defines

a leaf the halving reaches by halving

a looser separation never stores more

a partition rule this file defines

a per-block overhead between none and ten thousand operations

a power of two, so the bisection is exact at every level

a rank guess that is a number

a roughness view this figure draws

a shift inside the range the matrix stays positive definite and the geometry stays the geometry

a size the dense reference below is affordable at

a storage view this figure draws

a tolerance the dial draws

a tolerance the leaf sweep measures

an accuracy every frequency has singular values across

an accuracy every one of the four kernels has singular values across

an accuracy the blocks have singular values across

an accuracy, not a rank

an admissibility constant inside the range the expansion converges over

and is substantially worse

and just past the first crossover it does not

and never carries a smaller mean rank

and so is the split between low-rank and dense

and the crossovers come in order

and the highest reaches it

and the ranks do not move with the leaf

and the slope is linear in the mean rank

and there is a leaf above the optimum to be overtaken

and two of them hold more than half the range

at about five numbers per unknown per doubling per unit of rank

at no overhead the storage optimum stands

matmul shapes agree

no frequency passes twice the smooth kernel's rank

so the two objectives choose the same leaf

the constant selects among many partitions

the largest leaf is never the best

the storage per unknown grows by a constant per doubling, which is a logarithm

Against the rule

It draws a decomposition and prints its residual. It calls storageAgainstSize, and every figure above carries the badge — which residualcheck verifies by looking for it in the emitted SVG rather than by finding the call that builds one. A badge that is constructed and then left out of the body is the failure that check exists for.

Across the library: the rule bites on 217 of 397 generators — 199 print a residual and 18 are exempt with a published reason; 180 factorise nothing. Read from lib/residual-rule.js, which is the same body the gate enforces from, and the gate's last check fails the build if this page and it disagree about any generator.

Where it is called

Changing this generator changes every figure on this list. That is what makes the list worth publishing rather than keeping in a check script.

Neither sparse nor dense

A geometry setting that is a second accuracy

The tolerance raises every rank and moves no block; the leaf moves every block and no rank. The constant that decides how far apart two clusters must be before their block may be compressed moves both — 592 blocks at mean rank 3.25 at one end and 94 at mean rank 8.94 at the other — and the storage falls the whole way while the error against the dense matrix rises by a factor of 3.5, at a tolerance that never changed. It has no best setting, and it is not a third knob on the storage.

Neither sparse nor dense

A prediction that arrives a decade late

A rougher kernel raises every rank, a higher rank raises the side at which compressing a block stops paying, so the leaf that stores least should rise. Across four kernels whose largest rank runs 5, 5, 9 and 10, it is 16 on three of them and a tie between 8 and 16 on the fourth. The prediction is right in sign and out by a decade of tolerance, and the reason is a ceiling: an oscillation multiplies the rank by exactly two — 3 and 6, 4 and 8, 5 and 10, 6 and 12, 7 and 14 — at any frequency, because a cosine of a difference is a rank-two function.

Neither sparse nor dense

A quarter of the leaf

The leaf that stores a hierarchical matrix most cheaply had been read off a table of nine points, with the suggestion that it depends on the mean rank alone. Across six kernels at five tolerances — thirty cells — it does, once the mean rank is read in the right place. Plotted against the mean rank at a fixed leaf of 16, two cells a tenth of a rank apart want leaves of 8 and 16. Plotted against the rank of the blocks a halving would create, one rule — halve the leaf while that rank is below a quarter of the leaf — predicts the best leaf on 28 of the 30, and the two it misses are the two whose rank sits within three per cent of the threshold. The fractional power the last measurement expected to be rough is smoother than 1/r.

Neither sparse nor dense

A second objective that is the first one doubled

Counting the operations a hierarchical product does was supposed to give the leaf size a second optimum, somewhere other than where the storage puts it. The count is 160,128, 139,904, 135,936, 155,136 and 216,064 against stored totals of 80,064, 69,952, 67,968, 77,568 and 108,032 — twice each, at every leaf, exactly. The two objectives cannot disagree, and what separates the leaf that stores least from the leaf that runs fastest is a charge of about 139 operations for reaching a block at all.

Neither sparse nor dense

An offset that bends twice

A hierarchical matrix's cheapest leaf can be named by one build at a leaf of 8, and a rank guessed from the tolerance alone names it on smooth kernels and misses on oscillatory ones. The repair proposed was a term in the frequency: the oscillatory kernels sat two thirds of a rank and one and a half ranks above 1/r at frequencies 40 and 120, and the prediction was a fixed step each time the frequency triples. On five frequencies from 13⅓ to 1,080 the step is a third of a rank, then one, then one and a half, then a third again — a curve that bends twice. The last bend is the smallest blocks filling up: at the tightest tolerance every 8-wide block is at full rank from 360 on. No fixed term reproduces it, and the one build that reads it directly still names the cheapest leaf on thirteen cells of fifteen, never storing two per cent too much, where the uncorrected guess misses seven by up to nine.

Neither sparse nor dense

Each halving reads its own width

A hierarchical matrix's cheapest leaf is found by halving it while the blocks the halving creates have rank below a quarter of the leaf. The proposal was to probe only the near blocks of one compression at a leaf of 8, predicted to do at least as well as the whole compression. It does worse: twelve cells of fifteen against thirteen, every miss naming 16 where 32 is cheapest, because the decision between 32 and 16 turns on whether a block reaches rank 8 and an 8-wide block cannot exceed it. Read each halving off the blocks of its own width instead and the probe names the cheapest leaf on all fifteen oscillatory cells and all thirty cells of six kernels, beating even the rule with every leaf compressed, from eighteen small blocks at under one per cent of the work of the compression it replaces.

Neither sparse nor dense

One build tells the leaf

The rule that picks a hierarchical matrix's cheapest leaf — halve it while the rank at half the leaf is below a quarter of the leaf — reads ranks that exist only after the matrix has been built at every candidate leaf. Fed instead the rank a code can guess from the tolerance alone, one rank per two decades, it names the best leaf on twenty-three cells of thirty, and on the rank-one kernel it cannot see it stores up to seventy-two per cent too much. Doubling the guess for an oscillation, as earlier measurements suggested, makes it worse: eighteen of thirty. Building once, at a single leaf, and holding that build's mean rank fixed names the best leaf on twenty-nine — one more than the rule that builds at all five — and never stores three per cent more than the least.

Neither sparse nor dense

The offset that moved the slope

The accuracy is supposed to lift a storage curve and leave its growth alone. Measured at seven tolerances, the strong partition adds 10.9 numbers per unknown per doubling at two digits and 36.5 at twelve — the growth rate more than triples, so ten decades of accuracy cost 33 per cent more storage at 64 unknowns and 118 per cent at 512.

Neither sparse nor dense

The partition that does not move

The storage curve's growth rate more than triples between two digits and twelve, and the earlier measurement said so without saying what moves it. There are two candidates and the measurement separates them decisively: the partition is identical at every tolerance — 250 blocks, 156 of them low-rank, 94 dense — and the mean rank rises by exactly one per two decades of accuracy. The slope is 5.11 numbers per unknown per doubling per unit of rank, with a worst residual of 0.03 over six tolerances.

Neither sparse nor dense

The test that costs what it saves

The partition that refuses to compress a touching pair keeps every rank at five while the other lets them climb from nine to thirteen. It also stores more numbers at every size measured — 67,968 against 61,440 at n = 512 — and which of those two facts matters is a question about how large the problem is going to get.

Neither sparse nor dense

Two knobs on one number

The tolerance raises every block's rank and leaves the partition alone. The leaf size does the opposite — it changes how many blocks there are and does not move a single rank. Both act on the same storage, and only one of them has a best setting: at eight digits the least storage is at a leaf of 16 and the largest leaf tried costs 59 per cent more. The best leaf rises with the accuracy, from 4 at two digits to 16 at twelve, and the influence runs only that way.

The whole library · All essays · What must fail