Releases: Classiq/classiq-library
Classiq 0.45.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Enhancements
- Add
size
attribute to quantum variables:
=== "SDK"
[comment]: DO_NOT_TEST
``` python
@qfunc
def main(my_struct: Output[MyStruct]) -> None:
allocate(my_struct.size, my_struct)
```
=== "Native"
```
qfunc main(output my_struct: MyStruct) {
allocate(my_struct.size, my_struct);
}
```
Classiq 0.44.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Bug Fixes
- Fixed a bug related to nested control operations.
- Fixed a bug related to boolean arithmetic expressions with invert.
- Fixed a bug related to arithmetic expressions inside within-apply.
IDE
- Add back improved circuit nodes search.
- Fix bug in Quantum Program page .qprog file extensions uploads.
- New Quantum Program export option: Quantum programs can now be exported as .qprog files.
- Poll all active jobs in the job list, not just the selected job.
- Add support for Alice & Bob hardware configurations in the IDE.
- Add support for QCtrl API key configuration in IBM hardware settings.
Enhancements
- Add support for arithmetic boolean expressions as conditionals for control statements;
see here. - Add quantum structs.
- The element type of quantum arrays can be any quantum type. N-dimensional quantum arrays are supported.
- Operand parameter names are optional in both Native
(qfunc (indicator: qbit)
->qfunc (qbit)
) and Python
(QCallable[QBit]
->QCallable[Annotated[QBit, "indicator"]]
) Qmod. - Improve error messages.
- Provide better circuits for certain boolean arithmetic expressions.
- Improved qubit reuse and runtime performance for model without constraints.
- Add
solovay_kitaev_max_iterations
field to the synthesis preferences,
allowing for tuning the accuracy of the Solovay-Kitaev algorithm. - Built-in classical functions to decompose/compose a matrix into/from a Hamiltonian. Example of usage:
=== "SDK"
[comment]: DO_NOT_TEST
``` python
mat = np.array([[0, 1, 2, 3], [1, 4, 5, 6], [2, 5, 7, 8], [3, 6, 8, 9]])
hamiltonian = matrix_to_hamiltonian(mat)
mat = hamiltonian_to_matrix(hamiltonian)
```
- parsed_states, parsed_counts, parsed_state_vector will contain the parsed execution details as lists if a quantum array was used in the model.
=== "SDK"
[comment]: DO_NOT_TEST
``` python
@qfunc
def main(qna: Output[QArray[QNum[3, True, 0]]]) -> None:
allocate(6, qna)
hadamard_transform(qna)
qp = synthesize(create_model(main))
res = execute(qp).result()
print(res[0].value.parsed_counts[0])
```
previously this would print -> state={'qna': 43} shots=27
now it prints -> state={'qna': [-2, 3]} shots=27
Library and Documentation
- A new tutorial on Hamiltonian simulation for block-encoded Hamiltonians, using QSVT and Qubitization, was added to
the library; see here. - A new tutorial on solving the discrete Poisson's equation using the HHL algorithm, combined with quantum sine and
cosine transforms, was added to the library;
see here. - New state preparation functions -
prepare_unifrom_trimmed_state
,prepare_unifrom_interval_state
, see here. - Enhanced the Discrete logarithm example to the case where the order is not power of 2, see here.
- Updated the Quantum Types documentation page.
Interface Changes
- Some builtin operations parameters have been renamed:
control(ctrl=..., operand=...)
=>control(ctrl=..., stmt_block=...)
within_apply(compute=..., action=...)
=>within_apply(within=..., apply=...)
power(power=..., operand=...)
=>power(exponent=..., stmt_block=...)
invert(operand=)
=>invert(stmt_block=...)
Deprecations
- SDK: The
@struct
decorator has been removed. Define classical structs
using@dataclass
. - The field
variance
inEstimationResult
is deprecated, and will be
populated with the value-1
until removed. - The field
timeout_sec
inExecutionPreferences
, and the field
job_timeout
inAwsBackendPreferences
, have been removed. - classical arguments in the native language are now inside the parentheses
section ((...)
) alongside quantum variables
and not inside the angle brackets (<...>
), the angle brackets section is
now considered deprecated.
For example, you should
migrate:qfunc <a: real> main{...}
->qfunc main(a: real) {...}
for info refer to the language reference about functions.
A Warning was added to the IDE in the case it is used.
Classiq 0.43.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically. Please note that you might need to clear your cache after the version update. See this guide for help.
Enhancements
- Support signed quantum numerics in in-place-xor assignments (
^=
). - Support quantum array subscripts in quantum expressions.
- Support quantum numeric arrays.
- Improve synthesis performance.
- Apply an automatic qubit reuse pass when the model is unconstrained.
- Add user-defined enums.
=== "Native"
```
qfunc main(output res: qbit) {
allocate<1>(res);
qnv: qnum<2, False, 0>[]; // quantum numeric array
allocate<6>(qnv);
repeat (i: qnv.len) { inplace_prepare_int<i + 1>(qnv[i]); }
res ^= qnv[0] + qnv[1] == qnv[2]; // array subscripts in expressions
}
```
=== "Python"
[comment]: DO_NOT_TEST
```python
@qfunc
def main(res: Output[QBit]) -> None:
allocate(1, res)
qnv: QArray = QArray("qnv", element_type=QNum[2, False, 0]) # quantum numeric array
allocate(6, qnv)
repeat(qnv.len, lambda i: inplace_prepare_int(i + 1, qnv[i]))
res ^= qnv[0] + qnv[1] == qnv[2] # array subscripts in expressions
```
Interface Changes
- The classical scope in Qmod no longer supports function definitions.
- The
aer_simulator
,aer_simulator_statevector
,aer_simulator_density_matrix
, andaer_simulator_matrix_product_state
Classiq backends are no longer accessible in the SDK. Usesimulator
,simulator_statevector
,simulator_density_matrix
, andsimulator_matrix_product_state
instead. - The
@struct
decorator is deprecated and will be removed in a future
release. Use@dataclass
instead.
Bug Fixes
- Fixed a bug where multiple in-place assignment statements resulted in a
22102
error. - Fixed a bug where using the same variable in
control
operation for both the control operation and the body resulted in a non-indicative error. - Fix
invert
andwithin-apply
variable initialization tracking in native
Qmod. - Fix division with classical symbolic variables.
- Fix rogue comma inserted to the chemistry model classical execution code
after IDE form update. - Fix reporting uninitialized quantum variables in arithmetic expressions as
undefined. - Fix double execution on devices requiring access tokens.
- Fix execution configuration being applied only to the first selected device, when one of the selected devices requires an access token.
- Fix a bug where Grover circuit was incorrect when reflecting about states different than uniform superposition.
- Fix a synthesis bug that could appear in models that constrain the width and optimize depth or vice versa.
IDE
- Graphical Model tab redesign of nodes (Function call, Output, Assignment).
- Restructure of node categories (Graphical Model).
- Fix countries list not loading sometimes during registration.
- Prevent QMOD editor from crashing when compiler crashes.
- Redesigned the Accordion and Icon status for jobs.
- Quantum Program tabs moved to the left drawer.
- Uploading Quantum Program can now be done using the Upload button on the left drawer.
- 3 newly introduced tabs of Quantum Program data: Transpiled Info, Program Info, Data.
Library Additions
- A new technology demonstration notebook, treating a discrete quantum walk on a circle,
was added to the library; see here. - New rainbow options pricing notebooks in the public repository research folder.
Classiq 0.42.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Bug Fixes
- Fixed an error related to the translation of certain circuits between synthesis and execution.
- Fixed an error when calling a function with local variables multiple times.
Enhancements
- HHL workshop was added to the public repository and to the User Guide.
- It is now possible to use the execution primitives
estimate
andvqe
with models
with multiple output ports. The hamiltonian should match all the output ports
by their order. - Amplitude encoding assignments (
ind *= foo(n)
) support all quantum numeric
variables, not only unsigned fractions. - Add support for lookup tables in amplitude encoding assignments, e.g.,
ind *= [0, 0.5, 0.5, 1][n]
wheren
is an unsigned quantum integer
(ind *= subscript([0, 0.5, 0.5, 1], n)
in the SDK). - A quantum COSINE and SINE transforms of types I and II were added to the open library,
see Quantum COSINE and SINE Transforms. - New algorithm was added to the library: "Variational Quantum Linear Solver (VQLS) with Linear Combination of Unitaries (LCU) Block Encoding"
Variational Quantum Linear Solver Alice & Bob
provider is now accessible.
Interface Changes
compute_qaoa_initial_point
is now exposed in the SDK directly fromclassiq
package.
from classiq import compute_qaoa_initial_point
- The examples in IDE Flow page are replaced with a new arithmetics example.
Bug Fixes
- Properly evaluate type attributes in
main
.- Native Qmod:
qnum
's sign field can be specified with lowercase
true
/false
inmain
's signature.
- Native Qmod:
- Fix execution results received from running on Amazon Braket to be correct
when the measured outputs are not all of the variables of the model. - Improve language error reporting.
IDE
- Uniform drawer width for all pages
- New way to trigger node options context menu on Graphical Model page: node options menu can now be triggered by right-clicking a selected node
Classiq 0.41.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Enhancement
-
Hardware-aware synthesis
will now use the Solovay-Kitaev algorithm to approximate
single-qubit gates when the basis gate set is a specific variation of
Clifford + T (X
,Z
,H
,T
,CX
, andCCX
). -
qsvt
function was added to the function library.
See Quantum Singular Value Transformation. -
A tutorial on discrete quantum walks was added to the tutorials library.
See Discrete Quantum Walk. -
SDK: Quantum functions (
@qfunc
) can be recursive. -
SDK: PauliTerm can be used to declare a hamiltonian.
[comment]: DO_NOT_TESThamiltonian = [ PauliTerm(pauli=[Pauli.I], coefficient=1), PauliTerm(pauli=[Pauli.Z, Pauli.X], coefficient=2), ]
-
Introducing ExecutionSession which will allow choosing the execution
primitive in the SDK
without the need of changing/synthesizing the quantum program once again.
[comment]: DO_NOT_TESTmodel = create_model(main) qprog = synthesize(model) preferences = ExecutionPreferences(num_shots=1200) execution_session = ExecutionSession(qprog, preferences) # if the quantum program does not need any execution paramters: execution_session.sample() # if the quantum program needs execution parameters: execution_session.sample({"phi": 1}) # if multiple samples are needed: execution_session.batch_sample([{"phi": 1}, {"phi": 2}, {"phi": 3}]) # if an estimation is needed without execution parameters: hamiltonian = [ PauliTerm(pauli=[Pauli.I], coefficient=1), PauliTerm(pauli=[Pauli.Z], coefficient=2), ] execution_parameters.estimate(hamiltonian) # if an estimation is needed with execution paramters: execution_parameters.estimate(hamiltonian, {"theta": 1}) # if multiple estimations are needed: execution_parameters.batch_estimate(hamiltonian, [{"theta": 1}, {"theta": 2}])
-
A Qmod library reference, with usage examples for built-in and open library functions, can now be found in
Qmod Library Reference.
Interface Changes
- SDK: In
execute_qnn
, the optional argumentobservables
of typePauliOperators
has been replaced with the optional argumentobservable
of typePauliOperator
. - Documentation: The structure and content have the classiq documentation have been changed signficantly with the following new structure:
The old User Guide
chapter from the previous documentation can be found in the new Reference Manual.
Deprecations
- SDK: The
quantum_if
operation and the oldcontrol
syntax have been
removed.
quantum_if
is removed. Usecontrol
instead.control(operand, ctrl)
is no longer supported. Use
control(ctrl, operand)
instead.control(n, operand)
does not support quantum numeric variables (n
).
Instead, use abind
operation to castn
into a quantum array, or
comparen
to an integer explicitly (e.g.,n == 7
).
- SDK: The
QParam
type has been removed.
- Instead of
QParam[int]
, useCInt
. - Instead of
QParam[float]
, useCReal
. - Instead of
QParam[bool]
, useCBool
. - Instead of
QParam[List[...]]
, useCArray[...]
. - Instead of
QParam[Array[..., size]]
, useCArray[..., size]
.
-
Native Qmod: Accessing quantum variable properties (e.g.,
qbv.len
or
n.is_signed
) via function call syntax (len(qbv)
,is_signed(qbv)
) is no
longer supported. -
The field
optimizer_preferences
ofExecutionPreferences
has been removed. -
The function
set_initial_values
has been removed.
IDE
-
"Slack" and "Learn More" links were moved from the side drawer to the IDE
header. New links were added as well: Community, User Guide. -
Allow visualization of larger circuits and prolong the timeout for
visualization -
Users can now download a LaTeX format of their quantum programs directly from
the IDE, allowing for easy sharing, publication, and presentation of their
work. -
Cookies settings are now available to adjust the given consent at any time.
Bug fixes
- "selected example not found" error when opening the IDE
- Resetting now clears preferences form instead of initializing from cache on
the model page - Naming for exported files on the Graphical Editor
- State vector measurement results ordering
- Parameter names in lambda expressions don't have to match the
parameter names in operand declarations:
=== "Native"
```
qfunc my_H(qb: qbit) {
H(qb);
}
...
apply_to_all<my_H>(qba); // used to throw an error since "qb" != "target"
```
=== "Python"
[comment]: DO_NOT_TEST
```python
@qfunc
def my_H(qb: QBit) -> None:
H(qb)
...
apply_to_all(my_H, qba) # used to throw an error since "qb" != "target"
```
Classiq 0.40.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Interface Changes
- The
control
andquantum_if
statements have been unified into one
statement in native QMOD and the SDK under the namecontrol
.- SDK: The unified
control
statement accepts a qbit (q
), a q-array
(qbv
), or a comparison of a qnum and an integer (n == 5
) as the
first argument. - SDK: The old
control
syntax (withctrl
as the second argument) is
deprecated and will be removed in the next release. - SDK: The
quantum_if
operator is deprecated and will be removed in the
next release. - Native QMOD:
quantum_if
is no longer supported, use the newcontrol
statement instead.
- SDK: The unified
- SDK: The
QParam
andArray
types are deprecated and will be
removed in the next release.- Instead of
QParam[int]
, useCInt
. - Instead of
QParam[float]
, useCReal
. - Instead of
QParam[bool]
, useCBool
. - Instead of
QParam[List[...]]
, useCArray[...]
. - Instead of
QParam[Array[..., size]]
, useCArray[..., size]
.
- Instead of
- SDK: Using Python types (
int
,bool
, etc.) in struct declarations
(@struct
) is deprecated and will not be supported by the next release.
Instead, use classical data types (CInt
,CBool
, etc., see above). - Default timeout for sending jobs to AWS changed from 5 minutes to 4 hours.
Deprecations
- The error mitigation settings in the execution preferences are no longer
available. - The
aer_simulator
backend has been removed. Use Classiq's simulator backend
instead (ClassiqSimulatorBackendNames.SIMULATOR
).
Enhancements
- Improved error messages.
Bug fixes
- Fixed a bug preventing execution of circuits synthesized with hardware aware synthesis on Azure and IonQ.
Classiq 0.39.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Enhancements
- Improved the native QMOD syntax of the
repeat
,if
statements.
For details, see Classical Control Flow. - Improved the native QMOD syntax of the
control
,power
, andinvert
statements.
For details, see Quantum Operators. - Added the
classiq.execution.all_hardware_devices.get_all_hardware_devices
function to the Python SDK.
Deprecations
- In the SDK, the
classiq.analyzer.analyzer.Analyzer.get_available_devices
method is
deprecated. Useclassiq.execution.all_hardware_devices.get_all_hardware_devices
instead.
Interface Changes
- The
len
method forQArray
,QCallableList
, andQParam
of lists, is now a property.
use.len
instead of.len()
.
Classiq 0.38.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Overview
Release 0.38 achieves a major milestone in the migration to the new QMOD language. The following general changes are now in effect:
- In the IDE, Synthesis page is now removed. Writing and synthesizing models is now done exclusively in the Model page.
- All pre-defined models previously available in the Synthesis page in Json format are now available in the Model page in native QMOD syntax.
- Many QMOD language enhancements were introduced to enable the coding of all available models and applications, in both native QMOD and in its Python embedding (see detailed list below).
- A new QMOD reference manual, covering all the language concepts and constructs in both input formats, is available QMOD-language-reference.
- Documentation content covering old input formats - the Json input and the old SDK classes - has been removed
Language and SDK Enhancements
- Native QMOD now supports classical POD struct declaration, initialization, and member access.
- Native QMOD now supports within-apply statements.
- Native QMOD now supports generalized in-place quantum assignment.
- Add method
parsed_counts_of_outputs
to sample's result in the Python SDK, see
sample. - Constants can now be used in the
qmod
-python integration with theQConstant
class. - Native QMOD now supports global constants.
- The quantum numeric type can now receive sign and fraction digits as type arguments in parameter declarations, in both the SDK and native QMOD.
- Native QMOD example:
qnum<5, True, 2>
to indicate a 5-bit signed number with 2 fraction digits. - SDK examples:
QNum[5, True, 2]
to indicate a 5-bit signed number with 2 fraction digits (as a function argument)QNum("x", 5, True, 2)
to indicate a 5-bit signed number with 2 fraction digits (as a local variable)
- Native QMOD example:
- The amplitude encoding flavor of quantum arithmetic (
*=
operator) is now an in-place operation in both the SDK and native QMOD.
Interface Changes
- The
QStruct
decorator was renamed tostruct
in theqmod
-python integration. - The
qfunc
decorator is renamed toquantum_function
. The newerQFunc
andExternalQFunc
decorator are now available asqfunc
andqfunc(external=True)
. Using either classes as a decorator is deprecated, and this feature may be removed in a future release. - Similarly, a new
cfunc
decorator is now available, and using the classCFunc
as a decorator is deprecated and may be removed in the future. - Renamed
GeneratedCircuit
toQuantumProgram
in the SDK. - The
QNum
type does not accept size argument without sign and fraction digits. QNum
on the right-hand side ofbind
statements must have sign and fraction digits (inferred from initialization or declaration).- The Following async methods were removed from
Analyzer
class (The documented methods without theasync
suffix are still available and can be used instead):get_available_devices_async
analyzer_app_async
plot_hardware_connectivity_async
get_hardware_comparison_table_async
- The method
show_multiple_hardware_data
was removed fromRBAnalysis
class. The async equivalentshow_multiple_hardware_data_async
can be used instead. - Removed
reinterpret_num
operation (instead useQNum
/allocate_num
arguments). - Removed
split
andjoin
operation (instead usebind
operation).
Classiq 0.30.0
Upgrade Instructions
- Python SDK
- The IDE upgrades automatically.
Enhancement
- The
SuzukiTrotter
function now accepts parameters as coefficients for itspauli_list
. - The
SuzukiTrotter
function now has adisable_scheduling
option to disable the reordering of Pauli terms. - There is a new
QDrift
Hamiltonian evolution function.
Interface Changes
- Add the Classiq Provider as an execution backend preference. It contains the AER backends, that used to be inside IBMBackendPreferences, as well as the Nvidia simulator, which used to be in NvidiaBackendPreferences. See
Classiq Provider - Deprecate the NvidiaBackendPreferences.
- Python SDK: Change annotations of input and output
QVar
types -InputQVar[...]
is now writtenInput[QVar[...]]
, and likewise forOutput
.