84 switch (gate->GetGateType())
88 const auto g = std::static_pointer_cast<Circuits::PhaseGate<>>(gate);
89 pgate.SetPhaseShift(g->GetLambda());
90 return QC::Gates::AppliedGate<>(pgate.getRawOperatorMatrix(), gate->GetQubit(0));
93 return QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), gate->GetQubit(0));
95 return QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), gate->GetQubit(0));
97 return QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), gate->GetQubit(0));
99 return QC::Gates::AppliedGate<>(h.getRawOperatorMatrix(), gate->GetQubit(0));
101 return QC::Gates::AppliedGate<>(sgate.getRawOperatorMatrix(), gate->GetQubit(0));
103 return QC::Gates::AppliedGate<>(sdggate.getRawOperatorMatrix(), gate->GetQubit(0));
105 return QC::Gates::AppliedGate<>(tgate.getRawOperatorMatrix(), gate->GetQubit(0));
107 return QC::Gates::AppliedGate<>(tdggate.getRawOperatorMatrix(), gate->GetQubit(0));
109 return QC::Gates::AppliedGate<>(sxgate.getRawOperatorMatrix(), gate->GetQubit(0));
111 return QC::Gates::AppliedGate<>(sxdaggate.getRawOperatorMatrix(), gate->GetQubit(0));
113 return QC::Gates::AppliedGate<>(k.getRawOperatorMatrix(), gate->GetQubit(0));
115 const auto g = std::static_pointer_cast<Circuits::RxGate<>>(gate);
116 rxgate.SetTheta(g->GetTheta());
117 return QC::Gates::AppliedGate<>(rxgate.getRawOperatorMatrix(), gate->GetQubit(0));
120 const auto g = std::static_pointer_cast<Circuits::RyGate<>>(gate);
121 rygate.SetTheta(g->GetTheta());
122 return QC::Gates::AppliedGate<>(rygate.getRawOperatorMatrix(), gate->GetQubit(0));
125 const auto g = std::static_pointer_cast<Circuits::RzGate<>>(gate);
126 rzgate.SetTheta(g->GetTheta());
127 return QC::Gates::AppliedGate<>(rzgate.getRawOperatorMatrix(), gate->GetQubit(0));
130 const auto g = std::static_pointer_cast<Circuits::UGate<>>(gate);
131 ugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
132 return QC::Gates::AppliedGate<>(ugate.getRawOperatorMatrix(), gate->GetQubit(0));
137 return QC::Gates::AppliedGate<>(swapgate.getRawOperatorMatrix(), gate->GetQubit(0), gate->GetQubit(1));
139 return QC::Gates::AppliedGate<>(cxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
141 return QC::Gates::AppliedGate<>(cygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
143 return QC::Gates::AppliedGate<>(czgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
145 const auto g = std::static_pointer_cast<Circuits::CPGate<>>(gate);
146 cpgate.SetPhaseShift(g->GetLambda());
147 return QC::Gates::AppliedGate<>(cpgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
150 const auto g = std::static_pointer_cast<Circuits::CRxGate<>>(gate);
151 crxgate.SetTheta(g->GetTheta());
152 return QC::Gates::AppliedGate<>(crxgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
155 const auto g = std::static_pointer_cast<Circuits::CRyGate<>>(gate);
156 crygate.SetTheta(g->GetTheta());
157 return QC::Gates::AppliedGate<>(crygate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
160 const auto g = std::static_pointer_cast<Circuits::CRzGate<>>(gate);
161 crzgate.SetTheta(g->GetTheta());
162 return QC::Gates::AppliedGate<>(crzgate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
165 return QC::Gates::AppliedGate<>(ch.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
167 return QC::Gates::AppliedGate<>(csx.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
169 return QC::Gates::AppliedGate<>(csxdag.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
171 const auto g = std::static_pointer_cast<Circuits::CUGate<>>(gate);
172 cugate.SetParams(g->GetTheta(), g->GetPhi(), g->GetLambda(), g->GetGamma());
173 return QC::Gates::AppliedGate<>(cugate.getRawOperatorMatrix(), gate->GetQubit(1), gate->GetQubit(0));
178 return QC::Gates::AppliedGate<>(ccxgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
180 return QC::Gates::AppliedGate<>(cswapgate.getRawOperatorMatrix(), gate->GetQubit(2), gate->GetQubit(1), gate->GetQubit(0));
306 const auto ¤tAmplitudes = simulator.GetAmplitudes();
307 auto amplitudes = currentAmplitudes;
310 for (
size_t i = 0; i < pauliStringOrig.size(); ++i)
312 const char c = pauliStringOrig[i];
318 PropagateStep(QC::Gates::AppliedGate<>(xgate.getRawOperatorMatrix(), i), amplitudes);
323 PropagateStep(QC::Gates::AppliedGate<>(ygate.getRawOperatorMatrix(), i), amplitudes);
328 PropagateStep(QC::Gates::AppliedGate<>(zgate.getRawOperatorMatrix(), i), amplitudes);
336 double expectation = 0.0;
338 for (
const auto &[state, amplitude] : amplitudes)
340 if (currentAmplitudes.find(state) == currentAmplitudes.end())
343 const auto &oldAmplitude = currentAmplitudes.at(state);
344 expectation += std::real(std::conj(oldAmplitude) * amplitude);