Maestro 0.2.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuSimulator.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#ifndef _GPUSIMULATOR_H
16#define _GPUSIMULATOR_H
17
18#ifdef INCLUDED_BY_FACTORY
19
20#ifdef __linux__
21
22#include "GpuState.h"
23
24namespace Simulators {
25// TODO: Maybe use the pimpl idiom
26// https://en.cppreference.com/w/cpp/language/pimpl to hide the implementation
27// for good but during development this should be good enough
28namespace Private {
29
41class GpuSimulator : public GpuState {
42 public:
43 GpuSimulator() = default;
44 // allow no copy or assignment
45 GpuSimulator(const GpuSimulator &) = delete;
46 GpuSimulator &operator=(const GpuSimulator &) = delete;
47
48 // but allow moving
49 GpuSimulator(GpuSimulator &&other) = default;
50 GpuSimulator &operator=(GpuSimulator &&other) = default;
51
52
58 void ApplyGenericOneQubitGate(Types::qubit_t qubit,
59 const Eigen::Matrix2cd& gate) override {
60 throw std::runtime_error(
61 "GpuSimulator::ApplyGenericOneQubitGate: Not supported for GPU "
62 "simulator yet.");
63 }
64
71 void ApplyGenericTwoQubitGate(Types::qubit_t qubit0, Types::qubit_t qubit1,
72 const Eigen::Matrix4cd& gate) override {
73 throw std::runtime_error(
74 "GpuSimulator::ApplyGenericTwoQubitGate: Not supported for GPU "
75 "simulator yet.");
76 }
77
85 void ApplyP(Types::qubit_t qubit, double lambda) override {
86 if (GetSimulationType() == SimulationType::kStatevector)
87 state->ApplyP(qubit, lambda);
88 else if (GetSimulationType() == SimulationType::kMatrixProductState)
89 mps->ApplyP(qubit, lambda);
90 else if (GetSimulationType() == SimulationType::kTensorNetwork)
91 tn->ApplyP(qubit, lambda);
92 else if (GetSimulationType() == SimulationType::kPauliPropagator)
93 pp->ApplyP(qubit, lambda);
94
95 NotifyObservers({qubit});
96 }
97
104 void ApplyX(Types::qubit_t qubit) override {
105 if (GetSimulationType() == SimulationType::kStatevector)
106 state->ApplyX(qubit);
107 else if (GetSimulationType() == SimulationType::kMatrixProductState)
108 mps->ApplyX(qubit);
109 else if (GetSimulationType() == SimulationType::kTensorNetwork)
110 tn->ApplyX(qubit);
111 else if (GetSimulationType() == SimulationType::kPauliPropagator)
112 pp->ApplyX(qubit);
113
114 NotifyObservers({qubit});
115 }
116
123 void ApplyY(Types::qubit_t qubit) override {
124 if (GetSimulationType() == SimulationType::kStatevector)
125 state->ApplyY(qubit);
126 else if (GetSimulationType() == SimulationType::kMatrixProductState)
127 mps->ApplyY(qubit);
128 else if (GetSimulationType() == SimulationType::kTensorNetwork)
129 tn->ApplyY(qubit);
130 else if (GetSimulationType() == SimulationType::kPauliPropagator)
131 pp->ApplyY(qubit);
132
133 NotifyObservers({qubit});
134 }
135
142 void ApplyZ(Types::qubit_t qubit) override {
143 if (GetSimulationType() == SimulationType::kStatevector)
144 state->ApplyZ(qubit);
145 else if (GetSimulationType() == SimulationType::kMatrixProductState)
146 mps->ApplyZ(qubit);
147 else if (GetSimulationType() == SimulationType::kTensorNetwork)
148 tn->ApplyZ(qubit);
149 else if (GetSimulationType() == SimulationType::kPauliPropagator)
150 pp->ApplyZ(qubit);
151
152 NotifyObservers({qubit});
153 }
154
161 void ApplyH(Types::qubit_t qubit) override {
162 if (GetSimulationType() == SimulationType::kStatevector)
163 state->ApplyH(qubit);
164 else if (GetSimulationType() == SimulationType::kMatrixProductState)
165 mps->ApplyH(qubit);
166 else if (GetSimulationType() == SimulationType::kTensorNetwork)
167 tn->ApplyH(qubit);
168 else if (GetSimulationType() == SimulationType::kPauliPropagator)
169 pp->ApplyH(qubit);
170
171 NotifyObservers({qubit});
172 }
173
180 void ApplyS(Types::qubit_t qubit) override {
181 if (GetSimulationType() == SimulationType::kStatevector)
182 state->ApplyS(qubit);
183 else if (GetSimulationType() == SimulationType::kMatrixProductState)
184 mps->ApplyS(qubit);
185 else if (GetSimulationType() == SimulationType::kTensorNetwork)
186 tn->ApplyS(qubit);
187 else if (GetSimulationType() == SimulationType::kPauliPropagator)
188 pp->ApplyS(qubit);
189
190 NotifyObservers({qubit});
191 }
192
199 void ApplySDG(Types::qubit_t qubit) override {
200 if (GetSimulationType() == SimulationType::kStatevector)
201 state->ApplySDG(qubit);
202 else if (GetSimulationType() == SimulationType::kMatrixProductState)
203 mps->ApplySDG(qubit);
204 else if (GetSimulationType() == SimulationType::kTensorNetwork)
205 tn->ApplySDG(qubit);
206 else if (GetSimulationType() == SimulationType::kPauliPropagator)
207 pp->ApplySDG(qubit);
208
209 NotifyObservers({qubit});
210 }
211
218 void ApplyT(Types::qubit_t qubit) override {
219 if (GetSimulationType() == SimulationType::kStatevector)
220 state->ApplyT(qubit);
221 else if (GetSimulationType() == SimulationType::kMatrixProductState)
222 mps->ApplyT(qubit);
223 else if (GetSimulationType() == SimulationType::kTensorNetwork)
224 tn->ApplyT(qubit);
225 else if (GetSimulationType() == SimulationType::kPauliPropagator)
226 pp->ApplyT(qubit);
227
228 NotifyObservers({qubit});
229 }
230
237 void ApplyTDG(Types::qubit_t qubit) override {
238 if (GetSimulationType() == SimulationType::kStatevector)
239 state->ApplyTDG(qubit);
240 else if (GetSimulationType() == SimulationType::kMatrixProductState)
241 mps->ApplyTDG(qubit);
242 else if (GetSimulationType() == SimulationType::kTensorNetwork)
243 tn->ApplyTDG(qubit);
244 else if (GetSimulationType() == SimulationType::kPauliPropagator)
245 pp->ApplyTDG(qubit);
246
247 NotifyObservers({qubit});
248 }
249
256 void ApplySx(Types::qubit_t qubit) override {
257 if (GetSimulationType() == SimulationType::kStatevector)
258 state->ApplySX(qubit);
259 else if (GetSimulationType() == SimulationType::kMatrixProductState)
260 mps->ApplySX(qubit);
261 else if (GetSimulationType() == SimulationType::kTensorNetwork)
262 tn->ApplySX(qubit);
263 else if (GetSimulationType() == SimulationType::kPauliPropagator)
264 pp->ApplySQRTX(qubit);
265
266 NotifyObservers({qubit});
267 }
268
275 void ApplySxDAG(Types::qubit_t qubit) override {
276 if (GetSimulationType() == SimulationType::kStatevector)
277 state->ApplySXDG(qubit);
278 else if (GetSimulationType() == SimulationType::kMatrixProductState)
279 mps->ApplySXDG(qubit);
280 else if (GetSimulationType() == SimulationType::kTensorNetwork)
281 tn->ApplySXDG(qubit);
282 else if (GetSimulationType() == SimulationType::kPauliPropagator)
283 pp->ApplySxDAG(qubit);
284
285 NotifyObservers({qubit});
286 }
287
294 void ApplyK(Types::qubit_t qubit) override {
295 if (GetSimulationType() == SimulationType::kStatevector)
296 state->ApplyK(qubit);
297 else if (GetSimulationType() == SimulationType::kMatrixProductState)
298 mps->ApplyK(qubit);
299 else if (GetSimulationType() == SimulationType::kTensorNetwork)
300 tn->ApplyK(qubit);
301 else if (GetSimulationType() == SimulationType::kPauliPropagator)
302 pp->ApplyK(qubit);
303
304 NotifyObservers({qubit});
305 }
306
314 void ApplyRx(Types::qubit_t qubit, double theta) override {
315 if (GetSimulationType() == SimulationType::kStatevector)
316 state->ApplyRx(qubit, theta);
317 else if (GetSimulationType() == SimulationType::kMatrixProductState)
318 mps->ApplyRx(qubit, theta);
319 else if (GetSimulationType() == SimulationType::kTensorNetwork)
320 tn->ApplyRx(qubit, theta);
321 else if (GetSimulationType() == SimulationType::kPauliPropagator)
322 pp->ApplyRX(qubit, theta);
323
324 NotifyObservers({qubit});
325 }
326
334 void ApplyRy(Types::qubit_t qubit, double theta) override {
335 if (GetSimulationType() == SimulationType::kStatevector)
336 state->ApplyRy(qubit, theta);
337 else if (GetSimulationType() == SimulationType::kMatrixProductState)
338 mps->ApplyRy(qubit, theta);
339 else if (GetSimulationType() == SimulationType::kTensorNetwork)
340 tn->ApplyRy(qubit, theta);
341 else if (GetSimulationType() == SimulationType::kPauliPropagator)
342 pp->ApplyRY(qubit, theta);
343
344 NotifyObservers({qubit});
345 }
346
354 void ApplyRz(Types::qubit_t qubit, double theta) override {
355 if (GetSimulationType() == SimulationType::kStatevector)
356 state->ApplyRz(qubit, theta);
357 else if (GetSimulationType() == SimulationType::kMatrixProductState)
358 mps->ApplyRz(qubit, theta);
359 else if (GetSimulationType() == SimulationType::kTensorNetwork)
360 tn->ApplyRz(qubit, theta);
361 else if (GetSimulationType() == SimulationType::kPauliPropagator)
362 pp->ApplyRZ(qubit, theta);
363
364 NotifyObservers({qubit});
365 }
366
374 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
375 double gamma) override {
376 if (GetSimulationType() == SimulationType::kStatevector)
377 state->ApplyU(qubit, theta, phi, lambda, gamma);
378 else if (GetSimulationType() == SimulationType::kMatrixProductState)
379 mps->ApplyU(qubit, theta, phi, lambda, gamma);
380 else if (GetSimulationType() == SimulationType::kTensorNetwork)
381 tn->ApplyU(qubit, theta, phi, lambda, gamma);
382 else if (GetSimulationType() == SimulationType::kPauliPropagator)
383 pp->ApplyU(qubit, theta, phi, lambda, gamma);
384
385 NotifyObservers({qubit});
386 }
387
395 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
396 if (GetSimulationType() == SimulationType::kStatevector)
397 state->ApplyCX(ctrl_qubit, tgt_qubit);
398 else if (GetSimulationType() == SimulationType::kMatrixProductState)
399 mps->ApplyCX(ctrl_qubit, tgt_qubit);
400 else if (GetSimulationType() == SimulationType::kTensorNetwork)
401 tn->ApplyCX(ctrl_qubit, tgt_qubit);
402 else if (GetSimulationType() == SimulationType::kPauliPropagator)
403 pp->ApplyCX(ctrl_qubit, tgt_qubit);
404
405 NotifyObservers({tgt_qubit, ctrl_qubit});
406 }
407
415 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
416 if (GetSimulationType() == SimulationType::kStatevector)
417 state->ApplyCY(ctrl_qubit, tgt_qubit);
418 else if (GetSimulationType() == SimulationType::kMatrixProductState)
419 mps->ApplyCY(ctrl_qubit, tgt_qubit);
420 else if (GetSimulationType() == SimulationType::kTensorNetwork)
421 tn->ApplyCY(ctrl_qubit, tgt_qubit);
422 else if (GetSimulationType() == SimulationType::kPauliPropagator)
423 pp->ApplyCY(ctrl_qubit, tgt_qubit);
424
425 NotifyObservers({tgt_qubit, ctrl_qubit});
426 }
427
435 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
436 if (GetSimulationType() == SimulationType::kStatevector)
437 state->ApplyCZ(ctrl_qubit, tgt_qubit);
438 else if (GetSimulationType() == SimulationType::kMatrixProductState)
439 mps->ApplyCZ(ctrl_qubit, tgt_qubit);
440 else if (GetSimulationType() == SimulationType::kTensorNetwork)
441 tn->ApplyCZ(ctrl_qubit, tgt_qubit);
442 else if (GetSimulationType() == SimulationType::kPauliPropagator)
443 pp->ApplyCZ(ctrl_qubit, tgt_qubit);
444
445 NotifyObservers({tgt_qubit, ctrl_qubit});
446 }
447
456 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
457 double lambda) override {
458 if (GetSimulationType() == SimulationType::kStatevector)
459 state->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
460 else if (GetSimulationType() == SimulationType::kMatrixProductState)
461 mps->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
462 else if (GetSimulationType() == SimulationType::kTensorNetwork)
463 tn->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
464 else if (GetSimulationType() == SimulationType::kPauliPropagator)
465 pp->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
466
467 NotifyObservers({tgt_qubit, ctrl_qubit});
468 }
469
478 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
479 double theta) override {
480 if (GetSimulationType() == SimulationType::kStatevector)
481 state->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
482 else if (GetSimulationType() == SimulationType::kMatrixProductState)
483 mps->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
484 else if (GetSimulationType() == SimulationType::kTensorNetwork)
485 tn->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
486 else if (GetSimulationType() == SimulationType::kPauliPropagator)
487 pp->ApplyCRX(ctrl_qubit, tgt_qubit, theta);
488
489 NotifyObservers({tgt_qubit, ctrl_qubit});
490 }
491
500 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
501 double theta) override {
502 if (GetSimulationType() == SimulationType::kStatevector)
503 state->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
504 else if (GetSimulationType() == SimulationType::kMatrixProductState)
505 mps->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
506 else if (GetSimulationType() == SimulationType::kTensorNetwork)
507 tn->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
508 else if (GetSimulationType() == SimulationType::kPauliPropagator)
509 pp->ApplyCRY(ctrl_qubit, tgt_qubit, theta);
510
511 NotifyObservers({tgt_qubit, ctrl_qubit});
512 }
513
522 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
523 double theta) override {
524 if (GetSimulationType() == SimulationType::kStatevector)
525 state->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
526 else if (GetSimulationType() == SimulationType::kMatrixProductState)
527 mps->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
528 else if (GetSimulationType() == SimulationType::kTensorNetwork)
529 tn->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
530 else if (GetSimulationType() == SimulationType::kPauliPropagator)
531 pp->ApplyCRZ(ctrl_qubit, tgt_qubit, theta);
532
533 NotifyObservers({tgt_qubit, ctrl_qubit});
534 }
535
543 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
544 if (GetSimulationType() == SimulationType::kStatevector)
545 state->ApplyCH(ctrl_qubit, tgt_qubit);
546 else if (GetSimulationType() == SimulationType::kMatrixProductState)
547 mps->ApplyCH(ctrl_qubit, tgt_qubit);
548 else if (GetSimulationType() == SimulationType::kTensorNetwork)
549 tn->ApplyCH(ctrl_qubit, tgt_qubit);
550 else if (GetSimulationType() == SimulationType::kPauliPropagator)
551 pp->ApplyCH(ctrl_qubit, tgt_qubit);
552
553 NotifyObservers({tgt_qubit, ctrl_qubit});
554 }
555
563 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
564 if (GetSimulationType() == SimulationType::kStatevector)
565 state->ApplyCSX(ctrl_qubit, tgt_qubit);
566 else if (GetSimulationType() == SimulationType::kMatrixProductState)
567 mps->ApplyCSX(ctrl_qubit, tgt_qubit);
568 else if (GetSimulationType() == SimulationType::kTensorNetwork)
569 tn->ApplyCSX(ctrl_qubit, tgt_qubit);
570 else if (GetSimulationType() == SimulationType::kPauliPropagator)
571 pp->ApplyCSX(ctrl_qubit, tgt_qubit);
572
573 NotifyObservers({tgt_qubit, ctrl_qubit});
574 }
575
583 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
584 Types::qubit_t tgt_qubit) override {
585 if (GetSimulationType() == SimulationType::kStatevector)
586 state->ApplyCSXDG(ctrl_qubit, tgt_qubit);
587 else if (GetSimulationType() == SimulationType::kMatrixProductState)
588 mps->ApplyCSXDG(ctrl_qubit, tgt_qubit);
589 else if (GetSimulationType() == SimulationType::kTensorNetwork)
590 tn->ApplyCSXDG(ctrl_qubit, tgt_qubit);
591 else if (GetSimulationType() == SimulationType::kPauliPropagator)
592 pp->ApplyCSXDAG(ctrl_qubit, tgt_qubit);
593
594 NotifyObservers({tgt_qubit, ctrl_qubit});
595 }
596
604 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
605 if (GetSimulationType() == SimulationType::kStatevector)
606 state->ApplySwap(qubit0, qubit1);
607 else if (GetSimulationType() == SimulationType::kMatrixProductState)
608 mps->ApplySwap(qubit0, qubit1);
609 else if (GetSimulationType() == SimulationType::kTensorNetwork)
610 tn->ApplySwap(qubit0, qubit1);
611 else if (GetSimulationType() == SimulationType::kPauliPropagator)
612 pp->ApplySWAP(qubit0, qubit1);
613
614 NotifyObservers({qubit1, qubit0});
615 }
616
625 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
626 Types::qubit_t qubit2) override {
627 if (GetSimulationType() == SimulationType::kStatevector) {
628 state->ApplyCCX(qubit0, qubit1, qubit2);
629 NotifyObservers({qubit0, qubit1, qubit2});
630 } else if (GetSimulationType() == SimulationType::kMatrixProductState) {
631 const size_t q1 = qubit0; // control 1
632 const size_t q2 = qubit1; // control 2
633 const size_t q3 = qubit2; // target
634
635 // Sleator-Weinfurter decomposition
636 mps->ApplyCSX(static_cast<unsigned int>(q2),
637 static_cast<unsigned int>(q3));
638 NotifyObservers({qubit1, qubit2});
639
640 mps->ApplyCX(static_cast<unsigned int>(q1),
641 static_cast<unsigned int>(q2));
642 NotifyObservers({qubit0, qubit1});
643
644 mps->ApplyCSXDG(static_cast<unsigned int>(q2),
645 static_cast<unsigned int>(q3));
646 NotifyObservers({qubit1, qubit2});
647
648 mps->ApplyCX(static_cast<unsigned int>(q1),
649 static_cast<unsigned int>(q2));
650 NotifyObservers({qubit0, qubit1});
651
652 mps->ApplyCSX(static_cast<unsigned int>(q1),
653 static_cast<unsigned int>(q3));
654 NotifyObservers({qubit0, qubit2});
655 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
656 tn->ApplyCCX(qubit0, qubit1, qubit2);
657 NotifyObservers({qubit0, qubit1, qubit2});
658 } else if (GetSimulationType() == SimulationType::kPauliPropagator) {
659 pp->ApplyCCX(qubit0, qubit1, qubit2);
660 NotifyObservers({qubit0, qubit1, qubit2});
661 }
662 }
663
672 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
673 Types::qubit_t qubit1) override {
674 if (GetSimulationType() == SimulationType::kStatevector) {
675 state->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
676 NotifyObservers({qubit1, qubit0, ctrl_qubit});
677 } else if (GetSimulationType() == SimulationType::kMatrixProductState) {
678 const size_t q1 = ctrl_qubit; // control
679 const size_t q2 = qubit0;
680 const size_t q3 = qubit1;
681
682 // TODO: find a better decomposition
683 // this one I've got with the qiskit transpiler
684 mps->ApplyCX(static_cast<unsigned int>(q3),
685 static_cast<unsigned int>(q2));
686 NotifyObservers({qubit1, qubit0});
687
688 mps->ApplyCSX(static_cast<unsigned int>(q2),
689 static_cast<unsigned int>(q3));
690 NotifyObservers({qubit0, qubit1});
691
692 mps->ApplyCX(static_cast<unsigned int>(q1),
693 static_cast<unsigned int>(q2));
694 NotifyObservers({ctrl_qubit, qubit0});
695
696 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
697 NotifyObservers({qubit1});
698 mps->ApplyP(static_cast<unsigned int>(q2), -M_PI_2);
699 NotifyObservers({qubit0});
700
701 mps->ApplyCSX(static_cast<unsigned int>(q2),
702 static_cast<unsigned int>(q3));
703 NotifyObservers({qubit0, qubit1});
704
705 mps->ApplyCX(static_cast<unsigned int>(q1),
706 static_cast<unsigned int>(q2));
707 NotifyObservers({ctrl_qubit, qubit0});
708
709 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
710 NotifyObservers({qubit1});
711
712 mps->ApplyCSX(static_cast<unsigned int>(q1),
713 static_cast<unsigned int>(q3));
714 NotifyObservers({ctrl_qubit, qubit1});
715
716 mps->ApplyCX(static_cast<unsigned int>(q3),
717 static_cast<unsigned int>(q2));
718 NotifyObservers({qubit1, qubit0});
719 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
720 tn->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
721 NotifyObservers({qubit1, qubit0, ctrl_qubit});
722 } else if (GetSimulationType() == SimulationType::kPauliPropagator) {
723 pp->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
724 NotifyObservers({qubit1, qubit0, ctrl_qubit});
725 }
726 }
727
739 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
740 double theta, double phi, double lambda, double gamma) override {
741 if (GetSimulationType() == SimulationType::kStatevector)
742 state->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
743 else if (GetSimulationType() == SimulationType::kMatrixProductState)
744 mps->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
745 else if (GetSimulationType() == SimulationType::kTensorNetwork)
746 tn->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
747 else if (GetSimulationType() == SimulationType::kPauliPropagator)
748 pp->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
749
750 NotifyObservers({tgt_qubit, ctrl_qubit});
751 }
752
760 void ApplyNop() override {
761 // do nothing
762 }
763
774 std::unique_ptr<ISimulator> Clone() override {
775 if (GetSimulationType() == SimulationType::kTensorNetwork ||
776 GetSimulationType() == SimulationType::kPauliPropagator) {
777 throw std::runtime_error(
778 "GpuSimulator::Clone: Cloning Tensor Network or Pauli Propagator "
779 "simulation is not "
780 "supported.");
781 }
782
783 auto cloned = std::make_unique<GpuSimulator>();
784
785 cloned->simulationType = simulationType;
786 cloned->nrQubits = nrQubits;
787
788 cloned->limitSize = limitSize;
789 cloned->limitEntanglement = limitEntanglement;
790 cloned->chi = chi;
791 cloned->singularValueThreshold = singularValueThreshold;
792
793 cloned->lookaheadDepth = lookaheadDepth;
794 cloned->useOptimalMeetingPosition = useOptimalMeetingPosition;
795 cloned->upcomingGates = upcomingGates;
796 cloned->upcomingGateIndex = upcomingGateIndex;
797 cloned->growthFactorGate = growthFactorGate;
798 cloned->growthFactorSwap = growthFactorSwap;
799
800 if (state)
801 cloned->state = state->Clone();
802 else if (mps) {
803 cloned->mps = mps->Clone();
804
805 cloned->gateCounterObserver =
806 std::make_shared<GateCounterObserver>(upcomingGateIndex);
807 cloned->RegisterObserver(cloned->gateCounterObserver);
808
809 cloned->dummySim = dummySim ? dummySim->Clone() : nullptr;
810 }
811
812 return cloned;
813 }
814};
815
816} // namespace Private
817} // namespace Simulators
818
819#endif
820#endif
821#endif
int ApplyK(void *sim, int qubit)
int ApplyRx(void *sim, int qubit, double theta)
int ApplyX(void *sim, int qubit)
int ApplyU(void *sim, int qubit, double theta, double phi, double lambda, double gamma)
int ApplyCRy(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyTDG(void *sim, int qubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySDG(void *sim, int qubit)
int ApplyCSwap(void *sim, int controlQubit, int qubit1, int qubit2)
int ApplyCCX(void *sim, int controlQubit1, int controlQubit2, int targetQubit)
int ApplyY(void *sim, int qubit)
int ApplyZ(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
int ApplyCY(void *sim, int controlQubit, int targetQubit)
int ApplyCU(void *sim, int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
int ApplySwap(void *sim, int qubit1, int qubit2)
int ApplyRy(void *sim, int qubit, double theta)
int ApplyP(void *sim, int qubit, double theta)
int ApplyCH(void *sim, int controlQubit, int targetQubit)
int GetSimulationType(void *sim)
int ApplyCZ(void *sim, int controlQubit, int targetQubit)
int ApplyRz(void *sim, int qubit, double theta)
int ApplyT(void *sim, int qubit)
int ApplyCRx(void *sim, int controlQubit, int targetQubit, double theta)
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:21