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
59 void ApplyP(Types::qubit_t qubit, double lambda) override {
60 if (GetSimulationType() == SimulationType::kStatevector)
61 state->ApplyP(qubit, lambda);
62 else if (GetSimulationType() == SimulationType::kMatrixProductState)
63 mps->ApplyP(qubit, lambda);
64 else if (GetSimulationType() == SimulationType::kTensorNetwork)
65 tn->ApplyP(qubit, lambda);
66 else if (GetSimulationType() == SimulationType::kPauliPropagator)
67 pp->ApplyP(qubit, lambda);
68
69 NotifyObservers({qubit});
70 }
71
78 void ApplyX(Types::qubit_t qubit) override {
79 if (GetSimulationType() == SimulationType::kStatevector)
80 state->ApplyX(qubit);
81 else if (GetSimulationType() == SimulationType::kMatrixProductState)
82 mps->ApplyX(qubit);
83 else if (GetSimulationType() == SimulationType::kTensorNetwork)
84 tn->ApplyX(qubit);
85 else if (GetSimulationType() == SimulationType::kPauliPropagator)
86 pp->ApplyX(qubit);
87
88 NotifyObservers({qubit});
89 }
90
97 void ApplyY(Types::qubit_t qubit) override {
98 if (GetSimulationType() == SimulationType::kStatevector)
99 state->ApplyY(qubit);
100 else if (GetSimulationType() == SimulationType::kMatrixProductState)
101 mps->ApplyY(qubit);
102 else if (GetSimulationType() == SimulationType::kTensorNetwork)
103 tn->ApplyY(qubit);
104 else if (GetSimulationType() == SimulationType::kPauliPropagator)
105 pp->ApplyY(qubit);
106
107 NotifyObservers({qubit});
108 }
109
116 void ApplyZ(Types::qubit_t qubit) override {
117 if (GetSimulationType() == SimulationType::kStatevector)
118 state->ApplyZ(qubit);
119 else if (GetSimulationType() == SimulationType::kMatrixProductState)
120 mps->ApplyZ(qubit);
121 else if (GetSimulationType() == SimulationType::kTensorNetwork)
122 tn->ApplyZ(qubit);
123 else if (GetSimulationType() == SimulationType::kPauliPropagator)
124 pp->ApplyZ(qubit);
125
126 NotifyObservers({qubit});
127 }
128
135 void ApplyH(Types::qubit_t qubit) override {
136 if (GetSimulationType() == SimulationType::kStatevector)
137 state->ApplyH(qubit);
138 else if (GetSimulationType() == SimulationType::kMatrixProductState)
139 mps->ApplyH(qubit);
140 else if (GetSimulationType() == SimulationType::kTensorNetwork)
141 tn->ApplyH(qubit);
142 else if (GetSimulationType() == SimulationType::kPauliPropagator)
143 pp->ApplyH(qubit);
144
145 NotifyObservers({qubit});
146 }
147
154 void ApplyS(Types::qubit_t qubit) override {
155 if (GetSimulationType() == SimulationType::kStatevector)
156 state->ApplyS(qubit);
157 else if (GetSimulationType() == SimulationType::kMatrixProductState)
158 mps->ApplyS(qubit);
159 else if (GetSimulationType() == SimulationType::kTensorNetwork)
160 tn->ApplyS(qubit);
161 else if (GetSimulationType() == SimulationType::kPauliPropagator)
162 pp->ApplyS(qubit);
163
164 NotifyObservers({qubit});
165 }
166
173 void ApplySDG(Types::qubit_t qubit) override {
174 if (GetSimulationType() == SimulationType::kStatevector)
175 state->ApplySDG(qubit);
176 else if (GetSimulationType() == SimulationType::kMatrixProductState)
177 mps->ApplySDG(qubit);
178 else if (GetSimulationType() == SimulationType::kTensorNetwork)
179 tn->ApplySDG(qubit);
180 else if (GetSimulationType() == SimulationType::kPauliPropagator)
181 pp->ApplySDG(qubit);
182
183 NotifyObservers({qubit});
184 }
185
192 void ApplyT(Types::qubit_t qubit) override {
193 if (GetSimulationType() == SimulationType::kStatevector)
194 state->ApplyT(qubit);
195 else if (GetSimulationType() == SimulationType::kMatrixProductState)
196 mps->ApplyT(qubit);
197 else if (GetSimulationType() == SimulationType::kTensorNetwork)
198 tn->ApplyT(qubit);
199 else if (GetSimulationType() == SimulationType::kPauliPropagator)
200 pp->ApplyT(qubit);
201
202 NotifyObservers({qubit});
203 }
204
211 void ApplyTDG(Types::qubit_t qubit) override {
212 if (GetSimulationType() == SimulationType::kStatevector)
213 state->ApplyTDG(qubit);
214 else if (GetSimulationType() == SimulationType::kMatrixProductState)
215 mps->ApplyTDG(qubit);
216 else if (GetSimulationType() == SimulationType::kTensorNetwork)
217 tn->ApplyTDG(qubit);
218 else if (GetSimulationType() == SimulationType::kPauliPropagator)
219 pp->ApplyTDG(qubit);
220
221 NotifyObservers({qubit});
222 }
223
230 void ApplySx(Types::qubit_t qubit) override {
231 if (GetSimulationType() == SimulationType::kStatevector)
232 state->ApplySX(qubit);
233 else if (GetSimulationType() == SimulationType::kMatrixProductState)
234 mps->ApplySX(qubit);
235 else if (GetSimulationType() == SimulationType::kTensorNetwork)
236 tn->ApplySX(qubit);
237 else if (GetSimulationType() == SimulationType::kPauliPropagator)
238 pp->ApplySQRTX(qubit);
239
240 NotifyObservers({qubit});
241 }
242
249 void ApplySxDAG(Types::qubit_t qubit) override {
250 if (GetSimulationType() == SimulationType::kStatevector)
251 state->ApplySXDG(qubit);
252 else if (GetSimulationType() == SimulationType::kMatrixProductState)
253 mps->ApplySXDG(qubit);
254 else if (GetSimulationType() == SimulationType::kTensorNetwork)
255 tn->ApplySXDG(qubit);
256 else if (GetSimulationType() == SimulationType::kPauliPropagator)
257 pp->ApplySxDAG(qubit);
258
259 NotifyObservers({qubit});
260 }
261
268 void ApplyK(Types::qubit_t qubit) override {
269 if (GetSimulationType() == SimulationType::kStatevector)
270 state->ApplyK(qubit);
271 else if (GetSimulationType() == SimulationType::kMatrixProductState)
272 mps->ApplyK(qubit);
273 else if (GetSimulationType() == SimulationType::kTensorNetwork)
274 tn->ApplyK(qubit);
275 else if (GetSimulationType() == SimulationType::kPauliPropagator)
276 pp->ApplyK(qubit);
277
278 NotifyObservers({qubit});
279 }
280
288 void ApplyRx(Types::qubit_t qubit, double theta) override {
289 if (GetSimulationType() == SimulationType::kStatevector)
290 state->ApplyRx(qubit, theta);
291 else if (GetSimulationType() == SimulationType::kMatrixProductState)
292 mps->ApplyRx(qubit, theta);
293 else if (GetSimulationType() == SimulationType::kTensorNetwork)
294 tn->ApplyRx(qubit, theta);
295 else if (GetSimulationType() == SimulationType::kPauliPropagator)
296 pp->ApplyRX(qubit, theta);
297
298 NotifyObservers({qubit});
299 }
300
308 void ApplyRy(Types::qubit_t qubit, double theta) override {
309 if (GetSimulationType() == SimulationType::kStatevector)
310 state->ApplyRy(qubit, theta);
311 else if (GetSimulationType() == SimulationType::kMatrixProductState)
312 mps->ApplyRy(qubit, theta);
313 else if (GetSimulationType() == SimulationType::kTensorNetwork)
314 tn->ApplyRy(qubit, theta);
315 else if (GetSimulationType() == SimulationType::kPauliPropagator)
316 pp->ApplyRY(qubit, theta);
317
318 NotifyObservers({qubit});
319 }
320
328 void ApplyRz(Types::qubit_t qubit, double theta) override {
329 if (GetSimulationType() == SimulationType::kStatevector)
330 state->ApplyRz(qubit, theta);
331 else if (GetSimulationType() == SimulationType::kMatrixProductState)
332 mps->ApplyRz(qubit, theta);
333 else if (GetSimulationType() == SimulationType::kTensorNetwork)
334 tn->ApplyRz(qubit, theta);
335 else if (GetSimulationType() == SimulationType::kPauliPropagator)
336 pp->ApplyRZ(qubit, theta);
337
338 NotifyObservers({qubit});
339 }
340
348 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
349 double gamma) override {
350 if (GetSimulationType() == SimulationType::kStatevector)
351 state->ApplyU(qubit, theta, phi, lambda, gamma);
352 else if (GetSimulationType() == SimulationType::kMatrixProductState)
353 mps->ApplyU(qubit, theta, phi, lambda, gamma);
354 else if (GetSimulationType() == SimulationType::kTensorNetwork)
355 tn->ApplyU(qubit, theta, phi, lambda, gamma);
356 else if (GetSimulationType() == SimulationType::kPauliPropagator)
357 pp->ApplyU(qubit, theta, phi, lambda, gamma);
358
359 NotifyObservers({qubit});
360 }
361
369 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
370 if (GetSimulationType() == SimulationType::kStatevector)
371 state->ApplyCX(ctrl_qubit, tgt_qubit);
372 else if (GetSimulationType() == SimulationType::kMatrixProductState)
373 mps->ApplyCX(ctrl_qubit, tgt_qubit);
374 else if (GetSimulationType() == SimulationType::kTensorNetwork)
375 tn->ApplyCX(ctrl_qubit, tgt_qubit);
376 else if (GetSimulationType() == SimulationType::kPauliPropagator)
377 pp->ApplyCX(ctrl_qubit, tgt_qubit);
378
379 NotifyObservers({tgt_qubit, ctrl_qubit});
380 }
381
389 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
390 if (GetSimulationType() == SimulationType::kStatevector)
391 state->ApplyCY(ctrl_qubit, tgt_qubit);
392 else if (GetSimulationType() == SimulationType::kMatrixProductState)
393 mps->ApplyCY(ctrl_qubit, tgt_qubit);
394 else if (GetSimulationType() == SimulationType::kTensorNetwork)
395 tn->ApplyCY(ctrl_qubit, tgt_qubit);
396 else if (GetSimulationType() == SimulationType::kPauliPropagator)
397 pp->ApplyCY(ctrl_qubit, tgt_qubit);
398
399 NotifyObservers({tgt_qubit, ctrl_qubit});
400 }
401
409 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
410 if (GetSimulationType() == SimulationType::kStatevector)
411 state->ApplyCZ(ctrl_qubit, tgt_qubit);
412 else if (GetSimulationType() == SimulationType::kMatrixProductState)
413 mps->ApplyCZ(ctrl_qubit, tgt_qubit);
414 else if (GetSimulationType() == SimulationType::kTensorNetwork)
415 tn->ApplyCZ(ctrl_qubit, tgt_qubit);
416 else if (GetSimulationType() == SimulationType::kPauliPropagator)
417 pp->ApplyCZ(ctrl_qubit, tgt_qubit);
418
419 NotifyObservers({tgt_qubit, ctrl_qubit});
420 }
421
430 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
431 double lambda) override {
432 if (GetSimulationType() == SimulationType::kStatevector)
433 state->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
434 else if (GetSimulationType() == SimulationType::kMatrixProductState)
435 mps->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
436 else if (GetSimulationType() == SimulationType::kTensorNetwork)
437 tn->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
438 else if (GetSimulationType() == SimulationType::kPauliPropagator)
439 pp->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
440
441 NotifyObservers({tgt_qubit, ctrl_qubit});
442 }
443
452 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
453 double theta) override {
454 if (GetSimulationType() == SimulationType::kStatevector)
455 state->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
456 else if (GetSimulationType() == SimulationType::kMatrixProductState)
457 mps->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
458 else if (GetSimulationType() == SimulationType::kTensorNetwork)
459 tn->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
460 else if (GetSimulationType() == SimulationType::kPauliPropagator)
461 pp->ApplyCRX(ctrl_qubit, tgt_qubit, theta);
462
463 NotifyObservers({tgt_qubit, ctrl_qubit});
464 }
465
474 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
475 double theta) override {
476 if (GetSimulationType() == SimulationType::kStatevector)
477 state->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
478 else if (GetSimulationType() == SimulationType::kMatrixProductState)
479 mps->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
480 else if (GetSimulationType() == SimulationType::kTensorNetwork)
481 tn->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
482 else if (GetSimulationType() == SimulationType::kPauliPropagator)
483 pp->ApplyCRY(ctrl_qubit, tgt_qubit, theta);
484
485 NotifyObservers({tgt_qubit, ctrl_qubit});
486 }
487
496 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
497 double theta) override {
498 if (GetSimulationType() == SimulationType::kStatevector)
499 state->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
500 else if (GetSimulationType() == SimulationType::kMatrixProductState)
501 mps->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
502 else if (GetSimulationType() == SimulationType::kTensorNetwork)
503 tn->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
504 else if (GetSimulationType() == SimulationType::kPauliPropagator)
505 pp->ApplyCRZ(ctrl_qubit, tgt_qubit, theta);
506
507 NotifyObservers({tgt_qubit, ctrl_qubit});
508 }
509
517 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
518 if (GetSimulationType() == SimulationType::kStatevector)
519 state->ApplyCH(ctrl_qubit, tgt_qubit);
520 else if (GetSimulationType() == SimulationType::kMatrixProductState)
521 mps->ApplyCH(ctrl_qubit, tgt_qubit);
522 else if (GetSimulationType() == SimulationType::kTensorNetwork)
523 tn->ApplyCH(ctrl_qubit, tgt_qubit);
524 else if (GetSimulationType() == SimulationType::kPauliPropagator)
525 pp->ApplyCH(ctrl_qubit, tgt_qubit);
526
527 NotifyObservers({tgt_qubit, ctrl_qubit});
528 }
529
537 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
538 if (GetSimulationType() == SimulationType::kStatevector)
539 state->ApplyCSX(ctrl_qubit, tgt_qubit);
540 else if (GetSimulationType() == SimulationType::kMatrixProductState)
541 mps->ApplyCSX(ctrl_qubit, tgt_qubit);
542 else if (GetSimulationType() == SimulationType::kTensorNetwork)
543 tn->ApplyCSX(ctrl_qubit, tgt_qubit);
544 else if (GetSimulationType() == SimulationType::kPauliPropagator)
545 pp->ApplyCSX(ctrl_qubit, tgt_qubit);
546
547 NotifyObservers({tgt_qubit, ctrl_qubit});
548 }
549
557 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
558 Types::qubit_t tgt_qubit) override {
559 if (GetSimulationType() == SimulationType::kStatevector)
560 state->ApplyCSXDG(ctrl_qubit, tgt_qubit);
561 else if (GetSimulationType() == SimulationType::kMatrixProductState)
562 mps->ApplyCSXDG(ctrl_qubit, tgt_qubit);
563 else if (GetSimulationType() == SimulationType::kTensorNetwork)
564 tn->ApplyCSXDG(ctrl_qubit, tgt_qubit);
565 else if (GetSimulationType() == SimulationType::kPauliPropagator)
566 pp->ApplyCSXDAG(ctrl_qubit, tgt_qubit);
567
568 NotifyObservers({tgt_qubit, ctrl_qubit});
569 }
570
578 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
579 if (GetSimulationType() == SimulationType::kStatevector)
580 state->ApplySwap(qubit0, qubit1);
581 else if (GetSimulationType() == SimulationType::kMatrixProductState)
582 mps->ApplySwap(qubit0, qubit1);
583 else if (GetSimulationType() == SimulationType::kTensorNetwork)
584 tn->ApplySwap(qubit0, qubit1);
585 else if (GetSimulationType() == SimulationType::kPauliPropagator)
586 pp->ApplySWAP(qubit0, qubit1);
587
588 NotifyObservers({qubit1, qubit0});
589 }
590
599 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
600 Types::qubit_t qubit2) override {
601 if (GetSimulationType() == SimulationType::kStatevector) {
602 state->ApplyCCX(qubit0, qubit1, qubit2);
603 NotifyObservers({qubit0, qubit1, qubit2});
604 } else if (GetSimulationType() == SimulationType::kMatrixProductState) {
605 const size_t q1 = qubit0; // control 1
606 const size_t q2 = qubit1; // control 2
607 const size_t q3 = qubit2; // target
608
609 // Sleator-Weinfurter decomposition
610 mps->ApplyCSX(static_cast<unsigned int>(q2),
611 static_cast<unsigned int>(q3));
612 NotifyObservers({qubit1, qubit2});
613
614 mps->ApplyCX(static_cast<unsigned int>(q1),
615 static_cast<unsigned int>(q2));
616 NotifyObservers({qubit0, qubit1});
617
618 mps->ApplyCSXDG(static_cast<unsigned int>(q2),
619 static_cast<unsigned int>(q3));
620 NotifyObservers({qubit1, qubit2});
621
622 mps->ApplyCX(static_cast<unsigned int>(q1),
623 static_cast<unsigned int>(q2));
624 NotifyObservers({qubit0, qubit1});
625
626 mps->ApplyCSX(static_cast<unsigned int>(q1),
627 static_cast<unsigned int>(q3));
628 NotifyObservers({qubit0, qubit2});
629 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
630 tn->ApplyCCX(qubit0, qubit1, qubit2);
631 NotifyObservers({qubit0, qubit1, qubit2});
632 } else if (GetSimulationType() == SimulationType::kPauliPropagator) {
633 pp->ApplyCCX(qubit0, qubit1, qubit2);
634 NotifyObservers({qubit0, qubit1, qubit2});
635 }
636 }
637
646 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
647 Types::qubit_t qubit1) override {
648 if (GetSimulationType() == SimulationType::kStatevector) {
649 state->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
650 NotifyObservers({qubit1, qubit0, ctrl_qubit});
651 } else if (GetSimulationType() == SimulationType::kMatrixProductState) {
652 const size_t q1 = ctrl_qubit; // control
653 const size_t q2 = qubit0;
654 const size_t q3 = qubit1;
655
656 // TODO: find a better decomposition
657 // this one I've got with the qiskit transpiler
658 mps->ApplyCX(static_cast<unsigned int>(q3),
659 static_cast<unsigned int>(q2));
660 NotifyObservers({qubit1, qubit0});
661
662 mps->ApplyCSX(static_cast<unsigned int>(q2),
663 static_cast<unsigned int>(q3));
664 NotifyObservers({qubit0, qubit1});
665
666 mps->ApplyCX(static_cast<unsigned int>(q1),
667 static_cast<unsigned int>(q2));
668 NotifyObservers({ctrl_qubit, qubit0});
669
670 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
671 NotifyObservers({qubit1});
672 mps->ApplyP(static_cast<unsigned int>(q2), -M_PI_2);
673 NotifyObservers({qubit0});
674
675 mps->ApplyCSX(static_cast<unsigned int>(q2),
676 static_cast<unsigned int>(q3));
677 NotifyObservers({qubit0, qubit1});
678
679 mps->ApplyCX(static_cast<unsigned int>(q1),
680 static_cast<unsigned int>(q2));
681 NotifyObservers({ctrl_qubit, qubit0});
682
683 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
684 NotifyObservers({qubit1});
685
686 mps->ApplyCSX(static_cast<unsigned int>(q1),
687 static_cast<unsigned int>(q3));
688 NotifyObservers({ctrl_qubit, qubit1});
689
690 mps->ApplyCX(static_cast<unsigned int>(q3),
691 static_cast<unsigned int>(q2));
692 NotifyObservers({qubit1, qubit0});
693 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
694 tn->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
695 NotifyObservers({qubit1, qubit0, ctrl_qubit});
696 } else if (GetSimulationType() == SimulationType::kPauliPropagator) {
697 pp->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
698 NotifyObservers({qubit1, qubit0, ctrl_qubit});
699 }
700 }
701
713 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
714 double theta, double phi, double lambda, double gamma) override {
715 if (GetSimulationType() == SimulationType::kStatevector)
716 state->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
717 else if (GetSimulationType() == SimulationType::kMatrixProductState)
718 mps->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
719 else if (GetSimulationType() == SimulationType::kTensorNetwork)
720 tn->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
721 else if (GetSimulationType() == SimulationType::kPauliPropagator)
722 pp->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
723
724 NotifyObservers({tgt_qubit, ctrl_qubit});
725 }
726
734 void ApplyNop() override {
735 // do nothing
736 }
737
748 std::unique_ptr<ISimulator> Clone() override {
749 if (GetSimulationType() == SimulationType::kTensorNetwork ||
750 GetSimulationType() == SimulationType::kPauliPropagator) {
751 throw std::runtime_error(
752 "GpuSimulator::Clone: Cloning Tensor Network or Pauli Propagator "
753 "simulation is not "
754 "supported.");
755 }
756
757 auto cloned = std::make_unique<GpuSimulator>();
758
759 cloned->simulationType = simulationType;
760 cloned->nrQubits = nrQubits;
761
762 cloned->limitSize = limitSize;
763 cloned->limitEntanglement = limitEntanglement;
764 cloned->chi = chi;
765 cloned->singularValueThreshold = singularValueThreshold;
766
767 cloned->lookaheadDepth = lookaheadDepth;
768 cloned->useOptimalMeetingPosition = useOptimalMeetingPosition;
769 cloned->upcomingGates = upcomingGates;
770 cloned->upcomingGateIndex = upcomingGateIndex;
771 cloned->growthFactorGate = growthFactorGate;
772 cloned->growthFactorSwap = growthFactorSwap;
773
774 if (state)
775 cloned->state = state->Clone();
776 else if (mps) {
777 cloned->mps = mps->Clone();
778
779 cloned->gateCounterObserver =
780 std::make_shared<GateCounterObserver>(upcomingGateIndex);
781 cloned->RegisterObserver(cloned->gateCounterObserver);
782
783 cloned->dummySim = dummySim ? dummySim->Clone() : nullptr;
784 }
785
786 return cloned;
787 }
788};
789
790} // namespace Private
791} // namespace Simulators
792
793#endif
794#endif
795#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