qector-decoder-v3 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qector_decoder_v3-0.5.0/.gitattributes +20 -0
- qector_decoder_v3-0.5.0/.github/workflows/CI.yml +236 -0
- qector_decoder_v3-0.5.0/.github/workflows/tests.yml +84 -0
- qector_decoder_v3-0.5.0/.gitignore +80 -0
- qector_decoder_v3-0.5.0/CHANGELOG.md +64 -0
- qector_decoder_v3-0.5.0/COMMERCIAL.md +133 -0
- qector_decoder_v3-0.5.0/CONTRIBUTING.md +127 -0
- qector_decoder_v3-0.5.0/Cargo.lock +2349 -0
- qector_decoder_v3-0.5.0/Cargo.toml +68 -0
- qector_decoder_v3-0.5.0/Dockerfile +67 -0
- qector_decoder_v3-0.5.0/INSTALL.md +85 -0
- qector_decoder_v3-0.5.0/LICENSE +241 -0
- qector_decoder_v3-0.5.0/PKG-INFO +241 -0
- qector_decoder_v3-0.5.0/PYPI_README.md +180 -0
- qector_decoder_v3-0.5.0/README.md +419 -0
- qector_decoder_v3-0.5.0/RELEASE_NOTES.md +266 -0
- qector_decoder_v3-0.5.0/SECURITY.md +105 -0
- qector_decoder_v3-0.5.0/benchmark_results/belief_extended.json +312 -0
- qector_decoder_v3-0.5.0/benchmark_results/belief_grid.json +192 -0
- qector_decoder_v3-0.5.0/benchmark_results/belief_latency.json +117 -0
- qector_decoder_v3-0.5.0/benchmark_results/belief_latency.md +11 -0
- qector_decoder_v3-0.5.0/benchmark_results/competitive_belief.json +117 -0
- qector_decoder_v3-0.5.0/benchmark_results/competitive_belief.md +11 -0
- qector_decoder_v3-0.5.0/benchmark_results/competitive_stim_ler.json +227 -0
- qector_decoder_v3-0.5.0/benchmark_results/competitive_stim_ler.md +15 -0
- qector_decoder_v3-0.5.0/benchmark_results/competitive_stim_ler_full.md +15 -0
- qector_decoder_v3-0.5.0/benchmark_results/gpu_extensive.json +634 -0
- qector_decoder_v3-0.5.0/benchmark_results/ler_summary.md +42 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive.csv +16 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive.json +731 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive_belief.json +140 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive_belief.md +11 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive_stim_ler.json +226 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_competitive_stim_ler.md +15 -0
- qector_decoder_v3-0.5.0/benchmark_results/min_threshold_fast.json +80 -0
- qector_decoder_v3-0.5.0/benchmark_results/native_memory.json +147 -0
- qector_decoder_v3-0.5.0/benchmark_results/stim_ler_d13_d15.json +107 -0
- qector_decoder_v3-0.5.0/benchmark_results/stim_ler_d13_d15.md +12 -0
- qector_decoder_v3-0.5.0/benchmark_results/stim_ler_memz.json +227 -0
- qector_decoder_v3-0.5.0/benchmark_results/stim_ler_memz.md +15 -0
- qector_decoder_v3-0.5.0/benchmark_results/vram_profile.json +22 -0
- qector_decoder_v3-0.5.0/benchmark_results/weight_gap_analysis.json +36149 -0
- qector_decoder_v3-0.5.0/build.rs +78 -0
- qector_decoder_v3-0.5.0/docs/API_STABILITY.md +125 -0
- qector_decoder_v3-0.5.0/docs/API_SURFACES.md +92 -0
- qector_decoder_v3-0.5.0/docs/BENCHMARK_COMPETITIVE.md +82 -0
- qector_decoder_v3-0.5.0/docs/BEYOND_PYMATCHING.md +98 -0
- qector_decoder_v3-0.5.0/docs/CORRECTNESS_AUDIT.md +191 -0
- qector_decoder_v3-0.5.0/docs/METHODOLOGY.md +220 -0
- qector_decoder_v3-0.5.0/docs/PLATFORM_ARTIFACT_ROADMAP.md +143 -0
- qector_decoder_v3-0.5.0/docs/REPRODUCE.md +277 -0
- qector_decoder_v3-0.5.0/docs/REPRODUCIBILITY_CHECKLIST.md +163 -0
- qector_decoder_v3-0.5.0/docs/SCALING.md +87 -0
- qector_decoder_v3-0.5.0/docs/SECURITY_DEPLOYMENT.md +125 -0
- qector_decoder_v3-0.5.0/docs/SERVICE_API_SCHEMA.md +158 -0
- qector_decoder_v3-0.5.0/examples/example_advanced_decoders.py +78 -0
- qector_decoder_v3-0.5.0/examples/example_basic.py +77 -0
- qector_decoder_v3-0.5.0/examples/example_batch.py +111 -0
- qector_decoder_v3-0.5.0/examples/example_blossom.py +75 -0
- qector_decoder_v3-0.5.0/examples/example_codes_and_diagnostics.py +47 -0
- qector_decoder_v3-0.5.0/examples/example_pymatching_and_backend.py +49 -0
- qector_decoder_v3-0.5.0/examples/example_stim_dem.py +57 -0
- qector_decoder_v3-0.5.0/examples/example_streaming.py +81 -0
- qector_decoder_v3-0.5.0/lib/OpenCL.def +118 -0
- qector_decoder_v3-0.5.0/proto/qector.proto +44 -0
- qector_decoder_v3-0.5.0/pyproject.toml +140 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/__init__.py +1095 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/_bp_core.py +120 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/backend.py +345 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/belief_matching.py +233 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/benchmarking.py +401 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/bposd.py +212 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/codes.py +516 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/dem.py +456 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/predecoder.py +131 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/py.typed +2 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/pymatching_compat.py +257 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/qiskit_plugin.py +212 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/rest_api.py +222 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/result.py +216 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/sinter_compat.py +134 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/stim_compat.py +169 -0
- qector_decoder_v3-0.5.0/python/qector_decoder_v3/workbench.py +565 -0
- qector_decoder_v3-0.5.0/python/tests/test_auto_decoder_calibrate.py +70 -0
- qector_decoder_v3-0.5.0/python/tests/test_backend.py +92 -0
- qector_decoder_v3-0.5.0/python/tests/test_batch_shapes.py +49 -0
- qector_decoder_v3-0.5.0/python/tests/test_batch_vs_single_decode.py +75 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_bp_convergence.py +83 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_latency_cost.py +71 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_matching.py +83 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_memory_z.py +63 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_p_sweep.py +78 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_reference_package.py +64 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_seed_p_grid.py +78 -0
- qector_decoder_v3-0.5.0/python/tests/test_belief_seed_sweep.py +88 -0
- qector_decoder_v3-0.5.0/python/tests/test_benchmark.py +71 -0
- qector_decoder_v3-0.5.0/python/tests/test_benchmark_syndrome_faithful_gate.py +33 -0
- qector_decoder_v3-0.5.0/python/tests/test_benchmarking.py +86 -0
- qector_decoder_v3-0.5.0/python/tests/test_beyond_pymatching_examples.py +76 -0
- qector_decoder_v3-0.5.0/python/tests/test_blossom_adaptive_k_regression.py +61 -0
- qector_decoder_v3-0.5.0/python/tests/test_blossom_candidate_set_contains_optimal.py +65 -0
- qector_decoder_v3-0.5.0/python/tests/test_blossom_d15_no_gap.py +58 -0
- qector_decoder_v3-0.5.0/python/tests/test_blossom_extra.py +53 -0
- qector_decoder_v3-0.5.0/python/tests/test_blossom_weight_optimality.py +59 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_bb144.py +55 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_bb72.py +55 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_bicycle_family.py +53 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_bp_modes.py +30 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_hypergraph_product.py +56 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_ldpc.py +127 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_osd_orders.py +50 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_rowspace_metric.py +166 -0
- qector_decoder_v3-0.5.0/python/tests/test_bposd_vs_ldpc_runtime.py +109 -0
- qector_decoder_v3-0.5.0/python/tests/test_brute_force_small.py +113 -0
- qector_decoder_v3-0.5.0/python/tests/test_bulletproof.py +357 -0
- qector_decoder_v3-0.5.0/python/tests/test_clean_venv_install.py +78 -0
- qector_decoder_v3-0.5.0/python/tests/test_codes.py +131 -0
- qector_decoder_v3-0.5.0/python/tests/test_cold_path_present.py +47 -0
- qector_decoder_v3-0.5.0/python/tests/test_competitive_ler.py +112 -0
- qector_decoder_v3-0.5.0/python/tests/test_correctness_audit_commands.py +83 -0
- qector_decoder_v3-0.5.0/python/tests/test_cpu_no_cuda_required.py +90 -0
- qector_decoder_v3-0.5.0/python/tests/test_cuda_cpu_bit_identical.py +48 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_backend_metadata.py +44 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_bitpacked.py +46 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_fallback_status.py +47 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_json_roundtrip.py +67 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_sparse_indices.py +40 -0
- qector_decoder_v3-0.5.0/python/tests/test_decode_result_timing.py +34 -0
- qector_decoder_v3-0.5.0/python/tests/test_decoders.py +290 -0
- qector_decoder_v3-0.5.0/python/tests/test_defect_count_vs_weight_gap.py +62 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem.py +182 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_full_vs_collapsed_pymatching.py +77 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_observable_masks.py +68 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_parallel_edges.py +95 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_probability.py +93 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_regression_d11.py +39 -0
- qector_decoder_v3-0.5.0/python/tests/test_dem_collapse_regression_d15.py +38 -0
- qector_decoder_v3-0.5.0/python/tests/test_ecosystem.py +32 -0
- qector_decoder_v3-0.5.0/python/tests/test_error_messages.py +45 -0
- qector_decoder_v3-0.5.0/python/tests/test_examples.py +39 -0
- qector_decoder_v3-0.5.0/python/tests/test_fast_uf.py +31 -0
- qector_decoder_v3-0.5.0/python/tests/test_full_api_coverage.py +124 -0
- qector_decoder_v3-0.5.0/python/tests/test_gpu_fallback.py +83 -0
- qector_decoder_v3-0.5.0/python/tests/test_gpu_memory_bounded.py +61 -0
- qector_decoder_v3-0.5.0/python/tests/test_gpu_memory_profile.py +62 -0
- qector_decoder_v3-0.5.0/python/tests/test_gpu_no_silent_slowdown.py +91 -0
- qector_decoder_v3-0.5.0/python/tests/test_invalid_inputs.py +57 -0
- qector_decoder_v3-0.5.0/python/tests/test_latency_percentiles_monotonic.py +43 -0
- qector_decoder_v3-0.5.0/python/tests/test_license_included.py +54 -0
- qector_decoder_v3-0.5.0/python/tests/test_logical_coset_equivalence.py +122 -0
- qector_decoder_v3-0.5.0/python/tests/test_long_run_decode_memory.py +66 -0
- qector_decoder_v3-0.5.0/python/tests/test_lookup_table.py +129 -0
- qector_decoder_v3-0.5.0/python/tests/test_max_capacity.py +477 -0
- qector_decoder_v3-0.5.0/python/tests/test_measurement_error_time_edges.py +77 -0
- qector_decoder_v3-0.5.0/python/tests/test_new_modules.py +331 -0
- qector_decoder_v3-0.5.0/python/tests/test_no_native_rss_leak.py +69 -0
- qector_decoder_v3-0.5.0/python/tests/test_no_python_memory_growth.py +61 -0
- qector_decoder_v3-0.5.0/python/tests/test_noncontiguous_arrays.py +77 -0
- qector_decoder_v3-0.5.0/python/tests/test_numpy_dtypes.py +69 -0
- qector_decoder_v3-0.5.0/python/tests/test_opencl_cpu_bit_identical.py +49 -0
- qector_decoder_v3-0.5.0/python/tests/test_optional_extras.py +61 -0
- qector_decoder_v3-0.5.0/python/tests/test_performance_regression_smoke.py +46 -0
- qector_decoder_v3-0.5.0/python/tests/test_predecoder.py +52 -0
- qector_decoder_v3-0.5.0/python/tests/test_predicted_observables.py +102 -0
- qector_decoder_v3-0.5.0/python/tests/test_property_faithfulness.py +135 -0
- qector_decoder_v3-0.5.0/python/tests/test_public_api_imports.py +108 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_compat.py +121 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_full_dem_vs_collapsed.py +78 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_parity_memory_x.py +80 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_parity_memory_z.py +73 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_parity_p_sweep.py +77 -0
- qector_decoder_v3-0.5.0/python/tests/test_pymatching_parity_rounds_sweep.py +73 -0
- qector_decoder_v3-0.5.0/python/tests/test_readme_examples.py +75 -0
- qector_decoder_v3-0.5.0/python/tests/test_reproduce_commands.py +76 -0
- qector_decoder_v3-0.5.0/python/tests/test_result.py +86 -0
- qector_decoder_v3-0.5.0/python/tests/test_scaling_examples.py +64 -0
- qector_decoder_v3-0.5.0/python/tests/test_sinter.py +53 -0
- qector_decoder_v3-0.5.0/python/tests/test_sliding_window.py +34 -0
- qector_decoder_v3-0.5.0/python/tests/test_sliding_window_rounds.py +72 -0
- qector_decoder_v3-0.5.0/python/tests/test_sparse_blossom_boundary_pairing.py +96 -0
- qector_decoder_v3-0.5.0/python/tests/test_sparse_blossom_dense_syndromes.py +43 -0
- qector_decoder_v3-0.5.0/python/tests/test_sparse_blossom_faithfulness.py +43 -0
- qector_decoder_v3-0.5.0/python/tests/test_sparse_blossom_weight_gap.py +68 -0
- qector_decoder_v3-0.5.0/python/tests/test_stabilizer_equivalent_corrections.py +153 -0
- qector_decoder_v3-0.5.0/python/tests/test_stim_observable_agreement.py +102 -0
- qector_decoder_v3-0.5.0/python/tests/test_streaming_batch_equivalence.py +94 -0
- qector_decoder_v3-0.5.0/python/tests/test_streaming_flush.py +67 -0
- qector_decoder_v3-0.5.0/python/tests/test_streaming_history_size.py +69 -0
- qector_decoder_v3-0.5.0/python/tests/test_syndrome_faithfulness.py +184 -0
- qector_decoder_v3-0.5.0/python/tests/test_type_hints.py +82 -0
- qector_decoder_v3-0.5.0/python/tests/test_unionfind_adversarial_failure_documented.py +150 -0
- qector_decoder_v3-0.5.0/python/tests/test_unionfind_repetition_faithfulness.py +55 -0
- qector_decoder_v3-0.5.0/python/tests/test_unionfind_surface_faithfulness.py +46 -0
- qector_decoder_v3-0.5.0/python/tests/test_unionfind_toric_faithfulness.py +39 -0
- qector_decoder_v3-0.5.0/python/tests/test_validation.py +215 -0
- qector_decoder_v3-0.5.0/python/tests/test_version_consistency.py +54 -0
- qector_decoder_v3-0.5.0/python/tests/test_weight_gap_histogram.py +66 -0
- qector_decoder_v3-0.5.0/python/tests/test_wheel_import.py +70 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_backend_detection.py +27 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_cancel_job.py +47 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_environment_snapshot.py +35 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_export_csv_json.py +48 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_export_pdf.py +45 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_load_dem.py +51 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_load_stim.py +48 -0
- qector_decoder_v3-0.5.0/python/tests/test_workbench_run_benchmark.py +65 -0
- qector_decoder_v3-0.5.0/scripts/auto_backend_calibrate.py +90 -0
- qector_decoder_v3-0.5.0/scripts/belief_extended.py +201 -0
- qector_decoder_v3-0.5.0/scripts/belief_grid.py +102 -0
- qector_decoder_v3-0.5.0/scripts/belief_reference_compare.py +152 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_bp_marginal.py +98 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_gpu.py +116 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_gpu_end2end.py +156 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_heuristic.py +70 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_heuristic_sparse.py +85 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_ler.py +263 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_ler_gpu.py +474 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_ler_reporting.py +215 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_ler_serious.py +583 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_ler_surface.py +245 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_proper_toric.py +97 -0
- qector_decoder_v3-0.5.0/scripts/benchmark_vs_pymatching.py +151 -0
- qector_decoder_v3-0.5.0/scripts/competitive_belief_matching.py +154 -0
- qector_decoder_v3-0.5.0/scripts/competitive_stim_ler.py +196 -0
- qector_decoder_v3-0.5.0/scripts/d15_mismatch_audit.py +188 -0
- qector_decoder_v3-0.5.0/scripts/generate_report_pdf.py +1272 -0
- qector_decoder_v3-0.5.0/scripts/gpu_extensive_test.py +147 -0
- qector_decoder_v3-0.5.0/scripts/gpu_memory_profile.py +158 -0
- qector_decoder_v3-0.5.0/scripts/leak_test.py +144 -0
- qector_decoder_v3-0.5.0/scripts/native_memory_profile.py +121 -0
- qector_decoder_v3-0.5.0/scripts/run_benchmark.py +71 -0
- qector_decoder_v3-0.5.0/scripts/run_competitive_benchmark.py +128 -0
- qector_decoder_v3-0.5.0/scripts/run_due_diligence_bundle.py +257 -0
- qector_decoder_v3-0.5.0/scripts/run_scaling_benchmark.py +121 -0
- qector_decoder_v3-0.5.0/scripts/test_methods.py +4 -0
- qector_decoder_v3-0.5.0/scripts/test_sparse_methods.py +4 -0
- qector_decoder_v3-0.5.0/scripts/threshold_estimate.py +103 -0
- qector_decoder_v3-0.5.0/scripts/tune_blossom_k.py +78 -0
- qector_decoder_v3-0.5.0/scripts/verify_uf_rigorous.py +130 -0
- qector_decoder_v3-0.5.0/scripts/verify_uf_syndrome.py +148 -0
- qector_decoder_v3-0.5.0/scripts/vram_profile.py +107 -0
- qector_decoder_v3-0.5.0/scripts/weight_gap_analysis.py +114 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Normalize line endings -- enforce LF for all text files regardless of OS
|
|
2
|
+
* text=auto eol=lf
|
|
3
|
+
|
|
4
|
+
# Binaries
|
|
5
|
+
*.whl binary
|
|
6
|
+
*.pyd binary
|
|
7
|
+
*.so binary
|
|
8
|
+
*.dll binary
|
|
9
|
+
*.dylib binary
|
|
10
|
+
*.lib binary
|
|
11
|
+
*.exp binary
|
|
12
|
+
*.a binary
|
|
13
|
+
*.gz binary
|
|
14
|
+
*.zip binary
|
|
15
|
+
*.png binary
|
|
16
|
+
*.jpg binary
|
|
17
|
+
*.jpeg binary
|
|
18
|
+
*.gif binary
|
|
19
|
+
*.ico binary
|
|
20
|
+
*.pdf binary
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# CI -- Build wheels on Linux/Windows/macOS ARM, publish to PyPI on tag.
|
|
2
|
+
#
|
|
3
|
+
# Rust source is injected at build time from three GitHub Actions secrets
|
|
4
|
+
# (RUST_SRC_B64_1 + RUST_SRC_B64_2 + RUST_SRC_B64_3) to keep the proprietary
|
|
5
|
+
# core private. Secrets are base64 chunks that reassemble to src.tar.gz.
|
|
6
|
+
# On forks / external PRs the secrets will be empty and wheel builds are skipped.
|
|
7
|
+
#
|
|
8
|
+
# Trigger: push to main/master, any tag v*, pull_request, manual dispatch.
|
|
9
|
+
|
|
10
|
+
name: CI
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
push:
|
|
14
|
+
branches: [main, master]
|
|
15
|
+
tags: ["v*"]
|
|
16
|
+
pull_request:
|
|
17
|
+
workflow_dispatch:
|
|
18
|
+
|
|
19
|
+
permissions:
|
|
20
|
+
contents: read
|
|
21
|
+
|
|
22
|
+
env:
|
|
23
|
+
# Build without OpenCL (SDK not on runners). CUDA is runtime-loaded via
|
|
24
|
+
# libloading so no CUDA toolkit is needed at build time.
|
|
25
|
+
MATURIN_ARGS: --release --no-default-features --features cuda --out dist
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
# ------------------------------------------------------------------
|
|
29
|
+
# Linux x86_64 manylinux wheels
|
|
30
|
+
# ------------------------------------------------------------------
|
|
31
|
+
linux-x86_64:
|
|
32
|
+
name: linux-x86_64-py${{ matrix.python-version }}
|
|
33
|
+
runs-on: ubuntu-22.04
|
|
34
|
+
strategy:
|
|
35
|
+
fail-fast: false
|
|
36
|
+
matrix:
|
|
37
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
|
|
41
|
+
- name: Inject Rust source
|
|
42
|
+
env:
|
|
43
|
+
PART1: ${{ secrets.RUST_SRC_B64_1 }}
|
|
44
|
+
PART2: ${{ secrets.RUST_SRC_B64_2 }}
|
|
45
|
+
PART3: ${{ secrets.RUST_SRC_B64_3 }}
|
|
46
|
+
run: |
|
|
47
|
+
if [ -z "$PART1" ]; then
|
|
48
|
+
echo "::warning::RUST_SRC_B64_1 secret not set -- skipping wheel build"
|
|
49
|
+
echo "SKIP_BUILD=1" >> "$GITHUB_ENV"
|
|
50
|
+
else
|
|
51
|
+
echo "${PART1}${PART2}${PART3}" | base64 -d | tar -xzf - -C .
|
|
52
|
+
echo "SKIP_BUILD=0" >> "$GITHUB_ENV"
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
- uses: actions/setup-python@v5
|
|
56
|
+
if: env.SKIP_BUILD == '0'
|
|
57
|
+
with:
|
|
58
|
+
python-version: ${{ matrix.python-version }}
|
|
59
|
+
|
|
60
|
+
- name: Build manylinux wheel
|
|
61
|
+
if: env.SKIP_BUILD == '0'
|
|
62
|
+
uses: PyO3/maturin-action@v1
|
|
63
|
+
with:
|
|
64
|
+
target: x86_64
|
|
65
|
+
manylinux: auto
|
|
66
|
+
args: ${{ env.MATURIN_ARGS }} -i python${{ matrix.python-version }}
|
|
67
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
68
|
+
|
|
69
|
+
- uses: actions/upload-artifact@v4
|
|
70
|
+
if: env.SKIP_BUILD == '0'
|
|
71
|
+
with:
|
|
72
|
+
name: wheels-linux-x86_64-py${{ matrix.python-version }}
|
|
73
|
+
path: dist
|
|
74
|
+
|
|
75
|
+
# ------------------------------------------------------------------
|
|
76
|
+
# Windows x64 wheels
|
|
77
|
+
# ------------------------------------------------------------------
|
|
78
|
+
windows-x64:
|
|
79
|
+
name: windows-x64-py${{ matrix.python-version }}
|
|
80
|
+
runs-on: windows-latest
|
|
81
|
+
strategy:
|
|
82
|
+
fail-fast: false
|
|
83
|
+
matrix:
|
|
84
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
85
|
+
steps:
|
|
86
|
+
- uses: actions/checkout@v4
|
|
87
|
+
|
|
88
|
+
- name: Inject Rust source
|
|
89
|
+
env:
|
|
90
|
+
PART1: ${{ secrets.RUST_SRC_B64_1 }}
|
|
91
|
+
PART2: ${{ secrets.RUST_SRC_B64_2 }}
|
|
92
|
+
PART3: ${{ secrets.RUST_SRC_B64_3 }}
|
|
93
|
+
shell: bash
|
|
94
|
+
run: |
|
|
95
|
+
if [ -z "$PART1" ]; then
|
|
96
|
+
echo "::warning::RUST_SRC_B64_1 secret not set -- skipping wheel build"
|
|
97
|
+
echo "SKIP_BUILD=1" >> "$GITHUB_ENV"
|
|
98
|
+
else
|
|
99
|
+
echo "${PART1}${PART2}${PART3}" | base64 -d | tar -xzf - -C .
|
|
100
|
+
echo "SKIP_BUILD=0" >> "$GITHUB_ENV"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
- uses: actions/setup-python@v5
|
|
104
|
+
if: env.SKIP_BUILD == '0'
|
|
105
|
+
with:
|
|
106
|
+
python-version: ${{ matrix.python-version }}
|
|
107
|
+
architecture: x64
|
|
108
|
+
|
|
109
|
+
- name: Build Windows wheel
|
|
110
|
+
if: env.SKIP_BUILD == '0'
|
|
111
|
+
uses: PyO3/maturin-action@v1
|
|
112
|
+
with:
|
|
113
|
+
target: x64
|
|
114
|
+
args: ${{ env.MATURIN_ARGS }} -i python
|
|
115
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
116
|
+
|
|
117
|
+
- uses: actions/upload-artifact@v4
|
|
118
|
+
if: env.SKIP_BUILD == '0'
|
|
119
|
+
with:
|
|
120
|
+
name: wheels-windows-x64-py${{ matrix.python-version }}
|
|
121
|
+
path: dist
|
|
122
|
+
|
|
123
|
+
# ------------------------------------------------------------------
|
|
124
|
+
# macOS Apple Silicon (aarch64) wheels
|
|
125
|
+
# ------------------------------------------------------------------
|
|
126
|
+
macos-arm:
|
|
127
|
+
name: macos-aarch64-py${{ matrix.python-version }}
|
|
128
|
+
runs-on: macos-14
|
|
129
|
+
strategy:
|
|
130
|
+
fail-fast: false
|
|
131
|
+
matrix:
|
|
132
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
133
|
+
steps:
|
|
134
|
+
- uses: actions/checkout@v4
|
|
135
|
+
|
|
136
|
+
- name: Inject Rust source
|
|
137
|
+
env:
|
|
138
|
+
PART1: ${{ secrets.RUST_SRC_B64_1 }}
|
|
139
|
+
PART2: ${{ secrets.RUST_SRC_B64_2 }}
|
|
140
|
+
PART3: ${{ secrets.RUST_SRC_B64_3 }}
|
|
141
|
+
run: |
|
|
142
|
+
if [ -z "$PART1" ]; then
|
|
143
|
+
echo "::warning::RUST_SRC_B64_1 secret not set -- skipping wheel build"
|
|
144
|
+
echo "SKIP_BUILD=1" >> "$GITHUB_ENV"
|
|
145
|
+
else
|
|
146
|
+
echo "${PART1}${PART2}${PART3}" | base64 -d | tar -xzf - -C .
|
|
147
|
+
echo "SKIP_BUILD=0" >> "$GITHUB_ENV"
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
- uses: actions/setup-python@v5
|
|
151
|
+
if: env.SKIP_BUILD == '0'
|
|
152
|
+
with:
|
|
153
|
+
python-version: ${{ matrix.python-version }}
|
|
154
|
+
|
|
155
|
+
- name: Build macOS ARM wheel
|
|
156
|
+
if: env.SKIP_BUILD == '0'
|
|
157
|
+
uses: PyO3/maturin-action@v1
|
|
158
|
+
with:
|
|
159
|
+
target: aarch64
|
|
160
|
+
args: ${{ env.MATURIN_ARGS }} -i python
|
|
161
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
162
|
+
|
|
163
|
+
- uses: actions/upload-artifact@v4
|
|
164
|
+
if: env.SKIP_BUILD == '0'
|
|
165
|
+
with:
|
|
166
|
+
name: wheels-macos-aarch64-py${{ matrix.python-version }}
|
|
167
|
+
path: dist
|
|
168
|
+
|
|
169
|
+
# ------------------------------------------------------------------
|
|
170
|
+
# Source distribution (sdist) -- pure Python, no Rust needed
|
|
171
|
+
# ------------------------------------------------------------------
|
|
172
|
+
sdist:
|
|
173
|
+
name: sdist
|
|
174
|
+
runs-on: ubuntu-latest
|
|
175
|
+
steps:
|
|
176
|
+
- uses: actions/checkout@v4
|
|
177
|
+
|
|
178
|
+
- name: Inject Rust source (needed by maturin sdist to embed Cargo.toml)
|
|
179
|
+
env:
|
|
180
|
+
PART1: ${{ secrets.RUST_SRC_B64_1 }}
|
|
181
|
+
PART2: ${{ secrets.RUST_SRC_B64_2 }}
|
|
182
|
+
PART3: ${{ secrets.RUST_SRC_B64_3 }}
|
|
183
|
+
run: |
|
|
184
|
+
if [ -z "$PART1" ]; then
|
|
185
|
+
echo "SKIP_BUILD=1" >> "$GITHUB_ENV"
|
|
186
|
+
else
|
|
187
|
+
echo "${PART1}${PART2}${PART3}" | base64 -d | tar -xzf - -C .
|
|
188
|
+
echo "SKIP_BUILD=0" >> "$GITHUB_ENV"
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
- name: Build sdist
|
|
192
|
+
if: env.SKIP_BUILD == '0'
|
|
193
|
+
uses: PyO3/maturin-action@v1
|
|
194
|
+
with:
|
|
195
|
+
command: sdist
|
|
196
|
+
args: --out dist
|
|
197
|
+
|
|
198
|
+
- uses: actions/upload-artifact@v4
|
|
199
|
+
if: env.SKIP_BUILD == '0'
|
|
200
|
+
with:
|
|
201
|
+
name: wheels-sdist
|
|
202
|
+
path: dist
|
|
203
|
+
|
|
204
|
+
# ------------------------------------------------------------------
|
|
205
|
+
# Publish to PyPI via OIDC Trusted Publisher (no token required)
|
|
206
|
+
# Runs only on version tags pushed to the main repo (not forks)
|
|
207
|
+
# ------------------------------------------------------------------
|
|
208
|
+
release:
|
|
209
|
+
name: publish-to-pypi
|
|
210
|
+
runs-on: ubuntu-latest
|
|
211
|
+
if: >
|
|
212
|
+
startsWith(github.ref, 'refs/tags/v') &&
|
|
213
|
+
github.repository == 'GuillaumeLessard/qector-decoder' &&
|
|
214
|
+
github.event_name != 'pull_request'
|
|
215
|
+
needs: [linux-x86_64, windows-x64, macos-arm, sdist]
|
|
216
|
+
environment: pypi
|
|
217
|
+
permissions:
|
|
218
|
+
id-token: write
|
|
219
|
+
contents: write
|
|
220
|
+
attestations: write
|
|
221
|
+
steps:
|
|
222
|
+
- uses: actions/download-artifact@v4
|
|
223
|
+
with:
|
|
224
|
+
path: dist
|
|
225
|
+
merge-multiple: true
|
|
226
|
+
|
|
227
|
+
- name: Generate artifact attestations
|
|
228
|
+
uses: actions/attest-build-provenance@v2
|
|
229
|
+
with:
|
|
230
|
+
subject-path: "dist/*"
|
|
231
|
+
|
|
232
|
+
- name: Publish to PyPI
|
|
233
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
234
|
+
with:
|
|
235
|
+
packages-dir: dist/
|
|
236
|
+
skip-existing: true
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Lint and static analysis -- runs on every push/PR, no Rust build needed.
|
|
2
|
+
# Uses the installed wheel from PyPI (or a local sdist) to run the Python layer.
|
|
3
|
+
|
|
4
|
+
name: tests
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main, master]
|
|
9
|
+
pull_request:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
# ------------------------------------------------------------------
|
|
17
|
+
# Ruff lint + MyPy type-check
|
|
18
|
+
# ------------------------------------------------------------------
|
|
19
|
+
lint:
|
|
20
|
+
name: ruff-and-mypy
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
- name: Install linting tools
|
|
28
|
+
# numpy is intentionally omitted: numpy 2.x stubs use `type` syntax
|
|
29
|
+
# (Python 3.12+) which mypy rejects in py3.9 mode. --ignore-missing-imports
|
|
30
|
+
# in pyproject.toml handles the missing stubs gracefully.
|
|
31
|
+
run: pip install ruff mypy
|
|
32
|
+
- name: Ruff lint
|
|
33
|
+
run: ruff check python/
|
|
34
|
+
- name: Ruff format check
|
|
35
|
+
run: ruff format --check python/
|
|
36
|
+
- name: MyPy
|
|
37
|
+
# continue-on-error: pre-existing type inconsistencies in the Python layer
|
|
38
|
+
# (no-any-return, valid-type, attr-defined, operator, assignment) will be
|
|
39
|
+
# addressed in a follow-up typing PR. Lint and format checks are hard failures.
|
|
40
|
+
continue-on-error: true
|
|
41
|
+
run: mypy python/qector_decoder_v3/ --ignore-missing-imports
|
|
42
|
+
|
|
43
|
+
# ------------------------------------------------------------------
|
|
44
|
+
# Docker image build smoke test
|
|
45
|
+
# Dockerfile runs maturin build --release which requires the real Rust
|
|
46
|
+
# source (injected at CI build time via secrets). In the tests workflow
|
|
47
|
+
# the source is a stub, so the build is expected to fail -- mark
|
|
48
|
+
# continue-on-error so this job is informational only.
|
|
49
|
+
# ------------------------------------------------------------------
|
|
50
|
+
docker:
|
|
51
|
+
name: docker-build
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
continue-on-error: true
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
- name: Build Docker image (Rust source stub -- expected failure)
|
|
57
|
+
run: docker build -t qector-decoder-test:ci . || echo "::warning::Docker build failed (stub src -- expected)"
|
|
58
|
+
|
|
59
|
+
# ------------------------------------------------------------------
|
|
60
|
+
# Python layer import smoke test (installs from PyPI)
|
|
61
|
+
# ------------------------------------------------------------------
|
|
62
|
+
smoke-import:
|
|
63
|
+
name: smoke-import-py${{ matrix.python-version }}
|
|
64
|
+
runs-on: ubuntu-22.04
|
|
65
|
+
strategy:
|
|
66
|
+
fail-fast: false
|
|
67
|
+
matrix:
|
|
68
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v4
|
|
71
|
+
- uses: actions/setup-python@v5
|
|
72
|
+
with:
|
|
73
|
+
python-version: ${{ matrix.python-version }}
|
|
74
|
+
- name: Install from PyPI
|
|
75
|
+
run: pip install qector-decoder-v3 --pre || echo "PyPI package not yet available -- skipping import test"
|
|
76
|
+
- name: Import smoke test
|
|
77
|
+
run: |
|
|
78
|
+
python -c "
|
|
79
|
+
try:
|
|
80
|
+
import qector_decoder_v3
|
|
81
|
+
print(f'qector_decoder_v3 {getattr(qector_decoder_v3, \"__version__\", \"unknown\")} imported OK')
|
|
82
|
+
except ImportError as e:
|
|
83
|
+
print(f'ImportError (expected if not on PyPI yet): {e}')
|
|
84
|
+
"
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# QECTOR Decoder v3 -- .gitignore
|
|
2
|
+
# =================================
|
|
3
|
+
|
|
4
|
+
# --- Build artifacts ---
|
|
5
|
+
/target/
|
|
6
|
+
/dist/
|
|
7
|
+
*.whl
|
|
8
|
+
*.tar.gz
|
|
9
|
+
*.pyd
|
|
10
|
+
*.so
|
|
11
|
+
*.dll
|
|
12
|
+
*.dylib
|
|
13
|
+
|
|
14
|
+
# --- Python ---
|
|
15
|
+
__pycache__/
|
|
16
|
+
*.py[cod]
|
|
17
|
+
*$py.class
|
|
18
|
+
*.egg-info/
|
|
19
|
+
*.egg
|
|
20
|
+
.eggs/
|
|
21
|
+
build/
|
|
22
|
+
develop-eggs/
|
|
23
|
+
downloads/
|
|
24
|
+
eggs/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
lib64/
|
|
27
|
+
parts/
|
|
28
|
+
sdist/
|
|
29
|
+
var/
|
|
30
|
+
wheels/
|
|
31
|
+
*.spec
|
|
32
|
+
pip-wheel-metadata/
|
|
33
|
+
share/python-wheels/
|
|
34
|
+
MANIFEST
|
|
35
|
+
|
|
36
|
+
# --- Virtual environments ---
|
|
37
|
+
.venv/
|
|
38
|
+
venv/
|
|
39
|
+
env/
|
|
40
|
+
ENV/
|
|
41
|
+
env.bak/
|
|
42
|
+
venv.bak/
|
|
43
|
+
|
|
44
|
+
# --- IDE ---
|
|
45
|
+
.vscode/
|
|
46
|
+
.idea/
|
|
47
|
+
*.swp
|
|
48
|
+
*.swo
|
|
49
|
+
*~
|
|
50
|
+
|
|
51
|
+
# --- Rust ---
|
|
52
|
+
Cargo.lock.bak
|
|
53
|
+
|
|
54
|
+
# --- Generated lib artifacts (only OpenCL.def is tracked) ---
|
|
55
|
+
lib/OpenCL.lib
|
|
56
|
+
lib/OpenCL.exp
|
|
57
|
+
|
|
58
|
+
# --- Local build/dev directories ---
|
|
59
|
+
actions-runner/
|
|
60
|
+
artifacts/
|
|
61
|
+
|
|
62
|
+
# --- OS ---
|
|
63
|
+
.DS_Store
|
|
64
|
+
Thumbs.db
|
|
65
|
+
desktop.ini
|
|
66
|
+
|
|
67
|
+
# --- Benchmark outputs (tracked selectively) ---
|
|
68
|
+
# benchmark_results/ is tracked intentionally for reproducibility evidence
|
|
69
|
+
|
|
70
|
+
# --- Testing ---
|
|
71
|
+
.pytest_cache/
|
|
72
|
+
.coverage
|
|
73
|
+
htmlcov/
|
|
74
|
+
.mypy_cache/
|
|
75
|
+
.ruff_cache/
|
|
76
|
+
|
|
77
|
+
# --- Temporary ---
|
|
78
|
+
*.tmp
|
|
79
|
+
*.bak
|
|
80
|
+
*.orig
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to QECTOR Decoder v3 are documented here. The format is based
|
|
4
|
+
on [Keep a Changelog](https://keepachangelog.com/), and the project aims to follow
|
|
5
|
+
semantic versioning. Every benchmark artifact is stamped with the git commit and
|
|
6
|
+
environment so report figures trace back to a specific build.
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.5.0] - 2026-06-23
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Blossom exactness at large distance (adaptive-k).** `BlossomDecoder` previously
|
|
14
|
+
used a fixed `k=12` candidate cap, which undershot the optimum on large dense
|
|
15
|
+
circuit-level graphs (d ≥ 13–15), producing heavier matchings and a markedly
|
|
16
|
+
worse logical error rate than PyMatching at d=15. The candidate set is now
|
|
17
|
+
**adaptive**, `k = max(12, 4·√n_defects)`, restoring exact-MWPM LER parity with
|
|
18
|
+
PyMatching through **d=15** (`memory_x` and `memory_z`). Locked permanently by
|
|
19
|
+
`test_blossom_adaptive_k_regression.py`, `test_blossom_d15_no_gap.py`,
|
|
20
|
+
`test_blossom_candidate_set_contains_optimal.py`, `test_weight_gap_histogram.py`,
|
|
21
|
+
and `test_defect_count_vs_weight_gap.py`.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **QECTOR Workbench** (`qector_decoder_v3.workbench.Workbench`): headless,
|
|
25
|
+
fully-tested controller to load `.stim`/`.dem` files, run cancelable benchmark
|
|
26
|
+
jobs through a FIFO queue, and export JSON/CSV/PDF reports (charts built from
|
|
27
|
+
real artifacts, no fabricated data). Backend detection + environment snapshot.
|
|
28
|
+
- **Evidence & reproduction scripts**: `run_due_diligence_bundle.py` (one-command
|
|
29
|
+
evidence bundle with hashes + git commit), `belief_reference_compare.py`,
|
|
30
|
+
`gpu_memory_profile.py`, `auto_backend_calibrate.py`, `leak_test.py`.
|
|
31
|
+
- **Provenance**: `benchmarking.capture_environment()` now records `git_commit`, so
|
|
32
|
+
every JSON artifact and report figure points to the exact build it came from
|
|
33
|
+
(replaces "Git commit: unknown").
|
|
34
|
+
- **Expanded validation suite** covering: exact-MWPM parity (memory_x/z, p-sweep,
|
|
35
|
+
rounds-sweep), DEM-collapse mathematical equivalence + d=11/d=15 regression
|
|
36
|
+
fixtures (50,484→6,718 and 132,426→17,862), logical-observable / stabilizer-coset
|
|
37
|
+
correctness, belief-matching seed×p grid + reference cross-check, BP-OSD on
|
|
38
|
+
BB[[72,12]]/BB[[144,12,12]]/HGP/bicycle, GPU CPU-bit-identity + fallback +
|
|
39
|
+
calibration, latency percentiles + tail, and memory/leak profiling.
|
|
40
|
+
- **Documentation**: README "Validated scope", "When to use which decoder" decision
|
|
41
|
+
matrix, and a permanent "Known limitations" section with honest latency ratios.
|
|
42
|
+
|
|
43
|
+
### Build
|
|
44
|
+
- Refreshed Rust dependencies (`rayon` 1.12, `fastrand` 2.4) and migrated the
|
|
45
|
+
optional `grpc`/`full` stack to `tonic` 0.14 / `prost` 0.14 with a vendored
|
|
46
|
+
`protoc` (`protoc-bin-vendored`), so gRPC builds need no system `protoc`. The
|
|
47
|
+
default wheel features (`opencl`, `cuda` with CPU fallback) are unchanged.
|
|
48
|
+
|
|
49
|
+
## [0.4.0]
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
- `SparseBlossomDecoder` (region-growing, RadixHeap, exact DP for n ≤ 20 with
|
|
53
|
+
Edmonds primal-dual fallback), bit-validated against `BlossomDecoder`.
|
|
54
|
+
- Ecosystem layer: `codes`, `dem`, `result`, `backend`, `pymatching_compat`,
|
|
55
|
+
`benchmarking`; belief-matching and BP-OSD decoders; Stim/Sinter compatibility.
|
|
56
|
+
- Native CUDA (NVRTC + Driver API) and OpenCL batch decoders with CPU fallback.
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
- Stim DEM loading uses the correct detector graph (mechanisms = columns,
|
|
60
|
+
detectors = rows), replacing the earlier `stim_compat` heuristic.
|
|
61
|
+
|
|
62
|
+
## [0.2.0]
|
|
63
|
+
|
|
64
|
+
- Python + Numba baseline decoder core (pre-Rust rewrite).
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Commercial Licensing
|
|
2
|
+
|
|
3
|
+
QECTOR Decoder v3 is source-available for personal, academic, educational, and
|
|
4
|
+
non-commercial research use.
|
|
5
|
+
|
|
6
|
+
Commercial use requires a paid commercial license.
|
|
7
|
+
|
|
8
|
+
Commercial use includes, but is not limited to:
|
|
9
|
+
|
|
10
|
+
- company use
|
|
11
|
+
- startup use
|
|
12
|
+
- commercial R&D
|
|
13
|
+
- government use
|
|
14
|
+
- institutional or funded use
|
|
15
|
+
- paid consulting
|
|
16
|
+
- SaaS use
|
|
17
|
+
- hosted API use
|
|
18
|
+
- OEM embedding
|
|
19
|
+
- product integration
|
|
20
|
+
- redistribution
|
|
21
|
+
- internal business operations
|
|
22
|
+
- commercial benchmarking
|
|
23
|
+
- revenue-generating use
|
|
24
|
+
- fundraising or investor validation
|
|
25
|
+
|
|
26
|
+
## Current commercial pricing position
|
|
27
|
+
|
|
28
|
+
QECTOR is priced as a source-available Rust/Python QEC R&D platform, not as a
|
|
29
|
+
mature real-time hardware QEC stack.
|
|
30
|
+
|
|
31
|
+
The defendable value is decoder diversity, reproducible benchmark packaging,
|
|
32
|
+
BP-OSD / LDPC workflows, CPU/GPU batch paths, source access, and commercial legal
|
|
33
|
+
clarity.
|
|
34
|
+
|
|
35
|
+
QECTOR should not be sold as the universal fastest MWPM decoder. PyMatching
|
|
36
|
+
remains the latency leader for exact MWPM on the tested workloads. QECTOR's
|
|
37
|
+
commercial value must come from broader workflow packaging, differentiated R&D
|
|
38
|
+
use cases, reproducible artifacts, and selected accuracy-mode gains.
|
|
39
|
+
|
|
40
|
+
## Why pay when PyMatching and Stim are free?
|
|
41
|
+
|
|
42
|
+
PyMatching and Stim are excellent free baselines. A buyer should not license
|
|
43
|
+
QECTOR only to get exact-MWPM surface-code latency.
|
|
44
|
+
|
|
45
|
+
QECTOR is a paid commercial option when a team needs:
|
|
46
|
+
|
|
47
|
+
| Need | QECTOR value |
|
|
48
|
+
|---|---|
|
|
49
|
+
| Multi-decoder experiments | Union-Find, Blossom, Sparse Blossom, BP-OSD, streaming, batch, and hybrid workflows in one source-available platform |
|
|
50
|
+
| LDPC/qLDPC coverage | BP-OSD and LDPC workflows beyond plain graphlike MWPM |
|
|
51
|
+
| Reproducible evidence | Benchmark artifacts, environment snapshots, reproducibility scripts, and Workbench report bundles |
|
|
52
|
+
| Commercial permission | Written license terms for company, lab, funded, product, hosted, or revenue-linked use |
|
|
53
|
+
| Support path | Paid support, validation package, and advisory options for commercial R&D users |
|
|
54
|
+
|
|
55
|
+
The correct commercial pitch is workflow/time-saving value, reproducible proof,
|
|
56
|
+
legal clarity, and decoder breadth. Do not pitch QECTOR as a universal PyMatching
|
|
57
|
+
replacement.
|
|
58
|
+
|
|
59
|
+
## Public pricing tiers
|
|
60
|
+
|
|
61
|
+
| Tier | Price | Scope |
|
|
62
|
+
|---|---:|---|
|
|
63
|
+
| Personal / Academic | Free | Personal, academic, educational, and non-commercial research use |
|
|
64
|
+
| Commercial Evaluation Pilot | $1,500 / 90 days | Internal commercial evaluation, up to 2 named users, creditable toward annual license |
|
|
65
|
+
| Startup Commercial | $3,500 / year | Early commercial R&D, internal prototype use, up to 5 named users |
|
|
66
|
+
| Professional / Lab | $15,000 / year | Funded lab or commercial R&D use, benchmark workflows, up to 20 named users |
|
|
67
|
+
| Enterprise R&D | $35,000+ / year | Internal enterprise evaluation and commercial QEC research workflows |
|
|
68
|
+
| SaaS / Hosted API | Contact only | Beta review only until production hosted infrastructure, support scope, and hosted-value proof exist |
|
|
69
|
+
| OEM / Embedded | Contact only | Partner validation only until hardware/platform scope and redistribution terms exist |
|
|
70
|
+
| Strategic Partnership | Custom | No public exclusive-price floor; requires validation, IP, or partnership scope |
|
|
71
|
+
|
|
72
|
+
Hosted API and OEM prices are intentionally not listed publicly at this stage.
|
|
73
|
+
QECTOR's hosted layer is not yet enterprise SaaS infrastructure, and OEM rights
|
|
74
|
+
require a serious hardware or platform partner before pricing can be responsible.
|
|
75
|
+
|
|
76
|
+
## Optional support and advisory pricing
|
|
77
|
+
|
|
78
|
+
| Service | Price | Scope |
|
|
79
|
+
|---|---:|---|
|
|
80
|
+
| Priority Support | $5,000 / year | Private email support and priority bug review for licensed users |
|
|
81
|
+
| Integration Support | $10,000 / year | Benchmark review, install support, and integration guidance |
|
|
82
|
+
| Validation Report Package | $5,000 one-time | Review of customer benchmark setup and reproducibility package |
|
|
83
|
+
| Custom Engineering | $150 / hour | Private fixes, special reports, scripts, or workflow adaptation |
|
|
84
|
+
| Technical Advisory | $2,000 / day | Architecture review and QEC workflow consulting |
|
|
85
|
+
|
|
86
|
+
## Pilot success criteria
|
|
87
|
+
|
|
88
|
+
A commercial pilot should be judged on measurable workflow value, not vague
|
|
89
|
+
interest.
|
|
90
|
+
|
|
91
|
+
Recommended pilot proof points:
|
|
92
|
+
|
|
93
|
+
- install success on the buyer's target machines
|
|
94
|
+
- one reproduced benchmark artifact bundle
|
|
95
|
+
- one QECTOR vs PyMatching comparison run
|
|
96
|
+
- one BP-OSD / LDPC workflow if relevant
|
|
97
|
+
- one artifact manifest with hashes and environment snapshot
|
|
98
|
+
- documented time saved versus the buyer's existing PyMatching / Stim / custom-script workflow
|
|
99
|
+
|
|
100
|
+
## Next proof asset
|
|
101
|
+
|
|
102
|
+
The next commercially important public artifact is a reproducible GPU/batch
|
|
103
|
+
benchmark campaign against a strong PyMatching + Stim baseline.
|
|
104
|
+
|
|
105
|
+
Do not claim universal GPU throughput superiority, RTX 4090 speedups, SaaS
|
|
106
|
+
readiness, OEM readiness, or real-time hardware decoding until the repository
|
|
107
|
+
includes reproducible artifacts with hardware, driver/runtime versions, batch
|
|
108
|
+
size, circuit/DEM, seeds, wall time, memory, output hashes, and environment
|
|
109
|
+
snapshots.
|
|
110
|
+
|
|
111
|
+
## Rights not included by default
|
|
112
|
+
|
|
113
|
+
Unless explicitly granted in a written commercial agreement, no license tier
|
|
114
|
+
includes:
|
|
115
|
+
|
|
116
|
+
- redistribution rights
|
|
117
|
+
- sublicensing rights
|
|
118
|
+
- OEM rights
|
|
119
|
+
- hosted API rights
|
|
120
|
+
- SaaS rights
|
|
121
|
+
- trademark rights
|
|
122
|
+
- patent rights
|
|
123
|
+
- exclusivity
|
|
124
|
+
- warranty or indemnification
|
|
125
|
+
- government or defense rights
|
|
126
|
+
|
|
127
|
+
## Official licensing portal
|
|
128
|
+
|
|
129
|
+
https://www.qector.store
|
|
130
|
+
|
|
131
|
+
## Commercial contact
|
|
132
|
+
|
|
133
|
+
admin@qector.store
|