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.