Lint Messages¶
This page is the detailed lint message catalog for nkDSL diagnostics.
Use it when a compile-time diagnostic points you to a specific code.
Errors¶
NKDSL-E001: unresolved free symbols¶
- Meaning:
The operator IR contains free symbolic names (for example
symbol("J")) that were not resolved before compilation. Symbols declared withdefault=...are treated as resolved and do not trigger this lint.- Typical causes:
A numeric value was intended but left symbolic, or a parameter-binding step in the application workflow was skipped.
Example:
op = (
SymbolicDiscreteJaxOperator(hi, "hop")
.for_each_site("i")
.emit(identity(), matrix_element=symbol("J"))
.build()
)
- How to resolve:
Replace free symbols with concrete values before compile, or add an explicit parameter-binding layer in your workflow and ensure it runs before
.compile(). For optional parameters, declare a fallback directly withsymbol("J", default=...).
NKDSL-E002: static index out of Hilbert bounds¶
- Meaning:
A static source/target index expression (for example
source_index(k)ortarget_index(k)) refers to a site outside[0, hilbert_size).- Typical causes:
Hard-coded indices copied from a different model size, stale formulas after changing Hilbert layout, or incorrect assumptions about flattened indexing.
Example:
.emit(identity(), matrix_element=source_index(42))
- How to resolve:
Ensure every static index expression is valid for the current Hilbert size. If the index should depend on iterator labels, use symbolic selector/index expressions instead of fixed constants.
NKDSL-E003: potential zero division on runtime state values¶
- Meaning:
A division denominator is a direct runtime state read that may be zero. This includes iterator selectors (for example
site("i").value,emitted("i").value) and flat-index source/target reads (source_index(k),target_index(k)).- Typical causes:
Matrix elements use expressions like
1 / site("i").valueor1 / source_index(0)without a non-zero guard.
Example:
.emit(identity(), matrix_element=1 / target_index(0))
- How to resolve:
Add an explicit non-zero guard (for example
where(site("i").value != 0)), or rewrite with explicit conditional branching so division executes only on safe branches.
Warnings¶
NKDSL-W101: predicate is constant false¶
- Meaning:
The term predicate always evaluates to false, so the term can never emit.
- Typical causes:
Placeholder predicates left in place, contradictory conditions, or accidental boolean simplification to
False.- How to resolve:
Remove dead terms or fix predicate logic so intended visits are reachable.
NKDSL-W103: duplicate emissions¶
- Meaning:
Two or more emissions in the same term are structurally identical (same update program and amplitude expression).
- Typical causes:
Copy/paste duplication while building multi-emission terms.
- How to resolve:
Remove duplicates, or intentionally differentiate branch behavior and/or matrix element expressions.
NKDSL-W104: max connection hint below static upper bound¶
- Meaning:
max_conn_size_hintis smaller than the term’s static upper bound (n_iterator_rows * n_emissions).- Typical causes:
The hint was set early and not updated after adding rows/emissions.
- How to resolve:
Increase the hint to a conservative valid value, or remove the explicit hint and let the compiler infer one.
NKDSL-W301: generated states outside Hilbert support¶
- Meaning:
Sampled emitted states are not members of the Hilbert support set.
- Typical causes:
Update programs produce states that are not representable in the chosen Hilbert space.
- Example scenario:
A rewrite writes values outside what the Hilbert model can encode, or applies shifts that move occupations beyond support.
- How to resolve:
Constrain updates and predicates so emitted states remain in Hilbert support. If the warning is expected in exploratory code, reduce scope or guard branches until model assumptions are finalized.
NKDSL-W302: generated states violate Hilbert constraints¶
- Meaning:
Sampled emitted states fail
hilbert.constraint(state).- Typical causes:
Rewrites break particle-number, magnetization, parity, or custom constrained subspace rules.
- Example scenario:
A term shifts occupation on one site without complementary update, violating a fixed-particle-number constraint.
- How to resolve:
Tighten predicates and/or adjust update programs to preserve the constrained manifold for all emitted branches.
NKDSL-W303: generated states contain illegal local basis values¶
- Meaning:
One or more site values in sampled emitted states are outside
hilbert.local_states.- Typical causes:
Unbounded
shiftoperations, writes with invalid values, or assumptions about local basis that do not match the configured Hilbert object.- How to resolve:
Gate shifts with predicates, use bounded rewrites (for example
shift_modwhere physically appropriate), and validate write targets against local basis.
Info¶
NKDSL-I301: skipped exact support-membership checks¶
- Meaning:
Exact support lookup was skipped because Hilbert cardinality exceeded
lint_max_exact_hilbert_states.- Typical causes:
Hilbert space is too large for exact support enumeration within configured diagnostics limits.
- How to resolve:
Increase
lint_max_exact_hilbert_statesif memory/time budget allows, or rely on sampled diagnostics for large spaces.
NKDSL-I302: skipped sampled branch evaluation¶
- Meaning:
Some sampled branch evaluations could not run in diagnostics mode (for example unresolved runtime values or branch evaluation failures).
- Typical causes:
Missing runtime symbols, non-evaluable branch context during diagnostics, or unexpected evaluation failures in sampled paths.
- How to resolve:
Resolve runtime bindings before compile and ensure branch expressions can be evaluated under diagnostics sampling.