Releases: NVIDIA/cuda-quantum
0.9.1
This release adds support for using Amazon Braket and Infeqtion's Superstaq as backends.
Starting with this release, all C++ quantum kernels will be processed by the nvq++ compiler regardless of whether they run on a simulator or on a quantum hardware backend. This change is largely non-breaking, but language constructs that are not officially supported within quantum kernels will now lead to a compilation error whereas previously they could be used when executing on a simulator only. The previous behavior can be forced by passing the --library-mode
flag to the compiler. Please note that if you do so, however, the code will never be executable outside of a simulator and may not be supported even on simulators.
What's Changed
Features and Enhancements 🎉
- Support for the braket target with Python frontend by @khalatepradnya in #2401
- Superstaq integration by @vtomole in #2423
Bug Fixes 🐛
- Fix uninitialized memory issue for the result buffer in statevector simulators by @1tnguyen in #2475
- Fixing JIT compilation error for cudaq.observe from Python by @schweitzpgi in #2392
- Fixing observe for single spin operator by @schweitzpgi in #2394
- Complete revision of
pauli_word
implementation by @schweitzpgi in #2338 - Fix
NoiseModel
for single-precision backends by @1tnguyen in #2406 - Fix a bug with C++ argument handling in the front end by @schweitzpgi in #2459
Breaking Changes 🛠
- Switch the default to enable mlir by @schweitzpgi in #2366
Documentation Updates ✏️
- Fix documentation for Python struct syntax by @bebora in #2365
- Document C++ API for get_state, sample and observe by @lmondada in #2140
- Documentation for
braket
target by @khalatepradnya in #2418 - Documentation for
infleqtion
target by @khalatepradnya in #2464 - Fix wrong parameters in docs for Fermioniq backend by @MarkusPfundstein in #2367
Other Changes
- Tensornet contraction path reuse for expectation value calculation by @1tnguyen in #2397
- Improve binary sizes by not globing MLIR dialects/passes by @boschmitt in #2414
- Improve performance of some opt passes by @annagrin in #2431
- Support measurements of subveqs for braket by @annagrin in #2416
- Support measurement sampling seed for
cutensornet
backends by @1tnguyen in #2398 - Support for allocatable quantum structs by @schweitzpgi in #2432
- Allow setting noise on measurement operation and apply it accordingly by @1tnguyen in #2447
- MGPU updates for NVLink and bug fixes by @1tnguyen in #2424
New Contributors
- @bebora made their first contribution in #2365
- @mitchdz made their first contribution in #2399
- @vtomole made their first contribution in #2423
- @lmondada made their first contribution in #2140
Full Changelog: 0.9.0...0.9.1.
Release created by workflow 12315600791.
0.9.0
We are very excited to share a new toolset added for modeling and manipulating the dynamics of physical systems. The new API allows to define and execute a time evolution under arbitrary operators. For more information, we refer to our docs.
The 0.9.0 release furthermore includes a range of contribution to add new backends to CUDA-Q, including backends from Anyon Technologies, Ferimioniq, and QuEra Computing, as well as updates to existing backends from ORCA and OQC.
A more extensive list of the most important changes, as usual, is given below. We hope you enjoy the new features - also check out our new notebooks and examples to dive into CUDA-Q.
What's Changed
Features and Enhancements 🎉
- Enable user-custom data structs in python kernels by @amccaskey in #1939
- Python support for photonic simulator target by @khalatepradnya in #2055
- Anyon technologies backend integration by @Lambdauv in #2191
- Add
dep-analysis
pass (a.k.a.features/qubit-mgmt
) by @bmhowe23 in #2163 - Noise model enhancements by @1tnguyen in #2168
- Add Clifford-only simulator (Stim) by @bmhowe23 in #2235
- One- and Two-qubit operation synthesis by @khalatepradnya in #2217
- Enable user-custom data structs in C++ kernels by @schweitzpgi in #2254
- Add multi-QPU support for the 'orca' target by @khalatepradnya in #2260
- Noise modeling updates for Stim backend by @bmhowe23 in #2258
- Fermioniq integration by @MarkusPfundstein in #2225
- CUDA 12 installer, wheels, and images by @bettinaheim in #2187
- Adding
quera
backend by @khalatepradnya in #2358 - Dynamics backend for modeling of physical systems
Bug Fixes 🐛
- Fix memory leaks in Python JIT cache by @bmhowe23 in #2059
- Follow-up to #1603 - fix
kronprod
bug occurring with Nvidia simulators by @bmhowe23 in #2077 - Add dynamic tuple layout handling by @schweitzpgi in #2109
- Fixes bug in lower to cfg by @schweitzpgi in #2113
- Fix intermittent shutdown warning message by @bmhowe23 in #2130
- Fix missing import of crx by @ikkoham in #2142
- Fix runtime bug for span qview access where the span is of length 1 by @annagrin in #2149
- Fixes a bug in handling of small structs by @schweitzpgi in #2166
- Fix calling convention differences between libstdc++ and libc++ by @schweitzpgi in #2188
- Fix argument conversion issues by @annagrin in #2211
- Fix exp_pauli issues on remote simulators and quantum devices by @annagrin in #2226
- Fixes a bug with separate compilation by @schweitzpgi in #2264
- Fix argument passing issue in C++ bridge by @schweitzpgi in #2266
- Fix mid-circuit measurement if reset follows measurement by @bmhowe23 in #2275
- Fix various bugs when processing the host-side functions and the by @schweitzpgi in #2268
- Add support for aarch64 calling conventions by @schweitzpgi in #2278
- Fix
spin_op
multiplication. by @boschmitt in #2292 - Bug fixes for multi-GPU statevector simulator by @1tnguyen in #2313
- Fix issues with
state.from_data
bindings by @1tnguyen in #2312 - Fix incorrect call return for python device kernels by @annagrin in #2319
- Fix state retrieval logic for
tensornet
by @khalatepradnya in #2353
Breaking Changes 🛠
- CUDA 11 and CUDA 12 tags for Docker image and cuQuantum version update by @bettinaheim in #2333
- Python package name changes and metapackage by @bettinaheim in #2356
Documentation Updates ✏️
- New Tutorial - Divisive Clustering by @mawolf2023 in #1990
- Add
get_state_async
examples to themqpu
platform docs by @1tnguyen in #2063 - Correctly specify the used convention in noise channel docs by @anthony-santana in #2023
- Adding AFQMC tutorial by @zohimchandani in #1844
- Update Hadamard test tutorial by @ikkoham in #1972
- Quantum Filter diagonalization by @marwafar in #1997
- Added notebooks on Shor's algorithm by @mmvandieren in #2070
- Add clarification about setting env vars prior to setting target by @bmhowe23 in #2173
- New tutorial: unitary compilation using diffusion models by @zohimchandani in #2172
- Updates to Shor's algorithm notebook by @mmvandieren in #2178
- Random walk phase estimation example in Python #1579 by @Gaurang-Belekar in #2060
- Restructure of examples and applications by @zohimchandani in #2218
- Add the documentation of anyon tech backend by @Lambdauv in #2281
- Changing documentation and defaults to reflect the CUDA 12 builds/packages by @bettinaheim in #2374
Other Changes
- Add cudaq::draw support for hardware targets by @bmhowe23 in #2042
- Support more numpy constants in quantum kernels by @freifrauvonbleifrei in #1756
- Implement argument conversions as a runtime library by @schweitzpgi in #2040
- Update factor-quantum-alloc to handle subveqs better by @bmhowe23 in #2047
- Add support for kernel return values by @schweitzpgi in #2082
- Update regtomem to handle more cases by @schweitzpgi in #2135
- Update decomposition patterns for value semantics by @bmhowe23 in #2145
- CMake targets and other improvements for downstream projects by @amccaskey in #2014
- Allow state synthesis for remote simulators by @annagrin in #2212
- Separate compilation, supporting C++ host side function references. by @schweitzpgi in #2216
- Add enumerated noise_model_type to noise interface by @bmhowe23 in #2200
- ORCA asynchronous sampling by @Omar-ORCA in #2205
- Update Stim backend to support conditionals and mid-circuit measurements by @bmhowe23 in #2270
- Enable Python/C++ interop via exposed JIT functionality by @amccaskey in #2214
- Modify the launchers to support returning results. by @schweitzpgi in #2277
- Add new gates to Photonics simulator by @Omar-ORCA in #2289
- Add Braket backend by @rmshaffer in #2337
- OQC client upgrade by @jfriel-oqc in #2352
New Contributors
- @mawolf2023 made their first contribution in #1990
- @AishSweety made their first contribution in #2089
- @wahorvat made their first contribution in #2127
- @Lambdauv made their first contribution in #2191
- @MarkusPfundstein made their first contribution in #2225
- @rmshaffer made their first contribution in #2337
Full Changelog: https://github.com/...
0.8.0
The 0.8.0 release adds a range of changes to improve the ease of use and performance with CUDA-Q. The changes listed below highlight some of what we think will be the most useful features and changes to know about. While the listed changes do not capture all of the great contributions, we would like to extend many thanks for every contribution, in particular those from external contributors.
What's Changed
Features and Enhancements 🎉
- Allows std::pair and std::tuple to be passed as arguments to kernels by @schweitzpgi in #1585
- Support for complex numbers in quantum kernels by @annagrin in #1605
- IQM Aphrodite QPU support by @kukushechkin in #1637
- Support for U3 gate by @anthony-santana in #1614
- Blochsphere Visualization by @prateekchawla168 in #1763
- Circuit diagrams for unitary quantum kernels in LaTeX by @freifrauvonbleifrei in #1723
- Add ORCA backends and documentation by @Omar-ORCA in #1842
- Support custom unitary operations by @khalatepradnya in #1794
Performance ⚡
- Add optimized applyExpPauli to nvidia-mgpu by @bmhowe23 in #1559
- Optimize kernel mode for hybrid QNN test case by @bmhowe23 in #1572
- State initialization feature and performance improvements related to state handling by @schweitzpgi in #1754
- NVQC Optimizations for VQE (C++ and Python) by @bmhowe23 in #1901
- Optimization for XX, YY, ZZ rotations in MPS simulator by @1tnguyen in #1691
- Performance improvements for running compute APIs (state,observe,sample) in a loop by @1tnguyen in #1865
- Heuristic threshold to prevent OpenMP slow-down in simple
spin_op
*=
by @1tnguyen in #1676
Bug Fixes 🐛
- Fix issue with indexing raw args pointer for return value by @amccaskey in #1540
- [tools] Fix segfault in
cudaq-translate
whenemit-llvm=0
by @fabianmcg in #1557 - Allow measurement of variadic list of qubits by @amccaskey in #1502
- Fix Pauli word conversion bug in
observe_async
by @bmhowe23 in #1567 - Fix Python wheel installation issues (multiple subtlety linked items) by @bmhowe23 in #1493
- Fixes and issue with sampling when kernel contains mid-circuit measurements by @1tnguyen in #1619
- Fix
bool
toint
casting issue in Python by @1tnguyen in #1654 - Correctly handle 'break' within nested loops in Python by @khalatepradnya in #1693
- Allow math dialect to lower and run on NVQC by @bmhowe23 in #1692
- Segmentation fault during circuit simulation for large number of controlled gates by @schweitzpgi in #1735
- Bugs fixes in lower quake pass by @schweitzpgi in #1831
- Fix stack overflow when running with a large number of shots by @bmhowe23 in #1846
- Add nvidia-mqpu as a valid multi-GPU backend for NVQC by @bmhowe23 in #1856
- Fix bug in lower-to-cfg by @schweitzpgi in #1868
- Fix storage order of noise kraus ops by @1tnguyen in #1825
- Address scoping issue for
sample_async
by @khalatepradnya in #1878 - Fix LLVM aarch64 relocation overflow by @bmhowe23 in #1444
- Fix bug in
memtoreg
pass with classical values inif
s by @atgeller in #1905 - Fix bug for missing function declarations by @schweitzpgi in #1919
- Keep stack from growing without bound by @schweitzpgi in #1892
- Fix incorrect capture for array and list in python by @annagrin in #1928
- Correctly distinguish measurement result and boolean variable by @khalatepradnya in #1952
- Fixing an issue with copying measurement variable inside a kernel by @khalatepradnya in #1962
- Support use of
control
andadjoint
variants of a kernel by @khalatepradnya in #1979 - Fix cudaq::slice_vector synthesis bug by @bmhowe23 in #1981
- Handle use of indirect
adjoint
on acontrol
by @khalatepradnya in #1993
Breaking Changes 🛠
- Bump
cuquantum
to 24.03 andcutensor
to 2.0 by @1tnguyen in #1524 - Build and include the C++ standard library in installer by @bettinaheim in #1603
- Changes to cudaq headers for pure c++17 environment by @schweitzpgi in #1468
Documentation Updates ✏️
- Use arch-specific pip requirements and update docs by @bmhowe23 in #1602
- Additional tutorials and examples by @zohimchandani in #1702
- Added application Readout Error Mitigation by @Gopal-Dahale in #1765
- Improve structure and clarity of the documentation by @WingCode in #1724
- Add ability to set MPS SVD algorithm by @1tnguyen in #1761
- Adding examples for defining kernels and inverting them (e.g. inverse QFT) by @mmvandieren in #1885
- Hadamard test example by @marwafar in #1867
- Active space example with water molecule by @marwafar in #1859
- Adding example about molecular docking via DC-QAOA by @marwafar in #1960
Other Changes
- Add cudaq.translate API by @annagrin in #1916
- Enable 'reset' in Python kernel mode by @khalatepradnya in #1649
- Add support for python's for-else by @schweitzpgi in #1573
- Make quantum values a linear type by @schweitzpgi in #1612
- nvq++ command line options by @schweitzpgi in #1805
- Handle unsupported operation with nvqc target by @sacpis in #1907
- Enable capture of opaque kernel functions by @amccaskey in #1934
- NVQC API versioning updates and advance REST API to v1.1 by @bmhowe23 in #1941
- State preparation after synthesis by @annagrin in #1891
- Add error message about not synthesizing state pointers by @annagrin in #1974
- Support direct kernel invocation with a return value by @1tnguyen in #1969
New Contributors
- @actione made their first contribution in #1510
- @Gaurang-Belekar made their first contribution in #1525
- @fabianmcg made their first contribution in #1557
- @marwafar made their first contribution in #1581
- @abhiram6121 made their first contribution in #848
- @ikkoham made their first contribution in #1655
- @prateekchawla168 made their first contribution in #1763
- @Gopal-Dahale made their first contribution in #1765
- @freifrauvonbleifrei made their first contribution in #1723
- @WingCode made their first contribution in #1724
- @atgeller made their first contribution in #1829
- @BalajiJBcs made their first contribution in #1826
Full Changelog: 0.7.1...0.8.0
Release created by workflow 10252752123.
0.7.1
The 0.7.1 release adds bug fixes, slightly changes the Python wheel installation instructions, and adds simulator optimizations to our prior 0.7.0 release. The nvidia-mgpu
backend now supports user customization of the gate fusion level as controlled by the CUDAQ_MGPU_FUSE
environment variable documented here.
What's Changed
Features and Enhancements 🎉
- Perf. improvement for
CuStateVecCircuitSimulator::observe
by @1tnguyen in #1002 - Make spin_op.distribute_terms batch more efficiently by @bmhowe23 in #1437
- MPS backend to support gates on 3+ qubits by @1tnguyen in #1420
- Add optimized applyExpPauli to nvidia-mgpu by @bmhowe23 in #1559
- Optimize kernel mode for hybrid QNN test case by @bmhowe23 in #1572
Bug Fixes 🐛
- Fixing issue with sample_async failing on machines with multiple GPUs by @1tnguyen in #1379
- Enable list[T] argument specification in kernel builder by @amccaskey in #1370
- Fix synthesis of vectors with small integers. by @schweitzpgi in #1395
- Fix compilation issue for std::vector in some cases by @schweitzpgi in #1402
- Fixing incorrect error for synthesis of callables by @schweitzpgi in #1398
- Fix memory leak in CuStateVecCircuitSimulator.cu by @bmhowe23 in #1424
- Fix issue when passing np.ndarray to Python kernels by @amccaskey in #1406
- Fix Python handling of kernel list parameters by @bmhowe23 in #1410
- Fix issue with
spin_op
result retrieval by @1tnguyen in #1440 - Handling empty lists passed to Python kernels by @amccaskey in #1438
- Fix issue where qubits are retained with draw / tracer by @amccaskey in #1457
- Fix issue caused by docstrings inside Python kernels by @amccaskey in #1459
- Improved error handling and bug fixes for Python by @amccaskey in #1458
- Fix issue with cnot operation not being properly compiled for some targets by @schweitzpgi in #1466
- Simplify MLIR code generated for simple Python for loops over range(N) by @amccaskey in #1470
- Fix Python wheel installation issues (multiple subtlety linked items) by @bmhowe23 in #1493
- Fix observe() calls on nvidia-mgpu backend by @bmhowe23 in #1494
- Fix issue with unknown base on attribute call (throw an error) by @amccaskey in #1499
- Fix QPUD Library Mode Installer Build by @1tnguyen in #1435
Documentation Updates ✏️
- Documentation for NVQC by @1tnguyen in #1412
- Python documentation for kernel construction by @khalatepradnya in #1417
Other Changes
- Adds the ability to pass vector values to kernels as input by @schweitzpgi in #1404
- Add support for recently introduced cudaq::range(a,b,c) function. by @schweitzpgi in #1476
Release created by workflow 9094817952.
GitHub commit 1f8dd79d46cad9b9bd0eb220eb04408a2e6beda4
Full Changelog: 0.7.0...0.7.1
0.7.0
The 0.7.0 release adds support for using NVIDIA Quantum Cloud in the form of a new nvqc
target, giving you access to our most powerful GPU-accelerated simulators even if you don't have an NVIDIA GPU.
With 0.7.0, we have furthermore greatly increased expressiveness of the Python and C++ language frontends. Check our our new Quick Start to get started with the new Python syntax support we have added, and follow our blog to learn more about the new setup and its performance benefits.
What's Changed
Features and Enhancements 🎉
- NVCF integration by @1tnguyen in #1148
- Enable CUDA Quantum language specification in Python by @khalatepradnya in #1312
- Support for composable aggregate argument types, such as e.g. vectors of structs by @schweitzpgi in #1080
- Kernel builder JIT cache optimizations by @bmhowe23 in #1206
- Optimize LLVM JIT for large circuits by @bmhowe23 in #1261
- Unitary circuit drawing by @amccaskey in #1299
Bug Fixes 🐛
- Fix issue with argument checking on kernel_builder apply_call by @amccaskey in #1131
- Don't throw fatal exception during 'import cudaq' if missing dependencies by @bmhowe23 in #1152
- Fixes for the
remote-mqpu
platform by @1tnguyen in #1158 - Fix incorrect warning for IonQ command line parameters by @bmhowe23 in #1173
- Fix non-created custatevec handle edge case by @1tnguyen in #1160
- Fix tensornet bug with async python functions by @amccaskey in #1177
- Change
__global__
register bit ordering for target mode to match library mode by @bmhowe23 in #1027 - Fix issue with handling nested
cudaq::adjoint
by @boschmitt in #1217 - Handle LLVM errors via C++ exceptions in the REST server implementation by @1tnguyen in #1263
- Decode orca-url by @Omar-ORCA in #1270
- Refresh remote seeds for executions within a client session by @1tnguyen in #1318
- Miscellaneous bug fixes for argument and return values by @schweitzpgi in #1326
Breaking Changes 🛠
Documentation Updates ✏️
- Copy edits to the C++ examples on the website by @mmvandieren in #951
- Copy edits made to Advanced sections and Tutorials by @mmvandieren in #964
- Python example copy edits by @mmvandieren in #947
- Build and install guide update by @bettinaheim in #1188
- MPI related docs and commit update by @bettinaheim in #1191
- Build from source guide - Python wheels by @bettinaheim in #1220
Other Changes
- Change internal qubit ordering by @boschmitt in #1082
- Add support for CURL_CA_BUNDLE environment variable by @bmhowe23 in #1213
- Options for OQC Toshiko machine by @owen-oqc in #1195
- Optimize logger implementation by @bmhowe23 in #1254
New Contributors
- @justinlietz made their first contribution in #960
Full Changelog: 0.6.0...0.7.0
Release created by workflow 8332091498.
0.6.0
The 0.6.0 release contains improved support for various HPC scenarios. We have added a plugin infrastructure for connecting CUDA Quantum with an existing MPI installation, and we've added a new platform target that distributes workloads across multiple virtual QPUs, each simulated by one or more GPUs.
Starting with 0.6.0, we are now also distributing pre-built binaries for using CUDA Quantum with C++. The binaries are built against the GNU C library version 2.28. We've added a detailed Building from Source guide to build these binaries for older glibc
versions.
What's Changed
Features and Enhancements 🎉
- C++17 support by @schweitzpgi in #973
- MPI support as plugins by @1tnguyen in #966
- Support for recursive vector arguments and other data types by @schweitzpgi in #1051
- Allow user to directly specify mapping topology file by @bmhowe23 in #1084
- Pre-built binaries, installer, and building from source guide by @bettinaheim in #1010
- Introducing
remote-mqpu
REST Server-Client platform by @1tnguyen in #1012
Bug Fixes 🐛
- Make C++ ASTBridge specification adherent for operation broadcasting by @amccaskey in #876
- Fix missing ctrl-swap support by @schweitzpgi in #918
- Fix WireType compliance issues with qubit-mapping pass by @bmhowe23 in #932
- Reduce GPU memory usage when using reset(q) in user programs by @bmhowe23 in #942
- Fix for misleading CUDA not found message by @khalatepradnya in #986
- Fixes for
tensornet
backend not picking up MPI by @1tnguyen in #974 - Fix bug in sampling a kernel with mz-reset-mz pattern (overwriting sample_result register) by @amccaskey in #997
- Fix ghost qubit bug #981 by @amccaskey in #998
- Hide error message while checking for GPUs in Python workflow by @khalatepradnya in #995
- Fix density matrix qubit ordering bug by @anthony-santana in #1033
- Fix library mode qubit ordering bug. by @amccaskey in #1044
- Patch density matrix bug in release mode by @anthony-santana in #1053
- Fix issue 1064: bug in bridge when lambda argument contains a loop. by @schweitzpgi in #1069
- Improve thread-safety of CUDAQ static variables by @1tnguyen in #1078
- Chemistry related bug fixes by @amccaskey in #1099
- Fix bug 1108 - race condition in sample_async by @amccaskey in #1114
Documentation Updates ✏️
- Fixing typos and copy editing for docs by @mmvandieren in #896
- Add documentation and test for mixed language project by @schweitzpgi in #1085
- MPI plugin docs by @1tnguyen in #1095
- Adding a section on updating CUDA Quantum to docs by @bettinaheim in #1112
Other Changes
- Add new pass, linear-ctrl-form by @schweitzpgi in #853
- Add a MeasureType to Quake by @schweitzpgi in #869
- Deprecate builder ctrl gates that are not specification compliant by @anthony-santana in #935
- Add ability to create shared library to the driver by @schweitzpgi in #985
- Improved support for kernel return values by @schweitzpgi in #1009
- Deprecating qreg and qspan by @schweitzpgi in #983
- Support for return vectors of type std::vector where NT is a numerical type by @schweitzpgi in #1014
- Ability to pass custom passes from
nvq++
by @1tnguyen in #1034 - Add support for vectors of vectors to the bridge. by @schweitzpgi in #1036
- Support controlled-SWAP's in kernel builder by @anthony-santana in #924
- Partial support for passing/return POD struct values. by @schweitzpgi in #1054
- Process initializer lists for struct types in the bridge. by @schweitzpgi in #1068
- Enable use of single-term spin_op with kernel_builder::exp_pauli by @amccaskey in #1071
New Contributors
- @mmvandieren made their first contribution in #896
- @jjacobelli made their first contribution in #832
- @Yaraslaut made their first contribution in #1038
Full Changelog: 0.5.0...0.6.0
Release created by workflow 7702894514.
GitHub commit e0fb95f99b955acca530fcedeb3acd109d9d0183
0.5.0
With 0.5.0 we have added support for quantum kernel execution on OQC and IQM backends. For more information, see our docs. CUDA Quantum now allows to executing adaptive quantum kernels on quantum hardware backends that support it. The 0.5.0 release furthermore improves the tensor network simulation tools and adds a matrix product state simulator.
Additionally, we are now publishing images for experimental features, which currently includes improved Python language support. Please take a look at our installation guide for more information about how to obtain them.
What's Changed
Features and Enhancements 🎉
- Support for submission to OQC backends by @jfriel-oqc in #435
- Support for submission to IQM backends by @kukushechkin in #468
- Add more support for std::vector and (C style) arrays. by @schweitzpgi in #714
- Optimized support for applying exponentials of Paulis by @amccaskey in #660
- Additional kernels for chemistry applications by @1tnguyen in #731
- Support for adaptive quantum kernels on (certain) quantum hardware backends by @bmhowe23 in #741
- Adding photonics execution manager by @Omar-ORCA in #515
- Delay measurements if necessary when targeting quantum hardware backends by @bmhowe23 in #761
- Enable while loop normalization and unrolling by @schweitzpgi in #830
- Support ranged for-loops when targeting quantum hardware backends by @schweitzpgi in #833
- Enable deployments for experimental branches by @bettinaheim in #880
- Open-source tensornet simulator and add tensornet-mps simulator backend by @1tnguyen in #863
Bug Fixes 🐛
- Support Volta+ arch in custatevec backend by @1tnguyen in #696
- Fix bug with unwind lowering. by @schweitzpgi in #744
- Fix incorrect handling of measurements in value semantics representation by @schweitzpgi in #752
- Fix #781: Handle loops that include mid-circuit measurements by @schweitzpgi in #787
- Legalization error in basis conversion. by @schweitzpgi in #794
- Better error messages for unsupported statements in kernels by @bmhowe23 in #808
- Fix logical
&&
operator in__qpu__
kernels by @bmhowe23 in #811 - Fix bug in loop normalization. by @schweitzpgi in #807
- Fix ternary operator in
__qpu__
kernels by @bmhowe23 in #815 - Added missing GIL-safe implementation for
pySampleAsync
by @1tnguyen in #828 - Support 2-d broadcast for observe by @1tnguyen in #829
- Fix GKE bug for quantum kernels that take with std::vector arguments by @schweitzpgi in #841
- Enable diagnostics for invalid kernel argument types. by @schweitzpgi in #844
- Fix compiler crash when casting from floating to boolean by @bmhowe23 in #852
- Fix kernel builder c_if qubit extraction bug by @anthony-santana in #857
- Fix an issue due to an ABI differences between ARM and x86 architectures by @1tnguyen in #878
Breaking Changes 🛠
- Modifying default target to be GPU, if present by @khalatepradnya in #842
- Fix broadcasting behavior and log a warning for behavior change by @schweitzpgi in #898
- Update cuQuantum version to 23.10 by @1tnguyen in #863
Documentation Updates ✏️
- Add documentation for OQC backends by @owen-oqc in #816
- Add documentation for IQM backends by @kukushechkin in #562
- Add C++ noise modeling examples to our docs by @1tnguyen in #818
- Add state class to documentation by @anthony-santana in #790
- Update install guide and fixing tutorials by @bettinaheim in #860
- Adding documentation about default target and the environment variable to override it by @khalatepradnya in #899
- Documentation for
tensornet
andtensornet-mps
backends by @1tnguyen in #871 - Add documentation and tweaks for using CUDA Quantum in DGX Cloud by @bettinaheim in #905
Other Changes
- Support vector front/back by @anthony-santana in #702
- Implement
get_state_async
for mqpu platform by @1tnguyen in #766 - Limited support for executing loops with break statements on quantum hardware backends by @schweitzpgi in #768
- Implement the combine rotation peephole optimization. by @schweitzpgi in #772
- Add support for cudaq::range(N). by @schweitzpgi in #736
- Support for additional controlled gates in python by @anthony-santana in #784
- Deprecate exp_val_z/expectation_z in favor of
expectation
by @anthony-santana in #791 - Better support for
QuakeValue
in Python by @1tnguyen in #809 - Implement a loop peeling pass. by @schweitzpgi in #824
- Create qubit-mapping pass by @boschmitt in #610
- Incorporate new qubit-mapping pass for IQM backends by @bmhowe23 in #837
- Incorporate new qubit-mapping pass for OQC backends by @bmhowe23 in #838
- Add
error_mitigation
andsharpen
configurations to IonQ backend by @splch in #470 - Allow for multiple controls and targets in rotation gates by @anthony-santana in #835
- Removing password prompt and other ergonomic changes for Docker images by @bettinaheim in #820
- Allow the environment variable to override the default target by @khalatepradnya in #877
- Publish cuda-quantum images only to NGC, removing pushes to GHCR by @bettinaheim in #900
New Contributors
- @owen-oqc made their first contribution in #780
- @Omar-ORCA made their first contribution in #515
- @khalatepradnya made their first contribution in #842
Full Changelog: 0.4.1...0.5.0
Release created by workflow 6915068190.
0.4.1
The 0.4.1 release adds support for ARM processors in the form of multi-platform Docker images and aarch64 Python wheels. Additionally, all GPU-based backends are now included in the Python wheels as well as in the Docker image.
What's Changed
Features and Enhancements 🎉
- Expose adjoint T and S gates to python builder API by @anthony-santana in #402
- Added kernel_builder functions for the hardware efficient ansatz #361 by @johanneskuhlmann in #451
- Adding nvidia backends to python wheels by @bettinaheim in #480
- Multi-platform Docker images and aarch64 wheels by @bettinaheim in #548
- Implement CUDA Quantum Kernel from State Vector. by @amccaskey in #568
- Enable std::vector construction within kernels by @amccaskey in #593
Bug Fixes 🐛
- Support Volta+ arch in custatevec backend by @1tnguyen in #696
- Accurately detect mx/my mid-circuit measurements by @amccaskey in #415
- Bug fix to support multiple single qubit allocations on quantum backends by @schweitzpgi in #474
- Fix missing support for R1 decomposition by @amccaskey in #471
- Fix #475: bug with measurement operations in value semantics by @schweitzpgi in #491
- Fix #303 - release build segfault by @schweitzpgi in #502
- Fixes bug with null_wire. by @schweitzpgi in #504
- Fix bug in bit flip noise channel by @anthony-santana in #528
- [Support] Closes #532: change backtrace error message by @boschmitt in #534
- Fix #523 and std::unique bug in CircuitSimulator by @amccaskey in #526
- Fix compiler crash when processing empty region by @bmhowe23 in #552
- Bug fixes for
nvq++
arguments by @1tnguyen in #549 - Add spin_op::from_word(...) by @amccaskey in #555
- Add multi-control decomposition to IONQ pipeline by @boschmitt in #566
- Support QASM emission for CallOps by @amccaskey in #563
- Convert IonQ outputs to bit strings and correct order by @bmhowe23 in #575
- Canonicalizations for ConcatOp and ExtractRefOp by @amccaskey in #574
- [custatevec]
getStateData
to return data consistent with qpp andcudaq::from_state
by @1tnguyen in #582 - Allow more descriptive output names by @bmhowe23 in #580
- Fix for issue #603: QASM emission by @1tnguyen in #604
- Fix bug when using gcc-11 header files. by @schweitzpgi in #613
- Fix issues with get_state() in Python by @amccaskey in #616
- [Opt] Fix use after free (erase) in mem2reg by @boschmitt in #628
- Fix for issue #641: QASM export by @1tnguyen in #649
- Only enable optimization in non-empty kernels by @bmhowe23 in #656
- Add the ability to pass additional command line options by @schweitzpgi in #647
Documentation Updates ✏️
- Clarifying documentation for GPU-based simulators by @bettinaheim in #738
- Document CUDA library dependencies for Python wheels by @anthony-santana in #716
- Updating docs on built-in operations by @bettinaheim in #719
- Document GPU and CPU requirements by @schweitzpgi in #707
- Adding mqpu documentation by @1tnguyen in #708
- Fixed code snippets using wrong kernel_builder APIs by @1tnguyen in #479
- Cleanup the MLIR Pass advanced document, add a FileCheck test by @amccaskey in #547
- Refactor python documentation and update examples by @anthony-santana in #581
- Adding tutorials folder with example notebooks by @zohimchandani in #560
Other Changes
- Update unwind-lowering pass to be more general by @schweitzpgi in #389
- Improve synthesis. by @schweitzpgi in #401
- updating cuquantum and cutensor versions by @bettinaheim in #422
- Add environment variable allowing one to print the IR before remote submission by @amccaskey in #427
- Issue #274: Migrate the fixup-linkage script to C++ by @schweitzpgi in #497
- Add cudaq::set_random_seed() by @amccaskey in #477
- Python sample() and observe() implement broadcasting by @amccaskey in #495
- Add option to set the noise model when using the IonQ-hosted simulator by @1tnguyen in #536
- Add all_gather function for MPI by @amccaskey in #516
- Enable one to progressively build a Kernel with the kernel_builder by @amccaskey in #558
- Implement spin_op::to_sparse_matrix(). by @amccaskey in #567
- Rewrite the AST Bridge. by @schweitzpgi in #587
- Adjustments to support libc++ in the AST Bridge by @schweitzpgi in #594
- Improve reproducibility of results by @bmhowe23 in #617
- More precise representation of the dataflow in Quake value semantics by @schweitzpgi in #625
- Add get_random_seed() to make broadcast tests repeatable by @bmhowe23 in #648
- Modify Quake::ApplyOp to allow an indirect form of call in order to by @schweitzpgi in #663
- Improve measurement support for submissions to IonQ by @bmhowe23 in #661
- Add ctrl-t and ctrl-s decomposition via r1 conversion by @1tnguyen in #672
- Introduce sample_options and observe_options for addl flexibility by @bmhowe23 in #664
- Fix #633: Bump the LLVM version to 16.0.6. by @schweitzpgi in #676
New Contributors
- @orclassiq made their first contribution in #394
- @johanneskuhlmann made their first contribution in #451
- @jrhemstad made their first contribution in #447
- @kukushechkin made their first contribution in #468
- @ajschmidt8 made their first contribution in #585
- @jfriel-oqc made their first contribution in #435
- @zohimchandani made their first contribution in #560
Full Changelog: 0.4.0...0.4.1
Release created by workflow 6408359768.
0.4.0
CUDA Quantum is now available on PyPI!
For the initial PyPI release, the NVIDIA multi-gpu and tensornet backends are not yet included. Check out our Docker images on NGC to obtain the fully featured version, or build it from source using the release assets.
With 0.4.0 we have added support for quantum kernel execution on Quantinuum and IonQ backends. For more information, see our docs.
As always, we welcome questions and feedback in the form of issues and discussions on this repository.
What's Changed
Features and Enhancements 🎉
- Implement cudaq::control() taking a free function as argument by @schweitzpgi in #35
- Add reset to kernel_builder in C++ and python. by @amccaskey in #18
- Add for_loop to cudaq::kernel_builder and cudaq.Kernel by @amccaskey in #19
- Optimization: do not add control qubits to compute/uncompute steps of compute_action idiom. by @schweitzpgi in #63
- Expose for_each_term and for_each_pauli to python by @amccaskey in #56
- Implement spin_op::to_matrix() by @amccaskey in #31
- Add support for negate operator (operator!) to cudaq::control. by @schweitzpgi in #81
- Improve the ExecutionManager Extension Point by @amccaskey in #33
- Performance enhancements: observe_n and sample_n broadcast functions by @amccaskey in #74
- spin_op performance enhancement by @amccaskey in #115
- Implement chemistry domain sub-package. by @amccaskey in #112
- [optimizer] Decomposition pass by @boschmitt in #143
- Increase performance of quantum allocation and deallocation in simulation by @amccaskey in #167
- Basis translation pass by @boschmitt in #144
- Implement runtime quantum operation tracing by @amccaskey in #92
- [optimizer] Multicontrol decomposition by @boschmitt in #194
- Add Server Helper for Quantinuum backends by @amccaskey in #176
- Expose SWAP gate to c++ and python builder by @anthony-santana in #200
- [opt] Add memtoreg and regtomem passes. by @schweitzpgi in #233
- Added forward difference gradient evaluation. by @poojarao8 in #107
- Local emulation of remote qpu execution by @amccaskey in #262
- Implement MPI support in CUDA Quantum by @amccaskey in #237
- [pass] Add a loop normalization pass. by @schweitzpgi in #313
- Linux support for pip installation by @anthony-santana in #304
Bug Fixes 🐛
- Add overload to handle the case when the user writes: by @schweitzpgi in #32
- Do not allow operator! on target qubits. by @schweitzpgi in #6
- Temporary fix for AST visitor reentrancy bugs. by @schweitzpgi in #22
- Fix bug 69, no expval attached to
observe_result
when shots aren't provided by @amccaskey in #70 - Fix
QuakeValue
Lifetime Bug andkernel_builder::to_quake
Handling by @amccaskey in #67 - Adding r-val overload (QuakeValue &&) for kernel_builder adjoint modifier by @1tnguyen in #99
- [CircuitCheck] Handle qvec as controls by @boschmitt in #128
- [common-ops] Fixes some matrices (row-major vs col-major) issues by @boschmitt in #133
- [quake] Fixes some matrices (row-major vs col-major) issues by @boschmitt in #140
- Fix #129, Make kernel_builder::qalloc(1) explicitly return a qvec. by @amccaskey in #136
QuakeBridgeVisitor
to handlecphase
by @1tnguyen in #132- cudaq-ensmallen not export BLAS symbols by @1tnguyen in #185
- Fixed a subtle bug in
QppCircuitSimulator::observe
by @1tnguyen in #189 - Bind r1 gate to python by @anthony-santana in #198
- Fixed
QppCircuitSimulator
shotsExecutionResult.expectationValue
by @1tnguyen in #208 - Fixing segfault crashes when using measure/reset ops. by @1tnguyen in #217
- Fix #250: linkage of top-level (global) function. by @schweitzpgi in #267
- Reset and parametric gates in
kernel_builder
by @1tnguyen in #269 - Fix #251: Base profile should handle single qubit allocations. by @schweitzpgi in #273
- Fix #281: let canonicalization pattern work with IndexType. by @schweitzpgi in #282
- Fix #286: Add canonicalization to hoist invariants cc.loop arguments. by @schweitzpgi in #289
- Fix #296: issue processing if-statements in JIT compilation by @schweitzpgi in #298
- [pass] Fix #291: don't erase non-controlled ops by @boschmitt in #292
- Fix #325: Bridge had some bugs with callable instances. by @schweitzpgi in #326
- Fix issue with qreg of dynamic size and disappearing instructions by @schweitzpgi in #358
- Fix #344 - add support for std::uint8_t kernel argument by @amccaskey in #356
- Fix kernel_builder nested function call bug, #332 by @amccaskey in #334
- Fix #338: Work on implementation of cudaq::adjoint. by @schweitzpgi in #374
Breaking Changes 🛠
- Remove qpud by @amccaskey in #91
- Delete qtx-translate and references to same. by @schweitzpgi in #102
- Remove outdated functions from cudaq.py by @anthony-santana in #105
- [CircuitCheck] Remove QTX support by @boschmitt in #118
- [quake] Universally replace the QRef type name with Ref. by @schweitzpgi in #160
- [quake] Universal conversion of QVec to Veq. by @schweitzpgi in #163
- Removes the QTX dialect by @boschmitt in #157
- NVQ++ Targets by @amccaskey in #147
- Update python command line flags by @amccaskey in #187
- [nfc] Remove the raise to affine (stub) pass. by @schweitzpgi in #235
Documentation Updates ✏️
- Refer to GitHub for building from source instructions, by @bettinaheim in #40
- Documentation update for control qubit negation by @schweitzpgi in #86
- Fixes to common operations definitions by @boschmitt in #120
- Update circuit simulator documentation to reflect the latest refactoring by @amccaskey in #90
- Update the documentation to reflect the new unified dialect by @schweitzpgi in #153
- Make the CC ops documentation more uniform. by @schweitzpgi in #150
- [docs] Small fixes to quake dialect example by @boschmitt in #165
Other Changes
- Revert change to disable jump branching. by @schweitzpgi in #5
- Replace the old deallocation pass. by @schweitzpgi in #30
- Make use of the various math dialect power operations. by @schweitzpgi in #71
- [nvq++] Add RPATH flags only to the final binary by @boschmitt in #52
- CircuitSimulator Refactor by @amccaskey in #12
- Add a wire type to the quake dialect. by @schweitzpgi in #101
- Add new ops to quake. by @schweitzpgi in #109
- Link to correct version of custatvec libs by @hamidelmaazouz in http...
0.4.0-alpha
What's Changed
Features and Enhancements 🎉
- Implement cudaq::control() taking a free function as argument by @schweitzpgi in #35
- Add reset to kernel_builder in C++ and python. by @amccaskey in #18
- Add for_loop to cudaq::kernel_builder and cudaq.Kernel by @amccaskey in #19
- Optimization: do not add control qubits to compute/uncompute steps of compute_action idiom. by @schweitzpgi in #63
- Expose for_each_term and for_each_pauli to python by @amccaskey in #56
- Implement spin_op::to_matrix() by @amccaskey in #31
- Add support for negate operator (operator!) to cudaq::control. by @schweitzpgi in #81
- Improve the ExecutionManager Extension Point by @amccaskey in #33
- Performance enhancements: observe_n and sample_n broadcast functions by @amccaskey in #74
- spin_op performance enhancement by @amccaskey in #115
- Implement chemistry domain sub-package. by @amccaskey in #112
- [optimizer] Decomposition pass by @boschmitt in #143
- Increase performance of quantum allocation and deallocation in simulation by @amccaskey in #167
- Basis translation pass by @boschmitt in #144
- Implement runtime quantum operation tracing by @amccaskey in #92
- [optimizer] Multicontrol decomposition by @boschmitt in #194
- Add Server Helper for Quantinuum backends by @amccaskey in #176
- Add qvector, qarray, and qview by @amccaskey in #152
- Expose SWAP gate to c++ and python builder by @anthony-santana in #200
- [opt] Add memtoreg and regtomem passes. by @schweitzpgi in #233
- Added forward difference gradient evaluation. by @poojarao8 in #107
- Local emulation of remote qpu execution by @amccaskey in #262
- Implement MPI support in CUDA Quantum by @amccaskey in #237
Bug Fixes 🐛
- Add overload to handle the case when the user writes: by @schweitzpgi in #32
- Do not allow operator! on target qubits. by @schweitzpgi in #6
- Temporary fix for AST visitor reentrancy bugs. by @schweitzpgi in #22
- Fix bug 69, no expval attached to
observe_result
when shots aren't provided by @amccaskey in #70 - Fix
QuakeValue
Lifetime Bug andkernel_builder::to_quake
Handling by @amccaskey in #67 - Adding r-val overload (QuakeValue &&) for kernel_builder adjoint modifier by @1tnguyen in #99
- [CircuitCheck] Handle qvec as controls by @boschmitt in #128
- [common-ops] Fixes some matrices (row-major vs col-major) issues by @boschmitt in #133
- [quake] Fixes some matrices (row-major vs col-major) issues by @boschmitt in #140
- Fix #129, Make kernel_builder::qalloc(1) explicitly return a qvec. by @amccaskey in #136
QuakeBridgeVisitor
to handlecphase
by @1tnguyen in #132- cudaq-ensmallen not export BLAS symbols by @1tnguyen in #185
- Fixed a subtle bug in
QppCircuitSimulator::observe
by @1tnguyen in #189 - Bind r1 gate to python by @anthony-santana in #198
- Fixed
QppCircuitSimulator
shotsExecutionResult.expectationValue
by @1tnguyen in #208 - Fixing segfault crashes when using measure/reset ops. by @1tnguyen in #217
- Fix #250: linkage of top-level (global) function. by @schweitzpgi in #267
- Reset and parametric gates in
kernel_builder
by @1tnguyen in #269 - Fix #251: Base profile should handle single qubit allocations. by @schweitzpgi in #273
- Fix #281: let canonicalization pattern work with IndexType. by @schweitzpgi in #282
- Fix #286: Add canonicalization to hoist invariants cc.loop arguments. by @schweitzpgi in #289
- Fix #296: issue processing if-statements in JIT compilation by @schweitzpgi in #298
- [pass] Fix #291: don't erase non-controlled ops by @boschmitt in #292
Breaking Changes 🛠
- Remove qpud by @amccaskey in #91
- Delete qtx-translate and references to same. by @schweitzpgi in #102
- Remove outdated functions from cudaq.py by @anthony-santana in #105
- [CircuitCheck] Remove QTX support by @boschmitt in #118
- [quake] Universally replace the QRef type name with Ref. by @schweitzpgi in #160
- [quake] Universal conversion of QVec to Veq. by @schweitzpgi in #163
- Removes the QTX dialect by @boschmitt in #157
- NVQ++ Targets by @amccaskey in #147
- Update python command line flags by @amccaskey in #187
- [nfc] Remove the raise to affine (stub) pass. by @schweitzpgi in #235
Documentation Updates ✏️
- Refer to GitHub for building from source instructions, by @bettinaheim in #40
- Documentation update for control qubit negation by @schweitzpgi in #86
- Fixes to common operations definitions by @boschmitt in #120
- Update circuit simulator documentation to reflect the latest refactoring by @amccaskey in #90
- Update the documentation to reflect the new unified dialect by @schweitzpgi in #153
- Make the CC ops documentation more uniform. by @schweitzpgi in #150
- [docs] Small fixes to quake dialect example by @boschmitt in #165
Other Changes
- Revert change to disable jump branching. by @schweitzpgi in #5
- Replace the old deallocation pass. by @schweitzpgi in #30
- Make use of the various math dialect power operations. by @schweitzpgi in #71
- [nvq++] Add RPATH flags only to the final binary by @boschmitt in #52
- CircuitSimulator Refactor by @amccaskey in #12
- Add a wire type to the quake dialect. by @schweitzpgi in #101
- Add new ops to quake. by @schweitzpgi in #109
- Link to correct version of custatvec libs by @hamidelmaazouz in #88
- [CircuitCheck] Run canonicalizer before checking by @boschmitt in #122
- Convert the quake dialect ops to support both memory and register forms. by @schweitzpgi in #124
- Change qextract to extract_ref everywhere. by @schweitzpgi in #138
- Add types for structs and arrays to CC by @schweitzpgi in #146
- [quake] OperatorInterface method to get negated controls by @boschmitt in #154
- [CircuitCheck] Handle negated controls by @boschmitt in #159
- Fold constant into extract_ref op by @schweitzpgi in #164
- [CircuitCheck] Handle raw index in ExtractRefOp by @boschmitt in #168
- [cc] Start adding some LLVM-like operations. by @schweitzpgi in #192
- [CircuitCheck] Handle local qubits by @boschmitt in #190
- [quake, cc] Improved alloca ops by @schweitzpgi in #193
- Fixes for macOS by @boschmitt in #213
- [bridge, runtime] Replace use of LLVM-IR dialect in the bridge and python interface with CC dialect operations. by @schweitzpgi in #201
- [cc] Add...