Where the angle comes from

A neighbourhood is a hypothesis

Every simulation of this kind stops summing somewhere. The previous phase found that where it stops decides what pattern comes out — so the stopping place is not a detail of the program but a claim about how far a primordium's influence reaches, and it should be written down as one.

Worth reading first: How far a primordium reaches · The exponent that barely matters · A window that makes a pattern.

The placement rule on this site has one line that decides everything and one line nobody wrote down as a decision. The first is the rule itself: put the next primordium where the repulsion from the ones already there is least. The second is the sum that “the ones already there” runs over — because a real sum has to stop.

Three cut-offs at the same nominal width of 3 spacingsThe weight the interaction is multiplied by, against distance. They halve at 2.08 (exponential), 2.50 (gaussian), 3.00 (hard) spacings — so a rule described as "cut off at 3 spacings" is three different rules until the falloff is named. Every later figure is read in half-weight radii for that reason.00.2500.5000.7501012345distance from the candidate, in local spacingsweight the interaction is multiplied byhalf weightweight = f(d / 3√h)window runs to 4 widths
Fig. 1 Three ways of stopping, at the same nominal width. The weight the interaction is multiplied by, against distance in local spacings. They reach half strength at three different distances, which is the reason the rest of this essay measures ranges in half-weights rather than in the number somebody typed.

The previous phase discovered what that stopping place is worth. At an inverse first power the rule produces no lattice at all when it can see far enough — the divergence angle wanders over forty degrees, which is the wandering of an arbitrary sequence. Cut the neighbourhood at three spacings and the same rule produces a clean 8/13 at 137.62° with 0.58° of scatter: a pattern that passes every test this collection has, and disappears the moment the window is widened.

That result was recorded as truncation manufactures a pattern, and it was recorded with a repair attached that the phase did not have room to make. The repair is the subject here, and it is one sentence long: the neighbourhood is a parameter of the model rather than of the loop.

What the loop was actually doing

The code is worth being exact about, because the defect is invisible in the mathematics and obvious in the program.

grow() places node i by sweeping a candidate azimuth around the cylinder and computing, at each candidate, the total repulsion from a set of neighbours. The set was the most recent reach/√h nodes. That is a cut in recency: a node is in the sum because it was placed lately, not because it is nearby.

Two things follow, and the second is the one that matters.

The first is that the cut has no physical reading at all. On a cylinder the most-recent nodes are the ones nearest the top, so a recency window is roughly a band of rows below the tip — but only roughly. A node placed forty steps ago sits somewhere on a circle whose circumference is the whole stem, so some of it is close to the candidate and some of it is half a turn away, and the window keeps all of it equally. Meanwhile a node placed a hundred steps ago that happens to lie directly below the candidate is discarded. Nothing about a growing apex works that way. If inhibition falls off with distance, it falls off with distance.

A stem gathers neighbours linearly; a growing disc barely gathers them at allOn a cylinder of circumference 1 with a rise of 0.02, the nodes within distance d number 2d/0.02 once d exceeds one turn — a fitted exponent of 1.020 and 100 per unit against the 100 the geometry fixes. In the disc model an element of age k sits at radius e^(0.4k), so each doubling of the distance adds the same two or three neighbours rather than twice as many.123-0.50000.50011.50distance from the node, log₁₀neighbours, log₁₀a stemslope 1a disca logarithmrise 0.02 · 6000 nodes · meristem growth 0.4slope 1.020 against slope 1
Fig. 2 Why a recency window and a distance window are different cuts. The neighbours of a node accumulate linearly with distance on a cylinder, and at the rate the geometry fixes — so a fixed number of recent nodes is a ring of varying radius, and a fixed radius is a varying number of nodes.

The second is that the recency cut is smooth in the one variable the rule minimises over. As the candidate azimuth sweeps around the circle, the set of neighbours in the sum does not change: it was chosen once, before the sweep began. So the energy profile the rule sees is a continuous function of azimuth, whatever the window is.

That is not a small property. It is the reason the truncated rule produces a beautiful lattice rather than nonsense, and it is why the obvious repair — cut at a distance instead — turns out to be a different thing entirely rather than a tidier version of the same thing. That comparison has an essay of its own; what belongs here is why the repair was attempted in the first place.

Why nobody noticed

It is worth asking how a decision of this size stayed invisible through four phases, because the answer generalises past this site.

