This is the first version officially released to PyPi!
vm6502q.v6.1.0
Upon suggestion from the Unitary Fund team, Qrack has been debugged against the newly developed `[mirror]` suite of "mirror circuit" (or "Loschmidt echo") integration tests, at all levels of the layer stack. For scope, about 20+ separate logical bugs were fixed. Random mirror circuits were generated to the exhaustion of detecable bugs, mostly at the 6 qubit width by 6-plus-inverse qubit depth level, but also ultimately for 27 qubits width by 6-plus-inverse depth.
In the process of refactoring and debugging, `QStabilizerHybrid` has also been extended with single-qubit matrix product state buffers that are commuted around control qubits, which are now effectively "trimmed" like with the Schmidt decomposition techniques of `QUnit`, to significantly increase the breadth of circuits which can be handled as Gottesman-Knill sub-states of `QUnit`.
vm6502q.v6.0.0
The `QPager` type from earlier development was revived and better integrated to give major performance boosts and typically 2 additional qubits of GPU maximum width, for common 4 segment GPU RAM architectures! It has been integrated as part of the default layer stack, and it does *not* require multi-device OpenCL environments to enjoy a performance boost.
We also have begun to expand into approximate simulation techniques, besides the major improvements in exact techniques. `TrySeparate()` has finally demonstrated returns under the right conditions, as it permutes through X/Y/Z single qubit and Bell pair bases as a "reactive" separability method, (as opposed to the "proactive" methods `QUnit` has always prioritized). Rounding tolerance can be set via constructor argument or universally overridden with the `QRACK_QUNIT_SEPARABILITY_THRESHOLD` environment variable.
16-bit floating point accuracy is now supported for both CPU and GPU, (when available for the OpenCL device and environment,) and FP16 build has been added to CI.
vm6502q.v5.4.0
Major changes in this release include a “hybridized” Gottesman-Knill stabilizer simulation type, adapted from the basis of Aaronson’s CHP, suitable for general purpose use under QUnit. When operations outside of Clifford set gates are invoked, this QInterface type transparently converts (base simulation unit or selective QUnit sub-units) to “ket” simulation, without any required user code action, which is further “hybridized” by default between CPU and GPU QEngine types.
QUnit “Decompose()” variants have finally been adapted to separate sub-units without first maximally entangling representation within the group of qubits to “Decompose().”
“TryDecompose()” and “TrySeparate()” have been restored, (except in QUnitMulti, with "dummy" implementations there,) and “SumSqrDiff()” has been broken out as a separate public method from “ApproxCompare(),” in order to allow users to measure a quantitative difference between (happenstance numerical) raw “kets.” The point of this set of changes is to start to allow user experimentation with “approximate separability” of qubits, such as by trading off between error and efficiency by “Decompose()-ing” bits that introduce only small but non-zero overall “SumSqrDiff()” changes.
Many miscellaneous bug fixes have been made, as the library continues to be tested for stability and correctness on a rolling basis. Builds have been tested on x64 Linux, Windows, and Mac, as well as Android and iOS, and also Raspberry Pi 3 and 4. Qiskit, Q, and ProjectQ integrations remain available and supported, with unit tests. Windows and mobile builds are now also officially supported as plugins for the Unity video game development engine, as integrated with WrathfulSpatula’s unaffiliated personal fork of the OpenRelativity physics module by the MIT Game Lab, for education, game development, and general modern physics simulation qualitative proof-of-concept.
vm6502q.v5.3.0
- This release introduces the Qrack::QHybrid type, which switches between CPU and GPU modes as effecient.
- Small QEngineCPU (and QHybrid) workloads are now asynchronous.
- QUnit now loads underlying "shard" engines lazily, when a QEngine is not necessary to simulate single separable qubits.
- The experimental Qrack::QPager type has been added.
vm6502q.v5.2.2
Issue 357 related to Qrack::QUnit buffering accuracy was addressed and tested up to a random universal circuit depth of 5 layers.
vm6502q.v5.2.1
This release is a stability enhancement for Qrack::QUnit controlled gate buffers, debugged against cross entropy benchmark tests.
vm6502q.v5.2
QUnit buffering has been improved, and the "fSim" gate has been added, which is useful in the simulation of quantum particles with fermionic statistics.
vm6502q.v5.1
Due to extended cross entropy benchmark testing, a bug was detected and fixed in QUnit::Swap(). In the process, the QUnit controlled gate buffer code was made cleaner and more versatile. As we select versions to tag by stability and correctness, this is due a release iteration.
vm6502q.v5.0
1. Cross entropy benchmarks have helped us debug QUnit to its most stable, accurate, and performant point to date.
2. Builds have been tested on Linux, Windows, Apple, and with VC4CL on the Raspberry Pi 3.
3. QFusion was determined to be obsolete, including for performance considerations, and it was removed.
4. The "Hash" method has been added, which effectively lets the user specify any one-to-one function (without phase effects) for unitary qubit state transformation via a classical hash table.
5. CMake options now include arbitrary (power-of-two) maximum qubit capacity in a single QUnit, with the Boost libraries for big integers. Of course, allocation is still limited by system resources, and the maximum OpenCL "shard" indexing is 64 qubits or less, (which is safely outside of possible resource limits for "Schrödinger method" simulation).
6. Documentation has been brought into line with the features and benchmarks of the new release.
vm6502q.v4.0
At this point, Qrack has been integrated with and extensively tested against a wide, open source stack of third-party quantum computing libraries, as a first-order and a second-order dependency. This is also the state of development at which we plan submit an academic report on benchmarks, for peer review, thanks to the generous support of the Unitary Fund micro-grant program. In overview, major points of improvement include:
- Debugging all existing work to pass extensive batteries of open source, third party unit tests, (particularly see the recent continuous integration tests and Travis definition file)
- QUnit "phase gate buffering" optimizations, which cache, commute, and "fuse" 2-qubit controlled gates to further reduce required "representational entanglement" (re: "Schmidt decomposition")
- Replacing float rounding neighborhoods with exact float value checks wherever applicable, and without loss of performance (which, upon scrutinization, turns out to more-or-less entirely generally)
- Full support as a Qiskit plugin, in addition to existing support for ProjectQ, as well as tested support as a second-order dependency through those projects