@@ -764,33 +764,6 @@ error(0.05) D0 D1
764764 }
765765}
766766
767- TEST (StimDemDecoderFactory, RegisteredCreatorIsUsed) {
768- // static: the registry outlives this test, so the lambda must not
769- // capture a stack reference.
770- static bool registered_creator_was_called = false ;
771- registered_creator_was_called = false ;
772- // RAII guard: restore the registry slot on any exit path.
773- struct CreatorGuard {
774- const char *name;
775- ~CreatorGuard () { cudaq::qec::unregister_stim_dem_decoder_creator (name); }
776- } guard{" __stim_dem_test_decoder__" };
777- cudaq::qec::register_stim_dem_decoder_creator (
778- " __stim_dem_test_decoder__" ,
779- [](const std::string &dem_text, const cudaqx::heterogeneous_map &)
780- -> std::unique_ptr<cudaq::qec::decoder> {
781- registered_creator_was_called = true ;
782- EXPECT_EQ (dem_text, " passthrough" );
783- cudaqx::tensor<uint8_t > H ({2u , 2u });
784- cudaqx::heterogeneous_map empty;
785- return cudaq::qec::decoder::get (" single_error_lut" , H, empty);
786- });
787-
788- auto d = cudaq::qec::get_decoder_from_stim_dem (" __stim_dem_test_decoder__" ,
789- " passthrough" );
790- EXPECT_TRUE (registered_creator_was_called);
791- ASSERT_NE (d, nullptr );
792- }
793-
794767TEST (StimDemDecoderFactory, RepeatedDetectorOrObservableTargetsXorFold) {
795768 const std::string dem_text = R"( error(0.1) D0 D0
796769error(0.1) L0 L0
@@ -854,34 +827,6 @@ TEST(StimDemDecoderFactory, StimDemTargetCategoriesAreExhaustive) {
854827 }
855828}
856829
857- TEST (StimDemDecoderFactory, RegisteredCreatorTakesPrecedenceOverFallback) {
858- // Real decoder name on purpose: pins creator-over-fallback for an
859- // existing decoder (a sentinel name would just retest
860- // RegisteredCreatorIsUsed). Mutates the real "single_error_lut" slot;
861- // safe only because gtest runs tests serially in a binary. If this
862- // suite is ever parallelized, register against a sentinel name instead.
863- static bool creator_was_called = false ;
864- creator_was_called = false ;
865- struct CreatorGuard {
866- const char *name;
867- ~CreatorGuard () { cudaq::qec::unregister_stim_dem_decoder_creator (name); }
868- } guard{" single_error_lut" };
869- cudaq::qec::register_stim_dem_decoder_creator (
870- " single_error_lut" ,
871- [](const std::string &, const cudaqx::heterogeneous_map &)
872- -> std::unique_ptr<cudaq::qec::decoder> {
873- creator_was_called = true ;
874- cudaqx::tensor<uint8_t > H ({2u , 2u });
875- cudaqx::heterogeneous_map empty;
876- return cudaq::qec::decoder::get (" single_error_lut" , H, empty);
877- });
878-
879- const std::string dem_text = " error(0.1) D0 L0\n " ;
880- auto d = cudaq::qec::get_decoder_from_stim_dem (" single_error_lut" , dem_text);
881- EXPECT_TRUE (creator_was_called);
882- ASSERT_NE (d, nullptr );
883- }
884-
885830TEST (StimDemDecoderFactory, UserOptionsAreNotOverwritten) {
886831 const std::string dem_text = R"( error(0.1) D0 L0
887832error(0.1) D1 L0
@@ -893,64 +838,3 @@ error(0.05) D0 D1
893838 cudaq::qec::get_decoder_from_stim_dem (" single_error_lut" , dem_text, opts),
894839 std::runtime_error);
895840}
896-
897- TEST (StimDemDecoderFactory, UserSuppliedObservablesAreNotOverwritten) {
898- // Symmetric with UserOptionsAreNotOverwritten but for "O", via an
899- // echo creator (decoder-validation-independent).
900- static std::vector<std::size_t > observed_O_shape;
901- observed_O_shape.clear ();
902- struct CreatorGuard {
903- const char *name;
904- ~CreatorGuard () { cudaq::qec::unregister_stim_dem_decoder_creator (name); }
905- } guard{" __stim_dem_echo_O__" };
906- cudaq::qec::register_stim_dem_decoder_creator (
907- " __stim_dem_echo_O__" ,
908- [](const std::string &, const cudaqx::heterogeneous_map &opts)
909- -> std::unique_ptr<cudaq::qec::decoder> {
910- if (opts.contains (" O" )) {
911- auto O = opts.get <cudaqx::tensor<uint8_t >>(" O" );
912- observed_O_shape = O.shape ();
913- }
914- cudaqx::tensor<uint8_t > H ({2u , 2u });
915- cudaqx::heterogeneous_map empty;
916- return cudaq::qec::decoder::get (" single_error_lut" , H, empty);
917- });
918-
919- // Distinctive shape; a match proves the user's O reached the creator.
920- cudaqx::tensor<uint8_t > user_O ({7u , 11u });
921- cudaqx::heterogeneous_map opts;
922- opts.insert (" O" , user_O);
923- auto d = cudaq::qec::get_decoder_from_stim_dem (" __stim_dem_echo_O__" ,
924- " error(0.1) D0 L0\n " , opts);
925- ASSERT_NE (d, nullptr );
926- ASSERT_EQ (observed_O_shape.size (), 2u );
927- EXPECT_EQ (observed_O_shape[0 ], 7u );
928- EXPECT_EQ (observed_O_shape[1 ], 11u );
929- }
930-
931- TEST (StimDemDecoderFactory, RegisteredCreatorReceivesUserOptionsVerbatim) {
932- static std::vector<double > observed_rates;
933- observed_rates.clear ();
934- struct CreatorGuard {
935- const char *name;
936- ~CreatorGuard () { cudaq::qec::unregister_stim_dem_decoder_creator (name); }
937- } guard{" __stim_dem_echo__" };
938- cudaq::qec::register_stim_dem_decoder_creator (
939- " __stim_dem_echo__" ,
940- [](const std::string &, const cudaqx::heterogeneous_map &opts)
941- -> std::unique_ptr<cudaq::qec::decoder> {
942- if (opts.contains (" error_rate_vec" ))
943- observed_rates = opts.get <std::vector<double >>(" error_rate_vec" );
944- cudaqx::tensor<uint8_t > H ({2u , 2u });
945- cudaqx::heterogeneous_map empty;
946- return cudaq::qec::decoder::get (" single_error_lut" , H, empty);
947- });
948-
949- const std::vector<double > user_rates = {0.42 , 0.13 , 0.07 };
950- cudaqx::heterogeneous_map opts;
951- opts.insert (" error_rate_vec" , user_rates);
952- auto d = cudaq::qec::get_decoder_from_stim_dem (" __stim_dem_echo__" ,
953- " error(0.5) D0\n " , opts);
954- ASSERT_NE (d, nullptr );
955- EXPECT_EQ (observed_rates, user_rates);
956- }
0 commit comments