Where the angle comes from

What a sample grid decides

The rule takes its minimum over 384 sampled azimuths, and that number has been a constant since this site's first commit. Tripling it changes nothing at the two rises the collection argues from — five runs of five, identical readings — and changes which answer appears at the one rise published as having no answer. A parameter of the program, measured rather than assumed.

Worth reading first: The rung was not the instrument · Where the model stops · How far a primordium reaches.

The placement rule computes an energy at every one of 384 azimuths around the stem and puts the next organ at the smallest. That number has been in this site’s code since its first commit, has never been swept, and turned out to decide which rungs of the ladder an instrument can read.

Finding that a constant is doing work raises an immediate question about everything already published, and this essay is the answer to it. The short version: the two rises the collection argues from do not move, and the one published as having no answer answers differently — which is exactly the distribution of consequences that ought to follow.

What the finer grid does to the rises already published. The two rises this site has argued from and the one it published as having no answer, each read at both azimuth grids, five stems apiece. A filled mark agrees with the position counter, a half mark contradicts it, an open mark is a refusal. At 0.013 and 0.005 the readings are identical at both grids, so nothing already written depends on the sample count. At 0.008 they are not: 384 azimuths gives 5/8, 5/8 and 1152 gives 8/13, 8/13, against a counter that says 5/8. That rise was chosen in the earlier work because the three shortest lattice offsets there are within a fifth of each other, and a stem with no answer answering differently on a different grid is the object behaving as it was said to.
Fig. 1 The check. Three rises, five seeded stems each, read at both sample counts with everything else at that earlier work’s settings — a window of 30, a seed of 8 nodes, 900 internodes. At 0.013 and 0.005 the readings are identical and agree with the position counter on every run. At 0.008 they are not identical, and 0.008 is the rise the earlier work chose because the object has no unambiguous answer there.

What a sample grid is

The rule is a statement about a continuous quantity: the next organ goes where the repulsion from the existing ones is least. A computer cannot minimise over a circle, so it evaluates at a finite set of azimuths and takes the smallest.

That is an approximation with a size — the grid step, 360/384 = 0.94° — and the question is always whether the answer depends on it. Usually it does not, because the energy near a minimum is smooth and locally quadratic, so an error of half a grid step in position costs a fraction of a grid step squared in energy and the organ ends up within a fraction of a degree of where the continuous rule would put it.

Where it stops being harmless is when two minima are close in energy. Then the grid decides which one wins — not by rounding the answer but by choosing it — and the choice is repeatable, because the grid is the same on every run. Every stem gets the same wrong answer, and a repeatable wrong answer is invisible to every check that looks for scatter.

The 13/21 rung, at two azimuth grids. Five stems at each of three disturbances, all at a rise of 0.0019, read through a lag window of 45 from a seed of 40 nodes. A filled mark is a stem that returned 13/21, which is what the position counter finds in it; an open mark is a refusal. The only difference between the two rows is how many azimuths the placement rule samples when it takes its minimum: 384, which every run on this site has used since the earlier work, against 1152. At the coarse grid the rule locks onto its own sample points and the readout refuses 14 of 15 stems; at the fine one it reads all 15. The ceiling was a parameter of the program.
Fig. 2 Three disturbances read at both grids, at the fine rung where the grid decides everything. What a sample grid decides is whether a feature is in the pattern or in the sampling, and the test is to change the grid.

The three outcomes, and each is a different thing

At a rise of 0.013 and at 0.005, nothing changes. Five stems apiece at each grid, all ten returning the counted pair. Not “the same within noise” — the same answer, on the same seeds, at both grids. Every argument in this collection that uses a fixed-rise stem uses one of these two rises, so nothing already written depends on the sample count.

That is the result that mattered most and it was not guaranteed. Had it come out the other way, this essay’s finding would have required re-reading four rounds of essays.

