Crates.io | qdk_sim_rs |
lib.rs | qdk_sim_rs |
version | 0.28.291394 |
source | src |
created_at | 2022-06-07 03:48:19.996754 |
updated_at | 2023-07-31 16:51:13.153071 |
description | Rust-based simulators for use with the Quantum Development Kit. |
homepage | https://github.com/microsoft/qsharp-runtime |
repository | https://github.com/microsoft/qsharp-runtime |
max_upload_size | |
id | 601224 |
size | 294,571 |
ⓘ TIP
This crate provides low-level APIs for interacting with the Rust-base simulators included in the Quantum Development Kit. If you're interested in using these simulators to run your Q# programs, please see the installation instructions at https://github.com/microsoft/qsharp-runtime/blob/main/documentation/preview-simulators.md.
This crate implements simulation functionality for the Quantum Development Kit, including:
The [c_api
] module allows for using the simulation functionality in this crate from C, or from other languages with a C FFI (e.g.: C++ or C#), while Rust callers can take advantage of the structs and methods in this crate directly.
Similarly, the [python
] module allows exposing data structures in this crate to Python programs.
This crate provides several different data structures for representing quantum systems in a variety of different conventions:
State
]: Represents stabilizer, pure, or mixed states of a register of qubits.Process
]: Represents processes that map states to states.Instrument
]: Represents quantum instruments, the most general form of measurement.Noise models can be serialized to JSON for interoperability across languages. In particular, each noise model is represented by a JSON object with properties for each operation, for the initial state, and for the instrument used to implement $Z$-basis measurement.
For example:
{
"initial_state": {
"n_qubits": 1,
"data": {
"Mixed": {
"v": 1, "dim":[2 ,2],
"data": [[1.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
}
}
},
"i": {
"n_qubits": 1,
"data": {
"Unitary": {
"v": 1,"dim": [2, 2],
"data": [[1.0, 0.0], [0.0, 0.0], [0.0, 0.0], [1.0, 0.0]]
}
}
},
...
"z_meas": {
"Effects": [
{
"n_qubits": 1,
"data": {
"KrausDecomposition": {
"v":1, "dim": [1, 2, 2],
"data": [[1.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
}
}
},
{
"n_qubits": 1,
"data": {
"KrausDecomposition": {
"v": 1,"dim": [1, 2, 2],
"data":[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [1.0, 0.0]]
}
}
}
]
}
}
The value of the initial_state
property is a serialized [State
], the value of each operation property (i.e.: i
, x
, y
, z
, h
, s
, s_adj
, t
, t_adj
, and cnot
) is a serialized [Process
], and the value of z_meas
is a serialized [Instrument
].
Throughout noise model serialization, JSON objects representing $n$-dimensional arrays of complex numbers are used to store various vectors, matrices, and tensors. Such arrays are serialized as JSON objects with three properties:
v
: The version number of the JSON schema; must be "1"
.dims
: A list of the dimensions of the array being represented.data
: A list of the elements of the flattened array, each of which is represented as a list with two entries representing the real and complex parts of each element.For example, consider the serialization of the ideal y
operation:
"y": {
"n_qubits": 1,
"data": {
"Unitary": {
"v": 1, "dim": [2, 2],
"data": [[0.0, 0.0], [0.0, 1.0], [0.0, -1.0], [0.0, 0.0]]
}
}
}
Each state and process is represented in JSON by an object with two properties, n_qubits
and data
. The value of data
is itself a JSON object with one property indicating which variant of the [StateData
] or [ProcessData
] enum is used to represent that state or process, respectively.
For example, the following JSON object represents the mixed state $\ket{0}\bra{0}$:
{
"n_qubits": 1,
"data": {
"Mixed": {
"v": 1, "dim":[2 ,2],
"data": [[1.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
}
}
}
TODO
Instrument
] struct, only through underlying [Tableau
].