1#![allow(clippy::type_complexity)]
8#![allow(unused_variables)]
9#![allow(clippy::large_types_passed_by_value)]
11
12use super::helpers::*;
13use crate::dag::{DagArmSeed, DagBuilder};
14use crate::pipeline::PipelineBuilder;
15use crate::{Handler, IntoHandler, World};
16
17#[inline(never)]
22pub fn stress_pipe_30_steps(world: &mut World, input: u64) -> u64 {
23 let reg = world.registry();
24 let mut p = PipelineBuilder::<u64>::new()
25 .then(add_one, ®)
26 .then(double, ®)
27 .then(add_three, ®)
28 .then(square, ®)
29 .then(sub_ten, ®)
30 .then(shr_one, ®)
31 .then(xor_mask, ®)
32 .then(add_seven, ®)
33 .then(triple, ®)
34 .then(add_forty_two, ®)
35 .then(add_one, ®)
37 .then(double, ®)
38 .then(add_three, ®)
39 .then(square, ®)
40 .then(sub_ten, ®)
41 .then(shr_one, ®)
42 .then(xor_mask, ®)
43 .then(add_seven, ®)
44 .then(triple, ®)
45 .then(add_forty_two, ®)
46 .then(add_one, ®)
48 .then(double, ®)
49 .then(add_three, ®)
50 .then(square, ®)
51 .then(sub_ten, ®)
52 .then(shr_one, ®)
53 .then(xor_mask, ®)
54 .then(add_seven, ®)
55 .then(triple, ®)
56 .then(add_forty_two, ®);
57 p.run(world, input)
58}
59
60#[inline(never)]
65pub fn stress_pipe_50_steps(world: &mut World, input: u64) -> u64 {
66 let reg = world.registry();
67 let mut p = PipelineBuilder::<u64>::new()
68 .then(add_one, ®)
69 .then(double, ®)
70 .then(add_three, ®)
71 .then(square, ®)
72 .then(sub_ten, ®)
73 .then(shr_one, ®)
74 .then(xor_mask, ®)
75 .then(add_seven, ®)
76 .then(triple, ®)
77 .then(add_forty_two, ®)
78 .then(add_one, ®)
80 .then(double, ®)
81 .then(add_three, ®)
82 .then(square, ®)
83 .then(sub_ten, ®)
84 .then(shr_one, ®)
85 .then(xor_mask, ®)
86 .then(add_seven, ®)
87 .then(triple, ®)
88 .then(add_forty_two, ®)
89 .then(add_one, ®)
91 .then(double, ®)
92 .then(add_three, ®)
93 .then(square, ®)
94 .then(sub_ten, ®)
95 .then(shr_one, ®)
96 .then(xor_mask, ®)
97 .then(add_seven, ®)
98 .then(triple, ®)
99 .then(add_forty_two, ®)
100 .then(add_one, ®)
102 .then(double, ®)
103 .then(add_three, ®)
104 .then(square, ®)
105 .then(sub_ten, ®)
106 .then(shr_one, ®)
107 .then(xor_mask, ®)
108 .then(add_seven, ®)
109 .then(triple, ®)
110 .then(add_forty_two, ®)
111 .then(add_one, ®)
113 .then(double, ®)
114 .then(add_three, ®)
115 .then(square, ®)
116 .then(sub_ten, ®)
117 .then(shr_one, ®)
118 .then(xor_mask, ®)
119 .then(add_seven, ®)
120 .then(triple, ®)
121 .then(add_forty_two, ®);
122 p.run(world, input)
123}
124
125#[inline(never)]
130pub fn stress_pipe_all_combinators(world: &mut World, input: u64) -> u64 {
131 let reg = world.registry();
132
133 fn log_error(_err: u32) {}
134
135 let tee_side = DagArmSeed::<u64>::new().then(ref_consume, ®);
136
137 let on_true = PipelineBuilder::<u64>::new().then(double, ®);
138 let on_false = PipelineBuilder::<u64>::new().then(add_one, ®);
139
140 let mut p = PipelineBuilder::<u64>::new()
141 .then(add_one, ®) .tap(|_x: &u64| {}, ®) .tee(tee_side) .guard(|x: &u64| *x > 0, ®) .filter(|x: &u64| *x < 10000, ®) .inspect(|_x: &u64| {}, ®) .on_none(|| {}, ®) .ok_or(0u32) .map(double, ®) .inspect(|_x: &u64| {}, ®) .inspect_err(|_e: &u32| {}, ®) .map_err(|e: u32| e, ®) .catch(log_error, ®) .unwrap_or(0) .then(add_three, ®) .then(is_even, ®) .and(|| true, ®) .or(|| false, ®) .not() .xor(|| true, ®) .then(|b: bool| if b { 100u64 } else { 0u64 }, ®) .route(|x: &u64| *x > 50, ®, on_true, on_false); p.run(world, input)
164}
165
166#[inline(never)]
171pub fn stress_pipe_transition_chain(world: &mut World, input: u64) -> u64 {
172 let reg = world.registry();
173
174 fn log_error(_err: u32) {}
175
176 let mut p = PipelineBuilder::<u64>::new()
178 .then(|x: u64| x, ®)
179 .guard(|x: &u64| *x > 0, ®)
181 .ok_or(0u32)
182 .catch(log_error, ®)
183 .unwrap_or(0)
184 .guard(|x: &u64| *x > 0, ®)
186 .ok_or(0u32)
187 .catch(log_error, ®)
188 .unwrap_or(0)
189 .then(add_one, ®);
190 p.run(world, input)
191}
192
193#[inline(never)]
198pub fn stress_pipe_route_4_deep(world: &mut World, input: u64) -> u64 {
199 let reg = world.registry();
200
201 let l1 = PipelineBuilder::<u64>::new().then(add_one, ®);
203 let l2 = PipelineBuilder::<u64>::new().then(double, ®);
204 let l3 = PipelineBuilder::<u64>::new().then(add_three, ®);
205 let l4 = PipelineBuilder::<u64>::new().then(triple, ®);
206 let l5 = PipelineBuilder::<u64>::new().then(add_seven, ®);
207 let l6 = PipelineBuilder::<u64>::new().then(square, ®);
208 let l7 = PipelineBuilder::<u64>::new().then(sub_ten, ®);
209 let l8 = PipelineBuilder::<u64>::new().then(shr_one, ®);
210
211 let r3a =
213 PipelineBuilder::<u64>::new()
214 .then(|x: u64| x, ®)
215 .route(|x: &u64| *x > 10, ®, l1, l2);
216 let r3b =
217 PipelineBuilder::<u64>::new()
218 .then(|x: u64| x, ®)
219 .route(|x: &u64| *x > 20, ®, l3, l4);
220 let r3c =
221 PipelineBuilder::<u64>::new()
222 .then(|x: u64| x, ®)
223 .route(|x: &u64| *x > 30, ®, l5, l6);
224 let r3d =
225 PipelineBuilder::<u64>::new()
226 .then(|x: u64| x, ®)
227 .route(|x: &u64| *x > 40, ®, l7, l8);
228
229 let r2a = PipelineBuilder::<u64>::new().then(|x: u64| x, ®).route(
231 |x: &u64| *x > 50,
232 ®,
233 r3a,
234 r3b,
235 );
236 let r2b = PipelineBuilder::<u64>::new().then(|x: u64| x, ®).route(
237 |x: &u64| *x > 60,
238 ®,
239 r3c,
240 r3d,
241 );
242
243 let mut p = PipelineBuilder::<u64>::new().then(|x: u64| x, ®).route(
245 |x: &u64| *x > 100,
246 ®,
247 r2a,
248 r2b,
249 );
250 p.run(world, input)
251}
252
253#[inline(never)]
258pub fn stress_dag_fork_route_mix(world: &mut World, input: u64) {
259 let reg = world.registry();
260
261 let on_true = DagArmSeed::<u64>::new().then(ref_double, ®);
262 let on_false = DagArmSeed::<u64>::new().then(ref_triple, ®);
263
264 let mut d = DagBuilder::<u64>::new()
265 .root(add_one, ®)
266 .fork()
267 .arm(|a| {
268 a.then(ref_add_one, ®)
269 .route(|x: &u64| *x > 50, ®, on_true, on_false)
270 })
271 .arm(|a| a.then(ref_add_seven, ®))
272 .arm(|a| a.then(ref_square, ®))
273 .merge(merge_3, ®)
274 .then(ref_consume, ®)
275 .build();
276 d.run(world, input);
277}
278
279#[inline(never)]
284pub fn stress_batch_pipe_30_steps(world: &mut World) {
285 let reg = world.registry();
286 let mut bp = PipelineBuilder::<u64>::new()
287 .then(add_one, ®)
288 .then(double, ®)
289 .then(add_three, ®)
290 .then(square, ®)
291 .then(sub_ten, ®)
292 .then(shr_one, ®)
293 .then(xor_mask, ®)
294 .then(add_seven, ®)
295 .then(triple, ®)
296 .then(add_forty_two, ®)
297 .then(add_one, ®)
298 .then(double, ®)
299 .then(add_three, ®)
300 .then(square, ®)
301 .then(sub_ten, ®)
302 .then(shr_one, ®)
303 .then(xor_mask, ®)
304 .then(add_seven, ®)
305 .then(triple, ®)
306 .then(add_forty_two, ®)
307 .then(add_one, ®)
308 .then(double, ®)
309 .then(add_three, ®)
310 .then(square, ®)
311 .then(sub_ten, ®)
312 .then(shr_one, ®)
313 .then(xor_mask, ®)
314 .then(add_seven, ®)
315 .then(triple, ®)
316 .then(add_forty_two, ®)
317 .then(consume_val, ®)
318 .build_batch(64);
319 bp.input_mut().extend(0..64);
320 bp.run(world);
321}
322
323#[inline(never)]
328pub fn stress_batch_dag_nested(world: &mut World) {
329 let reg = world.registry();
330 let mut bd = DagBuilder::<u64>::new()
331 .root(add_one, ®)
332 .fork()
333 .arm(|a| {
334 a.then(ref_double, ®)
335 .fork()
336 .arm(|b| b.then(ref_add_one, ®))
337 .arm(|b| b.then(ref_triple, ®))
338 .merge(merge_add, ®)
339 })
340 .arm(|a| a.then(ref_add_seven, ®))
341 .merge(merge_add, ®)
342 .then(ref_consume, ®)
343 .build_batch(64);
344 bd.input_mut().extend(0..64);
345 bd.run(world);
346}
347
348#[inline(never)]
353pub fn stress_pipe_large_type(world: &mut World, input: u64) -> [u8; 4096] {
354 fn make_large(x: u64) -> [u8; 4096] {
355 let mut arr = [0u8; 4096];
356 arr[0] = x as u8;
357 arr
358 }
359
360 fn touch_large(x: [u8; 4096]) -> [u8; 4096] {
361 let mut out = x;
362 out[1] = out[0].wrapping_add(1);
363 out
364 }
365
366 let reg = world.registry();
367 let mut p = PipelineBuilder::<u64>::new()
368 .then(make_large, ®)
369 .then(touch_large, ®)
370 .then(touch_large, ®);
371 p.run(world, input)
372}
373
374#[inline(never)]
379pub fn stress_pipe_many_closures(world: &mut World, input: u64) -> u64 {
380 let reg = world.registry();
381 let mut p = PipelineBuilder::<u64>::new()
382 .then(|x: u64| x, ®)
383 .guard(|x: &u64| *x > 0, ®)
384 .filter(|x: &u64| *x < 10000, ®)
385 .filter(|x: &u64| *x > 5, ®)
386 .inspect(|_x: &u64| {}, ®)
387 .on_none(|| {}, ®)
388 .map(double, ®)
389 .filter(|x: &u64| *x < 50000, ®)
390 .filter(|x: &u64| *x > 1, ®)
391 .inspect(|_x: &u64| {}, ®)
392 .unwrap_or_else(|| 0, ®)
393 .then(add_one, ®);
394 p.run(world, input)
395}
396
397#[inline(never)]
402pub fn stress_dag_wide_fork(world: &mut World, input: u64) {
403 let reg = world.registry();
404 let mut d = DagBuilder::<u64>::new()
405 .root(add_one, ®)
406 .fork()
407 .arm(|a| {
408 a.then(ref_double, ®)
409 .fork()
410 .arm(|b| b.then(ref_add_one, ®))
411 .arm(|b| b.then(ref_triple, ®))
412 .arm(|b| b.then(ref_add_seven, ®))
413 .arm(|b| b.then(ref_xor_mask, ®))
414 .merge(merge_4, ®)
415 })
416 .arm(|a| {
417 a.then(ref_triple, ®)
418 .fork()
419 .arm(|b| b.then(ref_square, ®))
420 .arm(|b| b.then(ref_shr_one, ®))
421 .arm(|b| b.then(ref_sub_ten, ®))
422 .arm(|b| b.then(ref_add_forty_two, ®))
423 .merge(merge_4, ®)
424 })
425 .arm(|a| {
426 a.then(ref_add_seven, ®)
427 .fork()
428 .arm(|b| b.then(ref_double, ®))
429 .arm(|b| b.then(ref_add_three, ®))
430 .arm(|b| b.then(ref_triple, ®))
431 .arm(|b| b.then(ref_add_one, ®))
432 .merge(merge_4, ®)
433 })
434 .arm(|a| {
435 a.then(ref_xor_mask, ®)
436 .fork()
437 .arm(|b| b.then(ref_shr_one, ®))
438 .arm(|b| b.then(ref_sub_ten, ®))
439 .arm(|b| b.then(ref_square, ®))
440 .arm(|b| b.then(ref_add_forty_two, ®))
441 .merge(merge_4, ®)
442 })
443 .merge(merge_4, ®)
444 .then(ref_consume, ®)
445 .build();
446 d.run(world, input);
447}
448
449#[inline(never)]
454pub fn stress_pipe_splat_chain(world: &mut World, input: u64) -> u64 {
455 let reg = world.registry();
456 let mut p = PipelineBuilder::<u64>::new()
458 .then(split_u64, ®)
459 .splat()
460 .then(splat_add, ®)
461 .then(split_u64, ®)
462 .splat()
463 .then(splat_add, ®);
464 p.run(world, input)
465}
466
467#[inline(never)]
472pub fn stress_pipe_dedup_in_batch(world: &mut World) {
473 let reg = world.registry();
474 let mut bp = PipelineBuilder::<u64>::new()
475 .then(add_one, ®)
476 .dedup()
477 .map(double, ®)
478 .unwrap_or(0)
479 .then(consume_val, ®)
480 .build_batch(64);
481 bp.input_mut().extend(0..64);
482 bp.run(world);
483}
484
485#[inline(never)]
490pub fn stress_pipe_tee_in_route(world: &mut World, input: u64) -> u64 {
491 let reg = world.registry();
492
493 let tee_side = DagArmSeed::<u64>::new()
494 .then(ref_add_one, ®)
495 .then(ref_double, ®)
496 .then(ref_consume, ®);
497
498 let arm_t = PipelineBuilder::<u64>::new()
499 .then(double, ®)
500 .tee(tee_side)
501 .then(add_three, ®);
502
503 let arm_f = PipelineBuilder::<u64>::new().then(add_one, ®);
504
505 let mut p = PipelineBuilder::<u64>::new().then(|x: u64| x, ®).route(
506 |x: &u64| *x > 100,
507 ®,
508 arm_t,
509 arm_f,
510 );
511 p.run(world, input)
512}
513
514#[inline(never)]
519pub fn stress_mixed_everything(world: &mut World, input: u64) {
520 let reg = world.registry();
521
522 fn log_error(_err: u32) {}
523
524 let tee_side = DagArmSeed::<u64>::new().then(ref_consume, ®);
525
526 let on_true = PipelineBuilder::<u64>::new().then(double, ®);
527 let on_false = PipelineBuilder::<u64>::new().then(add_one, ®);
528
529 let handler = consume_val.into_handler(®);
530
531 let mut p = PipelineBuilder::<u64>::new()
532 .then(add_one, ®)
533 .tap(|_x: &u64| {}, ®)
534 .tee(tee_side)
535 .guard(|x: &u64| *x > 0, ®)
536 .map(double, ®)
537 .filter(|x: &u64| *x < 100_000, ®)
538 .ok_or(0u32)
539 .map(add_three, ®)
540 .catch(log_error, ®)
541 .unwrap_or(0)
542 .route(|x: &u64| *x > 50, ®, on_true, on_false)
543 .then(split_u64, ®)
544 .splat()
545 .then(splat_add, ®)
546 .dispatch(handler);
547 p.run(world, input);
548}