At the fine rung, 0.0019, the coarse grid fails and the fine one works. That is the finding this thread opened with: the rungs the site has published are inside the grid’s competence and the fine one is outside it.

And at 0.008 the answer changes. The counter says 5/8. At 384 samples two runs report 5/8 and three refuse. At 1,152, two runs report 8/13 — contradicting the counter — and three refuse. Same stems, same seeds, same everything else.

The angles against the positions, rise by rise. five rises, five seeded stems each. A filled mark is a run whose angle readout returned the pair the position counter finds in the same stem; an open mark is a refusal. At 0.032 the counter says 3/5 and the angles agree on 0 of 5, refusing 5. At 0.013 the counter says 5/8 and the angles agree on 5 of 5. At 0.01 the counter says 5/8 and the angles agree on 5 of 5. At 0.005 the counter says 8/13 and the angles agree on 5 of 5. At 0.008 the counter says 5/8 and the angles agree on 2 of 5, refusing 3. The two instruments share no code path: one is given a list of angles, the other a list of coordinates.
Fig. 3 The fork in its place among the rises, read at the site’s own settings — it is the bottom row, and it is the only one where the angles and the positions do not line up. The earlier work chose this rise deliberately: the three shortest lattice offsets there are 8 at 0.0889, 5 at 0.0953 and 13 at 0.1069 of a circumference, all within a fifth of each other, so the arrangement has no unambiguous second family. It was published as the case where two instruments disagree because the object does not decide.

Why the fork moving is the right result

A first reading of “the answer depends on the grid at 0.008” is that the model is unreliable there. The better reading is that the stem is, and the two are distinguishable.

At 0.008 the pattern is inside a transition. Two lattices are nearly degenerate in energy, the rule is choosing between minima separated by less than the difference a grid step makes, and which it picks is decided by which minimum a sample point happens to land nearer. The earlier work established the degeneracy independently, from the hop lengths — a fact about the lattice, with no rule and no grid in it — and predicted that the readings there would be unstable.

So the grid sweep is a confirmation of that prediction rather than a discovery about the code. A stem with no answer is a stem whose answer depends on irrelevant details, and here is an irrelevant detail it depends on.

The distinction is testable rather than rhetorical, and the test is the one above: a rise where the object has an answer gives the same answer at both grids. Two of three do. If all three had moved, the reading would have been that the model is grid-dependent everywhere and the collection’s numbers are estimates of the grid rather than of the rule.

The 13/21 rung, at two azimuth grids. Five stems at each of four disturbances, all at a rise of 0.0019, read through a lag window of 45 from a seed of 40 nodes. A filled mark is a stem that returned 13/21, which is what the position counter finds in it; an open mark is a refusal. The only difference between the two rows is how many azimuths the placement rule samples when it takes its minimum: 384, which every run on this site has used since the earlier work, against 1152. At the coarse grid the rule locks onto its own sample points and the readout refuses 17 of 20 stems; at the fine one it reads all 20. The ceiling was a parameter of the program.
Fig. 4 Four disturbances, the top of the range dropped. A feature that survives a change of grid is a feature of the arrangement, and the smallest disturbances are where that is hardest to establish.

How much a finer grid buys, and why it is never enough

“Refine the grid until it stops mattering” is the obvious response and it does not terminate. The reason is short and it changes what the right claim about a grid is.

Near a minimum the energy is locally quadratic, so evaluating on a grid of step g mis-estimates the depth of a minimum by an amount proportional to g squared — the organ lands within half a step of the true position, and half a step of position costs a quarter of a step squared of energy. The grid picks the wrong minimum exactly when the two minima are genuinely separated by less than that quantity. So the set of arrangements the grid decides rather than measures is a band, and its width in energy falls as the square of the grid step.

Tripling the sample count from 384 to 1,152 therefore shrinks that band by a factor of nine, not three. That is why one tripling was enough to open a whole rung: the band the coarse grid could not see past was nine times wider than the one the fine grid cannot see past, and the fine rung’s near-degeneracy sat between the two.

