57 if (!gate)
return std::nullopt;
59 switch (gate->GetGateType())
64 const auto g = std::static_pointer_cast<Circuits::PhaseGate<>>(gate);
65 pgate.SetPhaseShift(g->GetLambda());
66 return QC::Gates::AppliedGate<>(pgate.getRawOperatorMatrix(), gate->GetQubit(0));
69 return QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), gate->GetQubit(0));
71 return QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), gate->GetQubit(0));
73 return QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), gate->GetQubit(0));
75 return QC::Gates::AppliedGate<>(h.getRawOperatorMatrix(), gate->GetQubit(0));
77 return QC::Gates::AppliedGate<>(sgate.getRawOperatorMatrix(), gate->GetQubit(0));
79 return QC::Gates::AppliedGate<>(sdggate.getRawOperatorMatrix(), gate->GetQubit(0));
81 return QC::Gates::AppliedGate<>(tgate.getRawOperatorMatrix(), gate->GetQubit(0));
83 return QC::Gates::AppliedGate<>(tdggate.getRawOperatorMatrix(), gate->GetQubit(0));
85 return QC::Gates::AppliedGate<>(sxgate.getRawOperatorMatrix(), gate->GetQubit(0));
87 return QC::Gates::AppliedGate<>(sxdaggate.getRawOperatorMatrix(), gate->GetQubit(0));
89 return QC::Gates::AppliedGate<>(k.getRawOperatorMatrix(), gate->GetQubit(0));
92 const auto g = std::static_pointer_cast<Circuits::RxGate<>>(gate);
93 rxgate.SetTheta(g->GetTheta());
94 return QC::Gates::AppliedGate<>(rxgate.getRawOperatorMatrix(), gate->GetQubit(0));
98 const auto g = std::static_pointer_cast<Circuits::RyGate<>>(gate);
99 rygate.SetTheta(g->GetTheta());
100 return QC::Gates::AppliedGate<>(rygate.getRawOperatorMatrix(), gate->GetQubit(0));
104 const auto g = std::static_pointer_cast<Circuits::RzGate<>>(gate);
105 rzgate.SetTheta(g->GetTheta());
106 return QC::Gates::AppliedGate<>(rzgate.getRawOperatorMatrix(), gate->GetQubit(0));
110 const auto g = std::static_pointer_cast<Circuits::UGate<>>(gate);
111 ugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
112 return QC::Gates::AppliedGate<>(ugate.getRawOperatorMatrix(), gate->GetQubit(0));
117 return QC::Gates::AppliedGate<>(swapgate.getRawOperatorMatrix(), gate->GetQubit(0), gate->GetQubit(1));
119 return QC::Gates::AppliedGate<>(cxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
121 return QC::Gates::AppliedGate<>(cygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
123 return QC::Gates::AppliedGate<>(czgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
126 const auto g = std::static_pointer_cast<Circuits::CPGate<>>(gate);
127 cpgate.SetPhaseShift(g->GetLambda());
128 return QC::Gates::AppliedGate<>(cpgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
132 const auto g = std::static_pointer_cast<Circuits::CRxGate<>>(gate);
133 crxgate.SetTheta(g->GetTheta());
134 return QC::Gates::AppliedGate<>(crxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
138 const auto g = std::static_pointer_cast<Circuits::CRyGate<>>(gate);
139 crygate.SetTheta(g->GetTheta());
140 return QC::Gates::AppliedGate<>(crygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
144 const auto g = std::static_pointer_cast<Circuits::CRzGate<>>(gate);
145 crzgate.SetTheta(g->GetTheta());
146 return QC::Gates::AppliedGate<>(crzgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
149 return QC::Gates::AppliedGate<>(ch.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
151 return QC::Gates::AppliedGate<>(csx.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
153 return QC::Gates::AppliedGate<>(csxdag.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
156 const auto g = std::static_pointer_cast<Circuits::CUGate<>>(gate);
157 cugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
158 return QC::Gates::AppliedGate<>(cugate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
163 return QC::Gates::AppliedGate<>(ccxgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
165 return QC::Gates::AppliedGate<>(cswapgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
282 const auto& currentAmplitudes = simulator.GetAmplitudes();
283 auto amplitudes = currentAmplitudes;
286 for (
size_t i = 0; i < pauliStringOrig.size(); ++i)
288 const char c = pauliStringOrig[i];
294 PropagateStep(QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), i), amplitudes);
299 PropagateStep(QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), i), amplitudes);
304 PropagateStep(QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), i), amplitudes);
312 double expectation = 0.0;
314 for (
const auto& [state, amplitude] : amplitudes)
316 if (currentAmplitudes.find(state) == currentAmplitudes.end())
319 const auto& oldAmplitude = currentAmplitudes.at(state);
320 expectation += std::real(std::conj(oldAmplitude) * amplitude);