File PathSimulator.hpp

class PathSimulator : public CircuitSimulator

Public Functions

inline explicit PathSimulator(std::unique_ptr<qc::QuantumComputation> &&qc_, Configuration configuration = Configuration())
inline PathSimulator(std::unique_ptr<qc::QuantumComputation> &&qc_, typename Configuration::Mode mode_, std::size_t bracketSize_, std::size_t startingPoint_, std::list<std::size_t> gateCost_, std::size_t seed_)
virtual std::map<std::string, std::size_t> simulate(std::size_t shots) override

Run the simulation in the (derived) class.

Parameters:

shots – number of shots to take from the final quantum state

Returns:

a map from the strings representing basis states to the number of times they have been measured

inline const SimulationPath &getSimulationPath() const
inline void setSimulationPath(const SimulationPath &path)
inline void setSimulationPath(const typename SimulationPath::Components &components, bool assumeCorrectOrder = false)
void generateSequentialSimulationPath()
void generatePairwiseRecursiveGroupingSimulationPath()
void generateBracketSimulationPath(std::size_t bracketSize)
void generateAlternatingSimulationPath(std::size_t startingPoint)
void generateGatecostSimulationPath(std::size_t startingPoint, std::list<std::size_t> &gateCosts)

Private Functions

void constructTaskGraph()
void addSimulationTask(std::size_t leftID, std::size_t rightID, std::size_t resultID)

Private Members

std::unordered_map<std::size_t, tf::Task> tasks
std::unordered_map<std::size_t, std::variant<dd::VectorDD, dd::MatrixDD>> results
tf::Taskflow taskflow
tf::Executor executor
SimulationPath simulationPath = {}
struct Configuration

Public Types

enum class Mode : std::uint8_t

Values:

enumerator Sequential
enumerator PairwiseRecursiveGrouping
enumerator BracketGrouping
enumerator Alternating
enumerator GateCost

Public Functions

inline explicit Configuration(const Mode mode_ = Mode::Sequential, const std::size_t bracketSize_ = 2, const std::size_t startingPoint_ = 0, std::list<std::size_t> gateCost_ = {}, const std::size_t seed_ = 0)
inline nlohmann::json json() const
inline std::string toString() const

Public Members

Mode mode
std::size_t bracketSize
std::size_t startingPoint
std::list<std::size_t> gateCost
std::size_t seed

Public Static Functions

static inline Mode modeFromString(const std::string &mode)
static inline std::string modeToString(const Mode &mode)
struct SimulationPath

Public Types

using Components = std::vector<std::pair<std::size_t, std::size_t>>
using Steps = std::vector<Step>

Public Functions

SimulationPath() = default
SimulationPath(std::size_t nleaves_, Components components_, const qc::QuantumComputation *qc_, bool assumeCorrectOrder = false)

Public Members

Components components
Steps steps = {}
std::size_t nleaves = {}
const qc::QuantumComputation *qc = {}
struct Step

Public Functions

inline explicit Step(const std::size_t id_, std::vector<std::size_t> operations_ = {}, const std::size_t parent_ = UNKNOWN, std::pair<std::size_t, std::size_t> children_ = {UNKNOWN, UNKNOWN})

Public Members

std::size_t id
std::vector<std::size_t> operations
std::size_t parent
std::pair<std::size_t, std::size_t> children

Public Static Attributes

static constexpr size_t UNKNOWN = std::numeric_limits<size_t>::max()