OSCR

Modal Backflow Neural Quantum States for Anharmonic Vibrational Calculations.

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches
  1. [1] § Ab Initio Anharmonic Vibrational Hamiltonians ↔ Randomized_Watson_Hamiltonian/fnn_compare.py, lines 94–138 · score 0.67 · learning rate scheduling, Monte Carlo, CoRe, transitions, FNN, error
  2. [2] § Ab Initio Anharmonic Vibrational Hamiltonians ↔ Randomized_Watson_Hamiltonian/vib_randomized_ham.py, lines 94–175 · score 0.56 · learning rate scheduling, CoRe, transitions, error, modal, MBF
  3. [3] § Modal Backflow Neural Quantum States › Optimization › VSCF Pretraining ↔ nqs_vib.py, lines 133–218 · score 0.56 · VSCF solutions, modal functions, biases, zero, weights, network
  4. [4] § Modal Backflow Neural Quantum States › Optimization › Markov Chain Monte Carlo ↔ Selected_Configs/state.py, lines 84–98 · score 0.56 · Monte Carlo sampling, quantum state, expectation, sum
  5. [5] § Modal Backflow Neural Quantum States › Optimization › Markov Chain Monte Carlo ↔ Selected_Configs/state.py, lines 84–98 · score 0.53 · Monte Carlo sampling, quantum state, sum

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 520 lines · 18 KB · CC-BY-4.0 · 2 matches

  1. # Copyright 2021 The NetKet Authors - All rights reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # This file is modified from the MCState implementation of netket
  15. import warnings
  16. from functools import partial
  17. from typing import Any
  18. from collections.abc import Callable
  19. import jax
  20. import numpy as np
  21. from jax import numpy as jnp
  22. import time
  23. from flax import serialization, core as fcore
  24. from flax.core.scope import CollectionFilter, DenyList # noqa: F401
  25. from netket import config
  26. from netket import jax as nkjax
  27. from netket import nn as nknn
  28. from netket.hilbert.discrete_hilbert import DiscreteHilbert
  29. from netket.utils import (
  30. model_frameworks,
  31. wrap_afun,
  32. wrap_to_support_scalar,
  33. _serialization as serialization_utils,
  34. )
  35. from netket.utils.types import PyTree, SeedT, NNInitFunc
  36. from netket.optimizer import LinearOperator
  37. from netket.optimizer.qgt import QGTAuto
  38. from netket.vqs.base import VariationalState, QGTConstructor
  39. from netket.vqs.mc.mc_state.state import check_chunk_size, _is_power_of_two
  40. def fast_unique_configs(configs):
  41. """Fast unique for integer configurations using hash-based approach"""
  42. if len(configs) < 1000: # For small arrays, jnp.unique is fine
  43. return jnp.unique(configs, axis=0)
  44. # Convert to tuples and use set for O(n) average case deduplication
  45. seen = set()
  46. unique_list = []
  47. for config in configs:
  48. config_tuple = tuple(config.tolist()) # Convert to hashable tuple
  49. if config_tuple not in seen:
  50. seen.add(config_tuple)
  51. unique_list.append(config)
  52. return jnp.array(unique_list) if unique_list else configs[:0] # Empty array with right shape
  53. @partial(jax.jit, static_argnums=0)
  54. def jit_evaluate(fun: Callable, *args):
  55. """
  56. call `fun(*args)` inside of a `jax.jit` frame.
  57. Args:
  58. fun: the hashable callable to be evaluated.
  59. args: the arguments to the function.
  60. """
  61. return fun(*args)
  62. @jax.jit
  63. def _array_to_pdf(v):
  64. pdf = jnp.abs(v) ** 2
  65. return pdf / jnp.sum(pdf)
  66. class SCState(VariationalState):
  67. """Variational State for a variational quantum state computed without Monte Carlo sampling by summing over a selected part of Hilbert
  68. space.
  69. Expectation values and gradients are deterministic.
  70. The only non-deterministic part is due to the initialization seed used to generate
  71. the parameters.
  72. """
  73. _init_fun: Callable | None = None
  74. """The function used to initialise the parameters and model_state"""
  75. _apply_fun: Callable
  76. """The function used to evaluate the model"""
  77. _chunk_size: int | None = None
  78. def __init__(
  79. self,
  80. hilbert: DiscreteHilbert,
  81. model=None,
  82. seed_config = None,
  83. n_select=1,
  84. n_expand=1,
  85. hamiltonian = None,
  86. init_states = None,
  87. *,
  88. chunk_size: int | None = None,
  89. variables: PyTree | None = None,
  90. init_fun: NNInitFunc | None = None,
  91. apply_fun: Callable | None = None,
  92. seed: SeedT | None = None,
  93. mutable: CollectionFilter = False,
  94. training_kwargs: dict = {},
  95. dtype=float,
  96. ):
  97. """
  98. Constructs the SCState.
  99. Args:
  100. hilbert: The Hilbert space
  101. model: (Optional) The model. If not provided, you must provide init_fun and apply_fun.
  102. variables: Optional dictionary for the initial values for the variables (parameters and model state) of the model.
  103. seed: rng seed used to generate a set of parameters (only if parameters is not passed). Defaults to a random one.
  104. mutable: Name or list of names of mutable arguments. Use it to specify if the model has a state that can change
  105. during evaluation, but that should not be optimised. See also :meth:`flax.linen.Module.apply` documentation
  106. (default=False)
  107. init_fun: Function of the signature f(model, shape, rng_key, dtype) -> Optional_state, parameters used to
  108. initialise the parameters. Defaults to the standard flax initialiser. Only specify if your network has
  109. a non-standard init method.
  110. apply_fun: Function of the signature f(model, variables, σ) that should evaluate the model. Defaults to
  111. `model.apply(variables, σ)`. specify only if your network has a non-standard apply method.
  112. training_kwargs: a dict containing the optional keyword arguments to be passed to the apply_fun during training.
  113. Useful for example when you have a batchnorm layer that constructs the average/mean only during training.
  114. chunk_size: (Defaults to `None`) If specified, calculations are split into chunks where the neural network
  115. is evaluated at most on :code:`chunk_size` samples at once. This does not change the mathematical results,
  116. but will trade a higher computational cost for lower memory cost.
  117. """
  118. super().__init__(hilbert)
  119. self._model_framework = None
  120. self._states = None # Add this at the very start of __init__
  121. if variables is not None:
  122. # TODO: Always have shardings...
  123. if config.netket_experimental_sharding:
  124. par_sharding = jax.sharding.PositionalSharding(
  125. jax.devices()
  126. ).replicate()
  127. else:
  128. par_sharding = jax.sharding.SingleDeviceSharding(jax.devices()[0])
  129. variables = jax.tree_util.tree_map(
  130. lambda x: jax.lax.with_sharding_constraint(
  131. jnp.asarray(x), par_sharding
  132. ),
  133. variables,
  134. )
  135. # Init type 1: pass in a model
  136. if model is not None:
  137. # extract init and apply functions
  138. # Wrap it in an HashablePartial because if two instances of the same model are provided,
  139. # model.apply and model2.apply will be different methods forcing recompilation, but
  140. # model and model2 will have the same hash.
  141. self._model_framework = model_frameworks.identify_framework(model)
  142. _maybe_unwrapped_variables, model = self._model_framework.wrap(model)
  143. if variables is None:
  144. if _maybe_unwrapped_variables is not None:
  145. variables = _maybe_unwrapped_variables
  146. self._model = model
  147. self._init_fun = nkjax.HashablePartial(
  148. lambda model, *args, **kwargs: model.init(*args, **kwargs), model
  149. )
  150. self._apply_fun = wrap_to_support_scalar(
  151. nkjax.HashablePartial(
  152. lambda model, *args, **kwargs: model.apply(*args, **kwargs), model
  153. )
  154. )
  155. elif apply_fun is not None:
  156. self._apply_fun = wrap_to_support_scalar(apply_fun)
  157. if init_fun is not None:
  158. self._init_fun = init_fun
  159. elif variables is None:
  160. raise ValueError(
  161. "If you don't provide variables, you must pass a valid init_fun."
  162. )
  163. self._model = wrap_afun(apply_fun)
  164. else:
  165. raise ValueError("Must either pass the model or apply_fun.")
  166. self.mutable = mutable
  167. self.training_kwargs = fcore.freeze(training_kwargs)
  168. self.seed_config = seed_config
  169. def _init_configs_from_hamiltonian(self, hamiltonian, n_states, dtype=float):
  170. """
  171. Initializes configs by expanding from [0,...,0] using the Hamiltonian,
  172. then selecting the n_states highest-probability configs according to the network.
  173. """
  174. seed_config = jnp.zeros(self.hilbert.size, dtype=int) if self.seed_config is None else self.seed_config
  175. # Get all connected configurations
  176. connected, _ = hamiltonian.get_conn_padded(seed_config)
  177. # Remove duplicates (in case zero_config is also in connected)
  178. all_configs = fast_unique_configs(connected.reshape(-1, self.hilbert.size))
  179. # Evaluate amplitudes
  180. log_psi = self.log_value(all_configs)
  181. amplitudes = jnp.real(log_psi)
  182. # Select top n_states
  183. idx = np.argsort(amplitudes,kind="mergesort")[-self._n_select:][::-1]
  184. return all_configs[idx]
  185. self._n_select = n_select
  186. self._n_expand = n_expand
  187. self._hamiltonian = hamiltonian
  188. self._connected = None
  189. if variables is not None:
  190. self.variables = variables
  191. else:
  192. self.init(seed, dtype=dtype)
  193. if seed_config is None:
  194. seed_config = jnp.zeros((self.hilbert.size,), dtype=int)
  195. else:
  196. seed_config = jnp.asarray(seed_config, dtype=int)
  197. if seed_config.shape != (self.hilbert.size,):
  198. raise ValueError(
  199. f"seed_config must have shape ({self.hilbert.size},), got {seed_config.shape}"
  200. )
  201. if init_states is None:
  202. self._states = _init_configs_from_hamiltonian(self, self._hamiltonian, self._n_select)
  203. else:
  204. self._states = init_states
  205. self._psi = jnp.exp(self.log_value(self._states))
  206. self._array = self._psi
  207. self._pdf = _array_to_pdf(self._array)
  208. """
  209. Caches the output of `self._all_states()`.
  210. """
  211. #self._array = None
  212. """
  213. Caches the output of `self.to_array()`.
  214. """
  215. #self._pdf = None
  216. """
  217. Caches the output of `self.probability_distribution()`.
  218. """
  219. self.chunk_size = chunk_size
  220. def init(self, seed=None, dtype=None):
  221. """
  222. Initialises the variational parameters of the variational state.
  223. """
  224. if self._init_fun is None:
  225. raise RuntimeError(
  226. "Cannot initialise the parameters of this state"
  227. "because you did not supply a valid init_function."
  228. )
  229. if dtype is None:
  230. dtype = float
  231. key = nkjax.PRNGKey(seed)
  232. dummy_input = self.hilbert.random_state(key, 1, dtype=dtype)
  233. variables = jit_evaluate(self._init_fun, {"params": key}, dummy_input)
  234. self.variables = variables
  235. @property
  236. def hilbert(self) -> DiscreteHilbert:
  237. r"""The descriptor of the Hilbert space
  238. on which this variational state is defined.
  239. .. note::
  240. Full summation states only work over discrete hilbert spaces.
  241. """
  242. return self._hilbert # type: ignore
  243. @property
  244. def chunk_size(self) -> int | None:
  245. """
  246. Suggested *maximum size* of the chunks used in forward and backward evaluations
  247. of the Neural Network model. If your inputs are smaller than the chunk size
  248. this setting is ignored.
  249. This can be used to lower the memory required to run a computation with a very
  250. high number of samples or on a very large lattice. Notice that inputs and
  251. outputs must still fit in memory, but the intermediate computations will now
  252. require less memory.
  253. This option comes at an increased computational cost. While this cost should
  254. be negligible for large-enough chunk sizes, don't use it unless you are memory
  255. bound!
  256. This option is an hint: only some operations support chunking. If you perform
  257. an operation that is not implemented with chunking support, it will fall back
  258. to no chunking. To check if this happened, set the environment variable
  259. `NETKET_DEBUG=1`.
  260. """
  261. return self._chunk_size
  262. @chunk_size.setter
  263. def chunk_size(self, chunk_size: int | None):
  264. # disable chunks if it is None
  265. if chunk_size is None:
  266. self._chunk_size = None
  267. return
  268. if not isinstance(chunk_size, int) or chunk_size <= 0:
  269. raise ValueError("Chunk size must be a positive INTEGER. ")
  270. if not _is_power_of_two(chunk_size):
  271. warnings.warn(
  272. "For performance reasons, we suggest to use a power-of-two chunk size."
  273. )
  274. # TODO MPI aware check for valid size
  275. check_chunk_size(self.hilbert.n_states, chunk_size)
  276. self._chunk_size = chunk_size
  277. def update_configs(self):
  278. """
  279. Updates self._states by expanding to all configs connected by the Hamiltonian,
  280. then selecting the top n_select configs by probability amplitude.
  281. """
  282. # 1. Expand: get all connected configs
  283. if not hasattr(self, '_connected') or self._connected is None:
  284. all_connected, _ = self._hamiltonian.get_conn_padded(self._states)
  285. all_connected = all_connected.reshape(-1, self.hilbert.size)
  286. ind = np.random.randint(0, all_connected.shape[0], size=self._n_expand)
  287. all_connected = all_connected[ind]
  288. else:
  289. all_connected = self._connected[np.random.randint(0, self._connected.shape[0], size=self._n_expand)]
  290. all_connected = jnp.concatenate((self._states, all_connected), axis=0)
  291. # Remove duplicates
  292. all_connected = fast_unique_configs(all_connected)
  293. # 2. Evaluate amplitudes substitute
  294. log_psi = self.log_value(all_connected)
  295. amplitudes = jnp.real(log_psi)
  296. # 3. Select top n_select
  297. idx = np.argsort(amplitudes,kind="mergesort")[-self._n_select:][::-1]
  298. self._states = all_connected[idx]
  299. self._psi = jnp.exp(self.log_value(self._states))
  300. self._array = self._psi
  301. self._pdf = _array_to_pdf(self._array)
  302. def reset(self):
  303. """
  304. Resets the sampled states. This method is called automatically every time
  305. that the parameters/state is updated.
  306. """
  307. if self._states is None:
  308. return
  309. self.update_configs()
  310. @property
  311. def model(self) -> Any | None:
  312. """Returns the model definition of this variational state.
  313. This field is optional, and is set to `None` if the variational state has
  314. been initialized using a custom function.
  315. """
  316. if self._model_framework is not None:
  317. return self._model_framework.unwrap(self._model, self.variables)
  318. self._model
  319. def log_value(self, σ: jnp.ndarray) -> jnp.ndarray:
  320. r"""
  321. Evaluate the variational state for a batch of states and returns
  322. the logarithm of the amplitude of the quantum state.
  323. For pure states, this is :math:`\log(\langle\sigma|\psi\rangle)`,
  324. whereas for mixed states
  325. this is :math:`\log(\langle\sigma_r|\rho|\sigma_c\rangle)`, where
  326. :math:`\psi` and :math:`\rho` are respectively a pure state
  327. (wavefunction) and a mixed state (density matrix).
  328. For the density matrix, the left and right-acting states (row and column)
  329. are obtained as :code:`σr=σ[::,0:N]` and :code:`σc=σ[::,N:]`.
  330. Given a batch of inputs :code:`(Nb, N)`, returns a batch of outputs
  331. :code:`(Nb,)`.
  332. """
  333. return jit_evaluate(self._apply_fun, self.variables, σ)
  334. def quantum_geometric_tensor(
  335. self, qgt_T: QGTConstructor | None = None
  336. ) -> LinearOperator:
  337. r"""Computes an estimate of the quantum geometric tensor G_ij.
  338. This function returns a linear operator that can be used to apply G_ij to a given vector
  339. or can be converted to a full matrix.
  340. Args:
  341. qgt_T: the optional type of the quantum geometric tensor. By default it's automatically selected.
  342. Returns:
  343. nk.optimizer.LinearOperator: A linear operator representing the quantum geometric tensor.
  344. """
  345. if qgt_T is None:
  346. qgt_T = QGTAuto()
  347. return qgt_T(self)
  348. def to_array(self, normalize: bool = True, allgather: bool = True) -> jax.Array:
  349. # Only evaluate on self._states (your subset)
  350. if self._array is None and normalize:
  351. self._array = jnp.exp(self.log_value(self._states))
  352. # If you want amplitudes, use jnp.exp(self._array)
  353. if normalize:
  354. arr = self._array
  355. else:
  356. arr = jnp.exp(self.log_value(self._states))
  357. return arr
  358. def probability_distribution(self):
  359. if self._pdf is None:
  360. self._pdf = _array_to_pdf(self.to_array())
  361. return self._pdf
  362. # cached computations
  363. @property
  364. def _all_states(self):
  365. return self._states
  366. @property
  367. def samples(self):
  368. return self._states
  369. def __repr__(self):
  370. return (
  371. "SCState("
  372. + f"\n hilbert = {self.hilbert},"
  373. + f"\n n_parameters = {self.n_parameters})"
  374. )
  375. def __str__(self):
  376. return "SCState(" + f"hilbert = {self.hilbert}, "
  377. # serialization
  378. def serialize_SCState(vstate):
  379. state_dict = {
  380. "variables": serialization.to_state_dict(
  381. serialization_utils.remove_prngkeys(vstate.variables)
  382. ),
  383. "states": jnp.array(vstate._states), # <-- Add this line
  384. }
  385. return state_dict
  386. def deserialize_SCState(vstate, state_dict):
  387. import copy
  388. new_vstate = copy.copy(vstate)
  389. #new_vstate.reset()
  390. vars = jax.tree_util.tree_map(
  391. jnp.asarray,
  392. serialization.from_state_dict(vstate.variables, state_dict["variables"]),
  393. )
  394. vars = serialization_utils.restore_prngkeys(vstate.variables, vars)
  395. if config.netket_experimental_sharding:
  396. vars = jax.tree_util.tree_map(
  397. lambda x, y: jax.lax.with_sharding_constraint(jnp.asarray(y), x.sharding),
  398. vstate.variables,
  399. vars,
  400. )
  401. new_vstate.variables = vars
  402. # Restore the configurations
  403. if "states" in state_dict:
  404. new_vstate._states = jnp.array(state_dict["states"])
  405. return new_vstate
  406. serialization.register_serialization_state(
  407. SCState,
  408. serialize_SCState,
  409. deserialize_SCState,
  410. )

