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