Maestro 0.3.1
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
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
325 // Actual device of the current simulator, or -1 if no GPU state exists.
326 virtual int GetGpuDevice() const {
327 const auto sim = GetSimulator();
328 return sim ? sim->GetGpuDevice() : -1;
329 }
330
340 virtual void Configure(const char *key, const char *value) = 0;
341
353 virtual void CreateScheduler(
355
364 virtual std::shared_ptr<Schedulers::IScheduler<Time>> GetScheduler()
365 const = 0;
366
376 virtual const std::shared_ptr<IHost<Time>> GetHost(size_t hostId) const = 0;
377
386 virtual const std::shared_ptr<IController<Time>> GetController() const = 0;
387
397
405 virtual size_t GetNumHosts() const = 0;
406
415 virtual size_t GetNumQubits() const = 0;
416
426 virtual size_t GetNumQubitsForHost(size_t hostId) const = 0;
427
436 virtual size_t GetNumNetworkEntangledQubits() const = 0;
437
450 virtual size_t GetNumNetworkEntangledQubitsForHost(size_t hostId) const = 0;
451
460 virtual size_t GetNumClassicalBits() const = 0;
461
473 virtual size_t GetNumClassicalBitsForHost(size_t hostId) const = 0;
474
483 virtual bool AreQubitsOnSameHost(size_t qubitId1, size_t qubitId2) const = 0;
484
494 virtual bool AreClassicalBitsOnSameHost(size_t bitId1,
495 size_t bitId2) const = 0;
496
507 virtual bool AreQubitAndClassicalBitOnSameHost(size_t qubitId,
508 size_t bitId) const = 0;
509
519 virtual size_t GetHostIdForQubit(size_t qubitId) const = 0;
520
533 virtual size_t GetHostIdForEntangledQubit(size_t qubitId) const = 0;
534
544 virtual size_t GetHostIdForAnyQubit(size_t qubitId) const = 0;
545
555 virtual size_t GetHostIdForClassicalBit(size_t classicalBitId) const = 0;
556
565 virtual std::vector<size_t> GetQubitsIds(size_t hostId) const = 0;
566
577 virtual std::vector<size_t> GetNetworkEntangledQubitsIds(
578 size_t hostId) const = 0;
579
589 virtual std::vector<size_t> GetClassicalBitsIds(size_t hostId) const = 0;
590
601 virtual std::vector<size_t> GetEntangledQubitMeasurementBitIds(
602 size_t hostId) const = 0;
603
615 virtual bool IsNetworkEntangledQubit(size_t qubitId) const = 0;
616
627 virtual bool IsLocalOperation(
628 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
629
643 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
644
657 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
658
669 virtual bool SendPacket(size_t fromHostId, size_t toHostId,
670 const std::vector<uint8_t> &packet) = 0;
671
681 virtual bool IsEntanglingGate(
682 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
683
695 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
696
708 const std::shared_ptr<Circuits::IOperation<Time>> &op) const = 0;
709
720 virtual bool IsEntanglementQubitBusy(size_t qubitId) const = 0;
721
735 virtual bool AreEntanglementQubitsBusy(size_t qubitId1,
736 size_t qubitId2) const = 0;
737
748 virtual void MarkEntangledQubitsBusy(size_t qubitId1, size_t qubitId2) = 0;
749
759 virtual void MarkEntangledQubitFree(size_t qubitId) = 0;
760
769 virtual void ClearEntanglements() = 0;
770
778 std::shared_ptr<INetwork<Time>> getptr() {
779 return std::enable_shared_from_this<INetwork<Time>>::shared_from_this();
780 }
781
789 virtual NetworkType GetType() const = 0;
790
797 virtual std::shared_ptr<INetwork<Time>> Clone() const = 0;
798
808 virtual std::shared_ptr<Circuits::Circuit<Time>> GetDistributedCircuit()
809 const = 0;
810
820 virtual void SetOptimizeSimulator(bool optimize = true) = 0;
821
829 virtual bool GetOptimizeSimulator() const = 0;
830
839
840 // Device used by the last execution, which may differ from a recreated simulator.
841 virtual int GetLastGpuDevice() const { return -1; }
842
851
860 virtual const SimulatorsSet &GetSimulatorsSet() const = 0;
861
873
884
897
910 Simulators::SimulationType kind) const = 0;
911
922 virtual size_t GetMaxSimulators() const = 0;
923
935 virtual void SetMaxSimulators(size_t maxSimulators) = 0;
936
949 virtual std::vector<std::vector<std::string>> GetSubroutinesTextCode() const {
950 return {};
951 }
952
977 virtual std::shared_ptr<Simulators::ISimulator> ChooseBestSimulator(
978 std::shared_ptr<Circuits::Circuit<Time>> &dcirc, size_t &counts,
979 size_t nrQubits, size_t nrCbits, size_t nrResultCbits,
981 std::vector<bool> &executed, bool multithreading = false,
982 bool dontRunCircuitStart = false) = 0;
983
984
985 virtual void SetInitialQubitsMapOptimization(bool optimize = true) = 0;
986
987 virtual bool GetInitialQubitsMapOptimization() const = 0;
988
989 virtual void SetMPSOptimizeSwaps(bool optimize = true) = 0;
990
991 virtual bool GetMPSOptimizeSwaps() const = 0;
992
993 virtual void SetMPSOptimizationBondDimensionThreshold(size_t threshold) = 0;
994
996
997 virtual void SetMPSOptimizationQubitsNumberThreshold(size_t threshold) = 0;
998
999 virtual size_t GetMPSOptimizationQubitsNumberThreshold() const = 0;
1000
1001 virtual void SetLookaheadDepth(int depth) = 0;
1002
1003 virtual int GetLookaheadDepth() const = 0;
1004
1005 virtual void SetLookaheadDepthWithHeuristic(int depth) = 0;
1006
1007 virtual int GetLookaheadDepthWithHeuristic() const = 0;
1008
1009 virtual double getGrowthFactorSwap() const { return 0.; }
1010 virtual double getGrowthFactorGate() const { return 0.; }
1011
1012 virtual void setGrowthFactorSwap(double factor) {}
1013 virtual void setGrowthFactorGate(double factor) {}
1014
1021 virtual size_t GetCurrentMaxBondDimension() const { return 0; }
1022};
1023
1024} // namespace Network
1025
1026#endif // !_NETWORK_INTERFACE_H_
Circuit class for holding the sequence of operations.
Definition Circuit.h:48
std::unordered_map< std::vector< bool >, size_t > ExecuteResults
The results of the execution of the circuit.
Definition Circuit.h:50
The operation interface.
Definition Operations.h:360
The state class that stores the classical state of a quantum circuit execution.
Definition Operations.h:65
The network interface.
Definition Network.h:58
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:1013
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: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 double getGrowthFactorSwap() const
Definition Network.h:1009
virtual size_t GetMPSOptimizationBondDimensionThreshold() const =0
virtual void setGrowthFactorSwap(double factor)
Definition Network.h:1012
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.
std::pair< Simulators::SimulatorType, Simulators::SimulationType > SimulatorPair
Definition Network.h:61
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:326
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.
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:778
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:1010
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:60
std::unordered_set< SimulatorPair, boost::hash< SimulatorPair > > SimulatorsSet
Definition Network.h:63
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.
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::vector< std::vector< std::string > > GetSubroutinesTextCode() const
Get the text code that is executed on the hosts.
Definition Network.h:949
virtual void SetLookaheadDepthWithHeuristic(int depth)=0
virtual size_t GetCurrentMaxBondDimension() const
Returns the maximum bond dimension reached.
Definition Network.h:1021
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 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:841
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.
Definition Network.h:35
@ kSimpleNetwork
Simple fully connected network, sequential simulation.
Definition Network.h:37
@ kNetqasmNetwork
Fully connected network, hosts executing netqasm code with cooperative multitasking.
Definition Network.h:40
@ kNetqasmDESNetwork
Fully connected network, hosts executing netqasm code with discrete events simulation.
Definition Network.h:42
@ kSimpleDESNetwork
Simple fully connected network, discrete events simulation.
Definition Network.h:38
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:98
@ kMatrixProductState
matrix product state simulation type
Definition State.h:100
SimulatorType
The type of simulator.
Definition State.h:72
@ kQCSim
qcsim simulator type
Definition State.h:76
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