But it shrinks and does not close. At the exact rise where two minima are equal the difference is zero, and no finite grid resolves zero. There is always a band of rises where the grid chooses, at every sample count, and refining moves the band rather than removing it. The honest statement about a resolution parameter is therefore not that a fine enough setting is safe; it is that the setting fixes how wide the unsafe region is, and the region has to be located rather than assumed away.

Locating it is cheap, which is the useful half. The width falls as one over the square of the sample count, so a run at two grids bounds it: any rise where the two agree is outside the coarse grid’s band, and the rises where they disagree are inside it and outside nothing finer. One extra sweep converts an unknown into an interval.

Telling a decided fork from a real one

That leaves the question the 0.008 result raises, and it has an answer that costs no computation at all.

Two things produce a rise at which the reading changes with the grid. The object may be genuinely forked there — two arrangements the rule holds equally well, so which one a stem reaches is a matter of where it started. Or the grid may be choosing, in which case the object has one answer and the discretisation is overruling it.

They are distinguishable, and the distinguishing quantity is already being varied. A genuine near-degeneracy is broken by the transient: different seeds arrive at the fork from different states, so at a fixed grid the five stems should split. A grid artefact is not broken by anything of the sort — the grid is identical on every run, so all five stems take the same wrong branch, and the reading is unanimous at each grid and different between them.

So the test is: hold the grid and count how the seeds divide. Unanimous at both grids and different between them is the grid deciding. Split at either grid is the object being ambiguous, and the split fraction is then a measurement of the fork rather than a nuisance.

That is worth having because the two call for opposite responses. A decided fork is a defect and the fix is a finer grid at that rise. A real fork is a result — it is what a rise between two rungs means — and refining the grid there buys nothing, because the ambiguity is in the object and a sharper instrument reports it more sharply rather than removing it.

The rise at 0.008 was chosen by the earlier work precisely because the object was thought to have no unambiguous answer there, so the expectation is the second. Recording the test matters anyway: an expectation that a disagreement is real is exactly the expectation a grid artefact would hide behind.

What a resolution parameter is

The four cases below have a shared shape and it is sharper than “a program parameter”. Each is a resolution: a number that says how finely something is discretised, where the thing being discretised is continuous in the model.

The azimuth grid discretises the circle. The window discretises the neighbourhood. The cut-off discretises the interaction. And in every case the failure mode is the same and is worth stating once:

A resolution parameter fails by deciding rather than by rounding. If the quantity being resolved has one answer, a coarse resolution gives that answer imprecisely, and the imprecision shows up as scatter that shrinks when the resolution improves. If it has two nearly-equal answers, a coarse resolution picks one — the same one every time, because the discretisation is the same every time — and there is no scatter at all. The output is confident, stable, reproducible and wrong.

That is why these are hard to find with the tools available here. Every check here looks for something that varies when it should not, or that fails to vary when it should. A repeatable wrong answer varies in neither direction.

And it says what the diagnostic is: look for near-degeneracies. Wherever the model has two solutions close in whatever it is minimising, the resolution parameters are load-bearing and should be swept. Wherever it does not, they are not. That is a much smaller job than sweeping everything, and it is checkable in advance — the hop-length table says where the degeneracies are without running the model at all.

The class of defect

This site has now recorded four cases of a program parameter behaving like a model parameter, and they are worth listing together because the family resemblance is the useful part.

A recency cut-off that manufactured a lattice. The rule summed over the most recent k nodes, which is a property of the loop rather than of any plant, and at one interaction exponent the model had no lattice at all until the loop was cut — and then had a clean 8/13.

A window that was not binding. reach and maxWindow were one number, the first was doing all the work, and raising the second from 120 to 480 changed nothing and read as convergence.