A loop bound does not look like a modelling choice. It looks like an efficiency measure — the kind of line written while thinking about something else, with a comment saying keep the last few hundred, the rest contribute nothing. That comment is even true for the exponent the model was built at: at an inverse cube the far field really does contribute nothing, and a window of any generous size gives the same answer as no window at all. The bound was introduced when it was harmless and was still there when it was not.

What made it harmful was a different phase asking a different question. Varying the falloff exponent is the natural thing to do to a rule whose exponent came from a ferrofluid experiment rather than from a plant, and at the long-ranged end of that sweep the window stopped being generous and started being the model. Nothing warned anybody. Every gate was green; the figures were beautiful; the counts were Fibonacci.

There is a general shape here and this collection has now met it three times. A parameter that is not binding reports the same number however it is varied, and the same number however it is varied reads as robustness. The previous phase’s first sweep varied the window and found the answer perfectly stable, because at the rises involved the window was not the binding constraint and every column of the table was the same run. A robustness check that varies the wrong quantity is worse than no robustness check, because it is evidence for the wrong conclusion.

A cut-off, and what makes it a hypothesis

The change is small. Instead of choosing a set of neighbours and summing over it, multiply every neighbour’s contribution by a weight that falls with distance:

E(x)=qw ⁣(d(x,q)L)d(x,q)pE(x) = \sum_q w\!\left(\frac{d(x,q)}{L}\right) d(x,q)^{-p}

where LL is a stated width and ww is a stated falloff. The sum still runs over a finite set of nodes, because a program has to stop somewhere — but now the stopping place is chosen to be irrelevant: the window runs to four widths, where an exponential weight has fallen to e4e^{-4}, about one part in fifty-five, and a gaussian to 10710^{-7}.

The distinction between those two stopping places is the whole content of this change, and it is worth stating plainly. The old window decided the answer. The new one is required not to. That requirement is a check rather than a hope: assertTheWindowIsNotTheCutOff runs the same cut-off over twice as many neighbours and requires the settled divergence to move by less than a third of a degree. It does; the two agree to two decimal places.

What the change buys is that LL is now a claim about a plant. Inhibition from a primordium falls to half its strength at about two cell diameters is a sentence a biologist could argue with, could measure against, and could be wrong about. The loop stops after forty-seven nodes is a sentence about a program.

Two runs of the same rule from unrelated starting anglesBoth settle at 137.0°, within 0.5° of the golden angle, from seeds 166° apart.120130140150020406080stepdivergence angle produced at that step (°)golden anglegrowth 0.40settled spread 0.00°
Fig. 3 The rule the whole argument is about, before any of this. Each element is placed where the repulsion from the ones already present is least — and “the ones already present” is the phrase this essay is a repair to.

Three shapes, and why the third is here

The library carries three falloffs, and it is worth being explicit that only two of them are hypotheses.

Exponential, ed/Le^{-d/L}, is the steady-state concentration of a substance that is produced at a source, diffuses, and decays at a constant rate. It is what the standard account of auxin depletion actually implies: a primordium acts as a sink, the depleted region around it has an exponential profile, and the next primordium forms where the concentration recovers. Of the three, this is the one with a mechanism behind it.

Gaussian, e(d/L)2e^{-(d/L)^2}, is what a briefly-produced signal’s profile looks like as it spreads by diffusion alone, with no decay. It is the other standard shape and it describes a different story about the same chemistry.

Hard, one inside the width and zero outside, is not a physical claim about anything. It is in the library because it is what a truncated loop amounts to once it is written down as a function — the previous phase’s accident, converted into an explicit hypothesis so that it can be compared with the ones made on purpose. It turns out to behave completely differently from both smooth shapes, and that difference is the sharpest result of this thread.

The landscape the rule chooses over, at a cut-off of 3 spacingsOne height of an ideal lattice, swept around the circle. The exponential cut-off hands the rule a smooth landscape; the hard one hands it a landscape with steps, because a neighbour enters the sum as the candidate slides past it. Halving the sample resolution multiplies the largest jump between neighbouring points by 2.00 on the smooth curve and by 1.04 on the hard one — which is the definition of the difference, since a smooth function's steepest step is bounded by its derivative and a discontinuity's is not. An argmin taken over steps is pinned to the steps.00.2500.5000.750100.2000.4000.6000.8001candidate azimuth, in turnsenergy the rule minimises, scaled to its own rangeexponentialhard — a step, not a sloperise 0.02 · p = 1two cut-offs, one lattice
Fig. 4 The landscape the rule chooses over, under a smooth cut-off and a hard one. Both are the same lattice and the same range; the hard cut-off’s profile has steps in it, because a neighbour enters the sum as the candidate slides past it. An argmin taken over a landscape with steps is pinned to the steps.