state.py, under CC-BY-4.0 · at the source

Overview

Authors: Lexin Ding1, Markus Reiher1
ORCID iDs: Markus Reiher
  1. Department of Chemistry and Applied Biosciences, ETH Zürich, Vladimir-Prelog-Weg 2, CH-8093 Zürich, Switzerland
Institutions: ETH Zurich (Switzerland)
Journal: Journal of chemical theory and computation, volume 22, issue 6, pages 3032-3043
Dates: received 4 November 2025; accepted 18 February 2026; published online 9 March 2026; in print March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1021/acs.jctc.5c01852 · PMID 41802182 · PMCID PMC13019627 · OpenAlex W7134805057
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Methods: Statistics, Spectral & time-frequency
Topic: Quantum many-body systems (Atomic and Molecular Physics, and Optics, Physics and Astronomy), according to OpenAlex
Citations: cited by 2 papers (Europe PMC); 93 references in the paper

Abstract

Neural quantum states (NQS) are a promising ansatz for solving many-body quantum problems due to their inherent expressiveness. Yet this expressiveness can only be harnessed efficiently for treating identical particles if the suitable physical knowledge is hardwired into the neural network itself. For electronic structure, NQS based on backflow determinants have been shown to be a powerful ansatz for capturing strong correlation. By contrast, the analogue for bosons, backflow permanents, is unpractical due to the steep cost of computing the matrix permanent and due to the lack of particle conservation in common bosonic problems. To circumvent these obstacles, we introduce a modal backflow (MBF) NQS design and demonstrate its efficacy by solving the anharmonic vibrational problem. To accommodate the demand of high accuracy in spectroscopic calculations, we implement a selected-configuration scheme for evaluating physical observables and gradients, replacing the standard stochastic approach based on Monte Carlo sampling. A vibrational self-consistent field calculation is conveniently carried out within the MBF network, which serves as a pretraining step to accelerate and stabilize the optimization. In applications to both artificial and ab initio Hamiltonians, we find that the MBF network is capable of delivering spectroscopically accurate zero-point energies and vibrational transitions in all anharmonic regimes.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.

