Change Log¶
Unreleased¶
Breaking changes¶
neuraLQX now supports Python
>=3.11,<3.14. Python3.14and newer are not supported.
New features¶
Introduced a new
neuralqx.utils.io.runtime_loggers.DeferredRuntimeLogwhich avoids excessive device-to-host transfers in the VMC driver whenlogger(...)is called.
Changes¶
Added a new configuration variable
NQX_FUSED_KERNELS(defaultTrue) which when set toFalse, will avoid a fused kernel in the VQS path (expect/gradient/forces) for sequences of operators which can reduce the first step compile time in the VMC.
Bug fixes¶
Fixed a bug in the debugger which effectively made it always on.
Fixed a bug in the
Solverwhich did not propagatesilent_print=Trueto the VMC driver.Fixed an import-side effect where the symbolic operator deprecation warning could be emitted when only the experimental gradient path was touched, by lazily importing
neuralqx.experimentalsubmodules.
Deprecations¶
The experimental symbolic API under
neuralqx.experimental.operators.symbolicis now deprecated in favour of nkDSL (the independent DSL for both NetKet and neuraLQX), and will be removed in the next release. Users should migrate to nkDSL and follow its documentation: https://nkdsl.readthedocs.io/en/latest/?badge=latest
Experimental¶
Added a
for_each_distinct_pair()to the experimental operator DSL which iterates over sitesi != j.Added an exact bi-covariance gradient route for non-Hermitian objectives in
expect_and_grad(single operators, sequences, andSquaredobjectives) behindNQX_EXPERIMENTAL_GRAD.
neuraLQX v1.1.1 (April 4, 2026)¶
Breaking changes¶
The Hilbert package was restructured so that
neuralqx.hilbert.utilsnow contains abstractions only, concrete indexing/layout/operations now live in concrete Hilbert-space subpackages.AbstractHilbertSpaceandAbstractHilbertInterfaceare now strictly abstract and no longer provide concrete U(1)-specific defaults.Hilbert interface API cleanup:
.corehas been removed. Use.hilbert(neuraLQX core) and.hilbert_netket(NetKet Hilbert object).Deprecated the legacy
neuralqx.hilbert.utils.layout.gauge_stridedpath, useneuralqx.hilbert.u1.layout.StridedGaugeCopyLayout.
New features¶
Added a richer Hilbert enumerator abstraction with explicit metadata and explainability:
scheme_name,ordering_contract,supports_lazy_mode,requires_full_precompute,explain_state_to_number, andexplain_number_to_state.states_to_numbers/numbers_to_statesnow dispatch through plum via each core’s attached enumerator class.Added expanded profiling controls (run id, JAX trace/annotation toggles, sampling cadence, trace buffer sizing, and optional deep Python-call tracing) for clearer end-to-end runtime diagnostics.
Added new profiling helpers to instrument external library calls (for example, sampling paths) without editing upstream source code.
An implementation for the Lorentzian constraint for the single vertex QRLG model is now available.
Introduced a new strict versioning subsystem under
neuralqx.utils.module.versionwithVersionandNeuralqxVersionclasses, plus module-version parsing helpers for robust dependency and compatibility checks.
Changes¶
The configuration system (
neuralqx.configs) has been redesigned with a typed architecture. Options now carry explicit types, a three-level mutability model (IMMUTABLE/STARTUP/RUNTIME), and structured mutation hooks. Acfg.patch()context manager andcfg.thread_local_override()are available for scoped overrides. ExistingNQX_*environment variables andcfg.get()/cfg.set()calls are unaffected.NQX_LOG_LEVELis now runtime-mutable (previously startup-only).NQX_EXPERIMENTALandNQX_TESTINGnow accept boolean values (true/false) in addition to0/1.U(1) random/flip operations now live under
neuralqx.hilbert.u1.operations, the old top-levelneuralqx.hilbert.operationspackage has been removed.U(1) concrete layout now lives under
neuralqx.hilbert.u1.layout.U(1)-specific index helpers were moved out of
neuralqx.hilbert.utils.index, the utils index package is now abstraction-focused.Slightly improved VMC runtime with fused operator-evaluation kernels in
expect_and_grad/expect_and_forcesfor multi-constraint workloads, while preserving separate constraint estimators.neuralqx.__version__is now exposed asNeuralqxVersion(string-compatible, semantic comparisons), andneuralqx.version_infoprovides the strictVersionobject for typed checks.neuralqxno longer requires being imported before JAX or NetKet, aneuralqx_boot.pthfile installed into site-packages sets all required environment variables at interpreter startup automatically.Added
neuralqx.utils.dtypes, aDTypePolicyclass that derives the active real, complex, and index dtypes from configuration (respectingNQX_DTYPE_*andNQX_ENABLE_X64), plus policy-aware JAX array constructors (zeros_real,ones_complex,array_index, etc.) so call sites never hard-code dtype arguments.
Bug fixes¶
Fixed circular-import issues in Hilbert index dispatch/core initialization paths.
Corrected dispatch resolution so state-number conversion reliably uses concrete enumerator implementations.
Deprecations¶
None.
Experimental¶
Introduced an experimental declarative symbolic operator DSL under
neuralqx.experimental.operators.symbolic.dsl. Users can now define operator action by composing iterator scopes, predicates, and emissions instead of hand-writingget_conn_paddedkernels. The compiler lowers the resulting symbolic IR to executable matrix-free operators, and ships with documented extension points for custom passes, iterator semantics, and JAX lowerers.Introduced a new struct system under
neuralqx.utils.structfor building immutable, JAX-native data containers. SubclassStruct(or use@register_class/@dataclassfor existing classes) to get automatic JAX pytree registration, a typed field API (field(static=..., derived=..., converter=..., validator=...)), and built-in serialization viaexport()/load()andto_state_dict()/from_state_dict(). Fields are classified as node (JAX leaves), static (pytree aux / JIT cache keys), or opaque (runtime-only, excluded from tracing and serialization). Derived fields are computed from other fields and recomputed automatically onreplace(). Non-Structclasses can participate viaregister_pytree_type()orregister_attrs_type().
neuraLQX v1.1.0 (March 10, 2026)¶
Breaking changes¶
neuraLQX now requires a NetKet version of 3.19+, and no longer supports earlier versions. This means that, thanks to NetKet’s latest versions, neuraLQX simulations now run substantially faster than the previous version.
neuraLQX no longer support MPI based parallelisation. The only mode of parallelisation is now through JAX’s sharding, and only for Linux systems, as currently supported by the latest NetKet versions. This means that older neuraLQX scripts are not going to be compatible with this version.
The
NQX_MPIandNQX_MPI_CUDAconfiguration variables are now removed. neuraLQX will use all available GPUs automatically and if none are available, it will fallback to CPU execution.
New features¶
A new module
distributedis now responsible for all parallelisation related utils.
Changes¶
None.
Deprecations¶
Module
mpihas been removed as neuraLQX no longer supports MPI based parallelisation.
Experimental¶
None.
neuraLQX v1.0.1 (March 6, 2026)¶
Breaking changes¶
The gauge-copy layout implementation has been refactored around a new abstract layout API. The concrete strided implementation is now
neuralqx.hilbert.utils.layout.StridedGaugeCopyLayout(withGaugeLayoutretained as a backward-compatible alias).
New features¶
The
solver.utils.mpimodule now has support for JAX based MPI collectives and point-to-point communications.Added
neuralqx.hilbert.utils.layout.AbstractBasisLayout, a generic abstract base class for flattening/unflattening structured basis coordinates into 1D site indices. This provides a future-proof API for upcoming non-U(1) layouts, including SU(2)-specific coordinate schemes.Added
neuralqx.hilbert.utils.layout.GaugeCoord, an explicit structured coordinate type for gauge-copy strided layouts.Added
neuralqx.hilbert.utils.layout.StridedGaugeCopyLayoutas the concrete implementation of the current gauge-copy block-strided flattening convention.Added layout-agnostic methods
site_of(coord)andcoord_of(site)to support generic code, alongside convenience methodsencode(gauge_copy, edge_index)anddecode(site)for gauge layout implementations.
Changes¶
class:neuralqx.hilbert.utils.layout.GaugeLayout has now been renamed to
StridedGaugeCopyLayout. Backward compatibility exists, but the a deprecation warning will be issued and the renaming will be final in an upcoming release. Please change your code accordingly.
Bug fixes¶
Fixed a bug in the
neuralqx.solver.Solverwhich caused the current simulation’s output directory to be deleted before the run is completed whenclean_up=True.
Deprecations¶
The legacy helper
GaugeLayout.site(edge_index, gauge_copy=0)(and the corresponding method onStridedGaugeCopyLayout) is deprecated and will be removed in a future release. Useencode(gauge_copy, edge_index)instead. The new argument order is consistent withdecode(site) -> (gauge_copy, edge_index).The
neuralqx.utils.mpiis now marked to be deprecated. In the next release, neuraLQX will stop MPI support in favour of JAX’s sharding and to support the latest NetKet releases. This means that the only mode of parallelisation will be on GPUs and using JAX, and not MPI.
Experimental¶
Experimental multi-state VMC now supports two distinct strategies:
MT-MH / independent-state training (one network per target state, existing behavior)
ST-MH / shared-trunk multi-head training (new behavior)
The ST-MH path shares trunk parameters across all heads and applies one optimizer update to the shared model.
Added a single-trunk multi-head (ST-MH) multi-state VMC stack for learning multiple (near-)degenerate states with a shared parameterization instead of
Nfully independent networks.Added a Flax ST-MH wrapper module for constructing shared-trunk / multi-head ansätze from an arbitrary user-defined trunk network (feature extractor), including head selection utilities so each head can be exposed as a standard scalar-output model for
MCStatecompatibility.Added
neuralqx.state.stmh_state.STMultiMCState, a shared-parameter multi-state container that wraps multiple per-headMCStateobjects while exposing a single canonical parameter pytree and synchronizing parameters across heads.Added
neuralqx.solver.stmh_multi_vmc.SingleTrunkMultiHeadVMC, a dedicated ST-MH VMC driver that performs a single shared update by aggregating weighted per-head energy gradients and pairwise orthogonality/fidelity penalty gradients.Added
neuralqx.solver.stmh_solver.STMultiSolver, a solver-level interface for ST-MH training that mirrors the previous multi-state solver workflow while using the new shared-parameter state/driver backend.