Releases: unitaryfund/qook
separate() and normalize()
This adds the methods separate()
and normalize()
to QrackSimulator
. separate()
forces entanglement-breaking between the target subsystem and all other qubits (without condition). normalize()
is a necessary component to achieve separate()
manually via decompose()
.
A bug was fixed in QUnit::Decompose() in the course of testing separate()
.
Full Changelog: v0.12.0...v0.13.0
out_probs()
This release adds out_probs()
to the simulator API, which outputs all basis state probabilities in the same order as out_ket()
.
Full Changelog: v0.11.2...v0.12.0
sha1sum result:
cb5a4c0ac3142220ff8265923369efcf1a0c52be qook-0.12.0.crate
Optional noisy simulation
This release enables the option (off by default) to simulate with depolarizing single-qubit noise, for every gate.
Full Changelog: v0.11.1...v0.11.2
sha1sum result:
3bf39c3d0a9452b134b8fcbda47da4d65df01462 qook-0.11.2.crate
Debugging patch for v0.11.0
Primarily, in this release, matrix
expectation value variants have been debugged to accept the correct number of arguments: they should take 2 Float
components for each component of a 2x2 matrix, for 8 Float
components in total. Documentation has also been updated.
sha1sum result:
9175831dee7c6c11ba6bd3f20fc01a307021f42b qook-0.11.1.crate
Expectation value API
This release adds the newer API for many different types of expectation value and variance. It also allows 32-bit vs. 64-bit floating-point precision to be controlled by a build option.
sha1sum result:
300436c0196108833cb91ff232799498bd9aa99b qook-0.11.0.crate
QrackCircuit improvements
This adds inverse()
and past_light_cone()
methods to QrackCircuit
. (inverse()
returns a new QrackCircuit
that is the exact overall inverse of the original, while past_light_cone()
accepts a vector of qubits and returns a new QrackCircuit
with just the gates on the "past light cone" of those qubits, i.e., having any potential causal influence.)
Stabilizer weak sampling
This release add support for stabilizer weak sampling.
QrackCircuit and QrackNeuron
This release adds QrackCircuit
and QrackNeuron
to the public Qook classes. (QrackNeuron
was distributed as v0.6.0).
set_sdrp()
There's no particular reason why SDRP level can't be changed mid-circuit. Several historical design issues made this difficult, in the past, but these are no longer relevant as of late. This is particularly desirable given the recent addition of automatic fidelity calculation when using SDRP in QUnit.
Therefore, this release adds SetSdrp()
to the QInterface
API, and it also exposes it to the shared library interface. Qook consumes it as set_sdrp(f64)
.
get_unitary_fidelity() and reset_unitary_fidelity()
This release adds get_unitary_fidelity()
and reset_unitary_fidelity()
to the simulator API.
It was noted by Andrea Mari of Unitary Fund that, from first principles, for a discarded probability "ɛ
" in any rounding event, the worst case limit for fidelity loss from "Schmidt decomposition rounding parameter" ("SDRP") methods in QUnit
should go like
F = Π (1-ɛ_j) (for j events where ɛ less than SDRP threshold).
Implementing this model, Daniel Strano found it to be very pessimistic, but through trial and error it was noticed that
F = Π (1-ɛ_j / 2)^(1/2) (for j events where ɛ less than SDRP threshold)
was very close to "gold standard" results. Collecting tens of thousands of data points on different circuit widths, depths, and SDRP levels, the second model was found to explain >99% of variance among gold standard results, (without a theoretical argument, for now, explaining why this should be close to or exactly the average case behavior).
More than 99% of variance was explained for random circuits that are basically a "nearest-neighbor quantum volume" variant; other cases might not be as well described. This calculation is done automatically by QUnit
, and the result can be accessed through get_unitary_fidelity()
, or the calculation might be reset to identically 1 fidelity by reset_unitary_fidelity()
.