Support multiple seed pools

This commit is contained in:
2024-02-09 21:05:24 -08:00
parent ae1955b7c4
commit 94a410a587
19 changed files with 56006 additions and 140 deletions

110
simulator/level_7.txt Normal file
View File

@ -0,0 +1,110 @@
81
11
124
76
10
111
128
63
106
136
50
150
6
152
74
27
113
91
171
18
167
16
125
51
148
198
93
146
200
219
196
83
177
14
237
36
262
239
276
169
285
138
242
241
259
299
302
279
182
166
191
159
306
255
320
309
295
328
313
373
269
348
340
388
286
354
428
382
398
322
441
343
469
319
453
488
456
520
525
414
508
361
529
527
521
494
569
563
417
580
589
594
614
605
422
596
505
593
676
511
682
660
413
512
483
716
722
731
629
696

View File

@ -1,4 +1,4 @@
use std::{borrow::Borrow, fs::File, io::Write, sync::{Arc, Mutex}};
use std::{fs::File, io::Write, sync::{Arc, Mutex}};
use board::Board;
use ruleset::Ruleset;
@ -16,28 +16,7 @@ mod zobrist;
fn main() {
/*
let mut rng = PicoRng::srand(0x20000);
for _ in 0..10 {
println!("{}", rng.rnd(0x10000));
}
return;
*/
/*
let ruleset = Ruleset {
n_slots: 11,
n_suits: 5,
n_cards_per_suit: 10,
n_arcana: 25
};
*/
let ruleset = Ruleset {
n_slots: 11,
n_suits: 4,
n_cards_per_suit: 13,
n_arcana: 22
};
/*
let filename = "level_1.txt";
let ruleset = Ruleset {
n_slots: 5,
n_suits: 1,
@ -46,6 +25,16 @@ fn main() {
};
*/
/*
let filename = "level_2.txt";
let ruleset = Ruleset {
n_slots: 5,
n_suits: 2,
n_cards_per_suit: 9,
n_arcana: 0
};
*/
/*
let filename = "level_3.txt";
let ruleset = Ruleset {
n_slots: 7,
n_suits: 2,
@ -54,37 +43,61 @@ fn main() {
};
*/
/*
let filename = "level_4.txt";
let ruleset = Ruleset {
n_slots: 9,
n_suits: 3,
n_cards_per_suit: 9,
n_arcana: 16
};
*/
/*
let filename = "level_5.txt";
let ruleset = Ruleset {
n_slots: 9,
n_suits: 3,
n_cards_per_suit: 11,
n_arcana: 18
};
*/
/*
let filename = "fortunes_foundation.txt";
let ruleset = Ruleset {
n_slots: 11,
n_suits: 4,
n_cards_per_suit: 13,
n_arcana: 22
};
*/
let filename = "level_7.txt";
let ruleset = Ruleset {
n_slots: 11,
n_suits: 5,
n_cards_per_suit: 10,
n_arcana: 25
};
let setup = ruleset.compile().expect("compilation should succeed");
/*
for _ in 0..10000 {
Deal::deal(&setup, &mut rand::thread_rng());
}
*/
const THREADS: usize = 28;
let winnable_seeds_file = Arc::new(Mutex::new(File::create("winnable_seeds_multithreaded.txt").expect("should be able to create")));
let work_source: WorkSource = WorkSource::new(0);
let winnable_seeds_file = Arc::new(Mutex::new(File::create(filename).expect("should be able to create")));
let mut threads = Vec::new();
for i in 0..THREADS {
for _ in 0..THREADS {
let setup2 = setup.clone();
let source = work_source.clone();
let wsf = winnable_seeds_file.clone();
threads.push(std::thread::spawn(move || {
winnable_seeds_thread(
&setup2,
source,
|seed| {
let mut f = wsf.lock().expect("must be able to lock");
write!(f, "{}\n", seed).expect("write should succeed");
f.flush().expect("flush should succeed");
},
i as u32,
THREADS as u32
);
}));
}
@ -95,11 +108,31 @@ fn main() {
}
fn winnable_seeds_thread(setup: &ruleset::Setup, mut cb: impl FnMut(u32), start: u32, step: u32) {
#[derive(Clone)]
struct WorkSource {
seed: Arc<Mutex<Option<u32>>>
}
impl WorkSource {
fn new(seed: u32) -> Self {
return WorkSource { seed: Arc::new(Mutex::new(Some(seed))) }
}
fn take(&self) -> Option<u32> {
let mut self_seed = self.seed.lock().expect("shouldn't have panicked");
if let Some(seed) = *self_seed {
*self_seed = seed.checked_add(1);
return Some(seed);
}
return None
}
}
fn winnable_seeds_thread(setup: &ruleset::Setup, source: WorkSource, mut cb: impl FnMut(u32)) {
let mut winnable = 0;
let mut total = 0;
for seed in (start..0xffffffff).step_by(step as usize) {
while let Some(seed) = source.take() {
let mut board = Board::new(&setup);
board.deal(Deal::deal(&setup, seed));
board.display();

View File

@ -10832,3 +10832,109 @@
85247
92829
91669
97597
85443
84931
91729
88458
92969
95686
86653
88570
86989
79762
87578
90767
89826
86559
90667
89319
89598
85609
89626
89416
88794
90134
87662
97716
91243
92688
86171
96000
93473
79902
86671
87690
97877
86923
89767
86057
93557
92638
90891
90919
89823
90883
89822
89878
92881
84476
92722
92513
92716
84588
94005
98017
89836
90088
94145
90172
90995
92597
97884
90312
80182
88850
80294
81556
84840
96140
91753
80434
90974
91087
91809
94453
98024
87129
81948
82004
91271
86197
91311
90718
85323
87157
92793
92905
91977
94789
94817
85407
96224
98248
91479
88082
85631
91535
91591
85064
82200
98500
89102
98640
80518
82312
82480
89158
96308

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff