Skip to content

Commit dea7464

Browse files
authored
Merge pull request #22 from jlapeyre/gjl-allow-clear-cache
Support clearing caches and running tests serially * The diophantine solver uses static caches. For reproducibility and other reasons we need to be able to clear these caches. * In any case, code, including tests that use static caches can't be run concurrently, without incorrect results. We need to run some of these tests serially. The commit adds `clear_caches`, and introduces a dependency on `serial_test`. These are both tested in the test suite.
2 parents 7cfea4f + dfe5f78 commit dea7464

File tree

4 files changed

+36
-18
lines changed

4 files changed

+36
-18
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ log = "0.4"
3434
env_logger = "0.11"
3535

3636
[dev-dependencies]
37+
serial_test = "*"
3738

3839
[profile.release]
3940
opt-level = 3

src/diophantine.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,27 @@ fn diophantine(
838838
type DiophantineCacheType = LazyLock<Mutex<HashMap<(IBig, IBig), Option<DOmega>>>>;
839839
static DIOPHANTINE_CACHE: DiophantineCacheType = LazyLock::new(|| Mutex::new(HashMap::new()));
840840

841+
pub fn clear_caches() {
842+
if let Ok(mut cache) = PRIMALITY_CACHE.try_lock() {
843+
cache.clear();
844+
// println!("cleared primality cache");
845+
} else {
846+
// println!("Can't clear primality cache");
847+
}
848+
if let Ok(mut cache) = SQRT_CACHE.try_lock() {
849+
cache.clear();
850+
// println!("cleared sqrt cache");
851+
}
852+
if let Ok(mut cache) = FACTOR_CACHE.try_lock() {
853+
cache.clear();
854+
// println!("cleared factor cache");
855+
}
856+
if let Ok(mut cache) = DIOPHANTINE_CACHE.try_lock() {
857+
cache.clear();
858+
// println!("cleared diophantine cache");
859+
}
860+
}
861+
841862
pub(crate) fn diophantine_dyadic(
842863
xi: DRootTwo,
843864
diophantine_data: &mut DiophantineData,

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ pub mod synthesis_of_clifford_t;
1515
pub mod tdgp;
1616
pub mod to_upright;
1717
pub mod unitary;
18+
19+
pub use diophantine::clear_caches;

tests/integration_test.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,34 @@
1+
use rsgridsynth::clear_caches;
12
use rsgridsynth::config::config_from_theta_epsilon;
23
use rsgridsynth::gridsynth::gridsynth_gates;
4+
use serial_test::serial;
35

46
#[test]
5-
#[ignore]
7+
#[serial]
68
fn simple_test() {
79
let pi = std::f64::consts::PI;
810
let theta = pi / 8.0; // ≈ 0.39269908169872414
911
let epsilon = 1e-10;
10-
let seed = 1234;
11-
let verbose = false;
12-
let mut gridsynth_config = config_from_theta_epsilon(theta, epsilon, seed, verbose);
13-
let gates = gridsynth_gates(&mut gridsynth_config);
14-
let expected_gates = "HTHTSHTSHTHTSHTHTSHTHTHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTSHTHTSHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTHTHTSHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTHTSHTHTHTSHTSHTSHTHTSHTSHTHTSHTHTSHTSHTHTSHTHTHTSHTSHTSHTSHTHTHTHTSHTHTHTSHTHTSHTHTHTSHTHTSHTHTSHTXSSWWW";
15-
assert_eq!(gates, expected_gates);
16-
}
1712

18-
#[test]
19-
#[ignore]
20-
fn simple_test2() {
21-
let pi = std::f64::consts::PI;
22-
let theta = pi / 8.0; // ≈ 0.39269908169872414
23-
let epsilon = 1e-10;
13+
let gates_1234 = "HTHTSHTSHTHTSHTHTSHTHTHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTSHTHTSHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTHTHTSHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTHTSHTHTHTSHTSHTSHTHTSHTSHTHTSHTHTSHTSHTHTSHTHTHTSHTSHTSHTSHTHTHTHTSHTHTHTSHTHTSHTHTHTSHTHTSHTHTSHTXSSWWW";
14+
15+
let gates_101 = "HTSHTSHTSHTHTHTSHTHTHTSHTSHTHTHTHTHTHTSHTHTHTHTSHTSHTHTSHTHTHTHTHTHTHTHTSHTHTHTHTSHTHTSHTSHTSHTSHTHTSHTSHTHTSHTSHTHTSHTHTHTSHTSHTHTHTHTSHTHTSHTHTSHTHTHTSHTSHTHTHTHTHTSHTHTSHTSHTHTHTHTSHTHTHTSHTHTHTHTSHTHTSHTSHTHTSHTHTSHTHTHTHTHTHTHTHTSHTHTHTSHTSSSWW";
2416

25-
let gates1 = "HTHTSHTSHTHTSHTHTSHTHTHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTSHTHTSHTSHTSHTHTHTHTHTHTSHTSHTHTSHTSHTSHTHTHTSHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTSHTSHTSHTSHTSHTHTHTHTHTSHTHTSHTHTHTSHTSHTSHTHTSHTSHTHTSHTHTSHTSHTHTSHTHTHTSHTSHTSHTSHTHTHTHTSHTHTHTSHTHTSHTHTHTSHTHTSHTHTSHTXSSWWW";
17+
let gates_1 = "HTSHTHTHTSHTHTHTHTHTHTHTHTSHTHTSHTHTSHTSHTHTSHTHTHTHTSHTHTHTSHTHTHTHTSHTSHTHTSHTHTHTHTHTSHTSHTHTHTSHTHTSHTHTSHTHTHTHTSHTSHTHTHTSHTHTSHTSHTHTSHTSHTHTSHTSHTSHTSHTHTSHTHTHTHTSHTHTHTHTHTHTHTHTSHTHTSHTSHTHTHTHTSHTHTHTHTHTHTSHTSHTHTHTSHTHTHTSHTSHTSHTSSSWW";
2618

27-
let test_inputs = vec![(1234, gates1), (101, gates1), (1, gates1)];
19+
let test_inputs = vec![(1234, gates_1234), (101, gates_101), (1, gates_1)];
2820

2921
let verbose = false;
3022
for (seed, expected_gates) in test_inputs {
23+
clear_caches();
3124
let mut gridsynth_config = config_from_theta_epsilon(theta, epsilon, seed, verbose);
3225
let gates = gridsynth_gates(&mut gridsynth_config);
3326
assert_eq!(gates, expected_gates, "Test failed for seed: {}", seed);
3427
}
3528
}
3629

37-
//#[ignore]
3830
#[test]
31+
#[serial]
3932
fn pi_over_two_test() {
4033
let pi = std::f64::consts::PI;
4134
let theta = pi / 2.0;
@@ -44,8 +37,9 @@ fn pi_over_two_test() {
4437

4538
let verbose = false;
4639
for epsilon in epsilons {
47-
let seeds = 100..300;
40+
let seeds = 10..50;
4841
for seed in seeds {
42+
clear_caches();
4943
let mut gridsynth_config = config_from_theta_epsilon(theta, epsilon, seed, verbose);
5044
let gates = gridsynth_gates(&mut gridsynth_config);
5145
let expected_gates = "SWWWWWWW";

0 commit comments

Comments
 (0)