The unit the widths have to be read in

There is a trap in comparing shapes that this essay walked into and that the figures now exist to prevent.

Ask for “a cut-off at three spacings” and the three shapes give three different rules. At d=3d = 3 spacings with L=3L = 3, the exponential is at e1=0.37e^{-1} = 0.37 and the gaussian is at e1=0.37e^{-1} = 0.37 too — they agree there by construction — but at d=1.5d = 1.5 the exponential is at 0.61 and the gaussian at 0.78, and at d=6d = 6 the exponential is at 0.14 and the gaussian at 0.018. Nominally the same width, and one of them keeps four times as much of its far field.

The consequence, measured before it was understood: the two shapes disagreed about where the lattice ends, and the disagreement was reported as a property of the shapes when part of it was a property of the axis. The repair is a unit. Every range in this thread is stated as a half-weight radius — the distance at which the weight has fallen to a half — which is Lln2=0.83LL\sqrt{\ln 2} = 0.83L for a gaussian and Lln2=0.69LL\ln 2 = 0.69L for an exponential.

That does not make the disagreement go away. It shrinks it, and what is left is real, and the essay that follows this one is about what the residue turns out to be. But the unit had to exist before the question could be asked, and the general form is one this collection keeps rediscovering: a comparison between two models is a comparison between two parameterisations until somebody names the quantity both are being read in.

What the cut-off makes

With all of that in place, the prediction the previous phase recorded can be tested. It had three parts. A physical cut-off at three spacings would reproduce the manufactured lattice; it would be as fragile as the manufactured one; and the width would become a hypothesis with a critical value.

One rule at p = 1, cut three waysloop cut at 3/√h: 8/13 at 137.62° with 0.58° of scatter. exponential cut-off, 3: 8/13 at 137.58° with 0.50° of scatter. no cut at all: no lattice, 44° of scatter. The first two agree to 0.03° — the prediction held — and the third is what the same rule does when nothing cuts it.02040130135140145divergence the stem settles on, in degreesscatter of that divergence over the last quarter323 nodes, rise 0.4 → 0.004filled: a lattice · open: none
Fig. 5 The same rule at an inverse first power, cut three ways. The truncated loop and the exponential cut-off land within a third of a degree of each other and both count 8/13; the same rule with nothing cutting it has no divergence angle at all.

The first part holds, closely. The truncated loop settles at 137.62° with 0.58° of scatter and counts 8/13. An exponential cut-off at the same range settles at 137.58° with 0.50°, and counts 8/13. Four hundredths of a degree apart, on a quantity whose branches are three degrees apart — the two are the same pattern by any reading.

The third part holds too, and it is what makes the change worth making. Widen the cut-off and the lattice stops: past about four half-weights the exponential rule has no divergence angle either, which is the state the uncut rule was in all along. So there is a boundary, it is at a stated width, and the width is a number about inhibition rather than about a loop. A hypothesis that excludes something is the only kind worth having.

The second part fails, and it fails in the most useful direction available. That has an essay of its own as well.

The same rule at p = 1, cut off at two distancesThe top 220 nodes of two stems grown by an identical rule whose energy does not converge. Allowed to see 3/√h neighbours it produces 8/13 at 137.62° with 0.58° of scatter — a lattice no test on this site would question. Allowed 12/√h it produces 44° of scatter and no pattern. The truncation was doing the work.cut at 3/√h8/13 at 137.62°0.58° of scattercut at 12/√hno divergence angle43.86° of scatterexponent 1 · identical but for the neighbourhood0.58° against 43.9°
Fig. 6 The result this repair exists for. The same rule at an inverse first power makes a clean lattice with its neighbourhood cut and none with it open, and until this phase the cut was a loop bound rather than a claim.

What a width would mean on a plant

It is worth spending a paragraph on what the number actually refers to, because a model parameter with no units attached is a model parameter nobody can refute.

The local spacing on a cylindrical apex of unit circumference gaining one node per rise hh is h\sqrt{h} — each node holds an area of hh, and the distance between neighbours is the root of it. On a real shoot apical meristem that spacing is the distance between adjacent primordia at the moment of their formation, which is measured in tens of micrometres and is a few cell diameters across. So a cut-off at two half-weight radii is a claim that a forming primordium’s influence has fallen to half strength about two primordium-spacings away, and to a twentieth by five.