A truncation that made a pattern. A hard edge on the interaction range produced a fragility that was attributed to the range and belonged to the edge.

And a sample grid that set which rungs are readable. The work here.

What the finer grid does to the rises already published. The two rises this site has argued from and the one it published as having no answer, each read at both azimuth grids, five stems apiece. A filled mark agrees with the position counter, a half mark contradicts it, an open mark is a refusal. At 0.013 and 0.008 the readings are identical at both grids, so nothing already written depends on the sample count. At 0.008 they are not: 384 azimuths gives 5/8, 5/8 and 1152 gives 8/13, 8/13, against a counter that says 5/8. That rise was chosen in the earlier work because the three shortest lattice offsets there are within a fifth of each other, and a stem with no answer answering differently on a different grid is the object behaving as it was said to.
Fig. 5 Two adjacent rises. Reading a pair at a time is how a fork was shown to belong to the geometry rather than to the sample.
What the finer grid does to the rises already published. The two rises this site has argued from and the one it published as having no answer, each read at both azimuth grids, five stems apiece. A filled mark agrees with the position counter, a half mark contradicts it, an open mark is a refusal. At 0.005 and 0.008 the readings are identical at both grids, so nothing already written depends on the sample count. At 0.008 they are not: 384 azimuths gives 5/8, 5/8 and 1152 gives 8/13, 8/13, against a counter that says 5/8. That rise was chosen in the earlier work because the three shortest lattice offsets there are within a fifth of each other, and a stem with no answer answering differently on a different grid is the object behaving as it was said to.
Fig. 6 The two finest. The check costs a rerun rather than a new instrument, which is why this collection runs it often.

All four passed every check this collection runs, and it is worth being clear why: a check asks whether a computation is correct, and every one of these computations was correct. What was wrong was the mapping from a number in the code to a quantity in the world, and that mapping is not a computation.

The check that finds them is the same in every case — change the parameter and see whether the result moves — and it costs one sweep. The reason it is not run on everything is that a model has dozens of such numbers and sweeping all of them is a round of work’s work. What this essay adds to the site’s practice is a priority: sweep the parameters that set a resolution, because those are the ones whose failure is a repeatable wrong answer rather than scatter.

The sweep that should have been run first

There is a version of this essay that would have been better, and it is worth saying what it is rather than presenting the work as though it had been done optimally.

The sweep here has two points — 384 and 1,152 — chosen because the second is three times the first and works. A proper convergence study would take four or five, check that the answer stops changing rather than that it changes once, and report the resolution at which it settles. That is the standard thing to do with a discretisation and it was not done, for the ordinary reason: each point costs a full ensemble at every rise, and the two-point version answered the question the work was asking.

What the two points do establish is the part that matters for what is already published: the readings at 0.013 and 0.005 are the same at both, so those are not near a boundary in the sample count. What they do not establish is that 1,152 is enough at 0.0019 — only that it is enough to read that rung, which is a weaker claim. A rung finer still, 21/34, would need its own check and the work here has not made it.

So the honest statement of the result is: the collection’s fixed-rise numbers are unchanged under a threefold change in the sample grid, and the fine rung is readable at 1,152, and nobody has established where that stops. The first of those is what the essay was for and the third is what later work will have to do if it wants another rung.

Why 384 stays the default

The finer grid is used where it buys a rung and nowhere else, and the reason is cost. Every node’s placement is a loop over the sample count, so tripling it triples the most expensive part of every noisy run on this site — and the noisy runs are the collection’s most expensive figures.

Against that, the measurement above says the default is safe where it is used. Two published rises, five stems each, identical readings at both grids. The fork is not safe and was never presented as safe.

So the rule is: the grid is a setting of the reading, not a constant of the model. At the rises the site argues from, 384 is enough and is checked to be enough. At the fine rung it is not, and the essay that reads the fine rung says so and pays for 1,152. Recording which is which is the whole of the practice.

What this says about the model, which is not nothing

