Quantanium¶
On this page you can find all the information to install and use the local statevector simulator Quantanium
Install quantanium¶
the local statevector quantanium is an optional dependency of mimiqcircuits. It can be installed with pip:
pip3 install mimiqcircuits[quantanium]
Basic usage¶
Quantanium can be used to execute a circuit.
It must be instantiated before calling the method execute.
Execute will always start from the initial state |0…0>.
>>> from quantanium import *
>>> from mimiqcircuits import *
>>> circuit = Circuit()
>>> circuit.push(GateH(), 0)
1-qubit circuit with 1 instructions:
└── H @ q[0]
>>> sim = Quantanium()
>>> sim.execute(circuit)
QCSResults:
├── simulator: Quantanium StateVector 1.0
├── timings:
│ ├── sample time: 0.000122642s
│ └── apply time: 4.3511e-05s
├── fidelity estimate: 1
├── average multi-qubit gate error estimate: 0
├── most sampled:
│ ├── bs"1" => 527
│ └── bs"0" => 473
├── 1 executions
├── 0 amplitudes
└── 1000 samples
execute returns a QCSResult object.
Execute options¶
The execute method of Quantanium supports a subset of the options available on MIMIQ remote.
Here is an example of all the options available:
>>> circuit = Circuit()
>>> circuit.push(GateH(), 0)
1-qubit circuit with 1 instructions:
└── H @ q[0]
>>> sim = Quantanium()
>>> sim.execute(circuit, nsamples=15, seed=123)
QCSResults:
├── simulator: Quantanium StateVector 1.0
├── timings:
│ ├── sample time: 2.863e-06s
│ └── apply time: 1.8508e-05s
├── fidelity estimate: 1
├── average multi-qubit gate error estimate: 0
├── most sampled:
│ ├── bs"1" => 10
│ └── bs"0" => 5
├── 1 executions
├── 0 amplitudes
└── 15 samples
Get Statevector¶
After running a simulation with execute or evolve you can extract the statevector using the get_statevector method.
Users can not modify the state directly.
>>> circuit = Circuit()
>>> circuit.push(GateH(), 0)
1-qubit circuit with 1 instructions:
└── H @ q[0]
>>> sim = Quantanium()
>>> sim.execute(circuit, seed=123)
QCSResults:
├── simulator: Quantanium StateVector 1.0
├── timings:
│ ├── sample time: 7.9968e-05s
│ └── apply time: 1.6692e-05s
├── fidelity estimate: 1
├── average multi-qubit gate error estimate: 0
├── most sampled:
│ ├── bs"0" => 509
│ └── bs"1" => 491
├── 1 executions
├── 0 amplitudes
└── 1000 samples
>>> sim.get_statevector()
[(0.7071067811865475+0j), (0.7071067811865475+0j)]
Evolve Statevector¶
The state can also be evolved without restarting from the initial state everytime by using the method evolve:
>>> circuit = Circuit()
>>> circuit.push(GateH(), 0)
1-qubit circuit with 1 instructions:
└── H @ q[0]
>>> sim = Quantanium()
>>> sim.evolve(circuit)
>>> sim.evolve(circuit) # apply the circuit again
>>> sim.get_statevector()
[(0.9999999999999998+0j), (2.2371143170757382e-17+0j)]
Parse QASM¶
The local statevector simulator comes with its own OpenQASM 2 parser
it can be used with execute:
>>> qasm = """
... // Implementation of Deutsch algorithm with two qubits for f(x)=x
... // taken from https://github.com/pnnl/QASMBench/blob/master/small/deutsch_n2/deutsch_n2.qasm
... OPENQASM 2.0;
... include "qelib1.inc";
... qreg q[2];
... creg c[2];
... x q[1];
... h q[0];
... h q[1];
... cx q[0],q[1];
... h q[0];
... measure q[0] -> c[0];
... measure q[1] -> c[1];
... """
# Write the OPENQASM as a file
>>> with open("/tmp/deutsch_n2.qasm", "w") as file:
... file.write(qasm)
308
>>> sim = Quantanium()
>>> sim.execute("/tmp/deutsch_n2.qasm")
QCSResults:
├── simulator: Quantanium StateVector 1.0
├── timings:
│ ├── sample time: 9.8686e-05s
│ └── apply time: 3.7855e-05s
├── fidelity estimate: 1
├── average multi-qubit gate error estimate: 0
├── most sampled:
│ ├── bs"11" => 527
│ └── bs"10" => 473
├── 1 executions
├── 0 amplitudes
├── 0 amplitudes
└── 1000 samples