Download Latest Version v.1.9.12 source code.zip (16.4 MB) Google Add to Preferred Sources
Home / v.1.9.12
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2026-10-05 9.6 kB
v.1.9.12 source code.tar.gz 2026-10-05 16.3 MB
v.1.9.12 source code.zip 2026-10-05 16.4 MB
Totals: 3 Items   32.7 MB 0
  • Controlled postselection again (#457)

  • Add support for controls to PostselectionCircuit

  • Update CUDA version to 13.2.0 in CI workflow

  • Update use_nat_orbs (#429)

  • Update use_nat_orbs

previous implementation has a bug if it was being passed the active keyword while core already defined.

It also had an issue where the chosen orbs (act/core) were selected by total overlap, which may carry to many selected orbitals for some orbitals and no enough for other. Now more equitative

  • Cudaq fix problem with not callable object (#458)

  • Update README.md (#424)

  • Update version.py

  • Bump version to 1.9.11

  • Add support for controls to PostselectionCircuit (#453)

  • Add support for controls to PostselectionCircuit

  • Update CUDA version to 13.2.0 in CI workflow
  • Update CUDA version (old version for now)

  • renaming s to state - attempt to fix test sim backends

  • Setting CudaQ version back to 0.14 in CI


Co-authored-by: J. S. Kottmann jakob.kottmann@gmail.com Co-authored-by: Oliver Hüttenhofer oliver.huettenhofer@gmail.com

  • Adding optimizer: ExcitationSolve (#433)

  • Adding excitationsolve optimizer

  • Reimplement QCircuit to_matrix function using Tequila simulate (#463)

  • Error correctable compilation (#464)

  • Compile single qubit Pauli rotations to Clifford + T gates

  • Test Clifford + T gate compilation

  • Make pygridsynth dependency optional

  • Fix qiskit do_sample method (#460)

  • apply ruff formating (#465)

  • Use up_to_phase = True with gridsynth (#466)

  • Use up_to_phase = True with gridsynth

  • Cache compiled pauli rotations
  • Fix target of cached Pauli rotations

  • python 3.11/3.12 suport (#468)

  • Add support for Python 3.11 and 3.12 in CI

  • openfermion.molecule.save() comented
  • Update openfermion version constraint in requirements
  • Update ci_chemistry_pyscf.yml

testing current openfermion

  • Update PySCF installation in CI workflow
  • Update ci_chemistry_pyscf.yml
  • Add beh2_4.5.xyz data file for madness tests

  • remove madness test out of test-conda-madness

  • Remove specific version pinning for pyscf

  • fix scipy test max_iter keyword

  • fix number core orbitals + improved orbital orthogonalization active space (#467)

  • fix number core orbitals + improved orbital orthogonalization active space

  • sorry mr ruff

  • sorry mr ruff 2

  • Improve use_native_orbitals

  • Fix selection number act/fr orbs

  • sorry mr ruft 3

  • sorry mr ruff 4

  • sorry mr ruff 5?

  • Update qc_base.py

Change default value of 'core' parameter from empty list to None. Which triggers taking the core orbitals from the integral manager

  • Change maxiter to maxfun in tests optimizer TNC options

  • Remove redundant test functions from test_scipy.py

Removed two test functions for execution and execution with shots in test_scipy.py.

  • sorry mr ruff

  • Implemented ghost atom support + tests (#469)

  • Implemented ghost atom support + tests

  • sorry mr ruff + pass test if no chem backend

  • recovered get_geometry_string mistake

  • sorry mr ruff 2 + fix test ghost atom too close

  • Refactor identity gate (#471)

  • refactor identity gate not to be created through a power gate

  • test equivalence of rotation with angle=0 and identity

  • Fabio Tomic Bachelorthesis (#459)

  • bachelor thesis code

  • fix tests

  • fix tests and formatting


Co-authored-by: J. S. Kottmann jakob.kottmann@gmail.com

  • Fix transition elements: optimization, gradients, registers, sampling (#472)

  • Make objectives with transition elements optimizable

Objectives can be complex valued since they can hold transition elements created by tq.BraKet. Optimizers need a real scalar: a complex value cannot be ordered, so scipy fails with a TypeError as soon as it compares the current value against the best one found so far.

Add Objective.to_float() and apply it in Optimizer.compile_objective, which every optimizer routes both the objective and its gradient components through. Gradients are differentiated before they are compiled, so this never differentiates through the cast.

to_float raises when the imaginary part does not vanish, so an objective that is real by construction optimizes as before, while a genuinely complex one such as <psi(b)|phi(a)> reports a clear error instead of failing inside scipy.

  • Fix analytic gradients of transition elements

tq.grad over a braket returned wrong values: variables of the bra got a zero gradient and the ket was differentiated as if it were a self overlap. Nothing raised, optimization simply converged to the wrong point.

The cause is in the circuit compiler. It recognises an expectation value by duck typing on U and H, and a braket has both, but its U is only the ket, so the braket was rebuilt as an expectation value over the ket alone before any gradient code ran. The compiler now keeps the braket and compiles both circuits.

The gradient itself follows the real and imaginary decomposition that compile() already provides, which is also how the two parts are measured. Both are expectation values, so the existing shift rule differentiates them. The outer derivative of an objective holding a braket is requested as holomorphic, since the arithmetic combining the arguments is.

Objective.transformation returned a fresh lambda, so the comparison against identity in __grad_objective never held and the shortcut for the derivative of the identity never fired. Returning the shared identity is needed here, because building a gradient of the identity fails on a complex value, and it avoids the useless construction for every other objective as well.

  • Evaluate brakets in a shared qubit register

A braket whose bra and ket act on different qubits returned a wrong value without raising: <ry(b) on q1|ry(a) q0> gave cos((a-b)/2) instead of cos(a/2)cos(b/2). A backend circuit only spans the qubits it touches, so the two wavefunctions were simulated in registers that do not line up and were then combined by an inner product.

An operator acting on a qubit outside both circuits was dropped entirely and the braket returned zero.

Extend both circuits to the union of bra, ket and operator qubits with identity gates, which adds a qubit without changing the state.

  • Fix finite-shot sampling of brakets

Sampling a braket raised "Tried to call uncompiled ExpectationValueImpl". sample() called the abstract objectives handed back by compile() directly, which have to go through simulate. Present in the base class and in the qulacs override.

  • Report the measurements a braket actually needs

BraKetImpl.count_measurements counted the Pauli strings of the operator and reported the same number as a plain expectation value. Real and imaginary part are measured separately, each with one Hadamard test per Pauli string, so a two term Hamiltonian needs eight measurements and not two. Count what compile() produces instead.

BackendBraKet had no count_measurements at all, so printing a compiled braket objective raised an AttributeError.

  • Make RealBraKet and ImagBraKet usable

Both wrapped the complex braket and nested an objective inside the arguments, which the compiler rejects: tq.simulate reported that BraKetImpl is symbolic, tq.grad and tq.minimize raised a compiler exception.

Take the corresponding half of compile() instead, so both are ordinary real valued objectives that simulate, differentiate and optimize.

  • Tolerate floating point noise in qulacs Pauli coefficients

qulacs.Observable is a HermitianQuantumOperator and rejects any coefficient whose imaginary part is not exactly zero. The Pauli coefficients of a Hermitian operator are real by construction, but pick up noise of order 1e-18 when the operator is assembled numerically, for example from the KetBra terms in the Krylov method. qulacs then refuses an operator that is Hermitian for all practical purposes, which breaks test_krylov.

Cast the coefficients with to_float, which keeps the real part and raises if the imaginary part is too large to be numerical noise.

  • Support non-Hermitian operators in transition elements

<bra|o|ket> is well defined for any operator, but the qulacs braket backend built a qulacs.Observable, which is Hermitian only. A non-Hermitian operator silently returned zero before the braket rework and raises after it.

Use qulacs.GeneralQuantumOperator for brakets, which accepts complex coefficients and supports both get_transition_amplitude and get_expectation_value. Expectation values keep using Observable, where Hermiticity is the right requirement.

  • Gradient braket improved to differenciate the bra and ket before Hadamard test test compilation (#473)

  • Gradient braket improved to differenciate the bra and ket before Hadamard test compilation

  • sorry mr ru

  • forgive me mr ruff

  • mr rufff... :(

  • merge version 1.9.12


Co-authored-by: Oliver Hüttenhofer oliver.huettenhofer@gmail.com Co-authored-by: JdelArco98 francisco.del.arco.santos@uni-a.de Co-authored-by: Ram 101571593+Ram4Dev@users.noreply.github.com Co-authored-by: Erik Schultheis schultheis.e@freenet.de Co-authored-by: Matthias Deiml matthias.deiml@uni-a.de Co-authored-by: lily-barta bartalily8@gmail.com Co-authored-by: JdelArco98 javierdelarcosantos@gmail.com Co-authored-by: Fabio Tomic 69203939+CoderFabio@users.noreply.github.com Co-authored-by: Davide 59845652+davibinco@users.noreply.github.com

Source: README.md, updated 2026-10-05