That is a claim about the reach of whatever is doing the inhibiting. If the inhibitor is auxin depletion, the reach is set by how far auxin diffuses before the transporters move it back — a length that can be estimated from transport rates and that mutants change. If the inhibiting signal is mechanical, the reach is set by the stiffness of the tissue and is a completely different length. The two hypotheses predict different widths, and a width is now the kind of thing the model has an opinion about.

None of that is measured here. What is measured is that the model has the opinion — that the width matters, that there is a value beyond which the pattern stops, and that below it the pattern is the one plants show. Before this change, the model had no opinion at all, because the quantity was a loop bound and loop bounds do not have units.

A rule too long-ranged makes no pattern; every shorter one makes the same patternEach dot is 4 runs from a coarse start at one exponent, separated by 0.2° of placement noise. Below p ≈ 1.1 the divergence scatters by tens of degrees, which is what an arbitrary sequence gives. From p = 1.25 to p = 8 — a sixfold range — every run ends on 8/13 with the scatter between 0.75° and 1.06°.00.50011.50-0.25000.2500.5000.750falloff exponent, log₁₀scatter, log₁₀ degrees00.50011.50-0.25000.2500.5000.750falloff exponent, log₁₀scatter, log₁₀ degreesno latticethe same lattice, whatever pevery runsome runsno runneighbourhood 12/√h · 4 runs per exponenta lattice from p ≈ 1.25 upward
Fig. 7 The sweep that made the neighbourhood load-bearing. At the long-ranged end of it the window stopped being generous and started being the model, and nothing warned anybody.

What this does not fix

Two limits, both of which the rest of this thread runs into.

The cut-off does not make the p = 1 rule’s lattice real. It makes the claim that the lattice depends on a stated neighbourhood into an explicit one. A pattern that exists at a range of two spacings and not at six is a pattern conditional on a measurement nobody has made, and writing the condition down is progress rather than resolution. The honest summary of the whole thread is that the previous phase’s manufactured lattice has been converted from an artefact into a prediction — which is better, and is not the same as being true.

And the range, on its own, decides nothing. Two shapes read in the same unit still disagree about where the lattice ends by half. Something else is the invariant, and it was measured a phase ago for a different reason. That is the next essay.

The heads three settings of the one knob produceG=0.3 → 138.0° · G=0.62 → 149.3° · G=1.1 → 180.0°. The model was not told any of these angles.G = 0.30138.0° — goldenG = 0.62149.3° — otherG = 1.10180.0° — whorled (half)one rule, three growth rates, repulsion as 1/d^8the angle is an output
Fig. 8 The control that keeps all of this from being about the code. At an inverse eighth power — a rule that is short-ranged on its own — the regimes are the same regimes, and a cut-off anywhere in the range used above removes nothing that was contributing. Every result here is about long-ranged rules, which is where a neighbourhood is a question at all.
Which neighbours decide where an element goesEach line is one exponent: how much each shell of neighbours makes the energy profile vary around the circumference, divided by what the nearest shell contributes. At p = 0.5 the nearest shell leads the next by a factor of 1.2 and a node is placed against the whole neighbourhood at once. At p = 3 it leads by 7.4e+2, and a node is placed against its immediate neighbours — which is what a lattice is.-6-4-20distance from the tip, in node spacingsvariation ÷ nearest shell, log₁₀0–22–44–88–1616–3232–64a golden-angle stem at a rise of 0.02 · shells in units of √hnearest shell dominates by 1.2× at p = 0.5, 742× at p = 3
Fig. 9 And the quantity the width is really moving. How much of the energy profile’s variation each ring of neighbours contributes: a cut-off suppresses the outer rings, which is the same thing a steeper exponent does, and the next essay measures that they meet.

What is left

The previous phase asked for a repair and this is the repair. It changed one line of the placement rule, added a check that the loop bound is not the answer, and gave the neighbourhood a unit. What it found is that the accident it was built to remove reproduces exactly when it is stated on purpose — and that stating it on purpose changes something else, which nobody predicted, and which the next two essays are about.

The line that is now written down is worth reading once more as the thing it is:

the interaction falls to half its strength at R local spacings, with a stated falloff shape

Two numbers and a functional form, where before there was a loop bound. Neither number has been measured on a plant. Both could be.

Shares its objects with

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

Named objects

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

ArtefactCut offDiscretisationThe range of the interactionLattice offsetMeristemModel scopeNeighbourhoodThe placement rulePrimordiumRepulsionRiseTruncationUntested claim