pytket.circuit

Contents

pytket.circuit#

pytket.circuit.fresh_symbol(preferred: str = 'a') sympy.Symbol#

Given some preferred symbol, this finds an appropriate suffix that will guarantee it has not yet been used in the current python session.

Parameters:

preferred – The preferred readable symbol name as a string (default is ‘a’)

Returns:

A new sympy symbol object

class pytket.circuit.Op#

Encapsulates operation information

static create(*args, **kwargs)#

Overloaded function.

  1. create(arg0: pytket.circuit.OpType) -> pytket.circuit.Op

Create an Op with given type

  1. create(arg0: pytket.circuit.OpType, arg1: typing.Union[sympy.Expr, float]) -> pytket.circuit.Op

Create an Op with given type and parameter

  1. create(arg0: pytket.circuit.OpType, arg1: Sequence[typing.Union[sympy.Expr, float]]) -> pytket.circuit.Op

Create an Op with given type and parameters

free_symbols(self: pytket.circuit.Op) set[sympy.Symbol]#
get_name(self: pytket.circuit.Op, latex: bool = False) str#

String representation of op

get_unitary(self: pytket.circuit.Op) numpy.ndarray[numpy.complex128[m, n]]#
is_clifford(self: pytket.circuit.Op) bool#

Test whether the operation is in the Clifford group. A return value of true guarantees that the operation is Clifford. However, the converse is not the case as some Clifford operations may not be detected as such.

is_clifford_type(self: pytket.circuit.Op) bool#

Check if the operation is one of the Clifford `OpType`s.

is_gate(self: pytket.circuit.Op) bool#
property dagger#

Dagger of op

property n_qubits#

Number of qubits of op

property params#

Angular parameters of the op, in half-turns (e.g. 1.0 half-turns is \(\pi\) radians). The parameters returned are constrained to the appropriate canonical range, which is usually the half-open interval [0,2) but for some operations (e.g. Rx, Ry and Rz) is [0,4).

property transpose#

Transpose of op

property type#

Type of op being performed

class pytket.circuit.Command#

A single quantum command in the circuit, defined by the Op, the qubits it acts on, and the op group name if any.

free_symbols(self: pytket.circuit.Command) set[sympy.Symbol]#
Returns:

set of symbolic parameters for the command

property args#

The qubits/bits the command acts on.

property bits#

The bits the command could write to (does not include read-only bits).

property op#

Operation for this command.

property opgroup#

The op group name assigned to the command (or None if no name is defined).

property qubits#

The qubits the command acts on.

class pytket.circuit.BasisOrder#

Enum for readout basis and ordering. Readouts are viewed in increasing lexicographic order (ILO) of the bit’s UnitID. This is our default convention for column indexing for ALL readout forms (shots, counts, statevector, and unitaries). e.g. \(\lvert abc \rangle\) corresponds to the readout: (‘c’, 0) –> \(a\), (‘c’, 1) –> \(b\), (‘d’, 0) –> \(c\) For statevector and unitaries, the string abc is interpreted as an index in a big-endian (BE) fashion. e.g. the statevector \((a_{00}, a_{01}, a_{10}, a_{11})\) Some backends (Qiskit, ProjectQ, etc.) use a DLO-BE (decreasing lexicographic order, big-endian) convention. This is the same as ILO-LE (little-endian) for statevectors and unitaries, but gives shot tables/readouts in a counter-intuitive manner. Every backend and matrix-based box has a BasisOrder option which can toggle between ILO-BE (ilo) and DLO-BE (dlo).

Members:

ilo : Increasing Lexicographic Order of UnitID, big-endian

dlo : Decreasing Lexicographic Order of UnitID, big-endian

property name#
class pytket.circuit.CXConfigType#

Enum for available configurations for CXs upon decompose phase gadgets

Members:

Snake : linear nearest neighbour CX sequence. Linear depth.

Star : Every CX has same target, linear depth, good for gate cancellation.

Tree : Balanced tree: logarithmic depth, harder to route.

MultiQGate : Support for multi-qubit architectures, decomposing to 3-qubit XXPhase3 gates instead of CXs where possible.

property name#
class pytket.circuit.CircBox#

A user-defined operation specified by a Circuit.

__init__(self: pytket.circuit.CircBox, circ: pytket.circuit.Circuit) None#

Construct from a Circuit.

