@@ -2,16 +2,15 @@ use std::time::Duration;
2
2
3
3
use criterion:: { criterion_group, criterion_main, BenchmarkId , Criterion , Throughput } ;
4
4
use lazy_static:: lazy_static;
5
- use rustc_hash :: FxHashSet ;
5
+ use rand_pcg :: Pcg64Mcg ;
6
6
use smallvec:: smallvec;
7
- use wotw_seedgen:: { item_pool:: ItemPool , Player , UberStates , World } ;
7
+ use wotw_seedgen:: { item_pool:: ItemPool , UberStates , World } ;
8
8
use wotw_seedgen_assets:: { PresetAccess , WorldPreset , WorldPresetSettings } ;
9
9
use wotw_seedgen_data:: Skill ;
10
10
use wotw_seedgen_logic_language:: {
11
11
ast:: { parse, Areas } ,
12
12
output:: { Enemy , Graph , Requirement } ,
13
13
} ;
14
- use wotw_seedgen_seed_language:: output:: IntermediateOutput ;
15
14
use wotw_seedgen_settings:: { Difficulty , Spawn , UniverseSettings , WorldSettings , DEFAULT_SPAWN } ;
16
15
use wotw_seedgen_static_assets:: {
17
16
LOC_DATA , PRESET_ACCESS , SNIPPET_ACCESS , STATE_DATA , UBER_STATE_DATA ,
@@ -45,101 +44,111 @@ fn requirements(c: &mut Criterion) {
45
44
difficulty : Difficulty :: Unsafe ,
46
45
..WorldSettings :: default ( )
47
46
} ;
48
- let mut player = Player :: new ( & world_settings) ;
49
- let states = FxHashSet :: default ( ) ;
47
+ let graph = compile_graph ( & [ ] ) ;
48
+ let spawn = graph. find_node ( DEFAULT_SPAWN ) . unwrap ( ) ;
49
+ let uber_states = UberStates :: new ( & * UBER_STATE_DATA ) ;
50
+ let mut world = World :: new ( & graph, spawn, & world_settings, uber_states) ;
50
51
51
52
let req_a = Requirement :: EnergySkill ( Skill :: Blaze , 2.0 ) ;
52
53
let req_b = Requirement :: Damage ( 20.0 ) ;
53
54
let req_c = Requirement :: EnergySkill ( Skill :: Blaze , 1.0 ) ;
54
55
let req_d = Requirement :: Damage ( 10.0 ) ;
55
- player . inventory . skills . insert ( Skill :: Blaze ) ;
56
- player . inventory . health += 20 ;
57
- player . inventory . energy += 2. ;
56
+ world . set_skill ( Skill :: Blaze , true , & [ ] ) ;
57
+ world . modify_max_health ( 20 , & [ ] ) ;
58
+ world . modify_max_energy ( ( 2. ) . into ( ) , & [ ] ) ;
58
59
let requirement = Requirement :: And ( vec ! [
59
60
Requirement :: Or ( vec![ req_a. clone( ) , req_d. clone( ) ] ) ,
60
61
Requirement :: Or ( vec![ req_b. clone( ) , req_c. clone( ) ] ) ,
61
62
Requirement :: Or ( vec![ req_a. clone( ) , req_d. clone( ) ] ) ,
62
63
Requirement :: Or ( vec![ req_b. clone( ) , req_c. clone( ) ] ) ,
63
64
] ) ;
64
65
group. bench_function ( "nesting" , |b| {
65
- b. iter ( || player . is_met ( & requirement, & states , smallvec ! [ player . max_orbs( ) ] ) )
66
+ b. iter ( || world . is_met ( & requirement, & mut smallvec ! [ world . max_orbs( ) ] ) )
66
67
} ) ;
67
68
68
- player . inventory . skills . insert ( Skill :: Bow ) ;
69
- player . inventory . energy += 10. ;
69
+ world . set_skill ( Skill :: Bow , true , & [ ] ) ;
70
+ world . modify_max_energy ( ( 10. ) . into ( ) , & [ ] ) ;
70
71
let requirement = Requirement :: Combat ( smallvec ! [ ( Enemy :: Lizard , 3 ) , ] ) ;
71
72
group. bench_function ( "short_combat" , |b| {
72
- b. iter ( || player. is_met ( & requirement, & states, smallvec ! [ player. max_orbs( ) ] ) )
73
- } ) ;
74
- let requirement = Requirement :: And ( vec ! [
75
- Requirement :: Combat ( smallvec![
76
- ( Enemy :: Mantis , 2 ) ,
77
- ( Enemy :: Lizard , 2 ) ,
78
- ( Enemy :: EnergyRefill , 4 ) ,
79
- ( Enemy :: SneezeSlug , 2 ) ,
80
- ( Enemy :: Mantis , 1 ) ,
81
- ( Enemy :: Skeeto , 1 ) ,
82
- ( Enemy :: EnergyRefill , 4 ) ,
83
- ( Enemy :: SmallSkeeto , 7 ) ,
84
- ( Enemy :: Skeeto , 2 ) ,
85
- ( Enemy :: EnergyRefill , 4 ) ,
86
- ( Enemy :: Lizard , 2 ) ,
87
- ( Enemy :: Mantis , 2 ) ,
88
- ] ) ,
89
- Requirement :: Damage ( 50.0 ) ,
90
- ] ) ;
91
- player. inventory . clear ( ) ;
92
- group. bench_function ( "long_combat_progression" , |b| {
93
- b. iter ( || {
94
- player. solutions (
95
- & requirement,
96
- & states,
97
- smallvec ! [ player. max_orbs( ) ] ,
98
- 1000 ,
99
- 1000 ,
100
- )
101
- } )
73
+ b. iter ( || world. is_met ( & requirement, & mut smallvec ! [ world. max_orbs( ) ] ) )
102
74
} ) ;
103
75
76
+ // TODO reenable if this concept is added again
77
+ // let requirement = Requirement::And(vec![
78
+ // Requirement::Combat(smallvec![
79
+ // (Enemy::Mantis, 2),
80
+ // (Enemy::Lizard, 2),
81
+ // (Enemy::EnergyRefill, 4),
82
+ // (Enemy::SneezeSlug, 2),
83
+ // (Enemy::Mantis, 1),
84
+ // (Enemy::Skeeto, 1),
85
+ // (Enemy::EnergyRefill, 4),
86
+ // (Enemy::SmallSkeeto, 7),
87
+ // (Enemy::Skeeto, 2),
88
+ // (Enemy::EnergyRefill, 4),
89
+ // (Enemy::Lizard, 2),
90
+ // (Enemy::Mantis, 2),
91
+ // ]),
92
+ // Requirement::Damage(50.0),
93
+ // ]);
94
+ // player.inventory.clear();
95
+ // group.bench_function("long_combat_progression", |b| {
96
+ // b.iter(|| {
97
+ // player.solutions(
98
+ // &requirement,
99
+ // &states,
100
+ // smallvec![player.max_orbs()],
101
+ // 1000,
102
+ // 1000,
103
+ // )
104
+ // })
105
+ // });
106
+
104
107
group. finish ( ) ;
105
108
}
106
109
107
110
fn reach_checking ( c : & mut Criterion ) {
108
111
let mut group = c. benchmark_group ( "reach_check" ) ;
109
112
110
- let graph = Graph :: compile ( AREAS . clone ( ) , LOC_DATA . clone ( ) , STATE_DATA . clone ( ) , & [ ] )
111
- . into_result ( )
112
- . unwrap ( ) ;
113
+ let graph = compile_graph ( & [ ] ) ;
113
114
let uber_states = UberStates :: new ( & UBER_STATE_DATA ) ;
115
+ let world_settings = WorldSettings :: default ( ) ;
116
+ let spawn = graph. find_node ( DEFAULT_SPAWN ) . unwrap ( ) ;
117
+ let world = World :: new ( & graph, spawn, & world_settings, uber_states. clone ( ) ) ;
114
118
115
119
group. bench_function ( "short" , |b| {
116
120
b. iter ( || {
117
- let output = IntermediateOutput :: default ( ) ;
118
- let world_settings = WorldSettings :: default ( ) ;
119
- let spawn = graph. find_node ( DEFAULT_SPAWN ) . unwrap ( ) ;
120
- let mut world = World :: new ( & graph, spawn, & world_settings, uber_states. clone ( ) ) ;
121
- world. set_spirit_light ( 10000 , & output) ;
122
- world. set_max_health ( 200 , & output) ;
123
- world. set_max_energy ( 20.0 . into ( ) , & output) ;
124
- world. set_keystones ( 34 , & output) ;
125
- world. set_gorlek_ore ( 40 , & output) ;
126
- world. set_shard_slots ( 8 , & output) ;
127
- world. set_skill ( Skill :: Sword , true , & output) ;
128
- world. set_skill ( Skill :: DoubleJump , true , & output) ;
129
- world. set_skill ( Skill :: Dash , true , & output) ;
130
- world. reached ( )
121
+ let mut world = world. clone ( ) ;
122
+ world. traverse_spawn ( & [ ] ) ;
123
+ world. set_spirit_light ( 10000 , & [ ] ) ;
124
+ world. set_max_health ( 200 , & [ ] ) ;
125
+ world. set_max_energy ( 20.0 . into ( ) , & [ ] ) ;
126
+ world. set_keystones ( 34 , & [ ] ) ;
127
+ world. set_gorlek_ore ( 40 , & [ ] ) ;
128
+ world. set_shard_slots ( 8 , & [ ] ) ;
129
+ world. set_skill ( Skill :: Sword , true , & [ ] ) ;
130
+ world. set_skill ( Skill :: DoubleJump , true , & [ ] ) ;
131
+ world. set_skill ( Skill :: Dash , true , & [ ] ) ;
132
+ world. reached_nodes ( ) . for_each ( drop) ;
131
133
} )
132
134
} ) ;
133
- let output = IntermediateOutput :: default ( ) ;
135
+
134
136
let world_settings = WorldSettings :: default ( ) ;
135
137
let spawn = graph. find_node ( DEFAULT_SPAWN ) . unwrap ( ) ;
136
138
let uber_states = UberStates :: new ( & UBER_STATE_DATA ) ;
137
- let mut world = World :: new_spawn ( & graph, spawn, & world_settings, uber_states) ;
138
- let mut pool = ItemPool :: default ( ) ;
139
- for item in pool. drain ( ) {
140
- world. simulate ( & item, & output) ;
141
- }
142
- group. bench_function ( "long" , |b| b. iter ( || world. reached ( ) ) ) ;
139
+ let world = World :: new ( & graph, spawn, & world_settings, uber_states) ;
140
+ let mut pool = ItemPool :: new ( & mut Pcg64Mcg :: new ( 0 ) ) ;
141
+
142
+ group. bench_function ( "long" , |b| {
143
+ b. iter ( || {
144
+ let mut world = world. clone ( ) ;
145
+ world. traverse_spawn ( & [ ] ) ;
146
+ for item in pool. drain ( ..) {
147
+ world. simulate ( & item, & [ ] ) ;
148
+ }
149
+ world. reached_nodes ( ) . for_each ( drop) ;
150
+ } )
151
+ } ) ;
143
152
}
144
153
145
154
fn generation ( c : & mut Criterion ) {
@@ -148,14 +157,7 @@ fn generation(c: &mut Criterion) {
148
157
149
158
let mut universe_settings = UniverseSettings :: new ( String :: default ( ) ) ;
150
159
let mut seed = 0 ..;
151
- let graph = Graph :: compile (
152
- AREAS . clone ( ) ,
153
- LOC_DATA . clone ( ) ,
154
- STATE_DATA . clone ( ) ,
155
- & universe_settings. world_settings ,
156
- )
157
- . into_result ( )
158
- . unwrap ( ) ;
160
+ let graph = compile_graph ( & universe_settings. world_settings ) ;
159
161
let snippet_access = & * SNIPPET_ACCESS ;
160
162
let uber_state_data = & * UBER_STATE_DATA ;
161
163
@@ -212,14 +214,7 @@ fn generation(c: &mut Criterion) {
212
214
preset
213
215
. apply ( & mut universe_settings. world_settings [ 0 ] , & * PRESET_ACCESS )
214
216
. unwrap ( ) ;
215
- let graph = Graph :: compile (
216
- AREAS . clone ( ) ,
217
- LOC_DATA . clone ( ) ,
218
- STATE_DATA . clone ( ) ,
219
- & universe_settings. world_settings ,
220
- )
221
- . into_result ( )
222
- . unwrap ( ) ;
217
+ let graph = compile_graph ( & universe_settings. world_settings ) ;
223
218
group. bench_function ( "unsafe" , |b| {
224
219
b. iter ( || {
225
220
universe_settings. seed = seed. next ( ) . unwrap ( ) . to_string ( ) ;
@@ -245,14 +240,7 @@ fn multiworld(c: &mut Criterion) {
245
240
preset
246
241
. apply ( & mut universe_settings. world_settings [ 0 ] , & * PRESET_ACCESS )
247
242
. unwrap ( ) ;
248
- let graph = Graph :: compile (
249
- AREAS . clone ( ) ,
250
- LOC_DATA . clone ( ) ,
251
- STATE_DATA . clone ( ) ,
252
- & universe_settings. world_settings ,
253
- )
254
- . into_result ( )
255
- . unwrap ( ) ;
243
+ let graph = compile_graph ( & universe_settings. world_settings ) ;
256
244
257
245
let snippet_access = & * SNIPPET_ACCESS ;
258
246
let uber_state_data = & * UBER_STATE_DATA ;
@@ -281,6 +269,17 @@ fn multiworld(c: &mut Criterion) {
281
269
group. finish ( ) ;
282
270
}
283
271
272
+ fn compile_graph ( settings : & [ WorldSettings ] ) -> Graph {
273
+ Graph :: compile (
274
+ AREAS . clone ( ) ,
275
+ LOC_DATA . clone ( ) ,
276
+ STATE_DATA . clone ( ) ,
277
+ settings,
278
+ )
279
+ . into_result ( )
280
+ . unwrap ( )
281
+ }
282
+
284
283
criterion_group ! (
285
284
all,
286
285
logic_parsing,
0 commit comments