Zenodo 17552425

License: CC-BY-4.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: the references
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: JAX (12 files), NumPy (12 files), SciPy (3 files)
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)
28 files
At the source:

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 27 scripts, each with its path and the digest of its content;
  • 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data Availability Statement

The data and code for producing the result of this work are available on Zenodo.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 1 funder, 87 references.

Cite

This paper

Ding, L., & Reiher, M. (2026). Modal Backflow Neural Quantum States for Anharmonic Vibrational Calculations. Journal of chemical theory and computation, 22(6), 3032-3043. https://doi.org/10.1021/acs.jctc.5c01852

BibTeX

@article{ding2026modal,
author = {Ding, Lexin and Reiher, Markus},
title = {{Modal Backflow Neural Quantum States for Anharmonic Vibrational Calculations}},
journal = {Journal of chemical theory and computation},
year = {2026},
month = mar,
volume = {22},
number = {6},
pages = {3032--3043},
publisher = {American Chemical Society},
issn = {1549-9618},
doi = {10.1021/acs.jctc.5c01852},
url = {https://doi.org/10.1021/acs.jctc.5c01852},
pmid = {41802182},
pmcid = {PMC13019627}
}

RIS

TY - JOUR
AU - Ding, Lexin
AU - Reiher, Markus
TI - Modal Backflow Neural Quantum States for Anharmonic Vibrational Calculations
T2 - Journal of chemical theory and computation
J2 - J Chem Theory Comput
PY - 2026
DA - 2026/03/09
VL - 22
IS - 6
SP - 3032
EP - 3043
SN - 1549-9618
PB - American Chemical Society
DO - 10.1021/acs.jctc.5c01852
UR - https://doi.org/10.1021/acs.jctc.5c01852
LA - en
ER -

CSL-JSON

{
"id": "10.1021/acs.jctc.5c01852",
"type": "article-journal",
"title": "Modal Backflow Neural Quantum States for Anharmonic Vibrational Calculations",
"container-title": "Journal of chemical theory and computation",
"author": [
{
"family": "Ding",
"given": "Lexin"
},
{
"family": "Reiher",
"given": "Markus"
}
],
"container-title-short": "J Chem Theory Comput",
"volume": "22",
"issue": "6",
"page": "3032-3043",
"DOI": "10.1021/acs.jctc.5c01852",
"PMID": "41802182",
"PMCID": "PMC13019627",
"ISSN": "1549-9618",
"publisher": "American Chemical Society",
"URL": "https://doi.org/10.1021/acs.jctc.5c01852",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
9
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1021/acs.jpclett.6c00520 [code]
Neural Quantum States Based on Selected Configurations.
Journal: The journal of physical chemistry letters
In common: JAX, NumPy, 21 references, author Markus Reiher
[2] doi:10.1038/s41467-026-74028-6 [code]
Solving the Hubbard model with neural quantum states.
Journal: Nature communications
In common: 5 references
[3] doi:10.1371/journal.pone.0354021 [code]
A genetic algorithm for self-supervised models of oscillatory neurodynamics.
Journal: PloS one
In common: JAX, SciPy, NumPy, 1 reference
[4] doi:10.1371/journal.pcbi.1014340 [code]
pyhgf: A neural network library for predictive coding.
Journal: PLoS computational biology
In common: JAX, SciPy, NumPy, 1 reference
[5] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: JAX, SciPy, NumPy
[6] doi:10.1126/sciadv.aeg6797 [code]
Dorsoventral gradient of theta sweeps in the medial entorhinal cortex.
Journal: Science advances
In common: JAX, SciPy, NumPy
[7] doi:10.1002/hipo.70131 [code]
Decoding Medial Entorhinal Cortical Dynamics Produces Planning-Like Alternations in Hippocampal theta Sequences.
Journal: Hippocampus
In common: JAX, SciPy, NumPy
[8] doi:10.1371/journal.pcbi.1014657 [code]
Population morphology implies a common developmental blueprint for Drosophila motion detectors.
Journal: PLoS computational biology
In common: JAX, SciPy, NumPy
[9] doi:10.1038/s41467-026-75959-w [code]
Charting higher-order models of brain function beyond pairwise interactions.
Journal: Nature communications
In common: JAX, SciPy, NumPy
[10] doi:10.3390/ijms27156614 [code]
Candidalysin Inhibits &lt;i&gt;Porphyromonas gingivalis&lt;/i&gt; Lipoprotein-Induced IL-1β Production in BV-2 Microglia via Hydrophobic Microbial Interactions.
Journal: International journal of molecular sciences
In common: JAX, SciPy, NumPy

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.