17#ifndef _CIRCUIT_FACTORY_H_
18#define _CIRCUIT_FACTORY_H_
51 return std::make_shared<Circuit<Time>>(ops);
68 return std::make_shared<Reset<Time>>(qubits, 0, resetTgts);
81 return std::make_shared<Delay<Time>>(qubit, duration);
87 static std::shared_ptr<IOperation<Time>>
CreateRandom(
const std::vector<size_t> &bits = {})
89 return std::make_shared<Random<Time>>(bits);
102 static std::shared_ptr<IOperation<Time>>
CreateRandom(
const std::vector<size_t> &bits,
size_t seed)
104 return std::make_shared<Random<Time>>(bits, seed);
117 static const std::shared_ptr<IOperation<Time>>
CreateMeasurement(
const std::vector<std::pair<Types::qubit_t, size_t>> &qs = {})
119 return std::make_shared<MeasurementOperation<Time>>(qs);
144 static const std::shared_ptr<IQuantumGate<Time>>
CreateGate(
QuantumGateType type,
size_t q1,
size_t q2 = 0,
size_t q3 = 0,
double param1 = 0,
145 double param2 = 0,
double param3 = 0,
double param4 = 0)
152 std::shared_ptr<IQuantumGate<Time>> gate;
158 gate = std::make_shared<PhaseGate<Time>>(q1, param1);
161 gate = std::make_shared<XGate<Time>>(q1);
164 gate = std::make_shared<YGate<Time>>(q1);
167 gate = std::make_shared<ZGate<Time>>(q1);
170 gate = std::make_shared<HadamardGate<Time>>(q1);
173 gate = std::make_shared<SGate<Time>>(q1);
176 gate = std::make_shared<SdgGate<Time>>(q1);
179 gate = std::make_shared<TGate<Time>>(q1);
182 gate = std::make_shared<TdgGate<Time>>(q1);
185 gate = std::make_shared<SxGate<Time>>(q1);
188 gate = std::make_shared<SxDagGate<Time>>(q1);
191 gate = std::make_shared<KGate<Time>>(q1);
194 gate = std::make_shared<RxGate<Time>>(q1, param1);
197 gate = std::make_shared<RyGate<Time>>(q1, param1);
200 gate = std::make_shared<RzGate<Time>>(q1, param1);
203 gate = std::make_shared<UGate<Time>>(q1, param1, param2, param3, param4);
207 gate = std::make_shared<SwapGate<Time>>(q1, q2);
210 gate = std::make_shared<CXGate<Time>>(q1, q2);
213 gate = std::make_shared<CYGate<Time>>(q1, q2);
216 gate = std::make_shared<CZGate<Time>>(q1, q2);
219 gate = std::make_shared<CPGate<Time>>(q1, q2, param1);
222 gate = std::make_shared<CRxGate<Time>>(q1, q2, param1);
225 gate = std::make_shared<CRyGate<Time>>(q1, q2, param1);
228 gate = std::make_shared<CRzGate<Time>>(q1, q2, param1);
231 gate = std::make_shared<CHGate<Time>>(q1, q2);
234 gate = std::make_shared<CSxGate<Time>>(q1, q2);
237 gate = std::make_shared<CSxDagGate<Time>>(q1, q2);
240 gate = std::make_shared<CUGate<Time>>(q1, q2, param1, param2, param3, param4);
244 gate = std::make_shared<CSwapGate<Time>>(q1, q2, q3);
247 gate = std::make_shared<CCXGate<Time>>(q1, q2, q3);
269 const std::vector<double> ¶ms = {})
271 return CreateGate(type, qubits.empty() ? 0 : qubits[0], (qubits.size() < 2) ? 0 : qubits[1], (qubits.size() < 3) ? 0 : qubits[2],
272 params.empty() ? 0. : params[0], (params.size() < 2) ? 0. : params[1], (params.size() < 3) ? 0. : params[2],
273 (params.size() < 4) ? 0. : params[3]);
290 static std::shared_ptr<ICondition>
CreateEqualCondition(
const std::vector<size_t> &ind,
const std::vector<bool> &b)
292 return std::make_shared<EqualCondition>(ind, b);
311 const std::shared_ptr<ICondition> &condition)
313 return std::make_shared<ConditionalGate<Time>>(operation, condition);
332 return std::make_shared<ConditionalGate<Time>>(operation, eqcond);
349 const std::shared_ptr<ICondition> &condition)
351 return std::make_shared<ConditionalMeasurement<Time>>(measurement, condition);
369 const std::shared_ptr<ICondition> &condition)
371 return std::make_shared<ConditionalRandomGen<Time>>(randomGen, condition);
384 return std::make_shared<NoOperation<Time>>();
399 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateBellStateCircuit(
size_t qbit1,
size_t qbit2,
bool qbit1X =
false,
bool qbit2X =
false)
407 std::vector<std::shared_ptr<IOperation<Time>>> ops(s);
432 std::vector<std::shared_ptr<IOperation<Time>>> ops(2);
451 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateGZHStateCircuit(
size_t qbit1,
size_t qbit2,
size_t qbit3)
453 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
478 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateTeleportationCircuit(
size_t entqbit1,
size_t entqbit2,
size_t srcqbit,
size_t cbit1,
481 std::vector<std::shared_ptr<IOperation<Time>>> ops(8);
518 size_t ctrlEntangledMeasureBit)
520 std::vector<std::shared_ptr<IOperation<Time>>> ops(5);
532 const std::vector<std::pair<Types::qubit_t, size_t>> measureOps{{ctrlEntangledQubit, ctrlEntangledMeasureBit}};
541 ops[4] = std::make_shared<Circuits::ConditionalGate<Time>>(
542 std::make_shared<Circuits::XGate<Time>>(tgtEntangledQubit),
543 std::make_shared<Circuits::EqualCondition>(std::vector<size_t>{ctrlEntangledMeasureBit}, std::vector<bool>{
true}));
560 size_t tgtEntangledMeasureBit)
562 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
564 ops[0] = std::make_shared<Circuits::HadamardGate<Time>>(tgtEntangledQubit);
565 const std::vector<std::pair<Types::qubit_t, size_t>> measureOps{{tgtEntangledQubit, tgtEntangledMeasureBit}};
566 ops[1] = std::make_shared<Circuits::MeasurementOperation<Time>>(measureOps);
567 ops[2] = std::make_shared<Circuits::ConditionalGate<Time>>(
568 std::make_shared<Circuits::ZGate<Time>>(ctrlQubit),
569 std::make_shared<Circuits::EqualCondition>(std::vector<size_t>{tgtEntangledMeasureBit}, std::vector<bool>{
true}));
582 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateMeasureX(
size_t qubit,
size_t cbit)
584 std::vector<std::shared_ptr<IOperation<Time>>> ops(2);
599 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateMeasureY(
size_t qubit,
size_t cbit)
601 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
617 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateMeasureZ(
size_t qubit,
size_t cbit)
619 std::vector<std::shared_ptr<IOperation<Time>>> ops(1);
632 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateInitZero(
size_t qubit)
634 std::vector<std::shared_ptr<IOperation<Time>>> ops(1);
647 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateInitOne(
size_t qubit)
649 std::vector<std::shared_ptr<IOperation<Time>>> ops(2);
663 static std::vector<std::shared_ptr<IOperation<Time>>>
CreateInitPlus(
size_t qubit)
665 std::vector<std::shared_ptr<IOperation<Time>>> ops(2);
681 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
698 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
715 std::vector<std::shared_ptr<IOperation<Time>>> ops(3);
Factory for quantum gates and other operations.
static std::shared_ptr< IOperation< Time > > CreateSimpleConditionalGate(const std::shared_ptr< IGateOperation< Time > > &operation, const size_t cbit)
Construct a simple conditional gate.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateGZHStateCircuit(size_t qbit1, size_t qbit2, size_t qbit3)
Creates a circuit that prepares three qubits in a GHZ state.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitMinusI(size_t qubit)
Creates the circuit for initializing a qubit in the |-i> state.
static std::shared_ptr< IOperation< Time > > CreateNoOp()
Creates a no op.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitMinus(size_t qubit)
Creates the circuit for initializing a qubit in the |-> state.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitOne(size_t qubit)
Creates the circuit for initializing a qubit in the |1> state.
static const std::shared_ptr< IQuantumGate< Time > > CreateGate(QuantumGateType type, size_t q1, size_t q2=0, size_t q3=0, double param1=0, double param2=0, double param3=0, double param4=0)
Construct a quantum gate.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitZero(size_t qubit)
Creates the circuit for initializing a qubit in the |0> state.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateMeasureY(size_t qubit, size_t cbit)
Creates the circuit for measuring a qubit in the Y basis.
static std::shared_ptr< IOperation< Time > > CreateConditionalGate(const std::shared_ptr< IGateOperation< Time > > &operation, const std::shared_ptr< ICondition > &condition)
Construct a conditional gate.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitPlusI(size_t qubit)
Creates the circuit for initializing a qubit in the |i> state.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateMeasureZ(size_t qubit, size_t cbit)
Creates the circuit for measuring a qubit in the Z basis.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateMeasureX(size_t qubit, size_t cbit)
Creates the circuit for measuring a qubit in the X basis.
static std::shared_ptr< IOperation< Time > > CreateReset(const Types::qubits_vector &qubits={}, const std::vector< bool > &resetTgts={})
Construct a reset operation.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateStartDistributionCircuit(size_t ctrlQubit, size_t ctrlEntangledQubit, size_t tgtEntangledQubit, size_t ctrlEntangledMeasureBit)
Creates the circuit for distribution start.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateEndDistributionCircuit(size_t ctrlQubit, size_t tgtEntangledQubit, size_t tgtEntangledMeasureBit)
Creates the circuit for distribution end.
static const std::shared_ptr< IOperation< Time > > CreateMeasurement(const std::vector< std::pair< Types::qubit_t, size_t > > &qs={})
Construct a measurement operation.
static std::shared_ptr< Circuit< Time > > CreateCircuit(const std::vector< std::shared_ptr< IOperation< Time > > > &ops={})
Construct a circuit.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateTeleportationCircuit(size_t entqbit1, size_t entqbit2, size_t srcqbit, size_t cbit1, size_t cbit2)
Creates a teleportation circuit.
static std::shared_ptr< IOperation< Time > > CreateDelay(Types::qubit_t qubit=0, Time duration=0)
Construct a delay operation.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateBellStateDecoderCircuit(size_t qbit1, size_t qbit2)
Creates a Bell state decoder circuit.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateBellStateCircuit(size_t qbit1, size_t qbit2, bool qbit1X=false, bool qbit2X=false)
Creates a circuit that prepares a qubit pair in a Bell state.
static std::shared_ptr< IOperation< Time > > CreateConditionalRandomGen(const std::shared_ptr< Random< Time > > &randomGen, const std::shared_ptr< ICondition > &condition)
Constructs a conditional random number generator.
static std::shared_ptr< IOperation< Time > > CreateRandom(const std::vector< size_t > &bits={})
Construct a random operation without an explicit seed.
static const std::shared_ptr< IOperation< Time > > CreateGateWithVectors(QuantumGateType type, const Types::qubits_vector &qubits, const std::vector< double > ¶ms={})
Construct a quantum gate.
static std::vector< std::shared_ptr< IOperation< Time > > > CreateInitPlus(size_t qubit)
Creates the circuit for initializing a qubit in the |+> state.
static std::shared_ptr< IOperation< Time > > CreateRandom(const std::vector< size_t > &bits, size_t seed)
Construct a random operation with an explicit seed, including zero.
static std::shared_ptr< IOperation< Time > > CreateConditionalMeasurement(const std::shared_ptr< MeasurementOperation< Time > > &measurement, const std::shared_ptr< ICondition > &condition)
Constructs a conditional measurement.
static std::shared_ptr< ICondition > CreateEqualCondition(const std::vector< size_t > &ind, const std::vector< bool > &b)
Construct an equality condition.
The gate operation interface.
Measurement operation class.
QuantumGateType
The type of quantum gates.
std::vector< qubit_t > qubits_vector
The type of a vector of qubits.
uint_fast64_t qubit_t
The type of a qubit.