|
Maestro 0.2.11
Unified interface for quantum circuit simulation
|
Circuit class for holding the sequence of operations that can be compared with another circuit. More...
#include <Circuit.h>
Public Types | |
| using | allocator_type |
| using | BaseClass = Circuit<Time> |
| The base class type. | |
| using | BitMapping |
| The (qu)bit mapping for remapping. | |
| using | const_iterator |
| using | const_pointer |
| using | const_reference |
| using | const_reverse_iterator |
| using | difference_type |
| using | ExecuteResults |
| The results of the execution of the circuit. | |
| using | iterator |
| using | Operation = IOperation<Time> |
| The operation type. | |
| using | OperationPtr = std::shared_ptr<Operation> |
| The shared pointer to the operation type. | |
| using | OperationsVector |
| The vector of operations. | |
| using | pointer |
| using | reference |
| using | reverse_iterator |
| using | size_type |
| using | value_type |
Public Member Functions | |
| ComparableCircuit (const BaseClass &circ) | |
| Construct a new ComparableCircuit object. | |
| ComparableCircuit (const OperationsVector &ops={}) | |
| Construct a new ComparableCircuit object. | |
| bool | ActsOnlyOnAdjacentQubits () const |
| Checks if the circuit has only operations that act on adjacent qubits. | |
| void | AddCircuit (const std::shared_ptr< Circuit< Types::time_type > > &circuit) |
| Adds operations from another circuit to the circuit. | |
| void | AddOperation (const OperationPtr &op) |
| Adds an operation to the circuit. | |
| void | AddOperations (const OperationsVector &ops) |
| Adds operations to the circuit. | |
| void | AddResetsAtBeginningIfNeeded (Types::time_type delay=0) |
| Add resets at the beginning of the circuit. | |
| void | AddResetsIfNeeded (Types::time_type delay=0) |
| Add resets at the end of the circuit. | |
| std::vector< size_t > | AffectedBits () const override |
| Returns the affected bits. | |
| Types::qubits_vector | AffectedQubits () const override |
| Returns the affected qubits. | |
| iterator | begin () noexcept |
| Get the begin iterator for the operations. | |
| bool | CanAffectQuantumState () const override |
| Find if the circuit can affect the quantum state. | |
| const_iterator | cbegin () const noexcept |
| Get the const begin iterator for the operations. | |
| const_iterator | cend () const noexcept |
| Get the const end iterator for the operations. | |
| void | Clear () |
| Clears the operations from the circuit. | |
| double | CliffordPercentage () const |
| Get the percentage of Clifford operations in the circuit. | |
| OperationPtr | Clone () const override |
| Get a shared pointer to a clone of this object. | |
| OperationPtr | CloneFlyweight () const |
| Get a shared pointer to a clone of this object, but without cloning the operations. | |
| void | ConvertForCutting () |
| Converts the circuit for distributed computing. | |
| void | ConvertForDistribution () |
| Converts the circuit for distributed computing. | |
| const_reverse_iterator | crbegin () const noexcept |
| Get the const reverse begin iterator for the operations. | |
| const_reverse_iterator | crend () const noexcept |
| Get the const reverse end iterator for the operations. | |
| auto | empty () const |
| Check if the circuit is empty. | |
| iterator | end () noexcept |
| Get the end iterator for the operations. | |
| void | EnsureProperOrderForMeasurements () |
| void | Execute (const std::shared_ptr< Simulators::ISimulator > &sim, OperationState &state) const override |
| Execute the circuit on the given simulator. | |
| void | ExecuteMeasurements (const std::shared_ptr< Simulators::ISimulator > &sim, OperationState &state, const std::vector< bool > &executedOps) const |
| Execute the measurement operations from the circuit on the given simulator. | |
| std::vector< bool > | ExecuteNonMeasurements (const std::shared_ptr< Simulators::ISimulator > &sim, OperationState &state) const |
| Execute the non-measurements operations from the circuit on the given simulator. | |
| bool | GetApproximateParamsCheck () const |
| Gets whether to check approximate equality of gate parameters. | |
| std::set< size_t > | GetBits () const |
| Returns the classical bits affected by the operations. | |
| std::shared_ptr< Circuit< Types::time_type > > | GetCircuitCut (Types::qubit_t startQubit, Types::qubit_t endQubit) const |
| Get the circuit cut. | |
| std::unordered_set< Types::qubit_t > | GetCliffordQubits () const |
| Get the qubits that are acted on by Clifford operations. | |
| Types::time_type | GetDelay () const |
| Get the delay of the operation. | |
| std::pair< std::vector< size_t >, std::vector< Types::time_type > > | GetDepth () const |
| Get circuit depth. | |
| std::unordered_map< size_t, OperationPtr > | GetFirstOperationsOnQubits () const |
| Returns the first operations on circuit's qubits. | |
| std::shared_ptr< MeasurementOperation< Types::time_type > > | GetLastMeasurements (const std::vector< bool > &executedOps, bool sort=true) const |
| std::unordered_map< size_t, OperationPtr > | GetLastOperationsOnQubits () const |
| Returns the last operations on circuit's qubits. | |
| size_t | GetMaxCbitIndex () const |
| Returns the max classical bit id for all operations. | |
| std::pair< size_t, Types::time_type > | GetMaxDepth () const |
| Get max circuit depth. | |
| size_t | GetMaxQubitIndex () const |
| Returns the max qubit id for all operations. | |
| size_t | GetMinCbitIndex () const |
| Returns the min classical bit id for all operations. | |
| size_t | GetMinQubitIndex () const |
| Returns the min qubit id for all operations. | |
| size_t | GetNumberOfOperations () const |
| Get the number of operations in the circuit. | |
| OperationPtr | GetOperation (size_t pos) const |
| Get an operation at a given position. | |
| const OperationsVector & | GetOperations () const |
| Get the operations in the circuit. | |
| double | GetParamsEpsilon () const |
| Gets the epsilon used for checking approximate equality of gate parameters. | |
| std::shared_ptr< IOperation< Types::time_type > > | getptr () |
| Get a shared pointer to this object. | |
| std::set< size_t > | GetQubits () const |
| Returns the qubits affected by the operations. | |
| OperationType | GetType () const override |
| Get the type of the circuit. | |
| bool | HasConditionalOperations () const |
| Checks if the circuit has clasically conditional operations. | |
| bool | HasOpsAfterMeasurements () const |
| Checks if the circuit has measurements that are followed by operations that affect the measured qubits. | |
| bool | IsBranching () const override |
| Checks if any operation is a branching one. | |
| bool | IsClifford () const override |
| Checks if the circuit is a Clifford circuit. | |
| virtual bool | IsConditional () const |
| Find if the operation is a conditional operation. | |
| bool | IsForest () const |
| Checks if the circuit is a forest circuit. | |
| void | MoveMeasurementsAndResets () |
| Move the measurements and resets closer to the beginning of the circuit. | |
| bool | NeedsEntanglementForDistribution () const override |
| Find if the circuit needs entanglement for distribution. | |
| bool | operator!= (const BaseClass &rhs) const |
| Comparison operator. | |
| ComparableCircuit & | operator= (const BaseClass &circ) |
| Assignment operator. | |
| bool | operator== (const BaseClass &rhs) const |
| Comparison operator. | |
| auto & | operator[] (size_t pos) |
| Get the operation at a given position. | |
| void | Optimize (bool optimizeRotationGates=true) |
| Circuit optimization. | |
| reverse_iterator | rbegin () noexcept |
| Get the reverse begin iterator for the operations. | |
| OperationPtr | Remap (const BitMapping &qubitsMap, const BitMapping &bitsMap={}) const override |
| Get a shared pointer to a circuit remapped. | |
| virtual std::shared_ptr< IOperation< Types::time_type > > | Remap (const std::unordered_map< Types::qubit_t, Types::qubit_t > &qubitsMap, const std::unordered_map< Types::qubit_t, Types::qubit_t > &bitsMap={}) const =0 |
| Get a shared pointer to a remapped operation. | |
| std::shared_ptr< Circuit< Types::time_type > > | RemapToContinuous (BitMapping &newQubitsMap, BitMapping &reverseBitsMap, size_t &nrQubits, size_t &nrCbits) const |
| Get a shared pointer to a circuit remapped to a continuous interval starting from zero. | |
| std::shared_ptr< Circuits::Circuit< Types::time_type > > | RemoveExecutedOperations (std::vector< bool > &executedOps) const |
| Returns a new circuit with the operations that were not yet executed. | |
| reverse_iterator | rend () noexcept |
| Get the reverse end iterator for the operations. | |
| void | ReplaceOperation (size_t index, const OperationPtr &op) |
| Replaces an operation in the circuit. | |
| void | resize (size_t size) |
| Resizes the circuit. | |
| void | SetApproximateParamsCheck (bool check) |
| Sets whether to check approximate equality of gate parameters. | |
| void | SetDelay (Types::time_type d) |
| Set the delay of the operation. | |
| void | SetOperations (const OperationsVector &ops) |
| Set the operations in the circuit. | |
| void | SetParamsEpsilon (double eps) |
| Sets the epsilon used for checking approximate equality of gate parameters. | |
| auto | size () const |
| Get the number of operations in the circuit. | |
| std::vector< std::shared_ptr< Circuit< Types::time_type > > > | SplitCircuit () const |
| Splits a circuit that has disjoint subcircuits in it into separate circuits. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Types::time_type > > > | ToLayers () const |
| Converts the circuit to layers. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Types::time_type > > > | ToLayersNoClone () const |
| Converts the circuit to layers. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Types::time_type > > > | ToMultipleQubitsLayers () const |
| Converts the circuit to layers oriented on multiple qubit gates. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Types::time_type > > > | ToMultipleQubitsLayersNoClone () const |
| Converts the circuit to layers oriented on multiple qubit gates. | |
Static Public Member Functions | |
| static void | AccumulateResults (ExecuteResults &results, const ExecuteResults &newResults) |
| Accumulate the results of a circuit execution to already existing results. | |
| static void | AccumulateResultsWithRemapBack (ExecuteResults &results, const ExecuteResults &newResults, const BitMapping &bitsMap={}, bool ignoreNotMapped=true, size_t sz=0) |
| Accumulate the results of a circuit execution to already existing results with remapping. | |
| static std::shared_ptr< Circuits::Circuit< Types::time_type > > | LayersToCircuit (const std::vector< std::shared_ptr< Circuits::Circuit< Types::time_type > > > &layers) |
| Converts the layers back to a circuit. | |
| static ExecuteResults | RemapResultsBack (const ExecuteResults &results, const BitMapping &bitsMap={}, bool ignoreNotMapped=false, size_t sz=0) |
| Map back the results for a remapped circuit. | |
Circuit class for holding the sequence of operations that can be compared with another circuit.
Contains a sequence of operations that can be executed, supplying a function that allows executing them in a simulator. Allows adding operations and converting them to prepare the circuit for distributed computing.
| Time | The time type used for operation timing. |
|
inherited |
| using Circuits::ComparableCircuit< Time >::BaseClass = Circuit<Time> |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
| using Circuits::ComparableCircuit< Time >::Operation = IOperation<Time> |
| using Circuits::ComparableCircuit< Time >::OperationPtr = std::shared_ptr<Operation> |
| using Circuits::ComparableCircuit< Time >::OperationsVector |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inline |
Construct a new ComparableCircuit object.
Constructs a new ComparableCircuit object with the given operations.
| ops | The operations to add to the circuit. |
Definition at line 2734 of file Circuit.h.
Referenced by operator=(), and operator==().
|
inline |
Construct a new ComparableCircuit object.
Constructs a new ComparableCircuit object with the given Circuit.
| circuit | The circuit from where to add the operations to the comparable circuit. |
Definition at line 2744 of file Circuit.h.
References Circuits::Circuit< Types::time_type >::GetOperations().
|
inlinestaticinherited |
Accumulate the results of a circuit execution to already existing results.
Accumulates the results of a circuit execution to already existing results.
| results | The existing results to accumulate to. |
| newResults | The new results to add to the existing results. |
|
inlinestaticinherited |
Accumulate the results of a circuit execution to already existing results with remapping.
Accumulates the results of a circuit execution to already existing results with remapping back.
| results | The existing results to accumulate to. |
| newResults | The new results to add to the existing results. |
| bitsMap | The map of classical bits to remap. |
| ignoreNotMapped | If true, the results that are not in the map will be ignored. |
| sz | The size of the results vector. |
|
inlineinherited |
Checks if the circuit has only operations that act on adjacent qubits.
Checks if the circuit has only operations that act on adjacent qubits. Can be useful in picking up a tensor network contractor, for example. Also such a circuit is easier to simulate in a MPS simulator, since swap gates are not needed to be added to bring up the qubits next to each other before applying a two qubits gate.
|
inlineinherited |
|
inlineinherited |
Adds an operation to the circuit.
Adds an operation to the circuit.
| op | The operation to add. |
|
inlineinherited |
Adds operations to the circuit.
Adds operations to the circuit.
| ops | The operations to add. |
|
inlineinherited |
|
inlineinherited |
|
inlineoverridevirtualinherited |
Returns the affected bits.
Returns the affected classical bits.
Reimplemented from Circuits::IOperation< Types::time_type >.
Definition at line 631 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlineoverridevirtualinherited |
Returns the affected qubits.
Returns the affected qubits by the operation.
Reimplemented from Circuits::IOperation< Types::time_type >.
Definition at line 614 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlinenoexceptinherited |
|
inlineoverridevirtualinherited |
Find if the circuit can affect the quantum state.
Returns true if the circuit can affect the quantum state, false otherwise.
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inlinenoexceptinherited |
|
inlinenoexceptinherited |
|
inlineinherited |
|
inlineinherited |
Get the percentage of Clifford operations in the circuit.
Returns the percentage of Clifford operations in the circuit. Considers gates as Clifford if they are supported by the Clifford simulator.
|
inlineoverridevirtualinherited |
Get a shared pointer to a clone of this object.
Returns a shared pointer to a copy of this object.
Implements Circuits::IOperation< Types::time_type >.
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlinenoexceptinherited |
|
inlinenoexceptinherited |
|
inlineinherited |
|
inlinenoexceptinherited |
|
inlineinherited |
|
inlineoverridevirtualinherited |
Execute the circuit on the given simulator.
Executes the circuit on the given simulator.
| sim | The simulator to execute the circuit on. |
| state | The classical state containing the classical bits. |
Implements Circuits::IOperation< Types::time_type >.
|
inlineinherited |
Execute the measurement operations from the circuit on the given simulator.
Execute the measurements operations from the circuit on the given simulator.
| sim | The simulator to execute the circuit on. |
| state | The classical state containing the classical bits. |
|
inlineinherited |
Execute the non-measurements operations from the circuit on the given simulator.
Execute the non-measurements operations from the circuit on the given simulator.
| sim | The simulator to execute the circuit on. |
| state | The classical state containing the classical bits. |
|
inline |
|
inlineinherited |
|
inlineinherited |
Get the circuit cut.
Cuts out a circuit from the current circuit, starting from the startQubit and ending at the endQubit. Throws an exception if there is an operation that affects both qubits inside and outside of the specified interval. The returned circuit contains only operations that act on the qubits in the specified interval.
| startQubit | The start qubit of the interval. |
| endQubit | The end qubit of the interval. |
|
inlineinherited |
Get the qubits that are acted on by Clifford operations.
Returns the qubits that are acted on only by Clifford operations. Considers gates as Clifford if they are supported by the Clifford simulator.
|
inlineinherited |
Get the delay of the operation.
Returns the delay due of the execution time of the operation.
Definition at line 497 of file Operations.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlineinherited |
Get circuit depth.
Returns the depth of the circuit as a pair of the depth and an estimate of time cost for each qubit. Should be considered only as an estimate.
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
Get an operation at a given position.
Returns the operation at the given position.
| pos | The position of the operation to get. |
Definition at line 1543 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlineinherited |
Get the operations in the circuit.
Returns the operations in the circuit.
Definition at line 173 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::ComparableCircuit().
|
inline |
|
inlineinherited |
Get a shared pointer to this object.
Returns a shared pointer to this object. The object needs to be already wrapped in a shared pointer.
Definition at line 487 of file Operations.h.
|
inlineinherited |
Returns the qubits affected by the operations.
Returns the qubits affected by the operations. They might not cover all qubits, there might be gaps. In such cases a remapping might be needed, for example in a scheduler.
|
inlineoverridevirtualinherited |
Get the type of the circuit.
Returns the type of the circuit.
Reimplemented from Circuits::IOperation< Types::time_type >.
Definition at line 112 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlineinherited |
|
inlineinherited |
Checks if the circuit has measurements that are followed by operations that affect the measured qubits.
Checks if the circuit has measurements that are followed by operations that affect the measured qubits.
|
inlineoverridevirtualinherited |
Checks if any operation is a branching one.
Checks if any operation is a branching one, meaning that it can lead to splitting paths (relevant for the path integral simulator).
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inlineoverridevirtualinherited |
Checks if the circuit is a Clifford circuit.
Checks if the circuit is a Clifford circuit. Considers gates as Clifford if they are supported by the Clifford simulator.
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inlinevirtualinherited |
Find if the operation is a conditional operation.
Returns true if the operation is conditional, false otherwise.
Definition at line 458 of file Operations.h.
|
inlineinherited |
|
inlinestaticinherited |
Converts the layers back to a circuit.
The layers are converted back to a circuit by joining the individual circuits into a single one.
| layers | The layers to convert. |
|
inlineinherited |
|
inlineoverridevirtualinherited |
Find if the circuit needs entanglement for distribution.
Returns true if the circuit needs entanglement for distribution, false otherwise.
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inline |
|
inline |
Assignment operator.
Assigns the operations from the given circuit to this circuit.
| circ | The circuit from where to add the operations to this circuit. |
Definition at line 2753 of file Circuit.h.
References ComparableCircuit(), Circuits::Circuit< Time >::GetOperations(), and Circuits::Circuit< Time >::SetOperations().
|
inline |
Comparison operator.
Compares two circuits for equality.
| rhs | The circuit to compare to. |
Definition at line 2765 of file Circuit.h.
References ComparableCircuit(), Circuits::Circuit< Time >::AddOperation(), Circuits::Circuit< Types::time_type >::AffectedBits(), Circuits::Circuit< Types::time_type >::AffectedQubits(), Circuits::Circuit< Types::time_type >::GetDelay(), Circuits::IQuantumGate< Time >::GetGateType(), Circuits::Circuit< Types::time_type >::GetOperation(), Circuits::Circuit< Time >::GetOperations(), Circuits::IQuantumGate< Time >::GetParams(), Circuits::Reset< Time >::GetResetTargets(), Circuits::Circuit< Types::time_type >::GetType(), Circuits::kConditionalGate, Circuits::kConditionalMeasurement, Circuits::kConditionalRandomGen, Circuits::kGate, Circuits::kMeasurement, Circuits::kNoOp, Circuits::kRandomGen, Circuits::kReset, SetApproximateParamsCheck(), and Circuits::Circuit< Types::time_type >::size().
|
inlineinherited |
|
inlineinherited |
|
inlinenoexceptinherited |
|
inlineoverrideinherited |
Get a shared pointer to a circuit remapped.
Returns a shared pointer to a copy of the circuit with qubits and classical bits changed according to the provided maps.
| qubitsMap | The map of qubits to remap. |
| bitsMap | The map of classical bits to remap. |
|
pure virtualinherited |
Get a shared pointer to a remapped operation.
Returns a shared pointer to a copy of the operation with qubits and classical bits changed according to the provided maps.
| qubitsMap | The map of qubits to remap. |
| bitsMap | The map of classical bits to remap. |
|
inlinestaticinherited |
Map back the results for a remapped circuit.
Maps back the results for a remapped circuit, using the provided map. The results are the results of the execution of the circuit without remapping.
| results | The results to map back. |
| bitsMap | The map of classical bits to remap. |
| ignoreNotMapped | If true, the results that are not in the map will be ignored. |
| sz | The size of the results vector. |
|
inlineinherited |
Get a shared pointer to a circuit remapped to a continuous interval starting from zero.
Returns a shared pointer to a copy of the circuit with qubits and classical bits changed according to the provided maps.
| bitsMap | The map of classical bits, to allow remapping the results back to the original circuit results. |
|
inlineinherited |
Returns a new circuit with the operations that were not yet executed.
The parameter is modified to reflect the newly created circuit, which contains only the operations that were not yet executed.
| executedOps | A vector of bools indicating which operations were executed. |
|
inlinenoexceptinherited |
|
inlineinherited |
Replaces an operation in the circuit.
Replaces an operation in the circuit.
| index | The index of the operation to replace. |
| op | The operation to replace with. |
|
inlineinherited |
|
inline |
Sets whether to check approximate equality of gate parameters.
Sets whether to check approximate equality of gate parameters.
| check | Whether to check approximate equality of gate parameters. |
Definition at line 2898 of file Circuit.h.
Referenced by operator==().
|
inlineinherited |
Set the delay of the operation.
Sets the delay due of the execution time of the operation.
| d | The delay of the operation. |
Definition at line 505 of file Operations.h.
|
inlineinherited |
Set the operations in the circuit.
Sets the operations in the circuit.
| ops | The operations to set. |
|
inline |
|
inlineinherited |
Get the number of operations in the circuit.
Returns the number of operations in the circuit.
Definition at line 2514 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
Converts the circuit to layers oriented on multiple qubit gates.
The circuit is split in layers, each layer being a separate circuit. Operations are cloned. It's not as ToLayers above, the order of the operations in a layer matters. If the one qubit gates would be contracted into the ones on more than one qubit, then it would be the situation of normal layers.
|
inlineinherited |
Converts the circuit to layers oriented on multiple qubit gates.
The circuit is split in layers, each layer being a separate circuit. Operations are not cloned. It's not as ToLayers above, the order of the operations in a layer matters. If the one qubit gates would be contracted into the ones on more than one qubit, then it would be the situation of normal layers.