@@ -25,3 +25,83 @@ TEST(common, ErrorsStructFromDemInstruction) {
2525 EXPECT_EQ (ES.symptom .detectors , std::vector<int >{1 });
2626 EXPECT_EQ (ES.symptom .observables , 0b01 );
2727}
28+
29+ TEST (common, DemFromCountsRejectsZeroProbabilityErrors) {
30+ stim::DetectorErrorModel dem (R"DEM(
31+ error(0.1) D0
32+ error(0) D1
33+ error(0.2) D2
34+ detector(0, 0, 0) D0
35+ detector(0, 0, 0) D1
36+ detector(0, 0, 0) D2
37+ )DEM" );
38+
39+ std::vector<size_t > counts{1 , 7 , 4 };
40+ size_t num_shots = 10 ;
41+ EXPECT_THROW ({
42+ common::dem_from_counts (dem, counts, num_shots);
43+ }, std::invalid_argument);
44+
45+ stim::DetectorErrorModel cleaned = common::remove_zero_probability_errors (dem);
46+ stim::DetectorErrorModel out_dem =
47+ common::dem_from_counts (cleaned, std::vector<size_t >{1 , 4 }, num_shots);
48+
49+ auto flat = out_dem.flattened ();
50+ ASSERT_EQ (out_dem.count_errors (), 2 );
51+ ASSERT_GE (flat.instructions .size (), 2 );
52+
53+ EXPECT_EQ (flat.instructions [0 ].type ,
54+ stim::DemInstructionType::DEM_ERROR);
55+ EXPECT_NEAR (flat.instructions [0 ].arg_data [0 ], 0.1 , 1e-9 );
56+ ASSERT_EQ (flat.instructions [1 ].type ,
57+ stim::DemInstructionType::DEM_ERROR);
58+ EXPECT_NEAR (flat.instructions [1 ].arg_data [0 ], 0.4 , 1e-9 );
59+ }
60+
61+ TEST (common, DemFromCountsSimpleTwoErrors) {
62+ stim::DetectorErrorModel dem (R"DEM(
63+ error(0.25) D0
64+ error(0.35) D1
65+ detector(0, 0, 0) D0
66+ detector(0, 0, 0) D1
67+ )DEM" );
68+
69+ std::vector<size_t > counts{5 , 7 };
70+ size_t num_shots = 20 ;
71+ stim::DetectorErrorModel out_dem =
72+ common::dem_from_counts (dem, counts, num_shots);
73+
74+ auto flat = out_dem.flattened ();
75+ ASSERT_EQ (out_dem.count_errors (), 2 );
76+
77+ ASSERT_GE (flat.instructions .size (), 2 );
78+ EXPECT_EQ (flat.instructions [0 ].type ,
79+ stim::DemInstructionType::DEM_ERROR);
80+ EXPECT_NEAR (flat.instructions [0 ].arg_data [0 ], 0.25 , 1e-9 );
81+ EXPECT_EQ (flat.instructions [1 ].type ,
82+ stim::DemInstructionType::DEM_ERROR);
83+ EXPECT_NEAR (flat.instructions [1 ].arg_data [0 ], 0.35 , 1e-9 );
84+ }
85+
86+ TEST (common, RemoveZeroProbabilityErrors) {
87+ stim::DetectorErrorModel dem (R"DEM(
88+ error(0.1) D0
89+ error(0) D1
90+ error(0.2) D2
91+ detector(0, 0, 0) D0
92+ detector(0, 0, 0) D1
93+ detector(0, 0, 0) D2
94+ )DEM" );
95+
96+ stim::DetectorErrorModel cleaned =
97+ common::remove_zero_probability_errors (dem);
98+
99+ EXPECT_EQ (cleaned.count_errors (), 2 );
100+ auto flat = cleaned.flattened ();
101+ ASSERT_EQ (flat.instructions [0 ].type ,
102+ stim::DemInstructionType::DEM_ERROR);
103+ EXPECT_NEAR (flat.instructions [0 ].arg_data [0 ], 0.1 , 1e-9 );
104+ ASSERT_EQ (flat.instructions [1 ].type ,
105+ stim::DemInstructionType::DEM_ERROR);
106+ EXPECT_NEAR (flat.instructions [1 ].arg_data [0 ], 0.2 , 1e-9 );
107+ }
0 commit comments