tensorcircuit.circuit#
Quantum circuit: the state simulator
- class tensorcircuit.circuit.Circuit(nqubits: int, inputs: Optional[Any] = None, mps_inputs: Optional[tensorcircuit.quantum.QuOperator] = None, split: Optional[Dict[str, Any]] = None)[source]#
Bases:
tensorcircuit.basecircuit.BaseCircuit
Circuit
class. Simple usage demo below.c = tc.Circuit(3) c.H(1) c.CNOT(0, 1) c.RX(2, theta=tc.num_to_tensor(1.)) c.expectation([tc.gates.z(), (2, )]) # 0.54
- ANY(*index: int, **vars: Any) None #
Apply ANY gate with parameters on the circuit. See
tensorcircuit.gates.any_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CNOT(*index: int, **kws: Any) None #
Apply CNOT gate on the circuit. See
tensorcircuit.gates.cnot_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- CPHASE(*index: int, **vars: Any) None #
Apply CPHASE gate with parameters on the circuit. See
tensorcircuit.gates.cphase_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CR(*index: int, **vars: Any) None #
Apply CR gate with parameters on the circuit. See
tensorcircuit.gates.cr_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CRX(*index: int, **vars: Any) None #
Apply CRX gate with parameters on the circuit. See
tensorcircuit.gates.crx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CRY(*index: int, **vars: Any) None #
Apply CRY gate with parameters on the circuit. See
tensorcircuit.gates.cry_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CRZ(*index: int, **vars: Any) None #
Apply CRZ gate with parameters on the circuit. See
tensorcircuit.gates.crz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CU(*index: int, **vars: Any) None #
Apply CU gate with parameters on the circuit. See
tensorcircuit.gates.cu_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- CY(*index: int, **kws: Any) None #
Apply CY gate on the circuit. See
tensorcircuit.gates.cy_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.-1.j\\ 0.+0.j & 0.+0.j & 0.+1.j & 0.+0.j \end{bmatrix}\end{split}\]
- CZ(*index: int, **kws: Any) None #
Apply CZ gate on the circuit. See
tensorcircuit.gates.cz_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & -1.+0.j \end{bmatrix}\end{split}\]
- EXP(*index: int, **vars: Any) None #
Apply EXP gate with parameters on the circuit. See
tensorcircuit.gates.exp_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- EXP1(*index: int, **vars: Any) None #
Apply EXP1 gate with parameters on the circuit. See
tensorcircuit.gates.exp1_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- FREDKIN(*index: int, **kws: Any) None #
Apply FREDKIN gate on the circuit. See
tensorcircuit.gates.fredkin_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- H(*index: int, **kws: Any) None #
Apply H gate on the circuit. See
tensorcircuit.gates.h_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.70710677+0.j & 0.70710677+0.j\\ 0.70710677+0.j & -0.70710677+0.j \end{bmatrix}\end{split}\]
- I(*index: int, **kws: Any) None #
Apply I gate on the circuit. See
tensorcircuit.gates.i_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- ISWAP(*index: int, **vars: Any) None #
Apply ISWAP gate with parameters on the circuit. See
tensorcircuit.gates.iswap_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- MPO(*index: int, **vars: Any) None #
Apply mpo gate in MPO format on the circuit. See
tensorcircuit.gates.mpo_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- MULTICONTROL(*index: int, **vars: Any) None #
Apply multicontrol gate in MPO format on the circuit. See
tensorcircuit.gates.multicontrol_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ORX(*index: int, **vars: Any) None #
Apply ORX gate with parameters on the circuit. See
tensorcircuit.gates.orx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ORY(*index: int, **vars: Any) None #
Apply ORY gate with parameters on the circuit. See
tensorcircuit.gates.ory_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ORZ(*index: int, **vars: Any) None #
Apply ORZ gate with parameters on the circuit. See
tensorcircuit.gates.orz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- OX(*index: int, **kws: Any) None #
Apply OX gate on the circuit. See
tensorcircuit.gates.ox_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- OY(*index: int, **kws: Any) None #
Apply OY gate on the circuit. See
tensorcircuit.gates.oy_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 0.-1.j & 0.+0.j & 0.+0.j\\ 0.+1.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- OZ(*index: int, **kws: Any) None #
Apply OZ gate on the circuit. See
tensorcircuit.gates.oz_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & -1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- PHASE(*index: int, **vars: Any) None #
Apply PHASE gate with parameters on the circuit. See
tensorcircuit.gates.phase_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- R(*index: int, **vars: Any) None #
Apply R gate with parameters on the circuit. See
tensorcircuit.gates.r_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RX(*index: int, **vars: Any) None #
Apply RX gate with parameters on the circuit. See
tensorcircuit.gates.rx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RXX(*index: int, **vars: Any) None #
Apply RXX gate with parameters on the circuit. See
tensorcircuit.gates.rxx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RY(*index: int, **vars: Any) None #
Apply RY gate with parameters on the circuit. See
tensorcircuit.gates.ry_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RYY(*index: int, **vars: Any) None #
Apply RYY gate with parameters on the circuit. See
tensorcircuit.gates.ryy_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RZ(*index: int, **vars: Any) None #
Apply RZ gate with parameters on the circuit. See
tensorcircuit.gates.rz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- RZZ(*index: int, **vars: Any) None #
Apply RZZ gate with parameters on the circuit. See
tensorcircuit.gates.rzz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- S(*index: int, **kws: Any) None #
Apply S gate on the circuit. See
tensorcircuit.gates.s_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+1.j \end{bmatrix}\end{split}\]
- SD(*index: int, **kws: Any) None #
Apply SD gate on the circuit. See
tensorcircuit.gates.sd_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 0.-1.j \end{bmatrix}\end{split}\]
- SWAP(*index: int, **kws: Any) None #
Apply SWAP gate on the circuit. See
tensorcircuit.gates.swap_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- T(*index: int, **kws: Any) None #
Apply T gate on the circuit. See
tensorcircuit.gates.t_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1. & +0.j & 0. & +0.j\\ 0. & +0.j & 0.70710677+0.70710677j \end{bmatrix}\end{split}\]
- TD(*index: int, **kws: Any) None #
Apply TD gate on the circuit. See
tensorcircuit.gates.td_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1. & +0.j & 0. & +0.j\\ 0. & +0.j & 0.70710677-0.70710677j \end{bmatrix}\end{split}\]
- TOFFOLI(*index: int, **kws: Any) None #
Apply TOFFOLI gate on the circuit. See
tensorcircuit.gates.toffoli_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- U(*index: int, **vars: Any) None #
Apply U gate with parameters on the circuit. See
tensorcircuit.gates.u_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- WROOT(*index: int, **kws: Any) None #
Apply WROOT gate on the circuit. See
tensorcircuit.gates.wroot_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.70710677+0.j & -0.5 & -0.5j\\ 0.5 & -0.5j & 0.70710677+0.j \end{bmatrix}\end{split}\]
- X(*index: int, **kws: Any) None #
Apply X gate on the circuit. See
tensorcircuit.gates.x_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 1.+0.j\\ 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- Y(*index: int, **kws: Any) None #
Apply Y gate on the circuit. See
tensorcircuit.gates.y_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 0.-1.j\\ 0.+1.j & 0.+0.j \end{bmatrix}\end{split}\]
- Z(*index: int, **kws: Any) None #
Apply Z gate on the circuit. See
tensorcircuit.gates.z_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & -1.+0.j \end{bmatrix}\end{split}\]
- __init__(nqubits: int, inputs: Optional[Any] = None, mps_inputs: Optional[tensorcircuit.quantum.QuOperator] = None, split: Optional[Dict[str, Any]] = None) None [source]#
Circuit object based on state simulator.
- Parameters
nqubits (int) β The number of qubits in the circuit.
inputs (Optional[Tensor], optional) β If not None, the initial state of the circuit is taken as
inputs
instead of \(\vert 0\rangle^n\) qubits, defaults to None.mps_inputs (Optional[QuOperator]) β QuVector for a MPS like initial wavefunction.
split (Optional[Dict[str, Any]]) β dict if two qubit gate is ready for split, including parameters for at least one of
max_singular_values
andmax_truncation_err
.
- static all_zero_nodes(n: int, d: int = 2, prefix: str = 'qb-') List[tensornetwork.network_components.Node] #
- amplitude(l: Union[str, Any]) Any #
Returns the amplitude of the circuit given the bitstring l. For state simulator, it computes \(\langle l\vert \psi\rangle\), for density matrix simulator, it computes \(Tr(\rho \vert l\rangle \langle 1\vert)\) Note how these two are different up to a square operation.
- Example
>>> c = tc.Circuit(2) >>> c.X(0) >>> c.amplitude("10") array(1.+0.j, dtype=complex64) >>> c.CNOT(0, 1) >>> c.amplitude("11") array(1.+0.j, dtype=complex64)
- Parameters
l (Union[str, Tensor]) β The bitstring of 0 and 1s.
- Returns
The amplitude of the circuit.
- Return type
tn.Node.tensor
- amplitudedamping(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply amplitudedamping quantum channel on the circuit. See
tensorcircuit.channels.amplitudedampingchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- any(*index: int, **vars: Any) None #
Apply ANY gate with parameters on the circuit. See
tensorcircuit.gates.any_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- append(c: tensorcircuit.abstractcircuit.AbstractCircuit, indices: Optional[List[int]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
append circuit
c
before- Example
>>> c1 = tc.Circuit(2) >>> c1.H(0) >>> c1.H(1) >>> c2 = tc.Circuit(2) >>> c2.cnot(0, 1) >>> c1.append(c2) <tensorcircuit.circuit.Circuit object at 0x7f8402968970> >>> c1.draw() βββββ q_0:β€ H ββββ ββ βββββ€βββ΄ββ q_1:β€ H ββ€ X β ββββββββββ
- Parameters
c (BaseCircuit) β The other circuit to be appended
indices (Optional[List[int]], optional) β the qubit indices to which
c
is appended on. Defaults to None, which means plain concatenation.
- Returns
The composed circuit
- Return type
- append_from_qir(qir: List[Dict[str, Any]]) None #
Apply the ciurict in form of quantum intermediate representation after the current cirucit.
- Example
>>> c = tc.Circuit(3) >>> c.H(0) >>> c.to_qir() [{'gatef': h, 'gate': Gate(...), 'index': (0,), 'name': 'h', 'split': None, 'mpo': False}] >>> c2 = tc.Circuit(3) >>> c2.CNOT(0, 1) >>> c2.to_qir() [{'gatef': cnot, 'gate': Gate(...), 'index': (0, 1), 'name': 'cnot', 'split': None, 'mpo': False}] >>> c.append_from_qir(c2.to_qir()) >>> c.to_qir() [{'gatef': h, 'gate': Gate(...), 'index': (0,), 'name': 'h', 'split': None, 'mpo': False}, {'gatef': cnot, 'gate': Gate(...), 'index': (0, 1), 'name': 'cnot', 'split': None, 'mpo': False}]
- Parameters
qir (List[Dict[str, Any]]) β The quantum intermediate representation.
- apply(gate: Union[tensorcircuit.gates.Gate, tensorcircuit.quantum.QuOperator], *index: int, name: Optional[str] = None, split: Optional[Dict[str, Any]] = None, mpo: bool = False, ir_dict: Optional[Dict[str, Any]] = None) None #
An implementation of this method should also append gate directionary to self._qir
- apply_general_gate(gate: Union[tensorcircuit.gates.Gate, tensorcircuit.quantum.QuOperator], *index: int, name: Optional[str] = None, split: Optional[Dict[str, Any]] = None, mpo: bool = False, ir_dict: Optional[Dict[str, Any]] = None) None #
An implementation of this method should also append gate directionary to self._qir
- static apply_general_gate_delayed(gatef: Callable[[], tensorcircuit.gates.Gate], name: Optional[str] = None, mpo: bool = False) Callable[[...], None] #
- apply_general_kraus(kraus: Sequence[tensorcircuit.gates.Gate], *index: int, status: Optional[float] = None, with_prob: bool = False, name: Optional[str] = None) Any #
Monte Carlo trajectory simulation of general Kraus channel whose Kraus operators cannot be amplified to unitary operators. For unitary operators composed Kraus channel,
unitary_kraus()
is much faster.This function is jittable in theory. But only jax+GPU combination is recommended for jit since the graph building time is too long for other backend options; though the running time of the function is very fast for every case.
- Parameters
kraus (Sequence[Gate]) β A list of
tn.Node
for Kraus operators.index (int) β The qubits index that Kraus channel is applied on.
status (Optional[float], optional) β Random tensor uniformly between 0 or 1, defaults to be None, when the random number will be generated automatically
- static apply_general_kraus_delayed(krausf: Callable[[...], Sequence[tensorcircuit.gates.Gate]], is_unitary: bool = False) Callable[[...], None] [source]#
- static apply_general_variable_gate_delayed(gatef: Callable[[...], tensorcircuit.gates.Gate], name: Optional[str] = None, mpo: bool = False) Callable[[...], None] #
- barrier_instruction(*index: List[int]) None #
add a barrier instruction flag, no effect on numerical simulation
- Parameters
index (List[int]) β the corresponding qubits
- ccnot(*index: int, **kws: Any) None #
Apply TOFFOLI gate on the circuit. See
tensorcircuit.gates.toffoli_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- ccx(*index: int, **kws: Any) None #
Apply TOFFOLI gate on the circuit. See
tensorcircuit.gates.toffoli_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- circuit_param: Dict[str, Any]#
- cnot(*index: int, **kws: Any) None #
Apply CNOT gate on the circuit. See
tensorcircuit.gates.cnot_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- static coloring_copied_nodes(nodes: Sequence[tensornetwork.network_components.Node], nodes0: Sequence[tensornetwork.network_components.Node], is_dagger: bool = True, flag: str = 'inputs') None #
- static coloring_nodes(nodes: Sequence[tensornetwork.network_components.Node], is_dagger: bool = False, flag: str = 'inputs') None #
- cond_measure(index: int, status: Optional[float] = None) Any #
Measurement on z basis at
index
qubit based on quantum amplitude (not post-selection). The highlight is that this method can return the measured result as a int Tensor and thus maintained a jittable pipeline.- Example
>>> c = tc.Circuit(2) >>> c.H(0) >>> r = c.cond_measurement(0) >>> c.conditional_gate(r, [tc.gates.i(), tc.gates.x()], 1) >>> c.expectation([tc.gates.z(), [0]]), c.expectation([tc.gates.z(), [1]]) # two possible outputs: (1, 1) or (-1, -1)
Note
In terms of
DMCircuit
, this method returns nothing and the density matrix after this method is kept in mixed state without knowing the measuremet resuslts- Parameters
index (int) β the qubit for the z-basis measurement
- Returns
0 or 1 for z measurement on up and down freedom
- Return type
Tensor
- cond_measurement(index: int, status: Optional[float] = None) Any #
Measurement on z basis at
index
qubit based on quantum amplitude (not post-selection). The highlight is that this method can return the measured result as a int Tensor and thus maintained a jittable pipeline.- Example
>>> c = tc.Circuit(2) >>> c.H(0) >>> r = c.cond_measurement(0) >>> c.conditional_gate(r, [tc.gates.i(), tc.gates.x()], 1) >>> c.expectation([tc.gates.z(), [0]]), c.expectation([tc.gates.z(), [1]]) # two possible outputs: (1, 1) or (-1, -1)
Note
In terms of
DMCircuit
, this method returns nothing and the density matrix after this method is kept in mixed state without knowing the measuremet resuslts- Parameters
index (int) β the qubit for the z-basis measurement
- Returns
0 or 1 for z measurement on up and down freedom
- Return type
Tensor
- conditional_gate(which: Any, kraus: Sequence[tensorcircuit.gates.Gate], *index: int) None #
Apply
which
-th gate fromkraus
list, i.e. apply kraus[which]- Parameters
which (Tensor) β Tensor of shape [] and dtype int
kraus (Sequence[Gate]) β A list of gate in the form of
tc.gate
or Tensorindex (int) β the qubit lines the gate applied on
- static copy_nodes(nodes: Sequence[tensornetwork.network_components.Node], dangling: Optional[Sequence[tensornetwork.network_components.Edge]] = None, conj: Optional[bool] = False) Tuple[List[tensornetwork.network_components.Node], List[tensornetwork.network_components.Edge]] #
copy all nodes and dangling edges correspondingly
- Returns
- cphase(*index: int, **vars: Any) None #
Apply CPHASE gate with parameters on the circuit. See
tensorcircuit.gates.cphase_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- cr(*index: int, **vars: Any) None #
Apply CR gate with parameters on the circuit. See
tensorcircuit.gates.cr_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- crx(*index: int, **vars: Any) None #
Apply CRX gate with parameters on the circuit. See
tensorcircuit.gates.crx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- cry(*index: int, **vars: Any) None #
Apply CRY gate with parameters on the circuit. See
tensorcircuit.gates.cry_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- crz(*index: int, **vars: Any) None #
Apply CRZ gate with parameters on the circuit. See
tensorcircuit.gates.crz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- cswap(*index: int, **kws: Any) None #
Apply FREDKIN gate on the circuit. See
tensorcircuit.gates.fredkin_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- cu(*index: int, **vars: Any) None #
Apply CU gate with parameters on the circuit. See
tensorcircuit.gates.cu_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- cx(*index: int, **kws: Any) None #
Apply CNOT gate on the circuit. See
tensorcircuit.gates.cnot_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- cy(*index: int, **kws: Any) None #
Apply CY gate on the circuit. See
tensorcircuit.gates.cy_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.-1.j\\ 0.+0.j & 0.+0.j & 0.+1.j & 0.+0.j \end{bmatrix}\end{split}\]
- cz(*index: int, **kws: Any) None #
Apply CZ gate on the circuit. See
tensorcircuit.gates.cz_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & -1.+0.j \end{bmatrix}\end{split}\]
- depolarizing(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply depolarizing quantum channel on the circuit. See
tensorcircuit.channels.depolarizingchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- depolarizing2(index: int, *, px: float, py: float, pz: float, status: Optional[float] = None) float [source]#
- depolarizing_reference(index: int, *, px: float, py: float, pz: float, status: Optional[float] = None) Any [source]#
Apply depolarizing channel in a Monte Carlo way, i.e. for each call of this method, one of gates from X, Y, Z, I are applied on the circuit based on the probability indicated by
px
,py
,pz
.- Parameters
index (int) β The qubit that depolarizing channel is on
px (float) β probability for X noise
py (float) β probability for Y noise
pz (float) β probability for Z noise
status (Optional[float], optional) β random seed uniformly from 0 to 1, defaults to None (generated implicitly)
- Returns
int Tensor, the element lookup: [0: x, 1: y, 2: z, 3: I]
- Return type
Tensor
- draw(**kws: Any) Any #
Visualise the circuit. This method recevies the keywords as same as qiskit.circuit.QuantumCircuit.draw. More details can be found here: https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.draw.html. Interesting kws options include: ``idle_wires``(bool)
- Example
>>> c = tc.Circuit(3) >>> c.H(1) >>> c.X(2) >>> c.CNOT(0, 1) >>> c.draw(output='text') q_0: ββββββββ ββ ββββββββ΄ββ q_1: β€ H ββ€ X β βββββ€βββββ q_2: β€ X ββββββ βββββ
- exp(*index: int, **vars: Any) None #
Apply EXP gate with parameters on the circuit. See
tensorcircuit.gates.exp_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- exp1(*index: int, **vars: Any) None #
Apply EXP1 gate with parameters on the circuit. See
tensorcircuit.gates.exp1_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- expectation(*ops: Tuple[tensornetwork.network_components.Node, List[int]], reuse: bool = True, enable_lightcone: bool = False, noise_conf: Optional[Any] = None, nmc: int = 1000, status: Optional[Any] = None, **kws: Any) Any [source]#
Compute the expectation of corresponding operators.
- Example
>>> c = tc.Circuit(2) >>> c.H(0) >>> c.expectation((tc.gates.z(), [0])) array(0.+0.j, dtype=complex64)
>>> c = tc.Circuit(2) >>> c.cnot(0, 1) >>> c.rx(0, theta=0.4) >>> c.rx(1, theta=0.8) >>> c.h(0) >>> c.h(1) >>> error1 = tc.channels.generaldepolarizingchannel(0.1, 1) >>> error2 = tc.channels.generaldepolarizingchannel(0.06, 2) >>> noise_conf = NoiseConf() >>> noise_conf.add_noise("rx", error1) >>> noise_conf.add_noise("cnot", [error2], [[0, 1]]) >>> c.expectation((tc.gates.x(), [0]), noise_conf=noise_conf, nmc=10000) (0.46274087-3.764033e-09j)
- Parameters
ops (Tuple[tn.Node, List[int]]) β Operator and its position on the circuit, eg.
(tc.gates.z(), [1, ]), (tc.gates.x(), [2, ])
is for operator \(Z_1X_2\).reuse (bool, optional) β If True, then the wavefunction tensor is cached for further expectation evaluation, defaults to be true.
enable_lightcone (bool, optional) β whether enable light cone simplification, defaults to False
noise_conf (Optional[NoiseConf], optional) β Noise Configuration, defaults to None
nmc (int, optional) β repetition time for Monte Carlo sampling for noisfy calculation, defaults to 1000
status (Optional[Tensor], optional) β external randomness given by tensor uniformly from [0, 1], defaults to None, used for noisfy circuit sampling
- Raises
ValueError β βCannot measure two operators in one indexβ
- Returns
Tensor with one element
- Return type
Tensor
- expectation_before(*ops: Tuple[tensornetwork.network_components.Node, List[int]], reuse: bool = True, **kws: Any) List[tensornetwork.network_components.Node] #
Get the tensor network in the form of a list of nodes for the expectation calculation before the real contraction
- Parameters
reuse (bool, optional) β _description_, defaults to True
- Raises
ValueError β _description_
- Returns
_description_
- Return type
List[tn.Node]
- expectation_ps(x: Optional[Sequence[int]] = None, y: Optional[Sequence[int]] = None, z: Optional[Sequence[int]] = None, ps: Optional[Sequence[int]] = None, reuse: bool = True, noise_conf: Optional[Any] = None, nmc: int = 1000, status: Optional[Any] = None, **kws: Any) Any #
Shortcut for Pauli string expectation. x, y, z list are for X, Y, Z positions
- Example
>>> c = tc.Circuit(2) >>> c.X(0) >>> c.H(1) >>> c.expectation_ps(x=[1], z=[0]) array(-0.99999994+0.j, dtype=complex64)
>>> c = tc.Circuit(2) >>> c.cnot(0, 1) >>> c.rx(0, theta=0.4) >>> c.rx(1, theta=0.8) >>> c.h(0) >>> c.h(1) >>> error1 = tc.channels.generaldepolarizingchannel(0.1, 1) >>> error2 = tc.channels.generaldepolarizingchannel(0.06, 2) >>> noise_conf = NoiseConf() >>> noise_conf.add_noise("rx", error1) >>> noise_conf.add_noise("cnot", [error2], [[0, 1]]) >>> c.expectation_ps(x=[0], noise_conf=noise_conf, nmc=10000) (0.46274087-3.764033e-09j)
- Parameters
x (Optional[Sequence[int]], optional) β sites to apply X gate, defaults to None
y (Optional[Sequence[int]], optional) β sites to apply Y gate, defaults to None
z (Optional[Sequence[int]], optional) β sites to apply Z gate, defaults to None
ps (Optional[Sequence[int]], optional) β or one can apply a ps structures instead of
x
,y
,z
, e.g. [0, 1, 3, 0, 2, 2] for X_1Z_2Y_4Y_5 defaults to None,ps
can overwritex
,y
andz
reuse (bool, optional) β whether to cache and reuse the wavefunction, defaults to True
noise_conf (Optional[NoiseConf], optional) β Noise Configuration, defaults to None
nmc (int, optional) β repetition time for Monte Carlo sampling for noisfy calculation, defaults to 1000
status (Optional[Tensor], optional) β external randomness given by tensor uniformly from [0, 1], defaults to None, used for noisfy circuit sampling
- Returns
Expectation value
- Return type
Tensor
- fredkin(*index: int, **kws: Any) None #
Apply FREDKIN gate on the circuit. See
tensorcircuit.gates.fredkin_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- classmethod from_json(jsonstr: str, circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
load json str as a Circuit
- Parameters
jsonstr (str) β _description_
circuit_params (Optional[Dict[str, Any]], optional) β Extra circuit parameters in the format of
__init__
, defaults to None
- Returns
_description_
- Return type
- classmethod from_json_file(file: str, circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
load json file and convert it to a circuit
- Parameters
file (str) β filename
circuit_params (Optional[Dict[str, Any]], optional) β _description_, defaults to None
- Returns
_description_
- Return type
- classmethod from_openqasm(qasmstr: str, circuit_params: Optional[Dict[str, Any]] = None, keep_measure_order: bool = False) tensorcircuit.abstractcircuit.AbstractCircuit #
- classmethod from_openqasm_file(file: str, circuit_params: Optional[Dict[str, Any]] = None, keep_measure_order: bool = False) tensorcircuit.abstractcircuit.AbstractCircuit #
- classmethod from_qir(qir: List[Dict[str, Any]], circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
Restore the circuit from the quantum intermediate representation.
- Example
>>> c = tc.Circuit(3) >>> c.H(0) >>> c.rx(1, theta=tc.array_to_tensor(0.7)) >>> c.exp1(0, 1, unitary=tc.gates._zz_matrix, theta=tc.array_to_tensor(-0.2), split=split) >>> len(c) 7 >>> c.expectation((tc.gates.z(), [1])) array(0.764842+0.j, dtype=complex64) >>> qirs = c.to_qir() >>> >>> c = tc.Circuit.from_qir(qirs, circuit_params={"nqubits": 3}) >>> len(c._nodes) 7 >>> c.expectation((tc.gates.z(), [1])) array(0.764842+0.j, dtype=complex64)
- Parameters
qir (List[Dict[str, Any]]) β The quantum intermediate representation of a circuit.
circuit_params (Optional[Dict[str, Any]]) β Extra circuit parameters.
- Returns
The circuit have same gates in the qir.
- Return type
- classmethod from_qiskit(qc: Any, n: Optional[int] = None, inputs: Optional[List[float]] = None, circuit_params: Optional[Dict[str, Any]] = None, binding_params: Optional[Union[Sequence[float], Dict[Any, float]]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
Import Qiskit QuantumCircuit object as a
tc.Circuit
object.- Example
>>> from qiskit import QuantumCircuit >>> qisc = QuantumCircuit(3) >>> qisc.h(2) >>> qisc.cswap(1, 2, 0) >>> qisc.swap(0, 1) >>> c = tc.Circuit.from_qiskit(qisc)
- Parameters
qc (QuantumCircuit in Qiskit) β Qiskit Circuit object
n (int) β The number of qubits for the circuit
inputs (Optional[List[float]], optional) β possible input wavefunction for
tc.Circuit
, defaults to Nonecircuit_params (Optional[Dict[str, Any]]) β kwargs given in Circuit.__init__ construction function, default to None.
binding_params (Optional[Union[Sequence[float], Dict[Any, float]]]) β (variational) parameters for the circuit. Could be either a sequence or dictionary depending on the type of parameters in the Qiskit circuit. For
ParameterVectorElement
use sequence. ForParameter
use dictionary
- Returns
The same circuit but as tensorcircuit object
- Return type
- classmethod from_qsim_file(file: str, circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
- static front_from_nodes(nodes: List[tensornetwork.network_components.Node]) List[tensornetwork.network_components.Edge] #
- gate_aliases = [['cnot', 'cx'], ['fredkin', 'cswap'], ['toffoli', 'ccnot'], ['toffoli', 'ccx'], ['any', 'unitary'], ['sd', 'sdg'], ['td', 'tdg']]#
- gate_count(gate_list: Optional[Union[str, Sequence[str]]] = None) int #
count the gate number of the circuit
- Example
>>> c = tc.Circuit(3) >>> c.h(0) >>> c.multicontrol(0, 1, 2, ctrl=[0, 1], unitary=tc.gates._x_matrix) >>> c.toffolli(1, 2, 0) >>> c.gate_count() 3 >>> c.gate_count(["multicontrol", "toffoli"]) 2
- Parameters
gate_list (Optional[Sequence[str]], optional) β gate name or gate name list to be counted, defaults to None (counting all gates)
- Returns
the total number of all gates or gates in the
gate_list
- Return type
int
- gate_count_by_condition(cond_func: Callable[[Dict[str, Any]], bool]) int #
count the number of gates that satisfy certain condition
- Example
>>> c = tc.Circuit(3) >>> c.x(0) >>> c.h(0) >>> c.multicontrol(0, 1, 2, ctrl=[0, 1], unitary=tc.gates._x_matrix) >>> c.gate_count_by_condition(lambda qir: qir["index"] == (0, )) 2 >>> c.gate_count_by_condition(lambda qir: qir["mpo"]) 1
- Parameters
cond_func (Callable[[Dict[str, Any]], bool]) β the condition for counting the gate
- Returns
the total number of all gates which satisfy the
condition
- Return type
int
- gate_summary() Dict[str, int] #
return the summary dictionary on gate type - gate count pair
- Returns
the gate count dict by gate type
- Return type
Dict[str, int]
- general_kraus(kraus: Sequence[tensorcircuit.gates.Gate], *index: int, status: Optional[float] = None, with_prob: bool = False, name: Optional[str] = None) Any [source]#
Monte Carlo trajectory simulation of general Kraus channel whose Kraus operators cannot be amplified to unitary operators. For unitary operators composed Kraus channel,
unitary_kraus()
is much faster.This function is jittable in theory. But only jax+GPU combination is recommended for jit since the graph building time is too long for other backend options; though the running time of the function is very fast for every case.
- Parameters
kraus (Sequence[Gate]) β A list of
tn.Node
for Kraus operators.index (int) β The qubits index that Kraus channel is applied on.
status (Optional[float], optional) β Random tensor uniformly between 0 or 1, defaults to be None, when the random number will be generated automatically
- generaldepolarizing(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply generaldepolarizing quantum channel on the circuit. See
tensorcircuit.channels.generaldepolarizingchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- get_circuit_as_quoperator() tensorcircuit.quantum.QuOperator #
Get the
QuOperator
MPO like representation of the circuit unitary without contraction.- Returns
QuOperator
object for the circuit unitary (open indices for the input state)- Return type
- get_positional_logical_mapping() Dict[int, int] #
Get positional logical mapping dict based on measure instruction. This function is useful when we only measure part of the qubits in the circuit, to process the count result from partial measurement, we must be aware of the mapping, i.e. for each position in the count bitstring, what is the corresponding qubits (logical) defined on the circuit
- Returns
positional_logical_mapping
- Return type
Dict[int, int]
- get_quoperator() tensorcircuit.quantum.QuOperator [source]#
Get the
QuOperator
MPO like representation of the circuit unitary without contraction.- Returns
QuOperator
object for the circuit unitary (open indices for the input state)- Return type
- get_quvector() tensorcircuit.quantum.QuVector #
Get the representation of the output state in the form of
QuVector
while maintaining the circuit uncomputed- Returns
QuVector
representation of the output state from the circuit- Return type
- get_state_as_quvector() tensorcircuit.quantum.QuVector #
Get the representation of the output state in the form of
QuVector
while maintaining the circuit uncomputed- Returns
QuVector
representation of the output state from the circuit- Return type
- h(*index: int, **kws: Any) None #
Apply H gate on the circuit. See
tensorcircuit.gates.h_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.70710677+0.j & 0.70710677+0.j\\ 0.70710677+0.j & -0.70710677+0.j \end{bmatrix}\end{split}\]
- i(*index: int, **kws: Any) None #
Apply I gate on the circuit. See
tensorcircuit.gates.i_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- initial_mapping(logical_physical_mapping: Dict[int, int], n: Optional[int] = None, circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
generate a new circuit with the qubit mapping given by
logical_physical_mapping
- Parameters
logical_physical_mapping (Dict[int, int]) β how to map logical qubits to the physical qubits on the new circuit
n (Optional[int], optional) β number of qubit of the new circuit, can be different from the original one, defaults to None
circuit_params (Optional[Dict[str, Any]], optional) β _description_, defaults to None
- Returns
_description_
- Return type
- inputs: Any#
- inverse(circuit_params: Optional[Dict[str, Any]] = None) tensorcircuit.abstractcircuit.AbstractCircuit #
inverse the circuit, return a new inversed circuit
- EXAMPLE
>>> c = tc.Circuit(2) >>> c.H(0) >>> c.rzz(1, 2, theta=0.8) >>> c1 = c.inverse()
- Parameters
circuit_params (Optional[Dict[str, Any]], optional) β keywords dict for initialization the new circuit, defaults to None
- Returns
the inversed circuit
- Return type
- is_dm: bool = False#
- is_mps: bool = False#
- is_valid() bool [source]#
[WIP], check whether the circuit is legal.
- Returns
The bool indicating whether the circuit is legal
- Return type
bool
- isotropicdepolarizing(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply isotropicdepolarizing quantum channel on the circuit. See
tensorcircuit.channels.isotropicdepolarizingchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- iswap(*index: int, **vars: Any) None #
Apply ISWAP gate with parameters on the circuit. See
tensorcircuit.gates.iswap_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- matrix() Any [source]#
Get the unitary matrix for the circuit irrespective with the circuit input state.
- Returns
The circuit unitary matrix
- Return type
Tensor
- measure(*index: int, with_prob: bool = False, status: Optional[Any] = None) Tuple[Any, Any] #
Take measurement to the given quantum lines. This method is jittable is and about 100 times faster than unjit version!
- Parameters
index (int) β Measure on which quantum line.
with_prob (bool, optional) β If true, theoretical probability is also returned.
status (Optional[Tensor]) β external randomness, with shape [index], defaults to None
- Returns
The sample output and probability (optional) of the quantum line.
- Return type
Tuple[Tensor, Tensor]
- measure_instruction(*index: int) None #
add a measurement instruction flag, no effect on numerical simulation
- Parameters
index (int) β the corresponding qubits
- measure_jit(*index: int, with_prob: bool = False, status: Optional[Any] = None) Tuple[Any, Any] #
Take measurement to the given quantum lines. This method is jittable is and about 100 times faster than unjit version!
- Parameters
index (int) β Measure on which quantum line.
with_prob (bool, optional) β If true, theoretical probability is also returned.
status (Optional[Tensor]) β external randomness, with shape [index], defaults to None
- Returns
The sample output and probability (optional) of the quantum line.
- Return type
Tuple[Tensor, Tensor]
- measure_reference(*index: int, with_prob: bool = False) Tuple[str, float] [source]#
Take measurement on the given quantum lines by
index
.- Example
>>> c = tc.Circuit(3) >>> c.H(0) >>> c.h(1) >>> c.toffoli(0, 1, 2) >>> c.measure(2) ('1', -1.0) >>> # Another possible output: ('0', -1.0) >>> c.measure(2, with_prob=True) ('1', (0.25000011920928955+0j)) >>> # Another possible output: ('0', (0.7499998807907104+0j))
- Parameters
index β Measure on which quantum line.
with_prob β If true, theoretical probability is also returned.
- Returns
The sample output and probability (optional) of the quantum line.
- Return type
Tuple[str, float]
- mid_measure(index: int, keep: int = 0) Any #
Middle measurement in z-basis on the circuit, note the wavefunction output is not normalized with
mid_measurement
involved, one should normalize the state manually if needed. This is a post-selection method as keep is provided as a prior.- Parameters
index (int) β The index of qubit that the Z direction postselection applied on.
keep (int, optional) β 0 for spin up, 1 for spin down, defaults to be 0.
- mid_measurement(index: int, keep: int = 0) Any [source]#
Middle measurement in z-basis on the circuit, note the wavefunction output is not normalized with
mid_measurement
involved, one should normalize the state manually if needed. This is a post-selection method as keep is provided as a prior.- Parameters
index (int) β The index of qubit that the Z direction postselection applied on.
keep (int, optional) β 0 for spin up, 1 for spin down, defaults to be 0.
- mpo(*index: int, **vars: Any) None #
Apply mpo gate in MPO format on the circuit. See
tensorcircuit.gates.mpo_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- mpogates = ['multicontrol', 'mpo']#
- multicontrol(*index: int, **vars: Any) None #
Apply multicontrol gate in MPO format on the circuit. See
tensorcircuit.gates.multicontrol_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- orx(*index: int, **vars: Any) None #
Apply ORX gate with parameters on the circuit. See
tensorcircuit.gates.orx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ory(*index: int, **vars: Any) None #
Apply ORY gate with parameters on the circuit. See
tensorcircuit.gates.ory_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- orz(*index: int, **vars: Any) None #
Apply ORZ gate with parameters on the circuit. See
tensorcircuit.gates.orz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ox(*index: int, **kws: Any) None #
Apply OX gate on the circuit. See
tensorcircuit.gates.ox_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- oy(*index: int, **kws: Any) None #
Apply OY gate on the circuit. See
tensorcircuit.gates.oy_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 0.-1.j & 0.+0.j & 0.+0.j\\ 0.+1.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- oz(*index: int, **kws: Any) None #
Apply OZ gate on the circuit. See
tensorcircuit.gates.oz_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & -1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- perfect_sampling(status: Optional[Any] = None) Tuple[str, float] #
Sampling bistrings from the circuit output based on quantum amplitudes. Reference: arXiv:1201.3974.
- Parameters
status (Optional[Tensor]) β external randomness, with shape [nqubits], defaults to None
- Returns
Sampled bit string and the corresponding theoretical probability.
- Return type
Tuple[str, float]
- phase(*index: int, **vars: Any) None #
Apply PHASE gate with parameters on the circuit. See
tensorcircuit.gates.phase_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- phasedamping(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply phasedamping quantum channel on the circuit. See
tensorcircuit.channels.phasedampingchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- post_select(index: int, keep: int = 0) Any #
Middle measurement in z-basis on the circuit, note the wavefunction output is not normalized with
mid_measurement
involved, one should normalize the state manually if needed. This is a post-selection method as keep is provided as a prior.- Parameters
index (int) β The index of qubit that the Z direction postselection applied on.
keep (int, optional) β 0 for spin up, 1 for spin down, defaults to be 0.
- post_selection(index: int, keep: int = 0) Any #
Middle measurement in z-basis on the circuit, note the wavefunction output is not normalized with
mid_measurement
involved, one should normalize the state manually if needed. This is a post-selection method as keep is provided as a prior.- Parameters
index (int) β The index of qubit that the Z direction postselection applied on.
keep (int, optional) β 0 for spin up, 1 for spin down, defaults to be 0.
- prepend(c: tensorcircuit.abstractcircuit.AbstractCircuit) tensorcircuit.abstractcircuit.AbstractCircuit #
prepend circuit
c
before- Parameters
c (BaseCircuit) β The other circuit to be prepended
- Returns
The composed circuit
- Return type
- probability() Any #
get the 2^n length probability vector over computational basis
- Returns
probability vector
- Return type
Tensor
- quoperator() tensorcircuit.quantum.QuOperator #
Get the
QuOperator
MPO like representation of the circuit unitary without contraction.- Returns
QuOperator
object for the circuit unitary (open indices for the input state)- Return type
- quvector() tensorcircuit.quantum.QuVector #
Get the representation of the output state in the form of
QuVector
while maintaining the circuit uncomputed- Returns
QuVector
representation of the output state from the circuit- Return type
- r(*index: int, **vars: Any) None #
Apply R gate with parameters on the circuit. See
tensorcircuit.gates.r_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- readouterror_bs(readout_error: Optional[Sequence[Any]] = None, p: Optional[Any] = None) Any #
Apply readout error to original probabilities of bit string and return the noisy probabilities.
- Example
>>> readout_error = [] >>> readout_error.append([0.9,0.75]) # readout error for qubit 0, [p0|0,p1|1] >>> readout_error.append([0.4,0.7]) # readout error for qubit 1, [p0|0,p1|1]
- Parameters
readout_error (Optional[Sequence[Any]] Tensor, List, Tuple) β list of readout error for each qubits.
p (Optional[Any]) β probabilities of bit string
- Return type
Tensor
- replace_inputs(inputs: Any) None #
Replace the input state with the circuit structure unchanged.
- Parameters
inputs (Tensor) β Input wavefunction.
- replace_mps_inputs(mps_inputs: tensorcircuit.quantum.QuOperator) None [source]#
Replace the input state in MPS representation while keep the circuit structure unchanged.
- Example
>>> c = tc.Circuit(2) >>> c.X(0) >>> >>> c2 = tc.Circuit(2, mps_inputs=c.quvector()) >>> c2.X(0) >>> c2.wavefunction() array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], dtype=complex64) >>> >>> c3 = tc.Circuit(2) >>> c3.X(0) >>> c3.replace_mps_inputs(c.quvector()) >>> c3.wavefunction() array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], dtype=complex64)
- Parameters
mps_inputs (Tuple[Sequence[Gate], Sequence[Edge]]) β (Nodes, dangling Edges) for a MPS like initial wavefunction.
- reset(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply reset quantum channel on the circuit. See
tensorcircuit.channels.resetchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- reset_instruction(*index: int) None #
add a reset instruction flag, no effect on numerical simulation
- Parameters
index (int) β the corresponding qubits
- rx(*index: int, **vars: Any) None #
Apply RX gate with parameters on the circuit. See
tensorcircuit.gates.rx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- rxx(*index: int, **vars: Any) None #
Apply RXX gate with parameters on the circuit. See
tensorcircuit.gates.rxx_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ry(*index: int, **vars: Any) None #
Apply RY gate with parameters on the circuit. See
tensorcircuit.gates.ry_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- ryy(*index: int, **vars: Any) None #
Apply RYY gate with parameters on the circuit. See
tensorcircuit.gates.ryy_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- rz(*index: int, **vars: Any) None #
Apply RZ gate with parameters on the circuit. See
tensorcircuit.gates.rz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- rzz(*index: int, **vars: Any) None #
Apply RZZ gate with parameters on the circuit. See
tensorcircuit.gates.rzz_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- s(*index: int, **kws: Any) None #
Apply S gate on the circuit. See
tensorcircuit.gates.s_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 0.+1.j \end{bmatrix}\end{split}\]
- sample(batch: Optional[int] = None, allow_state: bool = False, readout_error: Optional[Sequence[Any]] = None, format: Optional[str] = None, random_generator: Optional[Any] = None, status: Optional[Any] = None) Any #
batched sampling from state or circuit tensor network directly
- Parameters
batch (Optional[int], optional) β number of samples, defaults to None
allow_state (bool, optional) β if true, we sample from the final state if memory allows, True is preferred, defaults to False
readout_error (Optional[Sequence[Any]] Tensor, List, Tuple) β readout_error, defaults to None
format (Optional[str]) β sample format, defaults to None as backward compatibility check the doc in
tensorcircuit.quantum.measurement_results()
format β alias for the argument
format
random_generator (Optional[Any], optional) β random generator, defaults to None
status (Optional[Tensor]) β external randomness given by tensor uniformly from [0, 1], if set, can overwrite random_generator
- Returns
List (if batch) of tuple (binary configuration tensor and corresponding probability) if the format is None, and consistent with format when given
- Return type
Any
- sample_expectation_ps(x: Optional[Sequence[int]] = None, y: Optional[Sequence[int]] = None, z: Optional[Sequence[int]] = None, shots: Optional[int] = None, random_generator: Optional[Any] = None, status: Optional[Any] = None, readout_error: Optional[Sequence[Any]] = None, noise_conf: Optional[Any] = None, nmc: int = 1000, statusc: Optional[Any] = None, **kws: Any) Any #
Compute the expectation with given Pauli string with measurement shots numbers
- Example
>>> c = tc.Circuit(2) >>> c.H(0) >>> c.rx(1, theta=np.pi/2) >>> c.sample_expectation_ps(x=[0], y=[1]) -0.99999976 >>> readout_error = [] >>> readout_error.append([0.9,0.75]) >>> readout_error.append([0.4,0.7]) >>> c.sample_expectation_ps(x=[0], y=[1],readout_error = readout_error)
>>> c = tc.Circuit(2) >>> c.cnot(0, 1) >>> c.rx(0, theta=0.4) >>> c.rx(1, theta=0.8) >>> c.h(0) >>> c.h(1) >>> error1 = tc.channels.generaldepolarizingchannel(0.1, 1) >>> error2 = tc.channels.generaldepolarizingchannel(0.06, 2) >>> readout_error = [[0.9, 0.75],[0.4, 0.7]] >>> noise_conf = NoiseConf() >>> noise_conf.add_noise("rx", error1) >>> noise_conf.add_noise("cnot", [error2], [[0, 1]]) >>> noise_conf.add_noise("readout", readout_error) >>> c.sample_expectation_ps(x=[0], noise_conf=noise_conf, nmc=10000) 0.44766843
- Parameters
x (Optional[Sequence[int]], optional) β index for Pauli X, defaults to None
y (Optional[Sequence[int]], optional) β index for Pauli Y, defaults to None
z (Optional[Sequence[int]], optional) β index for Pauli Z, defaults to None
shots (Optional[int], optional) β number of measurement shots, defaults to None, indicating analytical result
random_generator (Optional[Any]) β random_generator, defaults to None
status (Optional[Tensor]) β external randomness given by tensor uniformly from [0, 1], if set, can overwrite random_generator
readout_error (Optional[Sequence[Any]] Tensor, List, Tuple) β readout_error, defaults to None. Overrided if noise_conf is provided.
noise_conf (Optional[NoiseConf], optional) β Noise Configuration, defaults to None
nmc (int, optional) β repetition time for Monte Carlo sampling for noisfy calculation, defaults to 1000
statusc (Optional[Tensor], optional) β external randomness given by tensor uniformly from [0, 1], defaults to None, used for noisfy circuit sampling
- Returns
[description]
- Return type
Tensor
- sd(*index: int, **kws: Any) None #
Apply SD gate on the circuit. See
tensorcircuit.gates.sd_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 0.-1.j \end{bmatrix}\end{split}\]
- sdg(*index: int, **kws: Any) None #
Apply SD gate on the circuit. See
tensorcircuit.gates.sd_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & 0.-1.j \end{bmatrix}\end{split}\]
- select_gate(which: Any, kraus: Sequence[tensorcircuit.gates.Gate], *index: int) None #
Apply
which
-th gate fromkraus
list, i.e. apply kraus[which]- Parameters
which (Tensor) β Tensor of shape [] and dtype int
kraus (Sequence[Gate]) β A list of gate in the form of
tc.gate
or Tensorindex (int) β the qubit lines the gate applied on
- sexpps(x: Optional[Sequence[int]] = None, y: Optional[Sequence[int]] = None, z: Optional[Sequence[int]] = None, shots: Optional[int] = None, random_generator: Optional[Any] = None, status: Optional[Any] = None, readout_error: Optional[Sequence[Any]] = None, noise_conf: Optional[Any] = None, nmc: int = 1000, statusc: Optional[Any] = None, **kws: Any) Any #
Compute the expectation with given Pauli string with measurement shots numbers
- Example
>>> c = tc.Circuit(2) >>> c.H(0) >>> c.rx(1, theta=np.pi/2) >>> c.sample_expectation_ps(x=[0], y=[1]) -0.99999976 >>> readout_error = [] >>> readout_error.append([0.9,0.75]) >>> readout_error.append([0.4,0.7]) >>> c.sample_expectation_ps(x=[0], y=[1],readout_error = readout_error)
>>> c = tc.Circuit(2) >>> c.cnot(0, 1) >>> c.rx(0, theta=0.4) >>> c.rx(1, theta=0.8) >>> c.h(0) >>> c.h(1) >>> error1 = tc.channels.generaldepolarizingchannel(0.1, 1) >>> error2 = tc.channels.generaldepolarizingchannel(0.06, 2) >>> readout_error = [[0.9, 0.75],[0.4, 0.7]] >>> noise_conf = NoiseConf() >>> noise_conf.add_noise("rx", error1) >>> noise_conf.add_noise("cnot", [error2], [[0, 1]]) >>> noise_conf.add_noise("readout", readout_error) >>> c.sample_expectation_ps(x=[0], noise_conf=noise_conf, nmc=10000) 0.44766843
- Parameters
x (Optional[Sequence[int]], optional) β index for Pauli X, defaults to None
y (Optional[Sequence[int]], optional) β index for Pauli Y, defaults to None
z (Optional[Sequence[int]], optional) β index for Pauli Z, defaults to None
shots (Optional[int], optional) β number of measurement shots, defaults to None, indicating analytical result
random_generator (Optional[Any]) β random_generator, defaults to None
status (Optional[Tensor]) β external randomness given by tensor uniformly from [0, 1], if set, can overwrite random_generator
readout_error (Optional[Sequence[Any]] Tensor, List, Tuple) β readout_error, defaults to None. Overrided if noise_conf is provided.
noise_conf (Optional[NoiseConf], optional) β Noise Configuration, defaults to None
nmc (int, optional) β repetition time for Monte Carlo sampling for noisfy calculation, defaults to 1000
statusc (Optional[Tensor], optional) β external randomness given by tensor uniformly from [0, 1], defaults to None, used for noisfy circuit sampling
- Returns
[description]
- Return type
Tensor
- sgates = ['i', 'x', 'y', 'z', 'h', 't', 's', 'td', 'sd', 'wroot', 'cnot', 'cz', 'swap', 'cy', 'ox', 'oy', 'oz', 'toffoli', 'fredkin']#
- split: Optional[Dict[str, Any]]#
- static standardize_gate(name: str) str #
standardize the gate name to tc common gate sets
- Parameters
name (str) β non-standard gate name
- Returns
the standard gate name
- Return type
str
- state(form: str = 'default') <property object at 0x7fe2a376ee50> #
Compute the output wavefunction from the circuit.
- Parameters
form (str, optional) β The str indicating the form of the output wavefunction. βdefaultβ: [-1], βketβ: [-1, 1], βbraβ: [1, -1]
- Returns
Tensor with the corresponding shape.
- Return type
Tensor
- swap(*index: int, **kws: Any) None #
Apply SWAP gate on the circuit. See
tensorcircuit.gates.swap_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j \end{bmatrix}\end{split}\]
- t(*index: int, **kws: Any) None #
Apply T gate on the circuit. See
tensorcircuit.gates.t_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1. & +0.j & 0. & +0.j\\ 0. & +0.j & 0.70710677+0.70710677j \end{bmatrix}\end{split}\]
- td(*index: int, **kws: Any) None #
Apply TD gate on the circuit. See
tensorcircuit.gates.td_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1. & +0.j & 0. & +0.j\\ 0. & +0.j & 0.70710677-0.70710677j \end{bmatrix}\end{split}\]
- tdg(*index: int, **kws: Any) None #
Apply TD gate on the circuit. See
tensorcircuit.gates.td_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1. & +0.j & 0. & +0.j\\ 0. & +0.j & 0.70710677-0.70710677j \end{bmatrix}\end{split}\]
- tex(**kws: Any) str #
Generate latex string based on quantikz latex package
- Returns
Latex string that can be directly compiled via, e.g. latexit
- Return type
str
- thermalrelaxation(*index: int, status: Optional[float] = None, name: Optional[str] = None, **vars: float) None #
Apply thermalrelaxation quantum channel on the circuit. See
tensorcircuit.channels.thermalrelaxationchannel()
- Parameters
index (int.) β Qubit number that the gate applies on.
status (Tensor) β uniform external random number between 0 and 1
vars (float.) β Parameters for the channel.
- to_cirq(enable_instruction: bool = False) Any #
Translate
tc.Circuit
to a cirq circuit object.- Parameters
enable_instruction (bool, defaults to False) β whether also export measurement and reset instructions
- Returns
A cirq circuit of this circuit.
- to_graphviz(graph: Optional[graphviz.graphs.Graph] = None, include_all_names: bool = False, engine: str = 'neato') graphviz.graphs.Graph #
Not an ideal visualization for quantum circuit, but reserve here as a general approach to show the tensornetwork [Deprecated, use
Circuit.vis_tex
orCircuit.draw
instead]
- to_json(file: Optional[str] = None, simplified: bool = False) Any #
circuit dumps to json
- Parameters
file (Optional[str], optional) β file str to dump the json to, defaults to None, return the json str
simplified (bool) β If False, keep all info for each gate, defaults to be False. If True, suitable for IO since less information is required
- Returns
None if dumps to file otherwise the json str
- Return type
Any
- to_openqasm(**kws: Any) str #
transform circuit to openqasm via qiskit circuit, see https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.qasm.html for usage on possible options for
kws
- Returns
circuit representation in openqasm format
- Return type
str
- to_qir() List[Dict[str, Any]] #
Return the quantum intermediate representation of the circuit.
- Example
>>> c = tc.Circuit(2) >>> c.CNOT(0, 1) >>> c.to_qir() [{'gatef': cnot, 'gate': Gate( name: 'cnot', tensor: array([[[[1.+0.j, 0.+0.j], [0.+0.j, 0.+0.j]], [[0.+0.j, 1.+0.j], [0.+0.j, 0.+0.j]]], [[[0.+0.j, 0.+0.j], [0.+0.j, 1.+0.j]], [[0.+0.j, 0.+0.j], [1.+0.j, 0.+0.j]]]], dtype=complex64), edges: [ Edge(Dangling Edge)[0], Edge(Dangling Edge)[1], Edge('cnot'[2] -> 'qb-1'[0] ), Edge('cnot'[3] -> 'qb-2'[0] ) ]), 'index': (0, 1), 'name': 'cnot', 'split': None, 'mpo': False}]
- Returns
The quantum intermediate representation of the circuit.
- Return type
List[Dict[str, Any]]
- to_qiskit(enable_instruction: bool = False, enable_inputs: bool = False) Any #
Translate
tc.Circuit
to a qiskit QuantumCircuit object.- Parameters
enable_instruction (bool, defaults to False) β whether also export measurement and reset instructions
enable_inputs (bool, defaults to False) β whether also export the inputs
- Returns
A qiskit object of this circuit.
- toffoli(*index: int, **kws: Any) None #
Apply TOFFOLI gate on the circuit. See
tensorcircuit.gates.toffoli_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j & 0.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j\\ 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 0.+0.j & 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- u(*index: int, **vars: Any) None #
Apply U gate with parameters on the circuit. See
tensorcircuit.gates.u_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- unitary(*index: int, **vars: Any) None #
Apply ANY gate with parameters on the circuit. See
tensorcircuit.gates.any_gate()
.- Parameters
index (int.) β Qubit number that the gate applies on.
vars (float.) β Parameters for the gate.
- unitary_kraus(kraus: Sequence[tensorcircuit.gates.Gate], *index: int, prob: Optional[Sequence[float]] = None, status: Optional[float] = None, name: Optional[str] = None) Any [source]#
Apply unitary gates in
kraus
randomly based on correspondingprob
. Ifprob
isNone
, this is reduced to kraus channel language.- Parameters
kraus (Sequence[Gate]) β List of
tc.gates.Gate
or just Tensorsprob (Optional[Sequence[float]], optional) β prob list with the same size as
kraus
, defaults to Nonestatus (Optional[float], optional) β random seed between 0 to 1, defaults to None
- Returns
shape [] int dtype tensor indicates which kraus gate is actually applied
- Return type
Tensor
- unitary_kraus2(kraus: Sequence[tensorcircuit.gates.Gate], *index: int, prob: Optional[Sequence[float]] = None, status: Optional[float] = None, name: Optional[str] = None) Any [source]#
- vgates = ['r', 'cr', 'u', 'cu', 'rx', 'ry', 'rz', 'phase', 'rxx', 'ryy', 'rzz', 'cphase', 'crx', 'cry', 'crz', 'orx', 'ory', 'orz', 'iswap', 'any', 'exp', 'exp1']#
- vis_tex(**kws: Any) str #
Generate latex string based on quantikz latex package
- Returns
Latex string that can be directly compiled via, e.g. latexit
- Return type
str
- wavefunction(form: str = 'default') <property object at 0x7fe2a376ee50> [source]#
Compute the output wavefunction from the circuit.
- Parameters
form (str, optional) β The str indicating the form of the output wavefunction. βdefaultβ: [-1], βketβ: [-1, 1], βbraβ: [1, -1]
- Returns
Tensor with the corresponding shape.
- Return type
Tensor
- wroot(*index: int, **kws: Any) None #
Apply WROOT gate on the circuit. See
tensorcircuit.gates.wroot_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.70710677+0.j & -0.5 & -0.5j\\ 0.5 & -0.5j & 0.70710677+0.j \end{bmatrix}\end{split}\]
- x(*index: int, **kws: Any) None #
Apply X gate on the circuit. See
tensorcircuit.gates.x_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 1.+0.j\\ 1.+0.j & 0.+0.j \end{bmatrix}\end{split}\]
- y(*index: int, **kws: Any) None #
Apply Y gate on the circuit. See
tensorcircuit.gates.y_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 0.+0.j & 0.-1.j\\ 0.+1.j & 0.+0.j \end{bmatrix}\end{split}\]
- z(*index: int, **kws: Any) None #
Apply Z gate on the circuit. See
tensorcircuit.gates.z_gate()
.- Parameters
index (int.) β
Qubit number that the gate applies on. The matrix for the gate is
\[\begin{split}\begin{bmatrix} 1.+0.j & 0.+0.j\\ 0.+0.j & -1.+0.j \end{bmatrix}\end{split}\]
- tensorcircuit.circuit.expectation(*ops: Tuple[tensornetwork.network_components.Node, List[int]], ket: Any, bra: Optional[Any] = None, conj: bool = True, normalization: bool = False) Any [source]#
Compute \(\langle bra\vert ops \vert ket\rangle\).
Example 1 (\(bra\) is same as \(ket\))
>>> c = tc.Circuit(3) >>> c.H(0) >>> c.ry(1, theta=tc.num_to_tensor(0.8 + 0.7j)) >>> c.cnot(1, 2) >>> state = c.wavefunction() # the state of this circuit >>> x1z2 = [(tc.gates.x(), [0]), (tc.gates.z(), [1])] # input qubits >>> >>> # Expection of this circuit / <state|*x1z2|state> >>> c.expectation(*x1z2) array(0.69670665+0.j, dtype=complex64) >>> tc.expectation(*x1z2, ket=state) (0.6967066526412964+0j) >>> >>> # Normalize(expection of Circuit) / Normalize(<state|*x1z2|state>) >>> c.expectation(*x1z2) / tc.backend.norm(state) ** 2 (0.5550700389340034+0j) >>> tc.expectation(*x1z2, ket=state, normalization=True) (0.55507004+0j)
Example 2 (\(bra\) is different from \(ket\))
>>> c = tc.Circuit(2) >>> c.X(1) >>> s1 = c.state() >>> c2 = tc.Circuit(2) >>> c2.X(0) >>> s2 = c2.state() >>> c3 = tc.Circuit(2) >>> c3.H(1) >>> s3 = c3.state() >>> x1x2 = [(tc.gates.x(), [0]), (tc.gates.x(), [1])] >>> >>> tc.expectation(*x1x2, ket=s1, bra=s2) (1+0j) >>> tc.expectation(*x1x2, ket=s3, bra=s2) (0.7071067690849304+0j) # 1/sqrt(2)
- Parameters
ket (Tensor) β \(ket\). The state in tensor or
QuVector
formatbra (Optional[Tensor], optional) β \(bra\), defaults to None, which is the same as
ket
.conj (bool, optional) β \(bra\) changes to the adjoint matrix of \(bra\), defaults to True.
normalization (bool, optional) β Normalize the \(ket\) and \(bra\), defaults to False.
- Raises
ValueError β βCannot measure two operators in one indexβ
- Returns
The result of \(\langle bra\vert ops \vert ket\rangle\).
- Return type
Tensor