The naming glossary¶
One word per concept. This page is the frozen vocabulary for the public API: the single canonical spelling — and unit — for every recurring idea that appears in more than one function signature. It is the contract that the calling-convention unification (
WS-CONV) implements and that the CI naming gate (WS-NAMEGATE) enforces. A build fails if a public signature reintroduces a banned spelling for a concept defined here.
The analysis layer grew one stream at a time, each authored independently, so the
same concept ended up spelled up to five ways — transient / burn_in /
n_cut; final_time / steps / n / n_rescale; delay / tau / lag /
max_lag; and a first argument named nine different things for the one role "the
thing you analyse" (sys, system, sys_or_traj, source, map_sys,
observable, data, x, series). Each function was locally reasonable; the
aggregate was obscure. seed and ic — already consistent across the whole
surface — prove a single convention is achievable. This glossary makes it the law
for everything else.
Scope. The glossary and the gate cover the whole public callable surface —
tsdynamics.analysis (registry.analyses). It is a v4 change: spellings are corrected outright (the
v3→v4 token map in §6 lists every rename; the _migration shim raises a precise
"renamed to X" error for one release). Every ban below targets a parameter
name in a public signature — never an attribute (system.dim is untouched), a
return-object field, or a value. Domain-specific parameters that belong to a
single function (radii, metric, q, eps, n_scales, …) are out of scope —
each function owns those. The glossary fixes only the cross-cutting
vocabulary, plus the handful of homonyms (§5) the gate must whitelist by exact
name.
1. The first positional argument — three roles, two names¶
Every analysis takes its primary input as the first positional argument, with exactly one canonical name per kind:
| Input kind | Canonical name | Accepts |
|---|---|---|
| A dynamical system (flow / map / derived wrapper) | system |
any System (ContinuousSystem, DiscreteMap, PoincareMap, …) |
| A measured series / point set | data |
Trajectory, ndarray shaped (N,) or (N, dim) |
| A prior analysis result | named by kind (whitelisted — §5) | the upstream result object |
Choosing system vs data. A function whose job is to integrate or iterate
the dynamics itself takes system (it produces its own trajectory internally —
gali, expansion_entropy, fixed_points, attractors). A function whose
job is to operate on an already-measured signal takes data (recurrence_matrix,
correlation_dimension, lyapunov_from_data).
Dual-input functions take system as the first argument and coerce / accept a
measured series through internal handling or a data= overload — they never invent
a third name. The three current offenders are pinned:
| Function | v4 first arg | v3 first arg |
|---|---|---|
zero_one_test |
system (integrates internally like its sibling gali; series via coercion) |
observable |
poincare_section |
system (a Trajectory is accepted and coerced) |
sys_or_traj |
return_map |
system (a Trajectory / 1-D series is accepted and coerced) |
source |
Banned first-arg spellings (all → system or data):
| Banned | Canonical | Reason |
|---|---|---|
sys |
system |
abbreviation |
sys_or_traj |
system |
the dual nature is handled by coercion, not the name |
map_sys |
system |
a map is a System |
observable (as 1st arg) |
system / data |
the quantity observed is the component keyword, not the input |
source |
system / data |
vague |
x |
data |
the data-series convention; unify on data |
series |
data |
synonym |
2. The canonical keyword glossary¶
One spelling, one unit, everywhere the concept appears. The Bans column lists the spellings the naming gate rejects for that concept (subject to the exact homonym whitelist in §5). Bans marked † do not occur in v3 today — they are pre-emptive, kept so the concept can never drift into them.
| Concept | Canonical | Type / unit | Bans |
|---|---|---|---|
| Initial condition | ic |
array-like, length = system.dim |
x0†, initial†, u0†, y0† |
| RNG seed | seed |
int \| None |
random_state†, rng† |
| Discard-transient amount | transient |
time (flows) / steps (maps) — see §3 | burn_in, n_transient†, warmup† |
| Integration horizon (flows) | final_time |
float, in the system's time units |
T†, t_final†, tmax† |
| Iteration / sampling horizon | n |
int — see §3 |
steps, n_rescale |
| Step size | dt |
float, time units |
h† |
| Observed component | component |
int index or str name (None = all) |
components, observable, coord†, col† |
| Embedding dimension | dimension |
int |
m, emb_dim†, dim (as a parameter) |
| Embedding delay / lag | delay |
int, in samples |
tau, lag, max_lag (→ max_delay, §5) |
| Theiler window | theiler |
int, in samples |
theiler_window, w† |
| Nearest-neighbour count | n_neighbors |
int |
min_neighbors, num_neighbors† |
| Spatial region | region |
Box / Ball / Grid, or region([(lo, hi, n), …]) |
grid, box, domain†, bounds† |
| Estimator / algorithm selector | method |
str |
mode†, estimator†, scheme† |
| Numerical solver kernel | solver |
str |
method (v5), integrator† |
seed and ic are already universal — they are listed so the gate treats them as
locked, not because they need fixing.
solver= and method= are two concepts, and v6 gives each one word.
solver= selects a numerical kernel and is a keyword of run / reinit /
ensemble (lor.run(solver="dop853")); method= selects an estimator
algorithm on an analysis (optimal_delay(x, method="mi"),
fixed_points(sys, method="interval")). Passing method= to run raises and
names solver=. Both are always-allowed tokens in their own half and need no
per-site whitelist.
3. Unit rules (documentation-only — not gate-enforceable)¶
A signature gate sees parameter names, not their meaning, so the rules in this section are documentation-only: they bind authors and reviewers, not the CI naming gate. (The gate-enforceable rules are in §7.)
transient follows the unit of the call's horizon.
- Paired with
final_time(a flow) →transientis a time (same units asfinal_time):lyapunov_spectrum(lorenz, final_time=300, transient=50)discards the first 50 time units. - Paired with
n(a map / discrete view) →transientis a count of steps:orbit_diagram(logistic, "r", vals, points_per_value=200, transient=500)discards the first 500 iterations. - A few flow estimators parametrise their run by a count of rescaling cycles
(canonical
n, replacing v3'sn_rescale) rather thanfinal_time; theretransientis in protocol steps, following the count horizon (e.g. the Jacobian-free two-trajectory branch oflyapunov_spectrum). transientnever means "section crossings." A Poincaré / return view that wants to discard the first few section hits uses the dedicatedskip_crossingskeyword (§5), so the unit oftransientstays unambiguous.
final_time (flows) vs n (maps). A flow's run length is a time →
final_time. A map's / discrete view's run length is a count of iterations → n.
Analyses that serve both families expose both horizons and pick by the input
(gali, expansion_entropy carry final_time and steps→n). The unified
lyapunov_spectrum follows its documented signature
(lyapunov_spectrum(system, *, k=None, final_time=None, transient=None, dt=None,
ic=None, method=None, seed=None)) — final_time is its headline horizon.
n vs n_<thing>. Bare n is the primary run length / number of produced
units — iterations of a map, points recorded per orbit, surrogate realisations to
draw. A prefixed n_<thing> is a count of that specific thing and is a distinct,
function-owned parameter: n_samples, n_seeds, n_radii, n_scales,
n_internal, n_c, n_ref, n_ks. These are not the iteration horizon and
are not renamed to n (§7 lists them so the gate does not mistake them for bare-n
violators).
dt is a time step. The sampling / integration step. A window stride
(windowed_rqa) is a different concept and is not dt (§5).
4. Verbs — one intent, one word¶
| Intent | Canonical | Removed in v6 |
|---|---|---|
| Produce a trajectory (any family) | system.run(...) |
.integrate (flows), .iterate (maps), .trajectory |
| Ask what a system is | system.family |
.is_discrete |
| Derive a section or a strobe | system.poincare(...) |
.stroboscope(...) |
| Measure something | ts.analysis.<name>(subject) |
every bound analysis method and the .lyap/.chaos/.dims/.recurrence accessors |
One verb, closed signatures. Lorenz().run(final_time=100, dt=0.01) and
Henon().run(steps=5000) are the one verb a newcomer learns, and each family
binds exactly the keywords its mathematics admits — a map handed final_time=
raises and says why. integrate / iterate / trajectory are removed, not
aliased: hasattr(sys, "integrate") is False, and the AttributeError names
run.
5. Homonym carve-outs (the same token, a different concept)¶
These (function, parameter) pairs are deliberately allowed because each names
a genuinely different concept there. The naming gate whitelists exactly these
pairs; the same token used for a banned concept anywhere else still fails.
| Token | Allowed at (exact) | Means | Why it is not the banned concept |
|---|---|---|---|
k |
gali.k |
GALI order — number of deviation vectors evolved (2 ≤ k ≤ dim) |
an order, not a neighbour count |
k |
lyapunov_spectrum.k |
number of Lyapunov exponents to compute (was n_exp; may exceed dim for DDEs — a function-space tangent) |
a count of exponents, not neighbours |
k_max |
lyapunov_from_data.k_max |
length of the divergence / stretching curve S(k), evolved over k = 0 … k_max |
an abscissa horizon of the scaling curve, not a neighbour count |
step |
windowed_rqa.step |
window stride in samples | a stride between windows, not the integration time step dt |
max_steps |
attractors, basins, continuation, basin_fractions |
integration safety cap — max steps before a trajectory is declared lost / non-recurrent | a divergence/abort bound, not the run length n |
max_delay |
optimal_delay, mutual_information, estimate_period, autocorrelation |
the search ceiling for a delay scan (supersedes max_lag) |
a bound on the delay search, distinct from a single embedding delay; the lag/tau tokens stay banned |
New tokens WS-CONV introduces (not v3 renames — they do not exist yet, so a reviewer should not expect to find them in v3 code):
skip_crossings(poincare_section,return_map): number of section crossings to discard before recording. It replaces the crossing-counting use oftransienton those two views so thattransientkeeps a single unit (§3).region([(lo, hi, n), …])intsdynamics.data: a builder for theregionargument, replacing the three-parallel-arrayGrid(lo, hi, counts)constructor.
Prior-result first arguments (the third role in §1). These are named by the
kind of result they consume and are intentionally not unified onto a single
spelling; the gate whitelists each exact (function, first-arg) pair:
| Function | First arg | Consumes |
|---|---|---|
kaplan_yorke_dimension |
spectrum |
a Lyapunov spectrum (array / LyapunovSpectrum) |
uncertainty_exponent, wada_property, basin_entropy |
basins |
a BasinsResult |
resilience, tipping_points |
result |
a BasinsResult / ContinuationResult |
Domain-owned, out of scope (not renamed, not banned — each function owns them):
zero_one_test.n_cut (the mean-square-displacement lag ceiling, not a
transient — default N // 10), and the n_<thing> counts in §3.
6. v3 → v4 token map (quick reference)¶
Mechanical renames the migration shim and codemod (WS-MIGRATE) cover. The old
name raises a precise "renamed to X in v4.0" error for one release.
| v3 | v4 | Scope |
|---|---|---|
sys, sys_or_traj, map_sys, source, observable (1st arg) |
system |
lyapunov_spectrum, orbit_diagram, periodic_orbits, poincare_section, return_map, zero_one_test |
x, series (1st arg) |
data |
lyapunov_from_data |
observable (kwarg) |
component |
return_map |
components |
component |
orbit_diagram |
burn_in |
transient |
periodic_orbit |
steps, n_rescale |
n (or final_time for flows) |
gali, expansion_entropy, lyapunov_spectrum, poincare_section, return_map |
tau, lag |
delay |
embed, embedding_dimension, lyapunov_from_data |
max_lag |
max_delay |
optimal_delay, mutual_information, estimate_period, autocorrelation |
m, emb_dim |
dimension |
embed, lyapunov_from_data |
theiler_window |
theiler |
dimensions / recurrence family |
min_neighbors |
n_neighbors |
lyapunov_from_data |
kind (variant selector) |
method |
return_map (max/min/poincare) |
grid, box (region arg) |
region |
basins, fixed_points, periodic_orbits |
n_exp |
k |
lyapunov_spectrum |
.integrate / .iterate |
.run |
every family (.trajectory kept, not rewritten) |
bifurcation_diagram |
orbit_diagram |
ts.analysis (alias deleted in v6 — one concept, one spelling; the old name redirects) |
n_cut(zero_one_test) is not in this table: it is a domain-owned lag ceiling (§5), not a transient — it is neither renamed nor banned.v6 scope note. The Scope column above names only functions that still exist. The v6 scope surgery deleted the entropy, surrogate and transforms families outright (see the scope boundary in
CLAUDE.md), so thetau/lag→delayandm/emb_dim→dimensionrenames are now carried by the surviving phase-space users (the embedding family andlyapunov_from_data);detrendleft with the transforms package. The renames themselves are unchanged — only their scope shrank.
7. For the gate (WS-NAMEGATE) and signature (WS-CONV) authors¶
Gate-enforceable rules (decidable from inspect.signature alone):
- First argument of every public callable is
systemordata, or the(function, first-arg)pair is in the prior-result whitelist (§5). - No parameter name is a banned spelling from §2, unless the
(function, parameter)pair is in the homonym whitelist (§5). Build the banned→canonical map straight from the §2 Bans column; build the whitelist from the §5 exact-pair tables.methodis never banned (no whitelist needed). - The
n_<thing>domain counts (n_samples,n_seeds,n_radii,n_scales,n_internal,n_c,n_ref,n_ks) are notnviolations — they are distinct names, so a prefix check on barenalready passes them; they are listed here only so the gate author does not special-case them by mistake. - The gate sweeps
registry.analyses.
Documentation-only rules (a signature gate cannot see units or semantics, so
do not try to encode these — they are enforced in review, not CI): the
transient-follows-horizon rule, the final_time(flows) / n(maps) split, and
the n vs n_<thing> meaning (all §3).
For WS-CONV: the §5 whitelist references names that do not exist in v3 yet
(lyapunov_spectrum.k, skip_crossings) — these are the targets WS-CONV
creates; the gate whitelists the new names, so the entries are correct despite
being absent from the v3 signatures.
8. Adding a new analysis — the naming checklist¶
When you write a new public analysis, before it can merge:
- First argument is
system(you integrate/iterate it) ordata(you consume a measured series). Nothing else. - Every recurring concept in §2 uses its canonical spelling and documented unit. Function-specific parameters are free to be named whatever reads best.
- A new homonym? If you genuinely need a §2 token for a different concept,
add a row to §5 (an exact
(function, parameter)pair) and the matching whitelist entry to the naming gate — don't silently reuse it. transientand the horizon agree on units (§3):final_time+transientin time for a flow;n+transientin steps for a map.- The naming gate (
tests/test_polish_standards.py, registry-driven) sweeps your function automatically — no test edits needed. If it fails, it names the offending parameter and the canonical spelling.
The goal is simple: a user who has learned one analysis can guess the signature of the next.