1use quantrs2_core::qubit::QubitId;
10use scirs2_core::ndarray::Array1;
11use scirs2_core::Complex64;
12
13use super::{
14 LogicalOperator, LogicalOperatorType, PauliOperator, QECResult, QuantumErrorCode,
15 StabilizerGroup, StabilizerType,
16};
17
18pub struct SteaneCode;
24
25impl SteaneCode {
26 pub const fn new() -> Self {
27 Self
28 }
29}
30
31impl Default for SteaneCode {
32 fn default() -> Self {
33 Self::new()
34 }
35}
36
37impl QuantumErrorCode for SteaneCode {
38 fn get_stabilizers(&self) -> Vec<StabilizerGroup> {
39 vec![
40 StabilizerGroup {
42 operators: vec![
43 PauliOperator::X,
44 PauliOperator::X,
45 PauliOperator::X,
46 PauliOperator::X,
47 PauliOperator::I,
48 PauliOperator::I,
49 PauliOperator::I,
50 ],
51 qubits: vec![
52 QubitId::new(0),
53 QubitId::new(1),
54 QubitId::new(2),
55 QubitId::new(3),
56 QubitId::new(4),
57 QubitId::new(5),
58 QubitId::new(6),
59 ],
60 stabilizer_type: StabilizerType::XStabilizer,
61 weight: 4,
62 },
63 StabilizerGroup {
64 operators: vec![
65 PauliOperator::I,
66 PauliOperator::X,
67 PauliOperator::X,
68 PauliOperator::I,
69 PauliOperator::X,
70 PauliOperator::X,
71 PauliOperator::I,
72 ],
73 qubits: vec![
74 QubitId::new(0),
75 QubitId::new(1),
76 QubitId::new(2),
77 QubitId::new(3),
78 QubitId::new(4),
79 QubitId::new(5),
80 QubitId::new(6),
81 ],
82 stabilizer_type: StabilizerType::XStabilizer,
83 weight: 4,
84 },
85 StabilizerGroup {
86 operators: vec![
87 PauliOperator::I,
88 PauliOperator::I,
89 PauliOperator::I,
90 PauliOperator::X,
91 PauliOperator::X,
92 PauliOperator::X,
93 PauliOperator::X,
94 ],
95 qubits: vec![
96 QubitId::new(0),
97 QubitId::new(1),
98 QubitId::new(2),
99 QubitId::new(3),
100 QubitId::new(4),
101 QubitId::new(5),
102 QubitId::new(6),
103 ],
104 stabilizer_type: StabilizerType::XStabilizer,
105 weight: 4,
106 },
107 StabilizerGroup {
109 operators: vec![
110 PauliOperator::Z,
111 PauliOperator::Z,
112 PauliOperator::Z,
113 PauliOperator::Z,
114 PauliOperator::I,
115 PauliOperator::I,
116 PauliOperator::I,
117 ],
118 qubits: vec![
119 QubitId::new(0),
120 QubitId::new(1),
121 QubitId::new(2),
122 QubitId::new(3),
123 QubitId::new(4),
124 QubitId::new(5),
125 QubitId::new(6),
126 ],
127 stabilizer_type: StabilizerType::ZStabilizer,
128 weight: 4,
129 },
130 StabilizerGroup {
131 operators: vec![
132 PauliOperator::I,
133 PauliOperator::Z,
134 PauliOperator::Z,
135 PauliOperator::I,
136 PauliOperator::Z,
137 PauliOperator::Z,
138 PauliOperator::I,
139 ],
140 qubits: vec![
141 QubitId::new(0),
142 QubitId::new(1),
143 QubitId::new(2),
144 QubitId::new(3),
145 QubitId::new(4),
146 QubitId::new(5),
147 QubitId::new(6),
148 ],
149 stabilizer_type: StabilizerType::ZStabilizer,
150 weight: 4,
151 },
152 StabilizerGroup {
153 operators: vec![
154 PauliOperator::I,
155 PauliOperator::I,
156 PauliOperator::I,
157 PauliOperator::Z,
158 PauliOperator::Z,
159 PauliOperator::Z,
160 PauliOperator::Z,
161 ],
162 qubits: vec![
163 QubitId::new(0),
164 QubitId::new(1),
165 QubitId::new(2),
166 QubitId::new(3),
167 QubitId::new(4),
168 QubitId::new(5),
169 QubitId::new(6),
170 ],
171 stabilizer_type: StabilizerType::ZStabilizer,
172 weight: 4,
173 },
174 ]
175 }
176
177 fn get_logical_operators(&self) -> Vec<LogicalOperator> {
178 vec![
179 LogicalOperator {
181 operators: vec![
182 PauliOperator::X,
183 PauliOperator::X,
184 PauliOperator::X,
185 PauliOperator::X,
186 PauliOperator::X,
187 PauliOperator::X,
188 PauliOperator::X,
189 ],
190 operator_type: LogicalOperatorType::LogicalX,
191 },
192 LogicalOperator {
194 operators: vec![
195 PauliOperator::Z,
196 PauliOperator::Z,
197 PauliOperator::Z,
198 PauliOperator::Z,
199 PauliOperator::Z,
200 PauliOperator::Z,
201 PauliOperator::Z,
202 ],
203 operator_type: LogicalOperatorType::LogicalZ,
204 },
205 ]
206 }
207
208 fn distance(&self) -> usize {
209 3
210 }
211
212 fn num_data_qubits(&self) -> usize {
213 7
214 }
215
216 fn num_ancilla_qubits(&self) -> usize {
217 6
218 }
219
220 fn logical_qubit_count(&self) -> usize {
221 1
222 }
223
224 fn encode_logical_state(
225 &self,
226 logical_state: &Array1<Complex64>,
227 ) -> QECResult<Array1<Complex64>> {
228 Ok(logical_state.clone())
229 }
230}
231
232pub struct ShorCode;
238
239impl ShorCode {
240 pub const fn new() -> Self {
241 Self
242 }
243}
244
245impl Default for ShorCode {
246 fn default() -> Self {
247 Self::new()
248 }
249}
250
251impl QuantumErrorCode for ShorCode {
252 fn get_stabilizers(&self) -> Vec<StabilizerGroup> {
253 vec![
254 StabilizerGroup {
256 operators: vec![
257 PauliOperator::Z,
258 PauliOperator::Z,
259 PauliOperator::I,
260 PauliOperator::I,
261 PauliOperator::I,
262 PauliOperator::I,
263 PauliOperator::I,
264 PauliOperator::I,
265 PauliOperator::I,
266 ],
267 qubits: vec![
268 QubitId::new(0),
269 QubitId::new(1),
270 QubitId::new(2),
271 QubitId::new(3),
272 QubitId::new(4),
273 QubitId::new(5),
274 QubitId::new(6),
275 QubitId::new(7),
276 QubitId::new(8),
277 ],
278 stabilizer_type: StabilizerType::ZStabilizer,
279 weight: 2,
280 },
281 StabilizerGroup {
282 operators: vec![
283 PauliOperator::I,
284 PauliOperator::Z,
285 PauliOperator::Z,
286 PauliOperator::I,
287 PauliOperator::I,
288 PauliOperator::I,
289 PauliOperator::I,
290 PauliOperator::I,
291 PauliOperator::I,
292 ],
293 qubits: vec![
294 QubitId::new(0),
295 QubitId::new(1),
296 QubitId::new(2),
297 QubitId::new(3),
298 QubitId::new(4),
299 QubitId::new(5),
300 QubitId::new(6),
301 QubitId::new(7),
302 QubitId::new(8),
303 ],
304 stabilizer_type: StabilizerType::ZStabilizer,
305 weight: 2,
306 },
307 StabilizerGroup {
308 operators: vec![
309 PauliOperator::I,
310 PauliOperator::I,
311 PauliOperator::I,
312 PauliOperator::Z,
313 PauliOperator::Z,
314 PauliOperator::I,
315 PauliOperator::I,
316 PauliOperator::I,
317 PauliOperator::I,
318 ],
319 qubits: vec![
320 QubitId::new(0),
321 QubitId::new(1),
322 QubitId::new(2),
323 QubitId::new(3),
324 QubitId::new(4),
325 QubitId::new(5),
326 QubitId::new(6),
327 QubitId::new(7),
328 QubitId::new(8),
329 ],
330 stabilizer_type: StabilizerType::ZStabilizer,
331 weight: 2,
332 },
333 StabilizerGroup {
334 operators: vec![
335 PauliOperator::I,
336 PauliOperator::I,
337 PauliOperator::I,
338 PauliOperator::I,
339 PauliOperator::Z,
340 PauliOperator::Z,
341 PauliOperator::I,
342 PauliOperator::I,
343 PauliOperator::I,
344 ],
345 qubits: vec![
346 QubitId::new(0),
347 QubitId::new(1),
348 QubitId::new(2),
349 QubitId::new(3),
350 QubitId::new(4),
351 QubitId::new(5),
352 QubitId::new(6),
353 QubitId::new(7),
354 QubitId::new(8),
355 ],
356 stabilizer_type: StabilizerType::ZStabilizer,
357 weight: 2,
358 },
359 StabilizerGroup {
360 operators: vec![
361 PauliOperator::I,
362 PauliOperator::I,
363 PauliOperator::I,
364 PauliOperator::I,
365 PauliOperator::I,
366 PauliOperator::I,
367 PauliOperator::Z,
368 PauliOperator::Z,
369 PauliOperator::I,
370 ],
371 qubits: vec![
372 QubitId::new(0),
373 QubitId::new(1),
374 QubitId::new(2),
375 QubitId::new(3),
376 QubitId::new(4),
377 QubitId::new(5),
378 QubitId::new(6),
379 QubitId::new(7),
380 QubitId::new(8),
381 ],
382 stabilizer_type: StabilizerType::ZStabilizer,
383 weight: 2,
384 },
385 StabilizerGroup {
386 operators: vec![
387 PauliOperator::I,
388 PauliOperator::I,
389 PauliOperator::I,
390 PauliOperator::I,
391 PauliOperator::I,
392 PauliOperator::I,
393 PauliOperator::I,
394 PauliOperator::Z,
395 PauliOperator::Z,
396 ],
397 qubits: vec![
398 QubitId::new(0),
399 QubitId::new(1),
400 QubitId::new(2),
401 QubitId::new(3),
402 QubitId::new(4),
403 QubitId::new(5),
404 QubitId::new(6),
405 QubitId::new(7),
406 QubitId::new(8),
407 ],
408 stabilizer_type: StabilizerType::ZStabilizer,
409 weight: 2,
410 },
411 StabilizerGroup {
413 operators: vec![
414 PauliOperator::X,
415 PauliOperator::X,
416 PauliOperator::X,
417 PauliOperator::X,
418 PauliOperator::X,
419 PauliOperator::X,
420 PauliOperator::I,
421 PauliOperator::I,
422 PauliOperator::I,
423 ],
424 qubits: vec![
425 QubitId::new(0),
426 QubitId::new(1),
427 QubitId::new(2),
428 QubitId::new(3),
429 QubitId::new(4),
430 QubitId::new(5),
431 QubitId::new(6),
432 QubitId::new(7),
433 QubitId::new(8),
434 ],
435 stabilizer_type: StabilizerType::XStabilizer,
436 weight: 6,
437 },
438 StabilizerGroup {
439 operators: vec![
440 PauliOperator::I,
441 PauliOperator::I,
442 PauliOperator::I,
443 PauliOperator::X,
444 PauliOperator::X,
445 PauliOperator::X,
446 PauliOperator::X,
447 PauliOperator::X,
448 PauliOperator::X,
449 ],
450 qubits: vec![
451 QubitId::new(0),
452 QubitId::new(1),
453 QubitId::new(2),
454 QubitId::new(3),
455 QubitId::new(4),
456 QubitId::new(5),
457 QubitId::new(6),
458 QubitId::new(7),
459 QubitId::new(8),
460 ],
461 stabilizer_type: StabilizerType::XStabilizer,
462 weight: 6,
463 },
464 ]
465 }
466
467 fn get_logical_operators(&self) -> Vec<LogicalOperator> {
468 vec![
469 LogicalOperator {
471 operators: vec![
472 PauliOperator::X,
473 PauliOperator::I,
474 PauliOperator::I,
475 PauliOperator::X,
476 PauliOperator::I,
477 PauliOperator::I,
478 PauliOperator::X,
479 PauliOperator::I,
480 PauliOperator::I,
481 ],
482 operator_type: LogicalOperatorType::LogicalX,
483 },
484 LogicalOperator {
486 operators: vec![
487 PauliOperator::Z,
488 PauliOperator::Z,
489 PauliOperator::Z,
490 PauliOperator::Z,
491 PauliOperator::Z,
492 PauliOperator::Z,
493 PauliOperator::Z,
494 PauliOperator::Z,
495 PauliOperator::Z,
496 ],
497 operator_type: LogicalOperatorType::LogicalZ,
498 },
499 ]
500 }
501
502 fn distance(&self) -> usize {
503 3
504 }
505
506 fn num_data_qubits(&self) -> usize {
507 9
508 }
509
510 fn num_ancilla_qubits(&self) -> usize {
511 8
512 }
513
514 fn logical_qubit_count(&self) -> usize {
515 1
516 }
517
518 fn encode_logical_state(
519 &self,
520 logical_state: &Array1<Complex64>,
521 ) -> QECResult<Array1<Complex64>> {
522 Ok(logical_state.clone())
523 }
524}
525
526pub struct SurfaceCode {
532 distance: usize,
533}
534
535impl SurfaceCode {
536 pub const fn new(distance: usize) -> Self {
537 Self { distance }
538 }
539}
540
541impl QuantumErrorCode for SurfaceCode {
542 fn get_stabilizers(&self) -> Vec<StabilizerGroup> {
543 if self.distance != 3 {
546 return vec![
548 StabilizerGroup {
549 operators: vec![PauliOperator::X, PauliOperator::X],
550 qubits: vec![QubitId::new(0), QubitId::new(1)],
551 stabilizer_type: StabilizerType::XStabilizer,
552 weight: 2,
553 },
554 StabilizerGroup {
555 operators: vec![PauliOperator::Z, PauliOperator::Z],
556 qubits: vec![QubitId::new(0), QubitId::new(1)],
557 stabilizer_type: StabilizerType::ZStabilizer,
558 weight: 2,
559 },
560 ];
561 }
562
563 vec![
569 StabilizerGroup {
571 operators: vec![
572 PauliOperator::X,
573 PauliOperator::X,
574 PauliOperator::I,
575 PauliOperator::X,
576 PauliOperator::X,
577 PauliOperator::I,
578 PauliOperator::I,
579 PauliOperator::I,
580 PauliOperator::I,
581 ],
582 qubits: vec![
583 QubitId::new(0),
584 QubitId::new(1),
585 QubitId::new(2),
586 QubitId::new(3),
587 QubitId::new(4),
588 QubitId::new(5),
589 QubitId::new(6),
590 QubitId::new(7),
591 QubitId::new(8),
592 ],
593 stabilizer_type: StabilizerType::XStabilizer,
594 weight: 4,
595 },
596 StabilizerGroup {
597 operators: vec![
598 PauliOperator::I,
599 PauliOperator::X,
600 PauliOperator::X,
601 PauliOperator::I,
602 PauliOperator::X,
603 PauliOperator::X,
604 PauliOperator::I,
605 PauliOperator::I,
606 PauliOperator::I,
607 ],
608 qubits: vec![
609 QubitId::new(0),
610 QubitId::new(1),
611 QubitId::new(2),
612 QubitId::new(3),
613 QubitId::new(4),
614 QubitId::new(5),
615 QubitId::new(6),
616 QubitId::new(7),
617 QubitId::new(8),
618 ],
619 stabilizer_type: StabilizerType::XStabilizer,
620 weight: 4,
621 },
622 StabilizerGroup {
623 operators: vec![
624 PauliOperator::I,
625 PauliOperator::I,
626 PauliOperator::I,
627 PauliOperator::X,
628 PauliOperator::X,
629 PauliOperator::I,
630 PauliOperator::X,
631 PauliOperator::X,
632 PauliOperator::I,
633 ],
634 qubits: vec![
635 QubitId::new(0),
636 QubitId::new(1),
637 QubitId::new(2),
638 QubitId::new(3),
639 QubitId::new(4),
640 QubitId::new(5),
641 QubitId::new(6),
642 QubitId::new(7),
643 QubitId::new(8),
644 ],
645 stabilizer_type: StabilizerType::XStabilizer,
646 weight: 4,
647 },
648 StabilizerGroup {
649 operators: vec![
650 PauliOperator::I,
651 PauliOperator::I,
652 PauliOperator::I,
653 PauliOperator::I,
654 PauliOperator::X,
655 PauliOperator::X,
656 PauliOperator::I,
657 PauliOperator::X,
658 PauliOperator::X,
659 ],
660 qubits: vec![
661 QubitId::new(0),
662 QubitId::new(1),
663 QubitId::new(2),
664 QubitId::new(3),
665 QubitId::new(4),
666 QubitId::new(5),
667 QubitId::new(6),
668 QubitId::new(7),
669 QubitId::new(8),
670 ],
671 stabilizer_type: StabilizerType::XStabilizer,
672 weight: 4,
673 },
674 StabilizerGroup {
676 operators: vec![
677 PauliOperator::Z,
678 PauliOperator::Z,
679 PauliOperator::I,
680 PauliOperator::Z,
681 PauliOperator::Z,
682 PauliOperator::I,
683 PauliOperator::I,
684 PauliOperator::I,
685 PauliOperator::I,
686 ],
687 qubits: vec![
688 QubitId::new(0),
689 QubitId::new(1),
690 QubitId::new(2),
691 QubitId::new(3),
692 QubitId::new(4),
693 QubitId::new(5),
694 QubitId::new(6),
695 QubitId::new(7),
696 QubitId::new(8),
697 ],
698 stabilizer_type: StabilizerType::ZStabilizer,
699 weight: 4,
700 },
701 StabilizerGroup {
702 operators: vec![
703 PauliOperator::I,
704 PauliOperator::Z,
705 PauliOperator::Z,
706 PauliOperator::I,
707 PauliOperator::Z,
708 PauliOperator::Z,
709 PauliOperator::I,
710 PauliOperator::I,
711 PauliOperator::I,
712 ],
713 qubits: vec![
714 QubitId::new(0),
715 QubitId::new(1),
716 QubitId::new(2),
717 QubitId::new(3),
718 QubitId::new(4),
719 QubitId::new(5),
720 QubitId::new(6),
721 QubitId::new(7),
722 QubitId::new(8),
723 ],
724 stabilizer_type: StabilizerType::ZStabilizer,
725 weight: 4,
726 },
727 StabilizerGroup {
728 operators: vec![
729 PauliOperator::I,
730 PauliOperator::I,
731 PauliOperator::I,
732 PauliOperator::Z,
733 PauliOperator::Z,
734 PauliOperator::I,
735 PauliOperator::Z,
736 PauliOperator::Z,
737 PauliOperator::I,
738 ],
739 qubits: vec![
740 QubitId::new(0),
741 QubitId::new(1),
742 QubitId::new(2),
743 QubitId::new(3),
744 QubitId::new(4),
745 QubitId::new(5),
746 QubitId::new(6),
747 QubitId::new(7),
748 QubitId::new(8),
749 ],
750 stabilizer_type: StabilizerType::ZStabilizer,
751 weight: 4,
752 },
753 StabilizerGroup {
754 operators: vec![
755 PauliOperator::I,
756 PauliOperator::I,
757 PauliOperator::I,
758 PauliOperator::I,
759 PauliOperator::Z,
760 PauliOperator::Z,
761 PauliOperator::I,
762 PauliOperator::Z,
763 PauliOperator::Z,
764 ],
765 qubits: vec![
766 QubitId::new(0),
767 QubitId::new(1),
768 QubitId::new(2),
769 QubitId::new(3),
770 QubitId::new(4),
771 QubitId::new(5),
772 QubitId::new(6),
773 QubitId::new(7),
774 QubitId::new(8),
775 ],
776 stabilizer_type: StabilizerType::ZStabilizer,
777 weight: 4,
778 },
779 ]
780 }
781
782 fn get_logical_operators(&self) -> Vec<LogicalOperator> {
783 if self.distance != 3 {
784 return vec![
786 LogicalOperator {
787 operators: vec![PauliOperator::X, PauliOperator::I],
788 operator_type: LogicalOperatorType::LogicalX,
789 },
790 LogicalOperator {
791 operators: vec![PauliOperator::Z, PauliOperator::I],
792 operator_type: LogicalOperatorType::LogicalZ,
793 },
794 ];
795 }
796
797 vec![
799 LogicalOperator {
801 operators: vec![
802 PauliOperator::X,
803 PauliOperator::I,
804 PauliOperator::X,
805 PauliOperator::I,
806 PauliOperator::I,
807 PauliOperator::I,
808 PauliOperator::X,
809 PauliOperator::I,
810 PauliOperator::X,
811 ],
812 operator_type: LogicalOperatorType::LogicalX,
813 },
814 LogicalOperator {
816 operators: vec![
817 PauliOperator::Z,
818 PauliOperator::Z,
819 PauliOperator::Z,
820 PauliOperator::I,
821 PauliOperator::I,
822 PauliOperator::I,
823 PauliOperator::I,
824 PauliOperator::I,
825 PauliOperator::I,
826 ],
827 operator_type: LogicalOperatorType::LogicalZ,
828 },
829 ]
830 }
831
832 fn distance(&self) -> usize {
833 self.distance
834 }
835
836 fn num_data_qubits(&self) -> usize {
837 self.distance * self.distance
838 }
839
840 fn num_ancilla_qubits(&self) -> usize {
841 self.distance * self.distance - 1
842 }
843
844 fn logical_qubit_count(&self) -> usize {
845 1
846 }
847
848 fn encode_logical_state(
849 &self,
850 logical_state: &Array1<Complex64>,
851 ) -> QECResult<Array1<Complex64>> {
852 Ok(logical_state.clone())
853 }
854}
855
856pub struct ToricCode {
862 dimensions: (usize, usize),
863}
864
865impl ToricCode {
866 pub const fn new(dimensions: (usize, usize)) -> Self {
867 Self { dimensions }
868 }
869}
870
871impl QuantumErrorCode for ToricCode {
872 fn get_stabilizers(&self) -> Vec<StabilizerGroup> {
873 if self.dimensions != (2, 2) {
876 return vec![
878 StabilizerGroup {
879 operators: vec![PauliOperator::X, PauliOperator::X],
880 qubits: vec![QubitId::new(0), QubitId::new(1)],
881 stabilizer_type: StabilizerType::XStabilizer,
882 weight: 2,
883 },
884 StabilizerGroup {
885 operators: vec![PauliOperator::Z, PauliOperator::Z],
886 qubits: vec![QubitId::new(0), QubitId::new(1)],
887 stabilizer_type: StabilizerType::ZStabilizer,
888 weight: 2,
889 },
890 ];
891 }
892
893 vec![
896 StabilizerGroup {
898 operators: vec![
899 PauliOperator::X,
900 PauliOperator::X,
901 PauliOperator::I,
902 PauliOperator::I,
903 PauliOperator::X,
904 PauliOperator::X,
905 PauliOperator::I,
906 PauliOperator::I,
907 ],
908 qubits: vec![
909 QubitId::new(0),
910 QubitId::new(1),
911 QubitId::new(2),
912 QubitId::new(3),
913 QubitId::new(4),
914 QubitId::new(5),
915 QubitId::new(6),
916 QubitId::new(7),
917 ],
918 stabilizer_type: StabilizerType::XStabilizer,
919 weight: 4,
920 },
921 StabilizerGroup {
922 operators: vec![
923 PauliOperator::I,
924 PauliOperator::I,
925 PauliOperator::X,
926 PauliOperator::X,
927 PauliOperator::I,
928 PauliOperator::I,
929 PauliOperator::X,
930 PauliOperator::X,
931 ],
932 qubits: vec![
933 QubitId::new(0),
934 QubitId::new(1),
935 QubitId::new(2),
936 QubitId::new(3),
937 QubitId::new(4),
938 QubitId::new(5),
939 QubitId::new(6),
940 QubitId::new(7),
941 ],
942 stabilizer_type: StabilizerType::XStabilizer,
943 weight: 4,
944 },
945 StabilizerGroup {
946 operators: vec![
947 PauliOperator::I,
948 PauliOperator::I,
949 PauliOperator::I,
950 PauliOperator::I,
951 PauliOperator::X,
952 PauliOperator::X,
953 PauliOperator::I,
954 PauliOperator::I,
955 ],
956 qubits: vec![
957 QubitId::new(0),
958 QubitId::new(1),
959 QubitId::new(2),
960 QubitId::new(3),
961 QubitId::new(4),
962 QubitId::new(5),
963 QubitId::new(6),
964 QubitId::new(7),
965 ],
966 stabilizer_type: StabilizerType::XStabilizer,
967 weight: 4,
968 },
969 StabilizerGroup {
970 operators: vec![
971 PauliOperator::I,
972 PauliOperator::I,
973 PauliOperator::I,
974 PauliOperator::I,
975 PauliOperator::I,
976 PauliOperator::I,
977 PauliOperator::X,
978 PauliOperator::X,
979 ],
980 qubits: vec![
981 QubitId::new(0),
982 QubitId::new(1),
983 QubitId::new(2),
984 QubitId::new(3),
985 QubitId::new(4),
986 QubitId::new(5),
987 QubitId::new(6),
988 QubitId::new(7),
989 ],
990 stabilizer_type: StabilizerType::XStabilizer,
991 weight: 4,
992 },
993 StabilizerGroup {
995 operators: vec![
996 PauliOperator::Z,
997 PauliOperator::Z,
998 PauliOperator::I,
999 PauliOperator::I,
1000 PauliOperator::Z,
1001 PauliOperator::Z,
1002 PauliOperator::I,
1003 PauliOperator::I,
1004 ],
1005 qubits: vec![
1006 QubitId::new(0),
1007 QubitId::new(1),
1008 QubitId::new(2),
1009 QubitId::new(3),
1010 QubitId::new(4),
1011 QubitId::new(5),
1012 QubitId::new(6),
1013 QubitId::new(7),
1014 ],
1015 stabilizer_type: StabilizerType::ZStabilizer,
1016 weight: 4,
1017 },
1018 StabilizerGroup {
1019 operators: vec![
1020 PauliOperator::I,
1021 PauliOperator::I,
1022 PauliOperator::Z,
1023 PauliOperator::Z,
1024 PauliOperator::I,
1025 PauliOperator::I,
1026 PauliOperator::Z,
1027 PauliOperator::Z,
1028 ],
1029 qubits: vec![
1030 QubitId::new(0),
1031 QubitId::new(1),
1032 QubitId::new(2),
1033 QubitId::new(3),
1034 QubitId::new(4),
1035 QubitId::new(5),
1036 QubitId::new(6),
1037 QubitId::new(7),
1038 ],
1039 stabilizer_type: StabilizerType::ZStabilizer,
1040 weight: 4,
1041 },
1042 StabilizerGroup {
1043 operators: vec![
1044 PauliOperator::I,
1045 PauliOperator::I,
1046 PauliOperator::I,
1047 PauliOperator::I,
1048 PauliOperator::Z,
1049 PauliOperator::Z,
1050 PauliOperator::I,
1051 PauliOperator::I,
1052 ],
1053 qubits: vec![
1054 QubitId::new(0),
1055 QubitId::new(1),
1056 QubitId::new(2),
1057 QubitId::new(3),
1058 QubitId::new(4),
1059 QubitId::new(5),
1060 QubitId::new(6),
1061 QubitId::new(7),
1062 ],
1063 stabilizer_type: StabilizerType::ZStabilizer,
1064 weight: 4,
1065 },
1066 StabilizerGroup {
1067 operators: vec![
1068 PauliOperator::I,
1069 PauliOperator::I,
1070 PauliOperator::I,
1071 PauliOperator::I,
1072 PauliOperator::I,
1073 PauliOperator::I,
1074 PauliOperator::Z,
1075 PauliOperator::Z,
1076 ],
1077 qubits: vec![
1078 QubitId::new(0),
1079 QubitId::new(1),
1080 QubitId::new(2),
1081 QubitId::new(3),
1082 QubitId::new(4),
1083 QubitId::new(5),
1084 QubitId::new(6),
1085 QubitId::new(7),
1086 ],
1087 stabilizer_type: StabilizerType::ZStabilizer,
1088 weight: 4,
1089 },
1090 ]
1091 }
1092
1093 fn get_logical_operators(&self) -> Vec<LogicalOperator> {
1094 if self.dimensions != (2, 2) {
1095 return vec![
1097 LogicalOperator {
1098 operators: vec![PauliOperator::X, PauliOperator::I],
1099 operator_type: LogicalOperatorType::LogicalX,
1100 },
1101 LogicalOperator {
1102 operators: vec![PauliOperator::Z, PauliOperator::I],
1103 operator_type: LogicalOperatorType::LogicalZ,
1104 },
1105 ];
1106 }
1107
1108 vec![
1110 LogicalOperator {
1112 operators: vec![
1113 PauliOperator::X,
1114 PauliOperator::I,
1115 PauliOperator::X,
1116 PauliOperator::I,
1117 PauliOperator::I,
1118 PauliOperator::I,
1119 PauliOperator::I,
1120 PauliOperator::I,
1121 ],
1122 operator_type: LogicalOperatorType::LogicalX,
1123 },
1124 LogicalOperator {
1126 operators: vec![
1127 PauliOperator::Z,
1128 PauliOperator::I,
1129 PauliOperator::I,
1130 PauliOperator::I,
1131 PauliOperator::Z,
1132 PauliOperator::I,
1133 PauliOperator::I,
1134 PauliOperator::I,
1135 ],
1136 operator_type: LogicalOperatorType::LogicalZ,
1137 },
1138 ]
1139 }
1140
1141 fn distance(&self) -> usize {
1142 self.dimensions.0.min(self.dimensions.1)
1143 }
1144
1145 fn num_data_qubits(&self) -> usize {
1146 2 * self.dimensions.0 * self.dimensions.1
1147 }
1148
1149 fn num_ancilla_qubits(&self) -> usize {
1150 self.dimensions.0 * self.dimensions.1
1151 }
1152
1153 fn logical_qubit_count(&self) -> usize {
1154 2
1155 }
1156
1157 fn encode_logical_state(
1158 &self,
1159 logical_state: &Array1<Complex64>,
1160 ) -> QECResult<Array1<Complex64>> {
1161 Ok(logical_state.clone())
1162 }
1163}