Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Network.h
Go to the documentation of this file.
1
12
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"
26#include "Controller.h"
27
28namespace Network
29{
30
47
59template <typename Time = Types::time_type> class INetwork : public std::enable_shared_from_this<INetwork<Time>>
60{
61 public:
63 using SimulatorPair = std::pair<Simulators::SimulatorType, Simulators::SimulationType>;
64 using SimulatorsSet = std::unordered_set<SimulatorPair, boost::hash<SimulatorPair>>;
65
71 virtual ~INetwork() = default;
72
81 virtual size_t GetNumberOfGatesDistributedOrCut(const std::shared_ptr<Circuits::Circuit<Time>> &circuit) const = 0;
82
95 virtual void Execute(const std::shared_ptr<Circuits::Circuit<Time>> &circuit) = 0;
96
109 virtual void ExecuteOnHost(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId) = 0;
110
126 virtual std::vector<double> ExecuteExpectations(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, const std::vector<std::string> &paulis) = 0;
127
143 virtual std::vector<double> ExecuteOnHostExpectations(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId,
144 const std::vector<std::string> &paulis) = 0;
145
161 virtual std::vector<std::complex<double>> ExecuteOnHostAmplitudes(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId) = 0;
162
177 virtual std::complex<double> ExecuteOnHostProjectOnZero(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId) = 0;
178
193 virtual ExecuteResults RepeatedExecute(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t shots = 1000) = 0;
194
211 {
212 return RepeatedExecute(executeCircuit.circuit, executeCircuit.shots);
213 }
214
231 virtual ExecuteResults RepeatedExecuteOnHost(const std::shared_ptr<Circuits::Circuit<Time>> &circuit, size_t hostId, size_t shots = 1000) = 0;
232
251 {
252 return RepeatedExecuteOnHost(executeCircuit.circuit, hostId, executeCircuit.shots);
253 }
254
271 virtual std::vector<ExecuteResults> ExecuteScheduled(const std::vector<Schedulers::ExecuteCircuit<Time>> &circuits) = 0;
272
294
303 virtual std::shared_ptr<Simulators::ISimulator> GetSimulator() const = 0;
304
305 // Actual device of the current simulator, or -1 if no GPU state exists.
306 virtual int GetGpuDevice() const
307 {
308 const auto sim = GetSimulator();
309 return sim ? sim->GetGpuDevice() : -1;
310 }
311
321 virtual void Configure(const char *key, const char *value) = 0;
322
335
344 virtual std::shared_ptr<Schedulers::IScheduler<Time>> GetScheduler() const = 0;
345
355 virtual const std::shared_ptr<IHost<Time>> GetHost(size_t hostId) const = 0;
356
365 virtual const std::shared_ptr<IController<Time>> GetController() const = 0;
366
376
384 virtual size_t GetNumHosts() const = 0;
385
394 virtual size_t GetNumQubits() const = 0;
395
405 virtual size_t GetNumQubitsForHost(size_t hostId) const = 0;
406
415 virtual size_t GetNumNetworkEntangledQubits() const = 0;
416
429 virtual size_t GetNumNetworkEntangledQubitsForHost(size_t hostId) const = 0;
430
439 virtual size_t GetNumClassicalBits() const = 0;
440
452 virtual size_t GetNumClassicalBitsForHost(size_t hostId) const = 0;
453
462 virtual bool AreQubitsOnSameHost(size_t qubitId1, size_t qubitId2) const = 0;
463
473 virtual bool AreClassicalBitsOnSameHost(size_t bitId1, size_t bitId2) const = 0;
474
485 virtual bool AreQubitAndClassicalBitOnSameHost(size_t qubitId, size_t bitId) const = 0;
486
496 virtual size_t GetHostIdForQubit(size_t qubitId) const = 0;
497
510 virtual size_t GetHostIdForEntangledQubit(size_t qubitId) const = 0;
511
521 virtual size_t GetHostIdForAnyQubit(size_t qubitId) const = 0;
522
532 virtual size_t GetHostIdForClassicalBit(size_t classicalBitId) const = 0;
533
542 virtual std::vector<size_t> GetQubitsIds(size_t hostId) const = 0;
543
554 virtual std::vector<size_t> GetNetworkEntangledQubitsIds(size_t hostId) const = 0;
555
565 virtual std::vector<size_t> GetClassicalBitsIds(size_t hostId) const = 0;
566
577 virtual std::vector<size_t> GetEntangledQubitMeasurementBitIds(size_t hostId) const = 0;
578
590 virtual bool IsNetworkEntangledQubit(size_t qubitId) const = 0;
591
602 virtual bool IsLocalOperation(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
603
616 virtual bool IsDistributedOperation(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
617
629 virtual bool OperatesWithNetworkEntangledQubit(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
630
641 virtual bool SendPacket(size_t fromHostId, size_t toHostId, const std::vector<uint8_t> &packet) = 0;
642
652 virtual bool IsEntanglingGate(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
653
664 virtual bool ExpectsClassicalBitFromOtherHost(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
665
676 virtual size_t GetHostIdForClassicalControl(const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
677
688 virtual bool IsEntanglementQubitBusy(size_t qubitId) const = 0;
689
703 virtual bool AreEntanglementQubitsBusy(size_t qubitId1, size_t qubitId2) const = 0;
704
715 virtual void MarkEntangledQubitsBusy(size_t qubitId1, size_t qubitId2) = 0;
716
726 virtual void MarkEntangledQubitFree(size_t qubitId) = 0;
727
736 virtual void ClearEntanglements() = 0;
737
745 std::shared_ptr<INetwork<Time>> getptr()
746 {
747 return std::enable_shared_from_this<INetwork<Time>>::shared_from_this();
748 }
749
757 virtual NetworkType GetType() const = 0;
758
765 virtual std::shared_ptr<INetwork<Time>> Clone() const = 0;
766
776 virtual std::shared_ptr<Circuits::Circuit<Time>> GetDistributedCircuit() const = 0;
777
788 virtual void SetOptimizeSimulator(bool optimize = true) = 0;
789
797 virtual bool GetOptimizeSimulator() const = 0;
798
807
808 // Device used by the last execution, which may differ from a recreated simulator.
809 virtual int GetLastGpuDevice() const
810 {
811 return -1;
812 }
813
814 virtual unsigned GetLastGateFusionMaxQubits() const
815 {
816 return 0;
817 }
818
819 virtual bool WasGateFusionEnabled() const
820 {
821 return false;
822 }
823
824 // Requested setting, independent of the selected backend capability.
825 virtual bool GetGateFusion() const
826 {
827 return true;
828 }
829
838
847 virtual const SimulatorsSet &GetSimulatorsSet() const = 0;
848
859
869
881
893
904 virtual size_t GetMaxSimulators() const = 0;
905
917 virtual void SetMaxSimulators(size_t maxSimulators) = 0;
918
931 virtual std::vector<std::vector<std::string>> GetSubroutinesTextCode() const
932 {
933 return {};
934 }
935
960 virtual std::shared_ptr<Simulators::ISimulator> ChooseBestSimulator(std::shared_ptr<Circuits::Circuit<Time>> &dcirc, size_t &counts, size_t nrQubits,
961 size_t nrCbits, size_t nrResultCbits, Simulators::SimulatorType &simType,
962 Simulators::SimulationType &method, std::vector<bool> &executed,
963 bool multithreading = false, bool dontRunCircuitStart = false) = 0;
964
965 virtual void SetInitialQubitsMapOptimization(bool optimize = true) = 0;
966
967 virtual bool GetInitialQubitsMapOptimization() const = 0;
968
969 virtual void SetMPSOptimizeSwaps(bool optimize = true) = 0;
970
971 virtual bool GetMPSOptimizeSwaps() const = 0;
972
973 virtual void SetMPSOptimizationBondDimensionThreshold(size_t threshold) = 0;
974
976
977 virtual void SetMPSOptimizationQubitsNumberThreshold(size_t threshold) = 0;
978
979 virtual size_t GetMPSOptimizationQubitsNumberThreshold() const = 0;
980
981 virtual void SetLookaheadDepth(int depth) = 0;
982
983 virtual int GetLookaheadDepth() const = 0;
984
985 virtual void SetLookaheadDepthWithHeuristic(int depth) = 0;
986
987 virtual int GetLookaheadDepthWithHeuristic() const = 0;
988
989 virtual double getGrowthFactorSwap() const
990 {
991 return 0.;
992 }
993
994 virtual double getGrowthFactorGate() const
995 {
996 return 0.;
997 }
998
999 virtual void setGrowthFactorSwap(double factor)
1000 {
1001 }
1002
1003 virtual void setGrowthFactorGate(double factor)
1004 {
1005 }
1006
1013 virtual size_t GetCurrentMaxBondDimension() const
1014 {
1015 return 0;
1016 }
1017};
1018
1019} // namespace Network
1020
1021#endif // !_NETWORK_INTERFACE_H_
Circuit class for holding the sequence of operations.
Definition Circuit.h:51
std::unordered_map< std::vector< bool >, size_t > ExecuteResults
The results of the execution of the circuit.
Definition Circuit.h:53
The operation interface.
Definition Operations.h:402
The state class that stores the classical state of a quantum circuit execution.
Definition Operations.h:68
The network interface.
Definition Network.h:60
virtual void SetLookaheadDepth(int depth)=0
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 setGrowthFactorGate(double factor)
Definition Network.h:1003
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 int GetLookaheadDepthWithHeuristic() const =0
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:250
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 double getGrowthFactorSwap() const
Definition Network.h:989
virtual size_t GetMPSOptimizationBondDimensionThreshold() const =0
virtual void setGrowthFactorSwap(double factor)
Definition Network.h:999
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:210
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 int GetGpuDevice() const
Definition Network.h:306
virtual ~INetwork()=default
Destroy the INetwork object.
virtual bool WasGateFusionEnabled() const
Definition Network.h:819
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 GetGateFusion() const
Definition Network.h:825
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.
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:745
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 bool GetMPSOptimizeSwaps() const =0
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 double getGrowthFactorGate() const
Definition Network.h:994
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 int GetLookaheadDepth() const =0
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:62
virtual void CreateScheduler(SchedulerType schType=SchedulerType::kNoEntanglementQubitsParallel)=0
Create the scheduler for the network.
virtual void SetMPSOptimizeSwaps(bool optimize=true)=0
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:63
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 unsigned GetLastGateFusionMaxQubits() const
Definition Network.h:814
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::vector< std::vector< std::string > > GetSubroutinesTextCode() const
Get the text code that is executed on the hosts.
Definition Network.h:931
virtual void SetLookaheadDepthWithHeuristic(int depth)=0
virtual size_t GetCurrentMaxBondDimension() const
Returns the maximum bond dimension reached.
Definition Network.h:1013
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.
std::unordered_set< SimulatorPair, boost::hash< SimulatorPair > > SimulatorsSet
Definition Network.h:64
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 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)=0
Choose the best simulator for the given circuit.
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 int GetLastGpuDevice() const
Definition Network.h:809
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:36
@ kSimpleDisconnectedNetwork
Simple network, no communication among hosts, sequential simulation.
Definition Network.h:37
@ kSimpleNetwork
Simple fully connected network, sequential simulation.
Definition Network.h:39
@ kNetqasmNetwork
Fully connected network, hosts executing netqasm code with cooperative multitasking.
Definition Network.h:42
@ kNetqasmDESNetwork
Fully connected network, hosts executing netqasm code with discrete events simulation.
Definition Network.h:44
@ kSimpleDESNetwork
Simple fully connected network, discrete events simulation.
Definition Network.h:40
SchedulerType
The type of the network scheduler for scheduling execution of multiple circuits.
Definition Controller.h:89
SimulationType
The type of simulation.
Definition State.h:109
@ kMatrixProductState
matrix product state simulation type
Definition State.h:111
SimulatorType
The type of simulator.
Definition State.h:79
@ kQCSim
qcsim simulator type
Definition State.h:83
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:75