|
Maestro 0.2.11
Unified interface for quantum circuit simulation
|
Circuit class for holding the sequence of operations. More...
#include <Circuit.h>
Public Types | |
| using | allocator_type = typename OperationsVector::allocator_type |
| using | BitMapping |
| The (qu)bit mapping for remapping. | |
| using | const_iterator = typename OperationsVector::const_iterator |
| using | const_pointer = typename OperationsVector::const_pointer |
| using | const_reference = typename OperationsVector::const_reference |
| using | const_reverse_iterator |
| using | difference_type = typename OperationsVector::difference_type |
| using | ExecuteResults |
| The results of the execution of the circuit. | |
| using | iterator = typename OperationsVector::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 = typename OperationsVector::pointer |
| using | reference = typename OperationsVector::reference |
| using | reverse_iterator = typename OperationsVector::reverse_iterator |
| using | size_type = typename OperationsVector::size_type |
| using | value_type = typename OperationsVector::value_type |
Public Member Functions | |
| Circuit (const OperationsVector &ops={}) | |
| Construct a new Circuit object. | |
| bool | ActsOnlyOnAdjacentQubits () const |
| Checks if the circuit has only operations that act on adjacent qubits. | |
| void | AddCircuit (const std::shared_ptr< Circuit< Time > > &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 (Time delay=0) |
| Add resets at the beginning of the circuit. | |
| void | AddResetsIfNeeded (Time 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. | |
| std::set< size_t > | GetBits () const |
| Returns the classical bits affected by the operations. | |
| std::shared_ptr< Circuit< Time > > | 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< Time > > | 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< Time > > | 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, Time > | 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. | |
| 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. | |
| auto & | operator[] (size_t pos) |
| Get the operation at a given position. | |
| const auto & | operator[] (size_t pos) const |
| 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< Time > > | 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< Time > > | 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 | SetDelay (Types::time_type d) |
| Set the delay of the operation. | |
| void | SetOperations (const OperationsVector &ops) |
| Set the operations in the circuit. | |
| auto | size () const |
| Get the number of operations in the circuit. | |
| std::vector< std::shared_ptr< Circuit< Time > > > | SplitCircuit () const |
| Splits a circuit that has disjoint subcircuits in it into separate circuits. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Time > > > | ToLayers () const |
| Converts the circuit to layers. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Time > > > | ToLayersNoClone () const |
| Converts the circuit to layers. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Time > > > | ToMultipleQubitsLayers () const |
| Converts the circuit to layers oriented on multiple qubit gates. | |
| std::vector< std::shared_ptr< Circuits::Circuit< Time > > > | 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< Time > > | LayersToCircuit (const std::vector< std::shared_ptr< Circuits::Circuit< Time > > > &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.
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. |
| using Circuits::Circuit< Time >::allocator_type = typename OperationsVector::allocator_type |
| using Circuits::Circuit< Time >::BitMapping |
The (qu)bit mapping for remapping.
| using Circuits::Circuit< Time >::const_iterator = typename OperationsVector::const_iterator |
| using Circuits::Circuit< Time >::const_pointer = typename OperationsVector::const_pointer |
| using Circuits::Circuit< Time >::const_reference = typename OperationsVector::const_reference |
| using Circuits::Circuit< Time >::const_reverse_iterator |
| using Circuits::Circuit< Time >::difference_type = typename OperationsVector::difference_type |
| using Circuits::Circuit< Time >::ExecuteResults |
| using Circuits::Circuit< Time >::iterator = typename OperationsVector::iterator |
| using Circuits::Circuit< Time >::Operation = IOperation<Time> |
| using Circuits::Circuit< Time >::OperationPtr = std::shared_ptr<Operation> |
| using Circuits::Circuit< Time >::OperationsVector |
| using Circuits::Circuit< Time >::pointer = typename OperationsVector::pointer |
| using Circuits::Circuit< Time >::reference = typename OperationsVector::reference |
| using Circuits::Circuit< Time >::reverse_iterator = typename OperationsVector::reverse_iterator |
| using Circuits::Circuit< Time >::size_type = typename OperationsVector::size_type |
| using Circuits::Circuit< Time >::value_type = typename OperationsVector::value_type |
|
inline |
Construct a new Circuit object.
Constructs a new Circuit object with the given operations.
| ops | The operations to add to the circuit. |
|
inlinestatic |
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. |
|
inlinestatic |
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. |
|
inline |
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.
|
inline |
|
inline |
Adds an operation to the circuit.
Adds an operation to the circuit.
| op | The operation to add. |
Definition at line 121 of file Circuit.h.
Referenced by Circuits::ComparableCircuit< Time >::operator==().
|
inline |
Adds operations to the circuit.
Adds operations to the circuit.
| ops | The operations to add. |
Definition at line 152 of file Circuit.h.
Referenced by AddCircuit().
|
inline |
|
inline |
|
inlineoverridevirtual |
Returns the affected bits.
Returns the affected classical bits.
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inlineoverridevirtual |
Returns the affected qubits.
Returns the affected qubits by the operation.
Reimplemented from Circuits::IOperation< Types::time_type >.
|
inlinenoexcept |
Get the begin iterator for the operations.
Returns the begin iterator for the operations.
Definition at line 2448 of file Circuit.h.
Referenced by SplitCircuit().
|
inlineoverridevirtual |
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 >.
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inline |
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.
|
inlineoverridevirtual |
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 >.
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inlinenoexcept |
Get the end iterator for the operations.
Returns the end iterator for the operations.
Definition at line 2456 of file Circuit.h.
Referenced by SplitCircuit().
|
inline |
|
inlineoverridevirtual |
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 >.
|
inline |
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. |
|
inline |
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 |
Returns the classical bits affected by the operations.
Returns the classical bits affected by the operations.
Definition at line 598 of file Circuit.h.
Referenced by AffectedBits().
|
inline |
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. |
|
inline |
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::NoOperation< Time >::Clone().
|
inline |
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.
Definition at line 1414 of file Circuit.h.
Referenced by GetMaxDepth().
|
inline |
Returns the first operations on circuit's qubits.
Returns the first operations on circuit's qubits.
Definition at line 697 of file Circuit.h.
Referenced by AddResetsAtBeginningIfNeeded().
|
inline |
|
inline |
Returns the last operations on circuit's qubits.
Returns the last operations on circuit's qubits.
Definition at line 679 of file Circuit.h.
Referenced by AddResetsIfNeeded().
|
inline |
Returns the max classical bit id for all operations.
Returns the max classical bit id for all operations.
Definition at line 543 of file Circuit.h.
Referenced by MoveMeasurementsAndResets().
|
inline |
|
inline |
Returns the max qubit id for all operations.
Returns the max qubit id for all operations.
Definition at line 507 of file Circuit.h.
Referenced by GetDepth(), and MoveMeasurementsAndResets().
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Get the operations in the circuit.
Returns the operations in the circuit.
Definition at line 173 of file Circuit.h.
Referenced by IsBranching(), Circuits::ComparableCircuit< Time >::operator=(), Circuits::ComparableCircuit< Time >::operator==(), ToLayers(), ToLayersNoClone(), ToMultipleQubitsLayers(), and ToMultipleQubitsLayersNoClone().
|
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.
|
inline |
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.
Definition at line 581 of file Circuit.h.
Referenced by AffectedQubits(), and SplitCircuit().
|
inlineoverridevirtual |
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 GetLastMeasurements().
|
inline |
|
inline |
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.
|
inlineoverridevirtual |
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 >.
|
inlineoverridevirtual |
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.
|
inline |
|
inlinestatic |
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. |
Definition at line 2417 of file Circuit.h.
Referenced by Network::SimpleDisconnectedNetwork< Time, Controller >::OptimizeMPSInitialQubitsMap().
|
inline |
|
inlineoverridevirtual |
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 |
|
inline |
|
inlinenoexcept |
|
inlineoverride |
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. |
Implemented in Circuits::IConditionalOperation< Time >, Circuits::IConditionalOperation< Types::time_type >, Circuits::MeasurementOperation< Time >, Circuits::NoOperation< Time >, Circuits::Random< Time >, Circuits::Reset< Time >, Circuits::SingleQubitGate< Time >, Circuits::SingleQubitGate< Types::time_type >, Circuits::ThreeQubitsGate< Time >, Circuits::ThreeQubitsGate< Types::time_type >, Circuits::TwoQubitsGate< Time >, and Circuits::TwoQubitsGate< Types::time_type >.
|
inlinestatic |
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. |
|
inline |
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. |
|
inline |
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. |
|
inlinenoexcept |
|
inline |
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. |
|
inline |
|
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.
|
inline |
Set the operations in the circuit.
Sets the operations in the circuit.
| ops | The operations to set. |
|
inline |
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 MoveMeasurementsAndResets(), and RemoveExecutedOperations().
|
inline |
|
inline |
|
inline |
|
inline |
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.
|
inline |
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.