56 if (!gate)
return std::nullopt;
58 switch (gate->GetGateType())
63 const auto g = std::static_pointer_cast<Circuits::PhaseGate<>>(gate);
64 pgate.SetPhaseShift(g->GetLambda());
65 return QC::Gates::AppliedGate<>(pgate.getRawOperatorMatrix(), gate->GetQubit(0));
68 return QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), gate->GetQubit(0));
70 return QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), gate->GetQubit(0));
72 return QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), gate->GetQubit(0));
74 return QC::Gates::AppliedGate<>(h.getRawOperatorMatrix(), gate->GetQubit(0));
76 return QC::Gates::AppliedGate<>(sgate.getRawOperatorMatrix(), gate->GetQubit(0));
78 return QC::Gates::AppliedGate<>(sdggate.getRawOperatorMatrix(), gate->GetQubit(0));
80 return QC::Gates::AppliedGate<>(tgate.getRawOperatorMatrix(), gate->GetQubit(0));
82 return QC::Gates::AppliedGate<>(tdggate.getRawOperatorMatrix(), gate->GetQubit(0));
84 return QC::Gates::AppliedGate<>(sxgate.getRawOperatorMatrix(), gate->GetQubit(0));
86 return QC::Gates::AppliedGate<>(sxdaggate.getRawOperatorMatrix(), gate->GetQubit(0));
88 return QC::Gates::AppliedGate<>(k.getRawOperatorMatrix(), gate->GetQubit(0));
91 const auto g = std::static_pointer_cast<Circuits::RxGate<>>(gate);
92 rxgate.SetTheta(g->GetTheta());
93 return QC::Gates::AppliedGate<>(rxgate.getRawOperatorMatrix(), gate->GetQubit(0));
97 const auto g = std::static_pointer_cast<Circuits::RyGate<>>(gate);
98 rygate.SetTheta(g->GetTheta());
99 return QC::Gates::AppliedGate<>(rygate.getRawOperatorMatrix(), gate->GetQubit(0));
103 const auto g = std::static_pointer_cast<Circuits::RzGate<>>(gate);
104 rzgate.SetTheta(g->GetTheta());
105 return QC::Gates::AppliedGate<>(rzgate.getRawOperatorMatrix(), gate->GetQubit(0));
109 const auto g = std::static_pointer_cast<Circuits::UGate<>>(gate);
110 ugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
111 return QC::Gates::AppliedGate<>(ugate.getRawOperatorMatrix(), gate->GetQubit(0));
116 return QC::Gates::AppliedGate<>(swapgate.getRawOperatorMatrix(), gate->GetQubit(0), gate->GetQubit(1));
118 return QC::Gates::AppliedGate<>(cxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
120 return QC::Gates::AppliedGate<>(cygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
122 return QC::Gates::AppliedGate<>(czgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
125 const auto g = std::static_pointer_cast<Circuits::CPGate<>>(gate);
126 cpgate.SetPhaseShift(g->GetLambda());
127 return QC::Gates::AppliedGate<>(cpgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
131 const auto g = std::static_pointer_cast<Circuits::CRxGate<>>(gate);
132 crxgate.SetTheta(g->GetTheta());
133 return QC::Gates::AppliedGate<>(crxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
137 const auto g = std::static_pointer_cast<Circuits::CRyGate<>>(gate);
138 crygate.SetTheta(g->GetTheta());
139 return QC::Gates::AppliedGate<>(crygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
143 const auto g = std::static_pointer_cast<Circuits::CRzGate<>>(gate);
144 crzgate.SetTheta(g->GetTheta());
145 return QC::Gates::AppliedGate<>(crzgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
148 return QC::Gates::AppliedGate<>(ch.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
150 return QC::Gates::AppliedGate<>(csx.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
152 return QC::Gates::AppliedGate<>(csxdag.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
155 const auto g = std::static_pointer_cast<Circuits::CUGate<>>(gate);
156 cugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
157 return QC::Gates::AppliedGate<>(cugate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
162 return QC::Gates::AppliedGate<>(ccxgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
164 return QC::Gates::AppliedGate<>(cswapgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
281 const auto& currentAmplitudes = simulator.GetAmplitudes();
282 auto amplitudes = currentAmplitudes;
285 for (
size_t i = 0; i < pauliStringOrig.size(); ++i)
287 const char c = pauliStringOrig[i];
293 PropagateStep(QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), i), amplitudes);
298 PropagateStep(QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), i), amplitudes);
303 PropagateStep(QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), i), amplitudes);
311 double expectation = 0.0;
313 for (
const auto& [state, amplitude] : amplitudes)
315 if (currentAmplitudes.find(state) == currentAmplitudes.end())
318 const auto& oldAmplitude = currentAmplitudes.at(state);
319 expectation += std::real(std::conj(oldAmplitude) * amplitude);