Circuit

Quantum circuit is expressed as Circuit. This holds an array of instances of Gate or ParamGate to be applied.

Note

In this section, we regard Circuit as an array of Gate instances. To learn about ParamGate, see Using parametric gates and circuits.

Unlike Qulacs, you cannot insert Gate in the middle of Circuit or remove Gate from Circuit. These operations make user do complicated index-management.

Create Circuit

Circuit is created without arguments.

from scaluq.default.f64 import Circuit

nqubits = 2
circuit = Circuit()
print(circuit.to_json())
{"gate_list":[]}

Add Gate to Circuit

You can add Gate to Circuit by add_gate. Gate to be added is shallow-copied. Since all the Gates in Scaluq are immutable, this is always safe!

from scaluq.default.f64 import Circuit
from scaluq.default.f64.gate import H, X

nqubits = 2
circuit = Circuit()
circuit.add_gate(H(0))
circuit.add_gate(X(1, controls=[0]))

Apply Circuit to StateVector

You can run Circuit by applying update_quantum_state to StateVector.

from scaluq.default.f64 import Circuit, StateVector
from scaluq.default.f64.gate import H, X

nqubits = 2
circuit = Circuit()
circuit.add_gate(H(0))
circuit.add_gate(X(1, controls=[0]))

state = StateVector(nqubits)
circuit.update_quantum_state(state)
print(state.get_amplitudes())
[(0.7071067811865476+0j), 0j, 0j, (0.7071067811865476+0j)]

Get properties of Circuit

You can get some properties of Circuit.

from scaluq.default.f64 import Circuit
from scaluq.default.f64.gate import H, X

nqubits = 2
circuit = Circuit()
circuit.add_gate(H(0))
circuit.add_gate(X(1))
circuit.add_gate(X(1, controls=[0]))

print(circuit.gate_list()) # [H, X, CX]
print(circuit.n_gates()) # 3
print(circuit.calculate_depth()) # 2