get_circuit(self: pytket.circuit.CircBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

symbol_substitution(self: pytket.circuit.CircBox, symbol_map: dict[sympy.Symbol, Union[sympy.Expr, float]]) None#

In-place substitution of symbolic expressions within underlying circuit; iterates through each parameterised gate/box within the circuit and performs the substitution.

WARNING: This method potentially mutates the CircBox and any changes are propagated to any Circuit that the CircBox has been added to (via Circuit.add_circbox).

Parameters:

symbol_map – A map from SymPy symbols to SymPy expressions

property circuit_name#
Returns:

the name of the contained circuit.

WARNING: Setting this property mutates the CircBox and any changes are propagated to any Circuit that the CircBox has been added to (via Circuit.add_circbox).

class pytket.circuit.Unitary1qBox#

A user-defined one-qubit operation specified by a unitary matrix.

__init__(self: pytket.circuit.Unitary1qBox, m: numpy.ndarray[numpy.complex128[2, 2]]) None#

Construct from a unitary matrix.

get_circuit(self: pytket.circuit.Unitary1qBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_matrix(self: pytket.circuit.Unitary1qBox) numpy.ndarray[numpy.complex128[2, 2]]#
Returns:

the unitary matrix as a numpy array

class pytket.circuit.Unitary2qBox#

A user-defined two-qubit operation specified by a unitary matrix.

__init__(self: pytket.circuit.Unitary2qBox, m: numpy.ndarray[numpy.complex128[4, 4]], basis: pytket.circuit.BasisOrder = BasisOrder.ilo) None#

Construct from a unitary matrix.

Parameters:
  • m – The unitary matrix

  • basis – Whether the provided unitary is in the ILO-BE (increasing lexicographic order of qubit ids, big-endian indexing) format, or DLO-BE (decreasing lexicographic order of ids)

get_circuit(self: pytket.circuit.Unitary2qBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_matrix(self: pytket.circuit.Unitary2qBox) numpy.ndarray[numpy.complex128[4, 4]]#
Returns:

the unitary matrix (in ILO-BE format) as a numpy array

class pytket.circuit.Unitary3qBox#

A user-defined three-qubit operation specified by a unitary matrix.

__init__(self: pytket.circuit.Unitary3qBox, m: numpy.ndarray[numpy.complex128[m, n]], basis: pytket.circuit.BasisOrder = BasisOrder.ilo) None#

Construct from a unitary matrix.

Parameters:
  • m – The unitary matrix

  • basis – Whether the provided unitary is in the ILO-BE (increasing lexicographic order of qubit ids, big-endian indexing) format, or DLO-BE (decreasing lexicographic order of ids)

get_circuit(self: pytket.circuit.Unitary3qBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_matrix(self: pytket.circuit.Unitary3qBox) numpy.ndarray[numpy.complex128[8, 8]]#
Returns:

the unitary matrix (in ILO-BE format) as a numpy array

class pytket.circuit.ExpBox#

A user-defined two-qubit operation whose corresponding unitary matrix is the exponential of a user-defined hermitian matrix.

__init__(self: pytket.circuit.ExpBox, A: numpy.ndarray[numpy.complex128[4, 4]], t: float, basis: pytket.circuit.BasisOrder = BasisOrder.ilo) None#

Construct \(e^{itA}\) from a hermitian matrix \(A\) and a parameter \(t\).

Parameters:
  • A – A hermitian matrix

  • t – Exponentiation parameter

  • basis – Whether the provided matrix is in the ILO-BE (increasing lexicographic order of qubit ids, big-endian indexing) format, or DLO-BE (decreasing lexicographic order of ids)

get_circuit(self: pytket.circuit.ExpBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

class pytket.circuit.PauliExpBox#

An operation defined as the exponential of a tensor of Pauli operations and a (possibly symbolic) phase parameter.

__init__(self: pytket.circuit.PauliExpBox, paulis: Sequence[pytket.pauli.Pauli], t: Union[sympy.Expr, float], cx_config_type: pytket.circuit.CXConfigType = CXConfigType.Tree) None#

Construct \(e^{-\frac12 i \pi t \sigma_0 \otimes \sigma_1 \otimes \cdots}\) from Pauli operators \(\sigma_i \in \{I,X,Y,Z\}\) and a parameter \(t\).

get_circuit(self: pytket.circuit.PauliExpBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_cx_config(self: pytket.circuit.PauliExpBox) pytket.circuit.CXConfigType#
Returns:

decomposition method

get_paulis(self: pytket.circuit.PauliExpBox) list[pytket.pauli.Pauli]#
Returns:

the corresponding list of Pauli s

get_phase(self: pytket.circuit.PauliExpBox) Union[sympy.Expr, float]#
Returns:

the corresponding phase parameter

class pytket.circuit.PauliExpPairBox#

A pair of (not necessarily commuting) Pauli exponentials performed in sequence. Pairing up exponentials for synthesis can reduce gate costs of synthesis compared to synthesising individually, with the best reductions found when the Pauli tensors act on a large number of the same qubits. Phase parameters may be symbolic.

__init__(self: pytket.circuit.PauliExpPairBox, paulis0: Sequence[pytket.pauli.Pauli], t0: Union[sympy.Expr, float], paulis1: Sequence[pytket.pauli.Pauli], t1: Union[sympy.Expr, float], cx_config_type: pytket.circuit.CXConfigType = CXConfigType.Tree) None#

Construct a pair of Pauli exponentials of the form \(e^{-\frac12 i \pi t_j \sigma_0 \otimes \sigma_1 \otimes \cdots}\) from Pauli operator strings \(\sigma_i \in \{I,X,Y,Z\}\) and parameters \(t_j, j \in \{0,1\}\).

get_circuit(self: pytket.circuit.PauliExpPairBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_cx_config(self: pytket.circuit.PauliExpPairBox) pytket.circuit.CXConfigType#
Returns:

decomposition method

get_paulis_pair(self: pytket.circuit.PauliExpPairBox) tuple[list[pytket.pauli.Pauli], list[pytket.pauli.Pauli]]#
Returns:

A tuple containing the two corresponding lists of Pauli s

get_phase_pair(self: pytket.circuit.PauliExpPairBox) tuple[Union[sympy.Expr, float], Union[sympy.Expr, float]]#
Returns:

A tuple containing the two phase parameters

class pytket.circuit.PauliExpCommutingSetBox#

An operation defined as a set of commuting of exponentials of atensor of Pauli operations and their (possibly symbolic) phase parameters.

__init__(self: pytket.circuit.PauliExpCommutingSetBox, pauli_gadgets: Sequence[tuple[Sequence[pytket.pauli.Pauli], Union[sympy.Expr, float]]], cx_config_type: pytket.circuit.CXConfigType = CXConfigType.Tree) None#

Construct a set of necessarily commuting Pauli exponentials of the form \(e^{-\frac12 i \pi t_j \sigma_0 \otimes \sigma_1 \otimes \cdots}\) from Pauli operator strings \(\sigma_i \in \{I,X,Y,Z\}\) and parameters \(t_j, j \in \{0, 1, \cdots \}\).

get_circuit(self: pytket.circuit.PauliExpCommutingSetBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_cx_config(self: pytket.circuit.PauliExpCommutingSetBox) pytket.circuit.CXConfigType#
Returns:

decomposition method

get_paulis(self: pytket.circuit.PauliExpCommutingSetBox) list[tuple[list[pytket.pauli.Pauli], Union[sympy.Expr, float]]]#
Returns:

the corresponding list of Pauli gadgets

class pytket.circuit.TermSequenceBox#

An unordered collection of Pauli exponentials that can be synthesised in any order, causing a change in the unitary operation. Synthesis order depends on the synthesis strategy chosen only.

__init__(self: pytket.circuit.TermSequenceBox, pauli_gadgets: Sequence[tuple[Sequence[pytket.pauli.Pauli], Union[sympy.Expr, float]]], synthesis_strategy: pytket.transform.PauliSynthStrat = PauliSynthStrat.Sets, partitioning_strategy: pytket.partition.PauliPartitionStrat = PauliPartitionStrat.CommutingSets, graph_colouring: pytket.partition.GraphColourMethod = GraphColourMethod.Lazy, cx_config_type: pytket.circuit.CXConfigType = CXConfigType.Tree) None#

Construct a set of Pauli exponentials of the form \(e^{-\frac12 i \pi t_j \sigma_0 \otimes \sigma_1 \otimes \cdots}\) from Pauli operator strings \(\sigma_i \in \{I,X,Y,Z\}\) and parameters \(t_j, j \in \{0, 1, \cdots \}\).

get_circuit(self: pytket.circuit.TermSequenceBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_cx_config(self: pytket.circuit.TermSequenceBox) pytket.circuit.CXConfigType#
Returns:

cx decomposition method

get_graph_colouring_method(self: pytket.circuit.TermSequenceBox) pytket.partition.GraphColourMethod#
Returns:

graph colouring method

get_partition_strategy(self: pytket.circuit.TermSequenceBox) pytket.partition.PauliPartitionStrat#
Returns:

partitioning strategy

get_paulis(self: pytket.circuit.TermSequenceBox) list[tuple[list[pytket.pauli.Pauli], Union[sympy.Expr, float]]]#
Returns:

the corresponding list of Pauli gadgets

get_synthesis_strategy(self: pytket.circuit.TermSequenceBox) pytket.transform.PauliSynthStrat#
Returns:

synthesis strategy

class pytket.circuit.ToffoliBoxSynthStrat#

Enum strategies for synthesising ToffoliBoxes

Members:

Matching : Use multiplexors to perform parallel swaps on hypercubes

Cycle : Use CnX gates to perform transpositions

property name#
class pytket.circuit.ToffoliBox#

An operation that constructs a circuit to implement the specified permutation of classical basis states.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.ToffoliBox, permutation: Sequence[tuple[Sequence[bool], Sequence[bool]]], strat: pytket.circuit.ToffoliBoxSynthStrat, rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Construct from a permutation of basis states

Parameters:
  • permutation – a list of bitstring pairs

  • strat – synthesis strategy

  • rotation_axis – the rotation axis of the multiplexors used in the decomposition. Can be either Rx or Ry. Only applicable to the Matching strategy. Default to Ry.

  1. __init__(self: pytket.circuit.ToffoliBox, permutation: Sequence[tuple[Sequence[bool], Sequence[bool]]], rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Construct from a permutation of basis states and perform synthesis using the Matching strategy

Parameters:
  • permutation – a list of bitstring pairs

  • rotation_axis – the rotation axis of the multiplexors used in the decomposition. Can be either Rx or Ry, default to Ry.

  1. __init__(self: pytket.circuit.ToffoliBox, n_qubits: int, permutation: Sequence[tuple[Sequence[bool], Sequence[bool]]], rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Constructor for backward compatibility. Subject to deprecation.

  1. __init__(self: pytket.circuit.ToffoliBox, permutation: dict[tuple[bool, …], Sequence[bool]], strat: pytket.circuit.ToffoliBoxSynthStrat, rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Construct from a permutation of basis states

Parameters:
  • permutation – a map between bitstrings

  • strat – synthesis strategy

  • rotation_axis – the rotation axis of the multiplexors used in the decomposition. Can be either Rx or Ry. Only applicable to the Matching strategy. Default to Ry.

  1. __init__(self: pytket.circuit.ToffoliBox, permutation: dict[tuple[bool, …], Sequence[bool]], rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Construct from a permutation of basis states and perform synthesis using the Matching strategy

Parameters:
  • permutation – a map between bitstrings

  • rotation_axis – the rotation axis of the multiplexors used in the decomposition. Can be either Rx or Ry, default to Ry.

  1. __init__(self: pytket.circuit.ToffoliBox, n_qubits: int, permutation: dict[tuple[bool, …], Sequence[bool]], rotation_axis: pytket.circuit.OpType = <OpType.Ry: 35>) -> None

Constructor for backward compatibility. Subject to deprecation.

get_circuit(self: pytket.circuit.ToffoliBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_permutation(self: pytket.circuit.ToffoliBox) dict[tuple, tuple]#
Returns:

the permutation

get_rotation_axis(self: pytket.circuit.ToffoliBox) pytket.circuit.OpType#
Returns:

the rotation axis

get_strat(self: pytket.circuit.ToffoliBox) pytket.circuit.ToffoliBoxSynthStrat#
Returns:

the synthesis strategy

class pytket.circuit.QControlBox#

A user-defined controlled operation specified by an Op, the number of quantum controls, and the control state expressed as an integer or a bit vector.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.QControlBox, op: pytket.circuit.Op, n_controls: int = 1, control_state: Sequence[bool] = []) -> None

Construct from an Op, a number of quantum controls, and the control state expressed as a bit vector. The controls occupy the low-index ports of the resulting operation.

Parameters:
  • op – the underlying operator

  • n_controls – the number of control qubits. Default to 1

  • control_state – the control state expressed as a bit vector. Default to all 1s

  1. __init__(self: pytket.circuit.QControlBox, op: pytket.circuit.Op, n_controls: int, control_state: int) -> None

Construct from an Op, a number of quantum controls, and the control state expressed as an integer. The controls occupy the low-index ports of the resulting operation.

Parameters:
  • op – the underlying operator

  • n_controls – the number of control qubits

  • control_state – the control state expressed as an integer. Big-endian

  1. __init__(self: pytket.circuit.QControlBox, op: pytket.circuit.Op, n: int = 1) -> None

Construct from an Op and a number of quantum controls. The controls occupy the low-index ports of the resulting operation.

get_circuit(self: pytket.circuit.QControlBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_control_state(self: pytket.circuit.QControlBox) int#
Returns:

the control state as an integer (big-endian binary representation)

get_control_state_bits(self: pytket.circuit.QControlBox) list[bool]#
Returns:

the control state as a bit vector

get_n_controls(self: pytket.circuit.QControlBox) int#
Returns:

the number of control qubits

get_op(self: pytket.circuit.QControlBox) pytket.circuit.Op#
Returns:

the underlying operator

class pytket.circuit.CustomGateDef#

A custom unitary gate definition, given as a composition of other gates

static define(name: str, circ: pytket.circuit.Circuit, args: Sequence[sympy.Symbol]) pytket.circuit.CustomGateDef#

Define a new custom gate as a composite of other gates

Parameters:
  • name – Readable name for the new gate

  • circ – The definition of the gate as a Circuit

  • args – Symbols to be encapsulated as arguments of the custom gate

static from_dict(arg0: dict) pytket.circuit.CustomGateDef#

Construct Circuit instance from JSON serializable dictionary representation of the Circuit.

to_dict(self: pytket.circuit.CustomGateDef) dict#
Returns:

a JSON serializable dictionary representation of the CustomGateDef

property args#

Return symbolic arguments of gate.

property arity#

The number of real parameters for the gate

property definition#

Return definition as a circuit.

property name#

The readable name of the gate

class pytket.circuit.CustomGate#

A user-defined gate defined by a parametrised Circuit.

get_circuit(self: pytket.circuit.CustomGate) pytket.circuit.Circuit#
Returns:

the Circuit described by the gate.

property gate#

Underlying gate object.

property name#

The readable name of the gate.

property params#

The parameters of the gate.

class pytket.circuit.Conditional#

A wrapper for an operation to be applied conditionally on the value of some classical bits (following the nature of conditional operations in the OpenQASM specification).

property op#

The operation to be applied conditionally

property value#

The little-endian value the classical register must read in order to apply the operation (e.g. value 2 (10b) means bits[0] must be 0 and bits[1] must be 1)

property width#

The number of bits in the condition register

class pytket.circuit.ClassicalExpBox#

A box for holding classical expressions on Bits.

content_equality(self: pytket.circuit.ClassicalExpBox, arg0: pytket.circuit.ClassicalExpBox) bool#

Check whether two ClassicalExpBox are equal in content

get_exp(self: pytket.circuit.ClassicalExpBox) pytket.circuit.logic_exp.LogicExp#
Returns:

the classical expression

get_n_i(self: pytket.circuit.ClassicalExpBox) int#
Returns:

the number of pure inputs to the box.

get_n_io(self: pytket.circuit.ClassicalExpBox) int#
Returns:

the number of inputs/outputs to the box.

get_n_o(self: pytket.circuit.ClassicalExpBox) int#
Returns:

the number of pure outputs from the box.

class pytket.circuit.PhasePolyBox#

Box encapsulating any Circuit made up of CNOT and RZ as a phase polynomial + linear transformation

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.PhasePolyBox, n_qubits: int, qubit_indices: dict[pytket.unit_id.Qubit, int], phase_polynomial: dict[tuple[bool, …], typing.Union[sympy.Expr, float]], linear_transformation: numpy.ndarray[bool[m, n]]) -> None

Construct from the number of qubits, the mapping from Qubit to index, the phase polynomial (map from bitstring to phase) and the linear transformation (boolean matrix)

  1. __init__(self: pytket.circuit.PhasePolyBox, n_qubits: int, qubit_indices: dict[pytket.unit_id.Qubit, int], phase_polynomial: Sequence[tuple[Sequence[bool], typing.Union[sympy.Expr, float]]], linear_transformation: numpy.ndarray[bool[m, n]]) -> None

Construct from the number of qubits, the mapping from Qubit to index, the phase polynomial (list of bitstring phase pairs) and the linear transformation (boolean matrix)

If any bitstring is repeated in the phase polynomial list, the last given value for that bistring will be used

  1. __init__(self: pytket.circuit.PhasePolyBox, circuit: pytket.circuit.Circuit) -> None

Construct a PhasePolyBox from a given circuit containing only Rz and CX gates.

get_circuit(self: pytket.circuit.PhasePolyBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box.

property linear_transformation#

Boolean matrix corresponding to linear transformation.

property n_qubits#

Number of gates the polynomial acts on.

property phase_polynomial#

Map from bitstring (basis state) to phase.

property phase_polynomial_as_list#

List of bitstring(basis state)-phase pairs.

property qubit_indices#

Map from Qubit to index in polynomial.

class pytket.circuit.ProjectorAssertionBox#

A user-defined assertion specified by a 2x2, 4x4, or 8x8 projector matrix.

__init__(self: pytket.circuit.ProjectorAssertionBox, m: numpy.ndarray[numpy.complex128[m, n]], basis: pytket.circuit.BasisOrder = BasisOrder.ilo) None#

Construct from a projector matrix.

Parameters:
  • m – The projector matrix

  • basis – Whether the provided unitary is in the ILO-BE (increasing lexicographic order of qubit ids, big-endian indexing) format, or DLO-BE (decreasing lexicographic order of ids)

get_circuit(self: pytket.circuit.ProjectorAssertionBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_matrix(self: pytket.circuit.ProjectorAssertionBox) numpy.ndarray[numpy.complex128[m, n]]#
Returns:

the unitary matrix (in ILO-BE format) as a numpy array

class pytket.circuit.StabiliserAssertionBox#

A user-defined assertion specified by a list of Pauli stabilisers.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.StabiliserAssertionBox, stabilisers: Sequence[pytket.pauli.PauliStabiliser]) -> None

Construct from a list of Pauli stabilisers.

Parameters:

stabilisers – The list of Pauli stabilisers

  1. __init__(self: pytket.circuit.StabiliserAssertionBox, stabilisers: Sequence[str]) -> None

Construct from a list of Pauli stabilisers.

Parameters:

m – The list of Pauli stabilisers expressed as Python strings

get_circuit(self: pytket.circuit.StabiliserAssertionBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_stabilisers(self: pytket.circuit.StabiliserAssertionBox) list[pytket.pauli.PauliStabiliser]#
Returns:

the list of Pauli stabilisers

class pytket.circuit.WASMOp#

An op holding an external classical call, defined by the external module id, the name of the function and the arguments. External calls can only act on entire registers (which will be interpreted as fixed-width integers).

__init__(self: pytket.circuit.WASMOp, num_bits: int, num_w: int, n_inputs: Sequence[int], n_outputs: Sequence[int], func_name: str, wasm_uid: str) None#

Construct from number of bits, bitwidths of inputs and outputs, function name and module id.

property func_name#

Name of function.

property input_widths#

Widths of input integers.

property n_i32#

Number of integers acted on.

property num_bits#

Number of bits interacted with.

property num_w#

Number of wasm wire in the op

property output_widths#

Widths of output integers.

property wasm_uid#

Wasm module id.

class pytket.circuit.MultiBitOp#

An operation to apply a classical op multiple times in parallel.

__init__(self: pytket.circuit.MultiBitOp, op: pytket.circuit.ClassicalEvalOp, multiplier: int) None#

Construct from a basic operation and a multiplier.

property basic_op#

Underlying bitwise op.

class pytket.circuit.SetBitsOp#

An operation to set the values of Bits to some constants.

__init__(self: pytket.circuit.SetBitsOp, values: Sequence[bool]) None#

Construct from a table of values.

property values#

The values to set bits to.

class pytket.circuit.ClassicalEvalOp#

Evaluatable classical operation.

__init__(*args, **kwargs)#
class pytket.circuit.ClassicalOp#

Classical operation.

__init__(*args, **kwargs)#
property n_input_outputs#

Number of pure input/output arguments.

property n_inputs#

Number of pure inputs.

property n_outputs#

Number of pure outputs.

class pytket.circuit.CopyBitsOp#

An operation to copy the values of Bits to other Bits.

__init__(*args, **kwargs)#
class pytket.circuit.RangePredicateOp#

A predicate defined by a range of values in binary encoding.

__init__(self: pytket.circuit.RangePredicateOp, width: int, upper: int, lower: int) None#

Construct from a bit width, an upper bound and a lower bound.

property lower#

Inclusive lower bound.

property upper#

Inclusive upper bound.

class pytket.circuit.MultiplexorBox#

A user-defined multiplexor (i.e. uniformly controlled operations) specified by a map from bitstrings to Op sor a list of bitstring-Op s pairs

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.MultiplexorBox, bistring_to_op_list: Sequence[tuple[Sequence[bool], pytket.circuit.Op]]) -> None

Construct from a list of bitstring-Op spairs

Parameters:

bitstring_to_op_list – List of bitstring-Op spairs

  1. __init__(self: pytket.circuit.MultiplexorBox, op_map: dict[tuple[bool, …], pytket.circuit.Op]) -> None

Construct from a map from bitstrings to Op s

Parameters:

op_map – Map from bitstrings to Op s

get_bitstring_op_pair_list(self: pytket.circuit.MultiplexorBox) list[tuple[list[bool], pytket.circuit.Op]]#
Returns:

the underlying bistring-op pairs

get_circuit(self: pytket.circuit.MultiplexorBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_op_map(self: pytket.circuit.MultiplexorBox) dict[tuple[bool, ...], pytket.circuit.Op]#
Returns:

the underlying op map

class pytket.circuit.MultiplexedRotationBox#

A user-defined multiplexed rotation gate (i.e. uniformly controlled single-axis rotations) specified by a map from bitstrings to Op sor a list of bitstring-Op s pairs. Implementation based on arxiv.org/abs/quant-ph/0410066. The decomposed circuit has at most 2^k single-qubit rotations, 2^k CX gates, and two additional H gates if the rotation axis is X. k is the number of control qubits.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.MultiplexedRotationBox, bistring_to_op_list: Sequence[tuple[Sequence[bool], pytket.circuit.Op]]) -> None

Construct from a list of bitstring-Op spairs

All Op s must share the same single-qubit rotation type: Rx, Ry, or Rz.

Parameters:

bitstring_to_op_list – List of bitstring-Op spairs

  1. __init__(self: pytket.circuit.MultiplexedRotationBox, op_map: dict[tuple[bool, …], pytket.circuit.Op]) -> None

Construct from a map from bitstrings to Op s.All Op s must share the same single-qubit rotation type: Rx, Ry, or Rz.

Parameters:

op_map – Map from bitstrings to Op s

  1. __init__(self: pytket.circuit.MultiplexedRotationBox, angles: Sequence[float], axis: pytket.circuit.OpType) -> None

Construct from a list of angles and the rotation axis.

Parameters:
  • angles – List of rotation angles in half-turns. angles[i] is the angle activated by the binary representation of i

  • axisOpType.Rx, OpType.Ry or OpType.Rz

get_bitstring_op_pair_list(self: pytket.circuit.MultiplexedRotationBox) list[tuple[list[bool], pytket.circuit.Op]]#
Returns:

the underlying bistring-op pairs

get_circuit(self: pytket.circuit.MultiplexedRotationBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_op_map(self: pytket.circuit.MultiplexedRotationBox) dict[tuple[bool, ...], pytket.circuit.Op]#
Returns:

the underlying op map

class pytket.circuit.MultiplexedU2Box#

A user-defined multiplexed U2 gate (i.e. uniformly controlled U2 gate) specified by a map from bitstrings to Op sor a list of bitstring-Op s pairsImplementation based on arxiv.org/abs/quant-ph/0410066. The decomposed circuit has at most 2^k single-qubit gates, 2^k -1 CX gates, and a k+1 qubit DiagonalBox at the end. k is the number of control qubits.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.MultiplexedU2Box, bistring_to_op_list: Sequence[tuple[Sequence[bool], pytket.circuit.Op]], impl_diag: bool = True) -> None

Construct from a list of bitstring-Op spairs

Only supports single qubit unitary gate types and Unitary1qBox.

Parameters:
  • op_map – List of bitstring-Op spairs

  • impl_diag – Whether to implement the final diagonal gate, default to True.

  1. __init__(self: pytket.circuit.MultiplexedU2Box, op_map: dict[tuple[bool, …], pytket.circuit.Op], impl_diag: bool = True) -> None

Construct from a map from bitstrings to Op s.Only supports single qubit unitary gate types and Unitary1qBox.

Parameters:
  • op_map – Map from bitstrings to Op s

  • impl_diag – Whether to implement the final diagonal gate, default to True.

get_bitstring_op_pair_list(self: pytket.circuit.MultiplexedU2Box) list[tuple[list[bool], pytket.circuit.Op]]#
Returns:

the underlying bistring-op pairs

get_circuit(self: pytket.circuit.MultiplexedU2Box) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_impl_diag(self: pytket.circuit.MultiplexedU2Box) bool#
Returns:

flag indicating whether to implement the final diagonal gate.

get_op_map(self: pytket.circuit.MultiplexedU2Box) dict[tuple[bool, ...], pytket.circuit.Op]#
Returns:

the underlying op map

class pytket.circuit.MultiplexedTensoredU2Box#

A user-defined multiplexed tensor product of U2 gates specified by a map from bitstrings to lists of Op sor a list of bitstring-list(Op s) pairs. A box with k control qubits and t target qubits is implemented as t k-controlled multiplexed-U2 gates with their diagonal components merged and commuted to the end. The resulting circuit contains t non-diagonal components of the multiplexed-U2 decomposition, t k-controlled multiplexed-Rz boxes, and a k-qubit DiagonalBox at the end. The total CX count is at most 2^k(2t+1)-t-2.

__init__(*args, **kwargs)#

Overloaded function.

  1. __init__(self: pytket.circuit.MultiplexedTensoredU2Box, bistring_to_op_list: Sequence[tuple[Sequence[bool], Sequence[pytket.circuit.Op]]]) -> None

Construct from a list of bitstring-Op spairs

Only supports single qubit unitary gate types and Unitary1qBox.

Parameters:

bitstring_to_op_list – List of bitstring-List of Op s pairs

  1. __init__(self: pytket.circuit.MultiplexedTensoredU2Box, op_map: dict[tuple[bool, …], Sequence[pytket.circuit.Op]]) -> None

Construct from a map from bitstrings to equal-sized lists of Op s. Only supports single qubit unitary gate types and Unitary1qBox.

Parameters:

op_map – Map from bitstrings to lists of Op s

get_bitstring_op_pair_list(self: pytket.circuit.MultiplexedTensoredU2Box) list[tuple[list[bool], list[pytket.circuit.Op]]]#
Returns:

the underlying bistring-op pairs

get_circuit(self: pytket.circuit.MultiplexedTensoredU2Box) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_op_map(self: pytket.circuit.MultiplexedTensoredU2Box) dict[tuple[bool, ...], list[pytket.circuit.Op]]#
Returns:

the underlying op map

class pytket.circuit.StatePreparationBox#

A box for preparing quantum states using multiplexed-Ry and multiplexed-Rz gates. Implementation based on Theorem 9 of arxiv.org/abs/quant-ph/0406176. The decomposed circuit has at most 2*(2^n-2) CX gates, and 2^n-2 CX gates if the coefficients are all real.

__init__(self: pytket.circuit.StatePreparationBox, statevector: numpy.ndarray[numpy.complex128[m, 1]], is_inverse: bool = False, with_initial_reset: bool = False) None#

Construct from a statevector

Parameters:
  • statevector – normalised statevector

  • is_inverse – whether to implement the dagger of the state preparation circuit, default to false

  • with_initial_reset – whether to explicitly set the state to zero initially (by default the initial zero state is assumed and no explicit reset is applied)

get_circuit(self: pytket.circuit.StatePreparationBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_statevector(self: pytket.circuit.StatePreparationBox) numpy.ndarray[numpy.complex128[m, 1]]#
Returns:

the statevector

is_inverse(self: pytket.circuit.StatePreparationBox) bool#
Returns:

flag indicating whether to implement the dagger of the state preparation circuit

with_initial_reset(self: pytket.circuit.StatePreparationBox) bool#
Returns:

flag indicating whether the qubits are explicitly set to the zero state initially

class pytket.circuit.DiagonalBox#

A box for synthesising a diagonal unitary matrix into a sequence of multiplexed-Rz gates. Implementation based on Theorem 7 of arxiv.org/abs/quant-ph/0406176. The decomposed circuit has at most 2^n-2 CX gates.

__init__(self: pytket.circuit.DiagonalBox, diagonal: numpy.ndarray[numpy.complex128[m, 1]], upper_triangle: bool = True) None#

Construct from the diagonal entries of the unitary operator. The size of the vector must be 2^n where n is a positive integer.

Parameters:
  • diagonal – diagonal entries

  • upper_triangle – indicates whether the multiplexed-Rz gates take the shape of an upper triangle or a lower triangle. Default to true.

get_circuit(self: pytket.circuit.DiagonalBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_diagonal(self: pytket.circuit.DiagonalBox) numpy.ndarray[numpy.complex128[m, 1]]#
Returns:

the statevector

is_upper_triangle(self: pytket.circuit.DiagonalBox) bool#
Returns:

the upper_triangle flag

class pytket.circuit.ConjugationBox#

A box to express computations that follow the compute-action-uncompute pattern.

__init__(self: pytket.circuit.ConjugationBox, compute: pytket.circuit.Op, action: pytket.circuit.Op, uncompute: pytket.circuit.Op | None = None) None#

Construct from operations that perform compute, action, and uncompute. All three operations need to be quantum and have the same size.

Parameters:
  • compute – the compute operation

  • action – the action operation

  • uncompute – optional uncompute operation, default to compute.dagger(). If provided, the user needs to make sure that uncompute.dagger() and compute have the same unitary.

get_action(self: pytket.circuit.ConjugationBox) pytket.circuit.Op#
Returns:

the action operation

get_circuit(self: pytket.circuit.ConjugationBox) pytket.circuit.Circuit#
Returns:

the Circuit described by the box

get_compute(self: pytket.circuit.ConjugationBox) pytket.circuit.Op#
Returns:

the compute operation

get_uncompute(self: pytket.circuit.ConjugationBox) pytket.circuit.Op | None#
Returns:

the uncompute operation. Returns None if the default compute.dagger() is used

class pytket.circuit.ResourceBounds#

Structure holding a minimum and maximum value of some resource, where both values are unsigned integers.

__init__(self: pytket.circuit.ResourceBounds, min: int, max: int) None#

Constructs a ResourceBounds object.

Parameters:
  • min – minimum value

  • max – maximum value

get_max(self: pytket.circuit.ResourceBounds) int#
Returns:

the maximum value

get_min(self: pytket.circuit.ResourceBounds) int#
Returns:

the minimum value

class pytket.circuit.ResourceData#

An object holding resource data for use in a DummyBox.

The object holds several fields representing minimum and maximum values for certain resources. The absence of an OpType in one of these fields is interpreted as the absence of gates of that type in the (imagined) circuit.

See Circuit.get_resources() for how to use this data.

__init__(self: pytket.circuit.ResourceData, op_type_count: dict[pytket.circuit.OpType, pytket.circuit.ResourceBounds], gate_depth: pytket.circuit.ResourceBounds, op_type_depth: dict[pytket.circuit.OpType, pytket.circuit.ResourceBounds], two_qubit_gate_depth: pytket.circuit.ResourceBounds) None#

Constructs a ResourceData object.

Parameters:
  • op_type_count – dictionary of counts of selected OpType

  • gate_depth – overall gate depth

  • op_type_depth – dictionary of depths of selected OpType

  • two_qubit_gate_depth – overall two-qubit-gate depth

__repr__(self: pytket.circuit.ResourceData) str#
get_gate_depth(self: pytket.circuit.ResourceData) pytket.circuit.ResourceBounds#
Returns:

bounds on the gate depth

get_op_type_count(self: pytket.circuit.ResourceData) dict[pytket.circuit.OpType, pytket.circuit.ResourceBounds]#
Returns:

bounds on the op type count

get_op_type_depth(self: pytket.circuit.ResourceData) dict[pytket.circuit.OpType, pytket.circuit.ResourceBounds]#
Returns:

bounds on the op type depth

get_two_qubit_gate_depth(self: pytket.circuit.ResourceData) pytket.circuit.ResourceBounds#
Returns:

bounds on the two-qubit-gate depth

class pytket.circuit.DummyBox#

A placeholder operation that holds resource data. This box type cannot be decomposed into a circuit. It only serves to record resource data for a region of a circuit: for example, upper and lower bounds on gate counts and depth. A circuit containing such a box cannot be executed.

__init__(self: pytket.circuit.DummyBox, n_qubits: int, n_bits: int, resource_data: pytket.circuit.ResourceData) None#

Construct a new instance from some resource data.

get_n_bits(self: pytket.circuit.DummyBox) int#
Returns:

the number of bits covered by the box

get_n_qubits(self: pytket.circuit.DummyBox) int#
Returns:

the number of qubits covered by the box

get_resource_data(self: pytket.circuit.DummyBox) pytket.circuit.ResourceData#
Returns:

the associated resource data