There is a reading of all of this that is too comfortable, and it is worth closing it off. “The grid only matters where the object is degenerate” can be heard as “the grid never matters in practice”, and it should not be.

A real plant is at a rise that changes continuously as it grows, so it passes through every degeneracy on its way down the ladder. The transitions are where the pattern’s parastichy pair changes, and a transition is by definition a place where two lattices are competing. So the arrangements that a grid resolves badly are exactly the arrangements a growing shoot spends part of its life in.

That does not make the site’s transition results wrong — those are read from the position counter, which sees coordinates and has no grid of its own, and from the static ladder, which is arithmetic. But it does mean that any claim about what the rule does at a transition carries a grid dependence that has not been measured, and the site has one such claim: that a grown pattern tracks the static ladder at every rate, with no lag. That was measured at 384 samples, near transitions, on the quantity most sensitive to which of two competing lattices the rule picks.

It is on the list for later work rather than repaired here, and it is on the list because of this essay rather than in spite of it. The value of finding a resolution parameter is not the parameter; it is the list of results that turn out to have been measured through it.

The 13/21 rung, at two azimuth grids. Five stems at each of five disturbances, all at a rise of 0.0019, read through a lag window of 45 from a seed of 40 nodes. A filled mark is a stem that returned 13/21, which is what the position counter finds in it; an open mark is a refusal. The only difference between the two rows is how many azimuths the placement rule samples when it takes its minimum: 384, which every run on this site has used since the earlier work, against 1152. At the coarse grid the rule locks onto its own sample points and the readout refuses 22 of 25 stems; at the fine one it reads all 25. The ceiling was a parameter of the program.
Fig. 7 The measurement that started this, kept here for the comparison. The grid decides everything at the fine rung and nothing two rungs coarser, and the reason is the same in both directions: how close together the competing minima are.
The 13/21 rung, at two azimuth grids. Five stems at each of four disturbances, all at a rise of 0.0019, read through a lag window of 45 from a seed of 40 nodes. A filled mark is a stem that returned 13/21, which is what the position counter finds in it; an open mark is a refusal. The only difference between the two rows is how many azimuths the placement rule samples when it takes its minimum: 384, which every run on this site has used since the earlier work, against 1152. At the coarse grid the rule locks onto its own sample points and the readout refuses 17 of 20 stems; at the fine one it reads all 20. The ceiling was a parameter of the program.
Fig. 8 And the top four disturbances, with the quietest dropped. Six readings is what makes the distinction between the pattern and its sampling a measurement.

What links here

Computed from the collection, not written here: the essays that point at this one.

Shares its objects with

Essays that name at least two of the same things, and that neither author linked.

  • The organ that guards the second slot — both name artefact, discretisation, divergence angle, equilibrium, falsifiability, honest limits, measurement, parastichy pair, the placement rule, repulsion, rise
  • A front with no middle — both name artefact, discretisation, divergence angle, ensemble, equilibrium, honest limits, measurement, parastichy pair, the placement rule, rise
  • A rule that cannot heal a hole — both name artefact, divergence angle, ensemble, equilibrium, honest limits, measurement, parastichy pair, the placement rule, rise
  • The block is the count it was cut from — both name artefact, divergence angle, ensemble, equilibrium, honest limits, measurement, parastichy pair, the placement rule, rise
  • The response with a hole in it — both name artefact, discretisation, divergence angle, honest limits, identifiability, measurement, parastichy pair, the placement rule, rise
  • Two-ranked, by two different routes — both name artefact, discretisation, divergence angle, ensemble, equilibrium, honest limits, measurement, the placement rule, rise

Named objects

A flat tag is an object no other essay names yet.

ArtefactDiscretisationDivergence angleEnsembleEquilibriumFalsifiabilityHonest limitsIdentifiabilityMeasurementModel scopeParastichy pairThe placement ruleRepulsionRiseTransient