Maestro 0.2.5
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Network.h
Go to the documentation of this file.
1
13#pragma once
14
15#ifndef _NETWORK_INTERFACE_H_
16#define _NETWORK_INTERFACE_H_
17
18#include <boost/container_hash/hash.hpp>
19#include <complex>
20#include <memory>
21#include <unordered_set>
22#include <vector>
23
24#include "../Circuit/Circuit.h"
25#include "../Simulators/Factory.h"
26#include "Controller.h"
27
28namespace Network {
29
45
57template <typename Time = Types::time_type>
58class INetwork : public std::enable_shared_from_this<INetwork<Time>> {
59 public:
62 std::pair<Simulators::SimulatorType, Simulators::SimulationType>;
64 std::unordered_set<SimulatorPair, boost::hash<SimulatorPair>>;
65
71 virtual ~INetwork() = default;
72
82 const std::shared_ptr<Circuits::Circuit<Time>> &circuit) const = 0;
83
96 virtual void Execute(
97 const std::shared_ptr<Circuits::Circuit<Time>> &circuit) = 0;
98
111 virtual void ExecuteOnHost(
112 const std::shared_ptr<Circuits::Circuit<Time>> &circuit,
113 size_t hostId) = 0;
114
130 virtual std::vector<double> ExecuteExpectations(
131 const std::shared_ptr<Circuits::Circuit<Time>> &circuit,
132 const std::vector<std::string> &paulis) = 0;
133
149 virtual std::vector<double> ExecuteOnHostExpectations(
150 const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId,
151 const std::vector<std::string> &paulis) = 0;
152
168 virtual std::vector<std::complex<double>> ExecuteOnHostAmplitudes(
169 const std::shared_ptr<Circuits::Circuit<Time>> &circuit,
170 size_t hostId) = 0;
171
186 virtual std::complex<double> ExecuteOnHostProjectOnZero(
187 const std::shared_ptr<Circuits::Circuit<Time>> &circuit,
188 size_t hostId) = 0;
189
205 const std::shared_ptr<Circuits::Circuit<Time>> &circuit,
206 size_t shots = 1000) = 0;
207
224 const Schedulers::ExecuteCircuit<Time> &executeCircuit) {
225 return RepeatedExecute(executeCircuit.circuit, executeCircuit.shots);
226 }
227
245 const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId,
246 size_t shots = 1000) = 0;
247
266 const Schedulers::ExecuteCircuit<Time> &executeCircuit, size_t hostId) {
267 return RepeatedExecuteOnHost(executeCircuit.circuit, hostId,
268 executeCircuit.shots);
269 }
270
287 virtual std::vector<ExecuteResults> ExecuteScheduled(
288 const std::vector<Schedulers::ExecuteCircuit<Time>> &circuits) = 0;
289
309 virtual void CreateSimulator(
311 Simulators::SimulationType simExecType =
313 size_t nrQubits = 0) = 0;
314
323 virtual std::shared_ptr<Simulators::ISimulator> GetSimulator() const = 0;
324
334 virtual void Configure(const char *key, const char *value) = 0;
335
347 virtual void CreateScheduler(
349
358 virtual std::shared_ptr<Schedulers::IScheduler<Time>> GetScheduler()
359 const = 0;
360
370 virtual const std::shared_ptr<IHost<Time>> GetHost(size_t hostId) const = 0;
371
380 virtual const std::shared_ptr<IController<Time>> GetController() const = 0;
381
391
399 virtual size_t GetNumHosts() const = 0;
400
409 virtual size_t GetNumQubits() const = 0;
410
420 virtual size_t GetNumQubitsForHost(size_t hostId) const = 0;
421
430 virtual size_t GetNumNetworkEntangledQubits() const = 0;
431
444 virtual size_t GetNumNetworkEntangledQubitsForHost(size_t hostId) const = 0;
445
454 virtual size_t GetNumClassicalBits() const = 0;
455
467 virtual size_t GetNumClassicalBitsForHost(size_t hostId) const = 0;
468
477 virtual bool AreQubitsOnSameHost(size_t qubitId1, size_t qubitId2) const = 0;
478
488 virtual bool AreClassicalBitsOnSameHost(size_t bitId1,
489 size_t bitId2) const = 0;
490
501 virtual bool AreQubitAndClassicalBitOnSameHost(size_t qubitId,
502 size_t bitId) const = 0;
503
513 virtual size_t GetHostIdForQubit(size_t qubitId) const = 0;
514
527 virtual size_t GetHostIdForEntangledQubit(size_t qubitId) const = 0;
528
538 virtual size_t GetHostIdForAnyQubit(size_t qubitId) const = 0;
539
549 virtual size_t GetHostIdForClassicalBit(size_t classicalBitId) const = 0;
550
559 virtual std::vector<size_t> GetQubitsIds(size_t hostId) const = 0;
560
571 virtual std::vector<size_t> GetNetworkEntangledQubitsIds(
572 size_t hostId) const = 0;
573
583 virtual std::vector<size_t> GetClassicalBitsIds(size_t hostId) const = 0;
584
595 virtual std::vector<size_t> GetEntangledQubitMeasurementBitIds(
596 size_t hostId) const = 0;
597
609 virtual bool IsNetworkEntangledQubit(size_t qubitId) const = 0;
610
621 virtual bool IsLocalOperation(
622 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
623
637 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
638
651 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
652
663 virtual bool SendPacket(size_t fromHostId, size_t toHostId,
664 const std::vector<uint8_t> &packet) = 0;
665
675 virtual bool IsEntanglingGate(
676 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
677
689 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
690
702 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
703
714 virtual bool IsEntanglementQubitBusy(size_t qubitId) const = 0;
715
729 virtual bool AreEntanglementQubitsBusy(size_t qubitId1,
730 size_t qubitId2) const = 0;
731
742 virtual void MarkEntangledQubitsBusy(size_t qubitId1, size_t qubitId2) = 0;
743
753 virtual void MarkEntangledQubitFree(size_t qubitId) = 0;
754
763 virtual void ClearEntanglements() = 0;
764
772 std::shared_ptr<INetwork<Time>> getptr() {
773 return std::enable_shared_from_this<INetwork<Time>>::shared_from_this();
774 }
775
783 virtual NetworkType GetType() const = 0;
784
791 virtual std::shared_ptr<INetwork<Time>> Clone() const = 0;
792
802 virtual std::shared_ptr<Circuits::Circuit<Time>> GetDistributedCircuit()
803 const = 0;
804
814 virtual void SetOptimizeSimulator(bool optimize = true) = 0;
815
823 virtual bool GetOptimizeSimulator() const = 0;
824
833
842
851 virtual const SimulatorsSet &GetSimulatorsSet() const = 0;
852
864
875
888
901 Simulators::SimulationType kind) const = 0;
902
913 virtual size_t GetMaxSimulators() const = 0;
914
926 virtual void SetMaxSimulators(size_t maxSimulators) = 0;
927
940 virtual std::vector<std::vector<std::string>> GetSubroutinesTextCode() const {
941 return {};
942 }
943
968 virtual std::shared_ptr<Simulators::ISimulator> ChooseBestSimulator(
969 std::shared_ptr<Circuits::Circuit<Time>> &dcirc, size_t &counts,
970 size_t nrQubits, size_t nrCbits, size_t nrResultCbits,
972 std::vector<bool> &executed, bool multithreading = false,
973 bool dontRunCircuitStart = false) const = 0;
974
975
976 virtual void SetInitialQubitsMapOptimization(bool optimize = true) = 0;
977
978 virtual bool GetInitialQubitsMapOptimization() const = 0;
979
980 virtual void SetMPSOptimizationBondDimensionThreshold(size_t threshold) = 0;
981
983
984 virtual void SetMPSOptimizationQubitsNumberThreshold(size_t threshold) = 0;
985
986 virtual size_t GetMPSOptimizationQubitsNumberThreshold() const = 0;
987};
988
989} // namespace Network
990
991#endif // !_NETWORK_INTERFACE_H_
Circuit class for holding the sequence of operations.
Definition Circuit.h:46
std::unordered_map< std::vector< bool >, size_t > ExecuteResults
The results of the execution of the circuit.
Definition Circuit.h:51
The operation interface.
Definition Operations.h:358
The state class that stores the classical state of a quantum circuit execution.
Definition Operations.h:63
The network interface.
Definition Network.h:58
virtual Simulators::SimulationType GetLastSimulationType() const =0
Get the last used simulation type.
virtual size_t GetNumClassicalBitsForHost(size_t hostId) const =0
Get the number of classical bits in the network for the specified host.
virtual void Execute(const std::shared_ptr< Circuits::Circuit< Time > > &circuit)=0
Execute the circuit on the network.
virtual bool IsNetworkEntangledQubit(size_t qubitId) const =0
Check if the specified qubit id is for a qubit used for entanglement between hosts.
virtual void ClearEntanglements()=0
Clear all entanglements between hosts in the network.
virtual void RemoveOptimizationSimulator(Simulators::SimulatorType type, Simulators::SimulationType kind)=0
Removes a simulator from the simulators optimization set.
virtual ExecuteResults RepeatedExecute(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t shots=1000)=0
Execute the circuit on the network, repeatedly.
virtual bool IsDistributedOperation(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Check if the circuit operation is distributed.
virtual bool ExpectsClassicalBitFromOtherHost(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Checks if a gate expects a classical bit from another host.
virtual bool IsLocalOperation(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Check if the circuit operation is local.
ExecuteResults RepeatedExecuteCircuitOnHost(const Schedulers::ExecuteCircuit< Time > &executeCircuit, size_t hostId)
Execute the circuit on the specified host, repeatedly.
Definition Network.h:265
virtual void SetMaxSimulators(size_t maxSimulators)=0
Set the maximum number of simulators that can be used in the network.
virtual size_t GetNumNetworkEntangledQubitsForHost(size_t hostId) const =0
Get the number of qubits used for entanglement between hosts for the specified host.
virtual size_t GetHostIdForAnyQubit(size_t qubitId) const =0
Get the host id for the specified qubit.
virtual std::vector< size_t > GetClassicalBitsIds(size_t hostId) const =0
Get the classical bit ids for the specified host.
virtual std::vector< double > ExecuteExpectations(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, const std::vector< std::string > &paulis)=0
Execute the circuit on the network and return the expectation values for the specified Pauli strings.
virtual size_t GetMPSOptimizationBondDimensionThreshold() const =0
virtual std::complex< double > ExecuteOnHostProjectOnZero(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t hostId)=0
Execute circuit on host and return the projection onto the zero state.
virtual Circuits::OperationState & GetState()=0
Get the classical state of the network.
virtual std::vector< size_t > GetQubitsIds(size_t hostId) const =0
Get the qubit ids for the specified host.
ExecuteResults RepeatedExecuteCircuit(const Schedulers::ExecuteCircuit< Time > &executeCircuit)
Execute the circuit on the network, repeatedly.
Definition Network.h:223
virtual size_t GetNumberOfGatesDistributedOrCut(const std::shared_ptr< Circuits::Circuit< Time > > &circuit) const =0
Get the number of gates that span more than one host.
virtual size_t GetMPSOptimizationQubitsNumberThreshold() const =0
virtual ExecuteResults RepeatedExecuteOnHost(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t hostId, size_t shots=1000)=0
Execute the circuit on the specified host, repeatedly.
virtual bool SendPacket(size_t fromHostId, size_t toHostId, const std::vector< uint8_t > &packet)=0
Sends a packet between two hosts.
virtual std::vector< std::complex< double > > ExecuteOnHostAmplitudes(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t hostId)=0
Execute the circuit on the specified host and return the full statevector (complex amplitudes for eac...
virtual size_t GetMaxSimulators() const =0
Get the maximum number of simulators that can be used in the network.
virtual bool AreQubitsOnSameHost(size_t qubitId1, size_t qubitId2) const =0
Check if the specified qubits are on the same host.
virtual ~INetwork()=default
Destroy the INetwork object.
virtual std::vector< ExecuteResults > ExecuteScheduled(const std::vector< Schedulers::ExecuteCircuit< Time > > &circuits)=0
Schedule and execute circuits on the network.
virtual size_t GetNumHosts() const =0
Get the number of hosts in the network.
virtual std::shared_ptr< Schedulers::IScheduler< Time > > GetScheduler() const =0
Get the scheduler for the network.
virtual std::vector< double > ExecuteOnHostExpectations(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t hostId, const std::vector< std::string > &paulis)=0
Execute the circuit on the specified host and return the expectation values for the specified Pauli s...
virtual std::shared_ptr< Simulators::ISimulator > GetSimulator() const =0
Get the simulator for the network.
virtual bool AreEntanglementQubitsBusy(size_t qubitId1, size_t qubitId2) const =0
Check if any of the two specified qubits used for entanglement between hosts are busy.
std::unordered_set< SimulatorPair, boost::hash< SimulatorPair > > SimulatorsSet
Definition Network.h:64
virtual bool OptimizationSimulatorExists(Simulators::SimulatorType type, Simulators::SimulationType kind) const =0
Checks if a simulator exists in the optimization set.
virtual void AddOptimizationSimulator(Simulators::SimulatorType type, Simulators::SimulationType kind)=0
Adds a simulator to the simulators optimization set.
std::shared_ptr< INetwork< Time > > getptr()
Get a shared pointer to this object.
Definition Network.h:772
virtual void SetMPSOptimizationBondDimensionThreshold(size_t threshold)=0
virtual bool IsEntanglingGate(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Checks if a gate is an entangling gate.
virtual void Configure(const char *key, const char *value)=0
Configures the network.
virtual const std::shared_ptr< IHost< Time > > GetHost(size_t hostId) const =0
Get the host with the specified id.
virtual bool GetInitialQubitsMapOptimization() const =0
virtual bool OperatesWithNetworkEntangledQubit(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Check if the circuit operation operates on the entanglement qubits between hosts.
virtual void CreateSimulator(Simulators::SimulatorType simType=Simulators::SimulatorType::kQCSim, Simulators::SimulationType simExecType=Simulators::SimulationType::kMatrixProductState, size_t nrQubits=0)=0
Create the simulator for the network.
virtual size_t GetNumQubits() const =0
Get the number of qubits in the network.
virtual size_t GetNumQubitsForHost(size_t hostId) const =0
Get the number of qubits in the network for the specified host.
virtual std::shared_ptr< INetwork< Time > > Clone() const =0
Clone the network.
virtual std::shared_ptr< Circuits::Circuit< Time > > GetDistributedCircuit() const =0
Get the distributed circuit.
virtual size_t GetHostIdForClassicalControl(const std::shared_ptr< Circuits::IOperation< Time > > &op) const =0
Get the host id where the classical control bit resides for a conditioned gate.
virtual bool AreQubitAndClassicalBitOnSameHost(size_t qubitId, size_t bitId) const =0
Check if the specified qubit and classical bit are on the same host.
virtual bool IsEntanglementQubitBusy(size_t qubitId) const =0
Check if the specified qubit used for entanglement between hosts is busy.
virtual const SimulatorsSet & GetSimulatorsSet() const =0
Get the optimizations simulators set.
virtual void MarkEntangledQubitFree(size_t qubitId)=0
Mark the specified qubit used for entanglement between hosts as free.
typename Circuits::Circuit< Time >::ExecuteResults ExecuteResults
Definition Network.h:60
virtual void CreateScheduler(SchedulerType schType=SchedulerType::kNoEntanglementQubitsParallel)=0
Create the scheduler for the network.
virtual size_t GetNumClassicalBits() const =0
Get the number of classical bits in the network.
std::pair< Simulators::SimulatorType, Simulators::SimulationType > SimulatorPair
Definition Network.h:62
virtual size_t GetNumNetworkEntangledQubits() const =0
Get the number of qubits used for entanglement between hosts.
virtual Simulators::SimulatorType GetLastSimulatorType() const =0
Get the last used simulator type.
virtual size_t GetHostIdForEntangledQubit(size_t qubitId) const =0
Get the host id for the specified qubit used for entanglement between hosts.
virtual size_t GetHostIdForQubit(size_t qubitId) const =0
Get the host id for the specified qubit.
virtual bool GetOptimizeSimulator() const =0
Returns the 'optimize' flag.
virtual void ExecuteOnHost(const std::shared_ptr< Circuits::Circuit< Time > > &circuit, size_t hostId)=0
Execute the circuit on the specified host.
virtual void MarkEntangledQubitsBusy(size_t qubitId1, size_t qubitId2)=0
Mark the pair of the specified qubits used for entanglement between hosts as busy.
virtual std::shared_ptr< Simulators::ISimulator > ChooseBestSimulator(std::shared_ptr< Circuits::Circuit< Time > > &dcirc, size_t &counts, size_t nrQubits, size_t nrCbits, size_t nrResultCbits, Simulators::SimulatorType &simType, Simulators::SimulationType &method, std::vector< bool > &executed, bool multithreading=false, bool dontRunCircuitStart=false) const =0
Choose the best simulator for the given circuit.
virtual std::vector< std::vector< std::string > > GetSubroutinesTextCode() const
Get the text code that is executed on the hosts.
Definition Network.h:940
virtual bool AreClassicalBitsOnSameHost(size_t bitId1, size_t bitId2) const =0
Check if the specified classical bits are on the same host.
virtual void SetOptimizeSimulator(bool optimize=true)=0
Allows using an optimized simulator.
virtual void SetInitialQubitsMapOptimization(bool optimize=true)=0
virtual std::vector< size_t > GetEntangledQubitMeasurementBitIds(size_t hostId) const =0
Get the classical bit ids used for measurement of entanglement qubits between the hosts for the speci...
virtual void RemoveAllOptimizationSimulatorsAndAdd(Simulators::SimulatorType type, Simulators::SimulationType kind)=0
Removes all simulators from the simulators optimization set and adds the one specified.
virtual std::vector< size_t > GetNetworkEntangledQubitsIds(size_t hostId) const =0
Get the qubit ids used for entanglement between hosts for the specified host.
virtual NetworkType GetType() const =0
Get the type of the network.
virtual const std::shared_ptr< IController< Time > > GetController() const =0
Get the controller for the network.
virtual void SetMPSOptimizationQubitsNumberThreshold(size_t threshold)=0
virtual size_t GetHostIdForClassicalBit(size_t classicalBitId) const =0
Get the host id for the specified classical bit.
NetworkType
The type of the network.
Definition Network.h:34
@ kSimpleDisconnectedNetwork
Simple network, no communication among hosts, sequential simulation.
@ kSimpleNetwork
Simple fully connected network, sequential simulation.
@ kNetqasmNetwork
Fully connected network, hosts executing netqasm code with cooperative multitasking.
@ kNetqasmDESNetwork
Fully connected network, hosts executing netqasm code with discrete events simulation.
@ kSimpleDESNetwork
Simple fully connected network, discrete events simulation.
SchedulerType
The type of the network scheduler for scheduling execution of multiple circuits.
Definition Controller.h:86
SimulationType
The type of simulation.
Definition State.h:85
@ kMatrixProductState
matrix product state simulation type
SimulatorType
The type of simulator.
Definition State.h:68
@ kQCSim
qcsim simulator type
A way to pack together a circuit and the number of shots for its execution.
Definition Controller.h:61
std::shared_ptr< Circuits::Circuit< Time > > circuit
Definition Controller.h:74