diff --git a/.gitignore b/.gitignore index ec6d49b..6e18fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.mp4 +*.DS_Store # Files generated by invoking Julia with --code-coverage *.jl.cov diff --git a/Project.toml b/Project.toml index 524e7fe..d39cbc9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "MixedComplementarityProblems" uuid = "6c9e26cb-9263-41b8-a6c6-f4ca104ccdcd" -version = "0.2.3" +version = "0.2.4" authors = ["David Fridovich-Keil "] [deps] diff --git a/README.md b/README.md index 98616b8..66d4dae 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,16 @@ This package provides an easily-customizable interface for expressing mixed comp As of `v0.2.2`, `MixedComplementarityProblems.jl` implements CPU multithreading and GPU-parallelized solvers as well, enabled via `KernelAbstractions.jl`. Check out the benchmarking README [here](https://github.com/CLeARoboticsLab/MixedComplementarityProblems.jl/blob/main/benchmark/README.md) for more details. +If you find this project useful in your work, please cite the accompanying [paper](https://arxiv.org/pdf/2608.00959): +``` +@article{fridovich2026mcps, + title={MixedComplementarityProblems.jl: A Fast, Batched, Open-Source Interior Point Solver for Mixed Complementarity Problems}, + author={David Fridovich-Keil}, + year={2026}, + journal={arXiv preprint arXiv:2608.00959} +} +``` + ## What are MCPs? Mixed complementarity problems (MCPs) are a class of mathematical program, and they arise in a wide variety of application problems. In particular, one way they can arise is via the KKT conditions of nonlinear programs and noncooperative games. This package provides a utility for constructing MCPs from (parameterized) games, cf. `src/game.jl` for further details. To see the connection between KKT conditions and MCPs, read the next section. @@ -214,12 +224,17 @@ The returned `x`, `y`, `s` live on the GPU (as `CuArray`s); bring them back with > pattern the benchmarks use. `Adapt` is not a dependency of this package, so you would need > to add it to your own project (`] add Adapt`). -> **Performance status (as of `v0.2.3`).** GPU now beats a many-threaded CPU run by a -> consistent 2.5-2.8x on large-enough batched problems (e.g. the trajectory game once -> `horizon ≳ 30`), though CPU remains faster or roughly at parity for smaller -> per-instance problems — both handily beat PATH regardless. See the [benchmarking +> **Performance status.** Both batched backends clear a batch far faster than sequential +> `PATH` (the trajectory game runs ~60–90× faster on the multithreaded CPU, ~20–55× on the +> GPU). Between the two backends the story is regime-dependent: the GPU wins end-to-end only +> on large *dense* per-instance systems (e.g. randomly generated QPs with ≳128 primal +> variables, 2–3×) or large batches of them, while the **CPU is faster on the trajectory +> game** at all tested horizons. The GPU's batched sparse factorization does become cheaper +> *per instance* than threaded KLU as the per-instance system grows, but the CPU's active-set +> skip — it factorizes only the still-active instances each Newton step, whereas cuDSS always +> processes the whole batch — keeps the CPU ahead end-to-end on the game. See the [benchmarking > README](https://github.com/CLeARoboticsLab/MixedComplementarityProblems.jl/blob/main/benchmark/README.md) -> and PRs #54/#55 for the full breakdown and up-to-date numbers. +> for the full breakdown and numbers. ## A fancier demo diff --git a/benchmark/Project.toml b/benchmark/Project.toml index 77d5a96..f945763 100644 --- a/benchmark/Project.toml +++ b/benchmark/Project.toml @@ -1,9 +1,14 @@ [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" MixedComplementarityProblems = "6c9e26cb-9263-41b8-a6c6-f4ca104ccdcd" diff --git a/benchmark/README.md b/benchmark/README.md index ded1960..05c37b5 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -115,11 +115,17 @@ julia> data = problem_size_scaling_benchmark(); julia> problem_size_scaling_summary(data) ``` -**Current status (RTX 4090, as of 2026-07-04): GPU beats 32 CPU threads by a consistent -2.5-2.8x on the trajectory game once the per-instance problem is large enough (`horizon -≳ 30`, KKT dimension `d ≳ 2000`); below that, and for small dense QPs at small batch -sizes, CPU is still faster or roughly at parity.** The headline number depends heavily on -*which* regime you're in — see the breakdown below rather than quoting a single ratio. +**Current status (RTX 4090, 32 threads, updated 2026-07-30): the CPU is faster than the GPU +end-to-end on the trajectory game at every tested horizon; the GPU wins end-to-end only on +large *dense* per-instance systems (≳128-primal QPs, 2–3×) or large batches of them.** Both +batched backends clear a batch far faster than sequential `PATH` (game: CPU ~60–90×, GPU +~20–55×). Raw data and analysis scripts are in [`benchmark/results/`](../results/). + +> **Correction.** An earlier version of this section (and PRs #54/#55) claimed the GPU *beats* +> the CPU 2.5–2.8× on the game. That number was the GPU/CPU wall-clock *ratio* with the GPU in +> the numerator — i.e. the GPU is ~2.5× **slower** — mislabeled as GPU-favorable. Re-measured +> here (median-of-N), the raw ratios reproduce, but the direction is the opposite of the old +> headline. - **cuDSS tuning:** `factorization_alg = "algo1"` (set manually in `ext/MixedComplementarityProblemsCUDSSExt.jl`, since `LinearAlgebra.lu()`'s convenience @@ -128,31 +134,27 @@ sizes, CPU is still faster or roughly at parity.** The headline number depends h `algo2`-`algo5` are unsupported or slower; `reordering_alg`/`use_superpanels` don't help. - **Stall detection** (`max_stall_rounds` in `src/batched_solver.jl`) cut wall-clock 2.7-7x on both devices by ending instances that neither converge nor diverge instead of - dragging every solve to `max_outer_iters` — necessary groundwork, but on its own it - *shrank* GPU's apparent advantage rather than growing it (GPU was previously winning - partly by handling wasted iterations better, not via a genuine linear-algebra edge). -- **Why GPU wins at larger `horizon`:** raw per-instance `jacobian!+factorize!` cost - crosses over in GPU's favor right around `d ≈ 3500` (`horizon ≈ 50`) — confirmed by - isolated, apples-to-apples timing at fixed batch size, independent of solved fraction - or iteration count. `outer_iters` stays flat (9-16) across `horizon = 10..100`, so this - is **not** explained by `BatchedInteriorPoint`'s CPU-only active-set skip (which would, - if anything, favor CPU *more* as harder instances drop out early) — it's cuDSS's batched - factorization getting relatively cheaper per instance as the matrix grows, amortizing - its kernel-launch/occupancy overhead better than CPU's per-thread KLU factorization. -- **Trajectory game, with the sampling/warm-start fix above** (`N = 1024`, `height = 50`): - GPU/CPU wall-clock ratio is 2.68x (`horizon=30`), 2.50x (`horizon=50`), 2.48x - (`horizon=70`), 2.81x (`horizon=100`) — consistently GPU-favorable. Solved fraction is - 92% (`horizon=30`), 57% (`horizon=50`), 34-36% (`horizon=70`), 23-25% (`horizon=100`) — - a large improvement over the pre-fix collapse (as low as 0% at `horizon=100`), but still - short of a "realistic, high-confidence" benchmark at `horizon ≳ 50`; further tuning - (larger `lead_offset`/`lead_vy_boost`, or a genuinely better warm start) is still open. -- At `horizon ≤ 20` (small `d`), CPU remains faster (GPU 2-2.5x slower) — GPU only pulls - ahead once there's enough per-instance work to amortize its overhead. -- QP (small, dense, `num_primals = 32, num_inequalities = 16`): GPU/CPU ratio close to - parity (0.5-1.4x) across batch sizes; problem-size sweep (32/64/128 primals) is - non-monotonic (GPU wins at 128 primals, up to 2.9x, but loses at 64, 0.6-0.8x) — - confounded by the random QP generator's solved-fraction changing sharply with - `num_primals` (41% → 96% → 100%), not yet a clean isolated comparison. -- `num_samples = 16384`+ currently OOMs for the trajectory game with an unexplained low - reported memory usage (~10%) at failure — not yet root-caused; dropped from the sweep - for now. + dragging every solve to `max_outer_iters`. +- **The GPU factorization kernel *does* cross over — but end-to-end the CPU still wins.** + Isolated per-call timing (`percall_timing.csv`, all instances active) shows the GPU's + `jacobian!+factorize!` crossing over CPU's around `d ≈ 2500` (jac+fac GPU/CPU 1.92× at + `d=700` → 0.72× at `d=4900`) and `ldiv!` crossing even earlier (~`d≈1800`). But that + per-call number assumes the *whole* batch is factorized every step, which only holds on the + first Newton iteration. The real driver of end-to-end cost is `BatchedInteriorPoint`'s + **active-set skip**: on CPU each Newton step factorizes only the still-active instances + (cost ∝ active count), while cuDSS always factorizes the whole batch (flat cost — `active` + is a no-op on GPU). At `d = 3500` (`active_fraction_T50.csv`) the `jac+fac` GPU/CPU ratio + goes from 0.77× with all 1024 active to 8.1× with only 32 active. Since a real solve's active + set collapses fast as instances sub-converge, the CPU spends most of the solve in the regime + where it dominates. (This reverses the earlier claim here that the active-set skip was *not* + the explanation.) +- **Trajectory game, end-to-end** (`N = 1024`, warm, median-of-5): `horizon=30` CPU 4.15s vs + GPU 8.01s (GPU 1.93× slower); `horizon=50` CPU 12.7s vs GPU 16.3s. Solved fraction (warm) is + 93% (`horizon=30`), 57% (`horizon=50`) — matching earlier runs; cold-start collapses it + (≈17% at `horizon=30`), so cold high-horizon GPU/CPU ratios compare two mostly-failing + backends and aren't meaningful. GPU timings are also higher-variance at large horizon. +- **QP** (`num_primals=32, num_inequalities=16`): the GPU pulls ahead as the batch grows + (GPU/CPU ~0.6× at `N=4096`, i.e. GPU ~1.7× faster), while the CPU is faster at small batch + sizes. Problem-size sweep (32/64/128 primals) is non-monotonic — GPU wins clearly at 128 + primals (2–3×) but loses at 64 — confounded by the QP generator's solved fraction changing + sharply with `num_primals` (41% → 96% → 100%); not a clean isolated comparison. diff --git a/benchmark/batched_benchmark.jl b/benchmark/batched_benchmark.jl index d6780fd..c6d2e3a 100644 --- a/benchmark/batched_benchmark.jl +++ b/benchmark/batched_benchmark.jl @@ -33,6 +33,7 @@ function benchmark_throughput( run_batched = true, run_sequential_ip = true, run_path = true, + use_initial_guess = true, ) @info "Generating random problems..." problem = generate_test_problem(benchmark_type; problem_kwargs...) @@ -121,8 +122,10 @@ function benchmark_throughput( # Per-`benchmark_type` initial guess for the batched solve (e.g. the trajectory # game's zero-input rollout — see `generate_initial_guess` in # `trajectory_game_benchmark.jl`); `nothing` (cold zero start) for benchmark types - # that don't override it, matching prior behavior. - X₀ = run_batched ? + # that don't override it, matching prior behavior. Set `use_initial_guess = false` to + # force the batched solve to cold-start too, matching the (cold) sequential IP and + # PATH baselines for an apples-to-apples comparison. + X₀ = (run_batched && use_initial_guess) ? generate_initial_guess(benchmark_type, batched_mcp, Θ, device; problem_kwargs...) : nothing @@ -144,7 +147,12 @@ function benchmark_throughput( tol, regularize_linear_solve, ) - run_path && ParametricMCPs.solve(path_mcp, θs[1]; warn_on_convergence_failure = false) + run_path && ParametricMCPs.solve( + path_mcp, + θs[1]; + convergence_tolerance = tol, + warn_on_convergence_failure = false, + ) # --- Batched IP: one call over the whole batch, on `device`. --- batched = if run_batched @@ -184,6 +192,7 @@ function benchmark_throughput( ParametricMCPs.solve( path_mcp, θ; + convergence_tolerance = tol, warn_on_convergence_failure = false, ).status == PATHSolver.MCP_Solved end diff --git a/benchmark/path.jl b/benchmark/path.jl index 12009dd..a051f2e 100644 --- a/benchmark/path.jl +++ b/benchmark/path.jl @@ -81,8 +81,16 @@ function benchmark( ip_kwargs..., ) + # Hold PATH to the same convergence tolerance as the IP solver for a fair comparison. + path_tol = get(ip_kwargs, :tol, 1e-6) + @info "Warming up PATH solver..." - ParametricMCPs.solve(path_mcp, first(θs); warn_on_convergence_failure = false) + ParametricMCPs.solve( + path_mcp, + first(θs); + convergence_tolerance = path_tol, + warn_on_convergence_failure = false, + ) # Solve and time. ip_data = @showprogress desc = "Solving IP MCPs..." map(θs) do θ @@ -98,8 +106,12 @@ function benchmark( path_data = @showprogress desc = "Solving PATH MCPs..." map(θs) do θ # Solve and time. - elapsed_time = @elapsed sol = - ParametricMCPs.solve(path_mcp, θ; warn_on_convergence_failure = false) + elapsed_time = @elapsed sol = ParametricMCPs.solve( + path_mcp, + θ; + convergence_tolerance = path_tol, + warn_on_convergence_failure = false, + ) (; elapsed_time, success = sol.status == PATHSolver.MCP_Solved) end diff --git a/benchmark/results/README.md b/benchmark/results/README.md new file mode 100644 index 0000000..fdfdeb6 --- /dev/null +++ b/benchmark/results/README.md @@ -0,0 +1,75 @@ +# Experiments data (technical report §VII) + +Benchmark data behind the Experiments section of `docs/paper/main.tex`, collected 2026-07-30. +Hardware/software: see `run_metadata.txt` (AMD Ryzen 9 7950X, 16 physical / 32 logical cores; +NVIDIA RTX 4090 24 GB; Julia 1.12.6). All runs used `julia -t 32 --project=benchmark/gpu`. + +## Methodology +- **Cold vs warm start.** We report both: *cold* (all solvers from their default start) is the + fair, apples-to-apples comparison against PATH and the unbatched solver, which are always cold; + *warm* (the batched solve seeded with `generate_initial_guess`, the trajectory game's zero-input + rollout) reflects realistic receding-horizon robotics use. Warm only affects the game (the QP has + no initial-guess override). Controlled by the `use_initial_guess` kwarg on + `benchmark_throughput` and the `WARMSTART` env var in `scripts/run_benchmarks.jl`. +- **Distributions, not point estimates.** The QP's random draws are often infeasible by + construction, making per-instance solve times bimodal (fast feasible / slow-to-diverge + infeasible). Report mean±std, or violins when bimodal, from the raw per-sample CSVs — not a + single number. Batched sub-second timings are also noisy (GPU especially at large horizon), so + we sample many repetitions. +- **Matched tolerance for PATH.** All solvers, including `PATH`, are held to the same + convergence tolerance `1e-4`. `PATH` runs at its built-in default `convergence_tolerance = 1e-6` + unless the option is set explicitly, which would hold it to a 100× tighter bar than our solver; + every PATH call now passes `convergence_tolerance = tol`. In practice this changes PATH's + timings and solved counts negligibly (quadratic local convergence drives the residual below + both thresholds in the same iteration) — verified by re-running: identical solved counts, times + within run-to-run noise. `scripts/rerun_path_tol.jl` re-timed PATH at `1e-4` and patched the + PATH rows of every CSV in place, leaving all batched/IP/GPU rows untouched (the pre-fix PATH + numbers, at `1e-6`, are in git history). + +## Key findings +- **Batched solver vs PATH.** Both batched backends clear a batch far faster than sequential PATH + (game: CPU ~60–90×, GPU ~20–55×). +- **CPU vs GPU is regime-dependent, and the CPU wins on the game.** The GPU only wins end-to-end on + large *dense* per-instance systems (128-primal QP: 2–3×) or large QP batches. This **corrects + PR #55's headline** ("GPU beats CPU 2.5–2.8× on the game"), which inverted the ratio direction / + over-generalized a per-call result. The GPU *factorization kernel* does cross over CPU at large d + (`percall_timing.csv`), but the CPU's active-set skip — it factorizes only the shrinking active + subset each Newton step, while cuDSS always processes the whole batch — keeps the CPU ahead + end-to-end (`active_fraction_T50.csv`: GPU/CPU 0.77×→8.1× as the active set shrinks 1024→32). +- **KLU default.** Switching the unbatched interior-point solver's linear solve from UMFPACK to KLU + (in-place refactor reusing the symbolic analysis) is ~4–6× faster per solve at identical + reliability (`table1_summary.txt`), bringing the unbatched solver to ≈ parity with PATH on the QP + and ~50× faster on the game. Now the package default. + +## Files +| file | what | +|---|---| +| `experiments.csv` | single-shot cold results: throughput, gpu_scaling, problem_size, horizon (cold+warm). `warm_start` column. | +| `experiments_warm_reference.csv` | earlier full warm sweep (old schema, no `warm_start` col; QP rows cold-valid, game rows warm). | +| `per_instance.csv` | raw per-instance solve time + status for PATH & unbatched IP (N=1024, QP+game) — for violins / bimodality. | +| `per_instance_table1.csv` | Table I raw: per-instance PATH vs IP(UMFPACK) vs IP(KLU). `table1_summary.txt` has the summary. | +| `per_rep.csv` | raw per-repetition full-batch wall-clock for batched CPU/GPU (+ PATH totals). Covers both the batch-size sweep (base configs `p32i16`/`T10` across `B`) and the problem-size sweep (`p64i32`, `p128i64`; game `T20`/`T30`/`T40`/`T50` at `B=1024`, cold+warm, median-of-5). | +| `throughput_klu.csv` | clean single-run throughput (PATH vs sequential IP vs batched CPU) with the KLU default — the source for the report's Table II. | +| `thread_scaling.csv` | batched throughput vs CPU thread count (1–32), QP and game — the source for the thread-scaling figure. | +| `percall_timing.csv` | per-call `jacobian!`/`factorize!`/`ldiv!` CPU-vs-GPU vs horizon (d) — the kernel crossover. | +| `active_fraction_T50.csv` | GPU-vs-CPU vs active-set size at fixed d=3500 — the mechanism behind CPU winning end-to-end. | +| `confirm_game_T30_median.txt` | median-of-5 game T=30 CPU-vs-GPU (cold+warm). | +| `run_metadata.txt` | hardware / git / Julia snapshot. | +| `scripts/` | the driver + analysis scripts (repo root auto-resolved, or set `REPO_ROOT`). | + +## Reproduce +From the repo root, one GPU stage at a time (single GPU — never overlap): +``` +WARMSTART=0 STAGE=throughput julia -t 32 --project=benchmark/gpu benchmark/results/scripts/run_benchmarks.jl +# STAGE ∈ {throughput, gpu_scaling, problem_size, horizon} +julia -t 32 --project=benchmark/gpu benchmark/results/scripts/percall.jl # kernel crossover +julia -t 32 --project=benchmark/gpu benchmark/results/scripts/active_frac.jl # active-set mechanism +julia -t 32 --project=benchmark/gpu benchmark/results/scripts/table1_klu.jl # Table I (KLU vs UMFPACK) +STAGE=throughput_raw julia -t 32 --project=benchmark/gpu benchmark/results/scripts/raw_data.jl # STAGE ∈ {throughput_raw, scaling_raw, problem_size_raw} +julia -t 32 --project=benchmark/gpu benchmark/results/scripts/rerun_path_tol.jl # re-time PATH at 1e-4, patch PATH rows in every CSV +``` + +`problem_size_raw` (in `raw_data.jl`) fills the median-of-5 problem-size reps in `per_rep.csv` +(QP `p64i32`/`p128i64`; game `T20`–`T50`); the base configs `p32i16`/`T10` already have ≥30 +reps from `throughput_raw`. `rerun_path_tol.jl` is CPU-only and must be run *after* any stage +that regenerates a PATH-containing CSV, to restore matched-tolerance PATH numbers. diff --git a/benchmark/results/active_fraction_T50.csv b/benchmark/results/active_fraction_T50.csv new file mode 100644 index 0000000..1c17d4c --- /dev/null +++ b/benchmark/results/active_fraction_T50.csv @@ -0,0 +1,7 @@ +active_k,cpu_jacfac_ms,gpu_jacfac_ms,jacfac_GPU/CPU,cpu_ldiv_ms,gpu_ldiv_ms,ldiv_GPU/CPU +1024,39.73,30.62,0.77,25.31,11.87,0.47 +512,20.31,29.25,1.44,16.45,11.77,0.72 +256,11.65,29.28,2.51,6.65,11.76,1.77 +128,7.44,27.91,3.75,4.56,11.77,2.58 +64,4.42,27.34,6.19,3.96,11.77,2.97 +32,3.36,27.14,8.08,3.84,11.77,3.07 diff --git a/benchmark/results/confirm_game_T30_median.txt b/benchmark/results/confirm_game_T30_median.txt new file mode 100644 index 0000000..a9347a6 --- /dev/null +++ b/benchmark/results/confirm_game_T30_median.txt @@ -0,0 +1,8 @@ +=== game T=30 N=1024 warm=false (median-of-5) === + CPU: med=5.86s all=[6.166, 6.091, 5.86, 5.68, 5.612] solved=172 + GPU: med=7.06s all=[7.06, 7.052, 8.015, 7.418, 6.976] solved=171 + GPU/CPU=1.2 (>1 => GPU slower) +=== game T=30 N=1024 warm=true (median-of-5) === + CPU: med=4.537s all=[4.763, 4.346, 4.799, 4.312, 4.537] solved=945 + GPU: med=7.897s all=[7.897, 6.394, 6.968, 10.127, 7.9] solved=948 + GPU/CPU=1.74 (>1 => GPU slower) diff --git a/benchmark/results/experiments.csv b/benchmark/results/experiments.csv new file mode 100644 index 0000000..b934282 --- /dev/null +++ b/benchmark/results/experiments.csv @@ -0,0 +1,65 @@ +experiment,problem,num_primals,num_inequalities,horizon,num_samples,nthreads,solver,device,warm_start,total_time_s,num_solved,tol +throughput,qp,32,16,,1024,32,ip_seq,cpu,false,16.7058,431,0.0001 +throughput,qp,32,16,,1024,32,batched,cpu,false,0.733,424,0.0001 +throughput,game,,,10,1024,32,ip_seq,cpu,false,5.0855,1024,0.0001 +throughput,game,,,10,1024,32,batched,cpu,false,0.5155,1024,0.0001 +gpu_scaling,qp,32,16,,64,32,batched,gpu,false,0.1152,23,0.0001 +gpu_scaling,qp,32,16,,64,32,batched,cpu,false,0.0885,23,0.0001 +gpu_scaling,qp,32,16,,256,32,batched,gpu,false,0.1914,98,0.0001 +gpu_scaling,qp,32,16,,256,32,batched,cpu,false,0.1698,98,0.0001 +gpu_scaling,qp,32,16,,1024,32,batched,gpu,false,0.5315,424,0.0001 +gpu_scaling,qp,32,16,,1024,32,batched,cpu,false,0.6291,424,0.0001 +gpu_scaling,qp,32,16,,4096,32,batched,gpu,false,1.3309,1664,0.0001 +gpu_scaling,qp,32,16,,4096,32,batched,cpu,false,2.379,1664,0.0001 +gpu_scaling,qp,32,16,,16384,32,batched,gpu,false,7.3733,6802,0.0001 +gpu_scaling,qp,32,16,,16384,32,batched,cpu,false,9.5972,6802,0.0001 +gpu_scaling,game,,,10,64,32,batched,gpu,false,0.0563,64,0.0001 +gpu_scaling,game,,,10,64,32,batched,cpu,false,0.0707,64,0.0001 +gpu_scaling,game,,,10,256,32,batched,gpu,false,0.2332,256,0.0001 +gpu_scaling,game,,,10,256,32,batched,cpu,false,0.1102,256,0.0001 +gpu_scaling,game,,,10,1024,32,batched,gpu,false,0.8342,1024,0.0001 +gpu_scaling,game,,,10,1024,32,batched,cpu,false,0.3817,1024,0.0001 +gpu_scaling,game,,,10,4096,32,batched,gpu,false,6.8964,4095,0.0001 +gpu_scaling,game,,,10,4096,32,batched,cpu,false,2.4531,4095,0.0001 +problem_size,qp,32,16,,1024,32,batched,gpu,false,0.5799,424,0.0001 +problem_size,qp,32,16,,1024,32,batched,cpu,false,0.5814,424,0.0001 +problem_size,qp,32,16,,4096,32,batched,gpu,false,1.3218,1664,0.0001 +problem_size,qp,32,16,,4096,32,batched,cpu,false,2.3769,1664,0.0001 +problem_size,qp,64,32,,1024,32,batched,gpu,false,1.0466,986,0.0001 +problem_size,qp,64,32,,1024,32,batched,cpu,false,1.0555,986,0.0001 +problem_size,qp,64,32,,4096,32,batched,gpu,false,3.9347,3962,0.0001 +problem_size,qp,64,32,,4096,32,batched,cpu,false,2.8139,3962,0.0001 +problem_size,qp,128,64,,1024,32,batched,gpu,false,0.9538,1024,0.0001 +problem_size,qp,128,64,,1024,32,batched,cpu,false,3.0259,1024,0.0001 +problem_size,qp,128,64,,4096,32,batched,gpu,false,3.7164,4096,0.0001 +problem_size,qp,128,64,,4096,32,batched,cpu,false,7.8039,4096,0.0001 +horizon,game,,,10,1024,32,batched,gpu,false,1.0068,1024,0.0001 +horizon,game,,,10,1024,32,batched,cpu,false,0.5824,1024,0.0001 +horizon,game,,,10,1024,32,batched,gpu,true,0.5402,1024,0.0001 +horizon,game,,,10,1024,32,batched,cpu,true,0.343,1024,0.0001 +horizon,game,,,20,1024,32,batched,gpu,false,3.2557,1021,0.0001 +horizon,game,,,20,1024,32,batched,cpu,false,1.546,1021,0.0001 +horizon,game,,,20,1024,32,batched,gpu,true,3.3846,1019,0.0001 +horizon,game,,,20,1024,32,batched,cpu,true,1.6623,1019,0.0001 +horizon,game,,,30,1024,32,batched,gpu,false,6.9465,168,0.0001 +horizon,game,,,30,1024,32,batched,cpu,false,6.0865,172,0.0001 +horizon,game,,,30,1024,32,batched,gpu,true,11.2891,954,0.0001 +horizon,game,,,30,1024,32,batched,cpu,true,4.6459,941,0.0001 +horizon,game,,,40,1024,32,batched,gpu,false,4.3121,46,0.0001 +horizon,game,,,40,1024,32,batched,cpu,false,6.6606,52,0.0001 +horizon,game,,,40,1024,32,batched,gpu,true,11.0809,802,0.0001 +horizon,game,,,40,1024,32,batched,cpu,true,8.568,807,0.0001 +horizon,game,,,50,1024,32,batched,gpu,false,12.1356,24,0.0001 +horizon,game,,,50,1024,32,batched,cpu,false,10.2976,23,0.0001 +horizon,game,,,50,1024,32,batched,gpu,true,17.9422,562,0.0001 +horizon,game,,,50,1024,32,batched,cpu,true,12.5999,587,0.0001 +gpu_scaling,game,,,10,64,32,path,na,false,2.6759,63,0.0001 +gpu_scaling,game,,,10,256,32,path,na,false,11.119,252,0.0001 +gpu_scaling,game,,,10,1024,32,path,na,false,46.412,996,0.0001 +gpu_scaling,game,,,10,4096,32,path,na,false,187.0617,3960,0.0001 +throughput,game,,,10,1024,32,path,na,false,46.412,996,0.0001 +gpu_scaling,qp,32,16,,64,32,path,na,false,0.3652,25,0.0001 +gpu_scaling,qp,32,16,,256,32,path,na,false,1.0869,101,0.0001 +gpu_scaling,qp,32,16,,1024,32,path,na,false,3.9661,437,0.0001 +gpu_scaling,qp,32,16,,4096,32,path,na,false,16.2411,1693,0.0001 +throughput,qp,32,16,,1024,32,path,na,false,3.9661,437,0.0001 diff --git a/benchmark/results/experiments_warm_reference.csv b/benchmark/results/experiments_warm_reference.csv new file mode 100644 index 0000000..cafeabb --- /dev/null +++ b/benchmark/results/experiments_warm_reference.csv @@ -0,0 +1,33 @@ +experiment,problem,num_primals,num_inequalities,horizon,num_samples,nthreads,solver,device,total_time_s,num_solved,tol +throughput,qp,32,16,,1024,32,path,na,3.9234,437,0.0001 +throughput,qp,32,16,,1024,32,ip_seq,cpu,15.8746,431,0.0001 +throughput,qp,32,16,,1024,32,batched,cpu,0.5699,424,0.0001 +throughput,game,,,10,1024,32,path,na,46.4143,996,0.0001 +throughput,game,,,10,1024,32,ip_seq,cpu,4.9953,1024,0.0001 +throughput,game,,,10,1024,32,batched,cpu,0.4956,1024,0.0001 +gpu_scaling,qp,32,16,,64,32,batched,gpu,0.1151,23,0.0001 +gpu_scaling,qp,32,16,,64,32,path,na,0.4854,25,0.0001 +gpu_scaling,qp,32,16,,64,32,batched,cpu,0.0907,23,0.0001 +gpu_scaling,qp,32,16,,256,32,batched,gpu,0.1835,98,0.0001 +gpu_scaling,qp,32,16,,256,32,path,na,1.0585,101,0.0001 +gpu_scaling,qp,32,16,,256,32,batched,cpu,0.1674,98,0.0001 +gpu_scaling,qp,32,16,,1024,32,batched,gpu,0.5248,424,0.0001 +gpu_scaling,qp,32,16,,1024,32,path,na,3.9041,437,0.0001 +gpu_scaling,qp,32,16,,1024,32,batched,cpu,0.5553,424,0.0001 +gpu_scaling,qp,32,16,,4096,32,batched,gpu,1.3324,1664,0.0001 +gpu_scaling,qp,32,16,,4096,32,path,na,16.0902,1693,0.0001 +gpu_scaling,qp,32,16,,4096,32,batched,cpu,2.3509,1664,0.0001 +gpu_scaling,qp,32,16,,16384,32,batched,gpu,7.363,6802,0.0001 +gpu_scaling,qp,32,16,,16384,32,batched,cpu,9.6801,6802,0.0001 +gpu_scaling,game,,,10,64,32,batched,gpu,0.0494,64,0.0001 +gpu_scaling,game,,,10,64,32,path,na,2.5867,63,0.0001 +gpu_scaling,game,,,10,64,32,batched,cpu,0.1066,64,0.0001 +gpu_scaling,game,,,10,256,32,batched,gpu,0.1493,256,0.0001 +gpu_scaling,game,,,10,256,32,path,na,11.2713,252,0.0001 +gpu_scaling,game,,,10,256,32,batched,cpu,0.0794,256,0.0001 +gpu_scaling,game,,,10,1024,32,batched,gpu,0.5366,1024,0.0001 +gpu_scaling,game,,,10,1024,32,path,na,46.4373,996,0.0001 +gpu_scaling,game,,,10,1024,32,batched,cpu,0.314,1024,0.0001 +gpu_scaling,game,,,10,4096,32,batched,gpu,2.107,4096,0.0001 +gpu_scaling,game,,,10,4096,32,path,na,187.7654,3960,0.0001 +gpu_scaling,game,,,10,4096,32,batched,cpu,1.4211,4096,0.0001 diff --git a/benchmark/results/per_instance.csv b/benchmark/results/per_instance.csv new file mode 100644 index 0000000..02f1032 --- /dev/null +++ b/benchmark/results/per_instance.csv @@ -0,0 +1,4097 @@ +problem,size,solver,instance,time_s,solved,tol +qp,p32i16,ip_seq,1,0.042259,false,0.0001 +qp,p32i16,ip_seq,2,0.002294,false,0.0001 +qp,p32i16,ip_seq,3,0.025912,false,0.0001 +qp,p32i16,ip_seq,4,0.000892,true,0.0001 +qp,p32i16,ip_seq,5,0.000718,true,0.0001 +qp,p32i16,ip_seq,6,0.043212,false,0.0001 +qp,p32i16,ip_seq,7,0.026467,false,0.0001 +qp,p32i16,ip_seq,8,0.001825,false,0.0001 +qp,p32i16,ip_seq,9,0.026907,false,0.0001 +qp,p32i16,ip_seq,10,0.022741,false,0.0001 +qp,p32i16,ip_seq,11,0.002219,false,0.0001 +qp,p32i16,ip_seq,12,0.000637,true,0.0001 +qp,p32i16,ip_seq,13,0.02503,false,0.0001 +qp,p32i16,ip_seq,14,0.042536,false,0.0001 +qp,p32i16,ip_seq,15,0.00079,true,0.0001 +qp,p32i16,ip_seq,16,0.040168,false,0.0001 +qp,p32i16,ip_seq,17,0.000713,true,0.0001 +qp,p32i16,ip_seq,18,0.00243,false,0.0001 +qp,p32i16,ip_seq,19,0.002209,false,0.0001 +qp,p32i16,ip_seq,20,0.022486,false,0.0001 +qp,p32i16,ip_seq,21,0.000859,true,0.0001 +qp,p32i16,ip_seq,22,0.025351,false,0.0001 +qp,p32i16,ip_seq,23,0.045923,false,0.0001 +qp,p32i16,ip_seq,24,0.041102,false,0.0001 +qp,p32i16,ip_seq,25,0.03728,false,0.0001 +qp,p32i16,ip_seq,26,0.012325,true,0.0001 +qp,p32i16,ip_seq,27,0.037684,false,0.0001 +qp,p32i16,ip_seq,28,0.002171,false,0.0001 +qp,p32i16,ip_seq,29,0.038914,false,0.0001 +qp,p32i16,ip_seq,30,0.026068,false,0.0001 +qp,p32i16,ip_seq,31,0.00084,true,0.0001 +qp,p32i16,ip_seq,32,0.04563,false,0.0001 +qp,p32i16,ip_seq,33,0.000789,true,0.0001 +qp,p32i16,ip_seq,34,0.000787,true,0.0001 +qp,p32i16,ip_seq,35,0.023796,false,0.0001 +qp,p32i16,ip_seq,36,0.002111,false,0.0001 +qp,p32i16,ip_seq,37,0.002343,false,0.0001 +qp,p32i16,ip_seq,38,0.04444,false,0.0001 +qp,p32i16,ip_seq,39,0.040921,false,0.0001 +qp,p32i16,ip_seq,40,0.000603,true,0.0001 +qp,p32i16,ip_seq,41,0.000867,true,0.0001 +qp,p32i16,ip_seq,42,0.040254,false,0.0001 +qp,p32i16,ip_seq,43,0.001009,true,0.0001 +qp,p32i16,ip_seq,44,0.028526,false,0.0001 +qp,p32i16,ip_seq,45,0.023523,false,0.0001 +qp,p32i16,ip_seq,46,0.028956,false,0.0001 +qp,p32i16,ip_seq,47,0.025877,false,0.0001 +qp,p32i16,ip_seq,48,0.000777,true,0.0001 +qp,p32i16,ip_seq,49,0.002919,true,0.0001 +qp,p32i16,ip_seq,50,0.001015,true,0.0001 +qp,p32i16,ip_seq,51,0.037969,false,0.0001 +qp,p32i16,ip_seq,52,0.040768,false,0.0001 +qp,p32i16,ip_seq,53,0.000964,true,0.0001 +qp,p32i16,ip_seq,54,0.000729,true,0.0001 +qp,p32i16,ip_seq,55,0.004162,false,0.0001 +qp,p32i16,ip_seq,56,0.00069,true,0.0001 +qp,p32i16,ip_seq,57,0.047139,false,0.0001 +qp,p32i16,ip_seq,58,0.000861,true,0.0001 +qp,p32i16,ip_seq,59,0.000742,true,0.0001 +qp,p32i16,ip_seq,60,0.00069,true,0.0001 +qp,p32i16,ip_seq,61,0.026721,false,0.0001 +qp,p32i16,ip_seq,62,0.000932,true,0.0001 +qp,p32i16,ip_seq,63,0.000899,true,0.0001 +qp,p32i16,ip_seq,64,0.040746,false,0.0001 +qp,p32i16,ip_seq,65,0.000918,true,0.0001 +qp,p32i16,ip_seq,66,0.001019,true,0.0001 +qp,p32i16,ip_seq,67,0.044707,false,0.0001 +qp,p32i16,ip_seq,68,0.000738,true,0.0001 +qp,p32i16,ip_seq,69,0.038865,false,0.0001 +qp,p32i16,ip_seq,70,0.038224,false,0.0001 +qp,p32i16,ip_seq,71,0.027216,false,0.0001 +qp,p32i16,ip_seq,72,0.000875,true,0.0001 +qp,p32i16,ip_seq,73,0.002553,false,0.0001 +qp,p32i16,ip_seq,74,0.001022,true,0.0001 +qp,p32i16,ip_seq,75,0.025755,false,0.0001 +qp,p32i16,ip_seq,76,0.021434,false,0.0001 +qp,p32i16,ip_seq,77,0.028266,false,0.0001 +qp,p32i16,ip_seq,78,0.040341,false,0.0001 +qp,p32i16,ip_seq,79,0.000766,true,0.0001 +qp,p32i16,ip_seq,80,0.002174,false,0.0001 +qp,p32i16,ip_seq,81,0.036118,false,0.0001 +qp,p32i16,ip_seq,82,0.002071,false,0.0001 +qp,p32i16,ip_seq,83,0.00084,true,0.0001 +qp,p32i16,ip_seq,84,0.000752,true,0.0001 +qp,p32i16,ip_seq,85,0.004205,false,0.0001 +qp,p32i16,ip_seq,86,0.024292,false,0.0001 +qp,p32i16,ip_seq,87,0.024017,false,0.0001 +qp,p32i16,ip_seq,88,0.000714,true,0.0001 +qp,p32i16,ip_seq,89,0.000785,true,0.0001 +qp,p32i16,ip_seq,90,0.002177,false,0.0001 +qp,p32i16,ip_seq,91,0.040953,false,0.0001 +qp,p32i16,ip_seq,92,0.042567,false,0.0001 +qp,p32i16,ip_seq,93,0.000899,true,0.0001 +qp,p32i16,ip_seq,94,0.002102,false,0.0001 +qp,p32i16,ip_seq,95,0.000874,true,0.0001 +qp,p32i16,ip_seq,96,0.000771,true,0.0001 +qp,p32i16,ip_seq,97,0.000726,true,0.0001 +qp,p32i16,ip_seq,98,0.002862,true,0.0001 +qp,p32i16,ip_seq,99,0.000544,true,0.0001 +qp,p32i16,ip_seq,100,0.041346,false,0.0001 +qp,p32i16,ip_seq,101,0.039239,false,0.0001 +qp,p32i16,ip_seq,102,0.019684,false,0.0001 +qp,p32i16,ip_seq,103,0.000986,true,0.0001 +qp,p32i16,ip_seq,104,0.000754,true,0.0001 +qp,p32i16,ip_seq,105,0.036976,false,0.0001 +qp,p32i16,ip_seq,106,0.043196,false,0.0001 +qp,p32i16,ip_seq,107,0.00078,true,0.0001 +qp,p32i16,ip_seq,108,0.023734,false,0.0001 +qp,p32i16,ip_seq,109,0.002261,false,0.0001 +qp,p32i16,ip_seq,110,0.002073,false,0.0001 +qp,p32i16,ip_seq,111,0.002935,true,0.0001 +qp,p32i16,ip_seq,112,0.027053,true,0.0001 +qp,p32i16,ip_seq,113,0.000845,true,0.0001 +qp,p32i16,ip_seq,114,0.000878,true,0.0001 +qp,p32i16,ip_seq,115,0.00067,true,0.0001 +qp,p32i16,ip_seq,116,0.040395,false,0.0001 +qp,p32i16,ip_seq,117,0.002077,false,0.0001 +qp,p32i16,ip_seq,118,0.000667,true,0.0001 +qp,p32i16,ip_seq,119,0.038435,false,0.0001 +qp,p32i16,ip_seq,120,0.000833,true,0.0001 +qp,p32i16,ip_seq,121,0.001002,true,0.0001 +qp,p32i16,ip_seq,122,0.00095,true,0.0001 +qp,p32i16,ip_seq,123,0.00072,true,0.0001 +qp,p32i16,ip_seq,124,0.002169,false,0.0001 +qp,p32i16,ip_seq,125,0.004403,false,0.0001 +qp,p32i16,ip_seq,126,0.000772,true,0.0001 +qp,p32i16,ip_seq,127,0.000855,true,0.0001 +qp,p32i16,ip_seq,128,0.038169,false,0.0001 +qp,p32i16,ip_seq,129,0.041936,false,0.0001 +qp,p32i16,ip_seq,130,0.042715,false,0.0001 +qp,p32i16,ip_seq,131,0.000809,true,0.0001 +qp,p32i16,ip_seq,132,0.00087,true,0.0001 +qp,p32i16,ip_seq,133,0.041717,false,0.0001 +qp,p32i16,ip_seq,134,0.038669,false,0.0001 +qp,p32i16,ip_seq,135,0.003295,false,0.0001 +qp,p32i16,ip_seq,136,0.039079,false,0.0001 +qp,p32i16,ip_seq,137,0.029288,false,0.0001 +qp,p32i16,ip_seq,138,0.041881,false,0.0001 +qp,p32i16,ip_seq,139,0.036128,false,0.0001 +qp,p32i16,ip_seq,140,0.000738,true,0.0001 +qp,p32i16,ip_seq,141,0.042706,false,0.0001 +qp,p32i16,ip_seq,142,0.001012,true,0.0001 +qp,p32i16,ip_seq,143,0.002379,false,0.0001 +qp,p32i16,ip_seq,144,0.000732,true,0.0001 +qp,p32i16,ip_seq,145,0.036434,false,0.0001 +qp,p32i16,ip_seq,146,0.000719,true,0.0001 +qp,p32i16,ip_seq,147,0.001977,false,0.0001 +qp,p32i16,ip_seq,148,0.021095,false,0.0001 +qp,p32i16,ip_seq,149,0.000758,true,0.0001 +qp,p32i16,ip_seq,150,0.027671,false,0.0001 +qp,p32i16,ip_seq,151,0.000733,true,0.0001 +qp,p32i16,ip_seq,152,0.03403,false,0.0001 +qp,p32i16,ip_seq,153,0.001086,true,0.0001 +qp,p32i16,ip_seq,154,0.028517,false,0.0001 +qp,p32i16,ip_seq,155,0.022319,false,0.0001 +qp,p32i16,ip_seq,156,0.028942,false,0.0001 +qp,p32i16,ip_seq,157,0.000836,true,0.0001 +qp,p32i16,ip_seq,158,0.037144,false,0.0001 +qp,p32i16,ip_seq,159,0.000787,true,0.0001 +qp,p32i16,ip_seq,160,0.025687,false,0.0001 +qp,p32i16,ip_seq,161,0.000632,true,0.0001 +qp,p32i16,ip_seq,162,0.000784,true,0.0001 +qp,p32i16,ip_seq,163,0.000759,true,0.0001 +qp,p32i16,ip_seq,164,0.000922,true,0.0001 +qp,p32i16,ip_seq,165,0.001867,false,0.0001 +qp,p32i16,ip_seq,166,0.000798,true,0.0001 +qp,p32i16,ip_seq,167,0.036922,false,0.0001 +qp,p32i16,ip_seq,168,0.037638,false,0.0001 +qp,p32i16,ip_seq,169,0.037906,false,0.0001 +qp,p32i16,ip_seq,170,0.001933,true,0.0001 +qp,p32i16,ip_seq,171,0.037548,false,0.0001 +qp,p32i16,ip_seq,172,0.001063,true,0.0001 +qp,p32i16,ip_seq,173,0.002742,true,0.0001 +qp,p32i16,ip_seq,174,0.030914,false,0.0001 +qp,p32i16,ip_seq,175,0.037252,false,0.0001 +qp,p32i16,ip_seq,176,0.000916,true,0.0001 +qp,p32i16,ip_seq,177,0.003986,false,0.0001 +qp,p32i16,ip_seq,178,0.04095,false,0.0001 +qp,p32i16,ip_seq,179,0.001032,true,0.0001 +qp,p32i16,ip_seq,180,0.002418,false,0.0001 +qp,p32i16,ip_seq,181,0.042859,false,0.0001 +qp,p32i16,ip_seq,182,0.002214,false,0.0001 +qp,p32i16,ip_seq,183,0.04246,false,0.0001 +qp,p32i16,ip_seq,184,0.002214,false,0.0001 +qp,p32i16,ip_seq,185,0.022399,false,0.0001 +qp,p32i16,ip_seq,186,0.023785,false,0.0001 +qp,p32i16,ip_seq,187,0.030526,false,0.0001 +qp,p32i16,ip_seq,188,0.002469,true,0.0001 +qp,p32i16,ip_seq,189,0.000901,true,0.0001 +qp,p32i16,ip_seq,190,0.030867,false,0.0001 +qp,p32i16,ip_seq,191,0.040536,false,0.0001 +qp,p32i16,ip_seq,192,0.036346,false,0.0001 +qp,p32i16,ip_seq,193,0.000671,true,0.0001 +qp,p32i16,ip_seq,194,0.040321,false,0.0001 +qp,p32i16,ip_seq,195,0.002745,true,0.0001 +qp,p32i16,ip_seq,196,0.031981,false,0.0001 +qp,p32i16,ip_seq,197,0.022743,false,0.0001 +qp,p32i16,ip_seq,198,0.035559,false,0.0001 +qp,p32i16,ip_seq,199,0.000999,true,0.0001 +qp,p32i16,ip_seq,200,0.00099,true,0.0001 +qp,p32i16,ip_seq,201,0.038439,false,0.0001 +qp,p32i16,ip_seq,202,0.038917,false,0.0001 +qp,p32i16,ip_seq,203,0.022028,false,0.0001 +qp,p32i16,ip_seq,204,0.002435,false,0.0001 +qp,p32i16,ip_seq,205,0.03849,false,0.0001 +qp,p32i16,ip_seq,206,0.041078,false,0.0001 +qp,p32i16,ip_seq,207,0.002236,false,0.0001 +qp,p32i16,ip_seq,208,0.041481,false,0.0001 +qp,p32i16,ip_seq,209,0.00077,true,0.0001 +qp,p32i16,ip_seq,210,0.002177,false,0.0001 +qp,p32i16,ip_seq,211,0.002026,false,0.0001 +qp,p32i16,ip_seq,212,0.021593,false,0.0001 +qp,p32i16,ip_seq,213,0.002653,true,0.0001 +qp,p32i16,ip_seq,214,0.003045,false,0.0001 +qp,p32i16,ip_seq,215,0.037416,false,0.0001 +qp,p32i16,ip_seq,216,0.000675,true,0.0001 +qp,p32i16,ip_seq,217,0.006522,false,0.0001 +qp,p32i16,ip_seq,218,0.002056,false,0.0001 +qp,p32i16,ip_seq,219,0.000803,true,0.0001 +qp,p32i16,ip_seq,220,0.027907,false,0.0001 +qp,p32i16,ip_seq,221,0.021182,false,0.0001 +qp,p32i16,ip_seq,222,0.000971,true,0.0001 +qp,p32i16,ip_seq,223,0.002423,false,0.0001 +qp,p32i16,ip_seq,224,0.004104,false,0.0001 +qp,p32i16,ip_seq,225,0.00204,false,0.0001 +qp,p32i16,ip_seq,226,0.037876,false,0.0001 +qp,p32i16,ip_seq,227,0.038985,false,0.0001 +qp,p32i16,ip_seq,228,0.000758,true,0.0001 +qp,p32i16,ip_seq,229,0.000982,true,0.0001 +qp,p32i16,ip_seq,230,0.036588,false,0.0001 +qp,p32i16,ip_seq,231,0.028418,false,0.0001 +qp,p32i16,ip_seq,232,0.030102,false,0.0001 +qp,p32i16,ip_seq,233,0.037448,false,0.0001 +qp,p32i16,ip_seq,234,0.000755,true,0.0001 +qp,p32i16,ip_seq,235,0.029745,false,0.0001 +qp,p32i16,ip_seq,236,0.001874,true,0.0001 +qp,p32i16,ip_seq,237,0.040429,false,0.0001 +qp,p32i16,ip_seq,238,0.000733,true,0.0001 +qp,p32i16,ip_seq,239,0.039803,false,0.0001 +qp,p32i16,ip_seq,240,0.000861,true,0.0001 +qp,p32i16,ip_seq,241,0.034882,false,0.0001 +qp,p32i16,ip_seq,242,0.037812,false,0.0001 +qp,p32i16,ip_seq,243,0.00087,true,0.0001 +qp,p32i16,ip_seq,244,0.000871,true,0.0001 +qp,p32i16,ip_seq,245,0.000775,true,0.0001 +qp,p32i16,ip_seq,246,0.000672,true,0.0001 +qp,p32i16,ip_seq,247,0.000865,true,0.0001 +qp,p32i16,ip_seq,248,0.002135,false,0.0001 +qp,p32i16,ip_seq,249,0.038714,false,0.0001 +qp,p32i16,ip_seq,250,0.023615,false,0.0001 +qp,p32i16,ip_seq,251,0.000671,true,0.0001 +qp,p32i16,ip_seq,252,0.023901,false,0.0001 +qp,p32i16,ip_seq,253,0.027606,false,0.0001 +qp,p32i16,ip_seq,254,0.036118,false,0.0001 +qp,p32i16,ip_seq,255,0.000846,true,0.0001 +qp,p32i16,ip_seq,256,0.037965,false,0.0001 +qp,p32i16,ip_seq,257,0.027959,false,0.0001 +qp,p32i16,ip_seq,258,0.007121,false,0.0001 +qp,p32i16,ip_seq,259,0.024824,false,0.0001 +qp,p32i16,ip_seq,260,0.042283,false,0.0001 +qp,p32i16,ip_seq,261,0.002422,true,0.0001 +qp,p32i16,ip_seq,262,0.02124,false,0.0001 +qp,p32i16,ip_seq,263,0.002267,false,0.0001 +qp,p32i16,ip_seq,264,0.000778,true,0.0001 +qp,p32i16,ip_seq,265,0.041642,false,0.0001 +qp,p32i16,ip_seq,266,0.024512,false,0.0001 +qp,p32i16,ip_seq,267,0.000878,true,0.0001 +qp,p32i16,ip_seq,268,0.000747,true,0.0001 +qp,p32i16,ip_seq,269,0.000649,true,0.0001 +qp,p32i16,ip_seq,270,0.000681,true,0.0001 +qp,p32i16,ip_seq,271,0.041469,false,0.0001 +qp,p32i16,ip_seq,272,0.028328,false,0.0001 +qp,p32i16,ip_seq,273,0.002155,false,0.0001 +qp,p32i16,ip_seq,274,0.034302,false,0.0001 +qp,p32i16,ip_seq,275,0.041709,false,0.0001 +qp,p32i16,ip_seq,276,0.002136,false,0.0001 +qp,p32i16,ip_seq,277,0.005134,false,0.0001 +qp,p32i16,ip_seq,278,0.024239,false,0.0001 +qp,p32i16,ip_seq,279,0.021345,false,0.0001 +qp,p32i16,ip_seq,280,0.030329,false,0.0001 +qp,p32i16,ip_seq,281,0.002047,false,0.0001 +qp,p32i16,ip_seq,282,0.028551,false,0.0001 +qp,p32i16,ip_seq,283,0.0315,false,0.0001 +qp,p32i16,ip_seq,284,0.030733,false,0.0001 +qp,p32i16,ip_seq,285,0.02543,false,0.0001 +qp,p32i16,ip_seq,286,0.000933,true,0.0001 +qp,p32i16,ip_seq,287,0.002267,false,0.0001 +qp,p32i16,ip_seq,288,0.001971,false,0.0001 +qp,p32i16,ip_seq,289,0.042307,false,0.0001 +qp,p32i16,ip_seq,290,0.000774,true,0.0001 +qp,p32i16,ip_seq,291,0.000925,true,0.0001 +qp,p32i16,ip_seq,292,0.000837,true,0.0001 +qp,p32i16,ip_seq,293,0.002588,true,0.0001 +qp,p32i16,ip_seq,294,0.025895,false,0.0001 +qp,p32i16,ip_seq,295,0.000889,true,0.0001 +qp,p32i16,ip_seq,296,0.000898,true,0.0001 +qp,p32i16,ip_seq,297,0.000796,true,0.0001 +qp,p32i16,ip_seq,298,0.045195,false,0.0001 +qp,p32i16,ip_seq,299,0.000977,true,0.0001 +qp,p32i16,ip_seq,300,0.038821,false,0.0001 +qp,p32i16,ip_seq,301,0.000943,true,0.0001 +qp,p32i16,ip_seq,302,0.023077,false,0.0001 +qp,p32i16,ip_seq,303,0.038181,false,0.0001 +qp,p32i16,ip_seq,304,0.002117,false,0.0001 +qp,p32i16,ip_seq,305,0.041076,false,0.0001 +qp,p32i16,ip_seq,306,0.000899,true,0.0001 +qp,p32i16,ip_seq,307,0.000946,true,0.0001 +qp,p32i16,ip_seq,308,0.021817,false,0.0001 +qp,p32i16,ip_seq,309,0.027092,false,0.0001 +qp,p32i16,ip_seq,310,0.03548,false,0.0001 +qp,p32i16,ip_seq,311,0.002192,false,0.0001 +qp,p32i16,ip_seq,312,0.001928,false,0.0001 +qp,p32i16,ip_seq,313,0.002461,false,0.0001 +qp,p32i16,ip_seq,314,0.041309,false,0.0001 +qp,p32i16,ip_seq,315,0.040325,false,0.0001 +qp,p32i16,ip_seq,316,0.000902,true,0.0001 +qp,p32i16,ip_seq,317,0.000954,true,0.0001 +qp,p32i16,ip_seq,318,0.002712,true,0.0001 +qp,p32i16,ip_seq,319,0.000805,true,0.0001 +qp,p32i16,ip_seq,320,0.00174,false,0.0001 +qp,p32i16,ip_seq,321,0.001241,true,0.0001 +qp,p32i16,ip_seq,322,0.000892,true,0.0001 +qp,p32i16,ip_seq,323,0.023493,false,0.0001 +qp,p32i16,ip_seq,324,0.002737,true,0.0001 +qp,p32i16,ip_seq,325,0.023761,false,0.0001 +qp,p32i16,ip_seq,326,0.000849,true,0.0001 +qp,p32i16,ip_seq,327,0.002021,false,0.0001 +qp,p32i16,ip_seq,328,0.000681,true,0.0001 +qp,p32i16,ip_seq,329,0.000626,true,0.0001 +qp,p32i16,ip_seq,330,0.000925,true,0.0001 +qp,p32i16,ip_seq,331,0.002536,false,0.0001 +qp,p32i16,ip_seq,332,0.040308,false,0.0001 +qp,p32i16,ip_seq,333,0.033959,false,0.0001 +qp,p32i16,ip_seq,334,0.029843,false,0.0001 +qp,p32i16,ip_seq,335,0.000914,true,0.0001 +qp,p32i16,ip_seq,336,0.000897,true,0.0001 +qp,p32i16,ip_seq,337,0.004254,false,0.0001 +qp,p32i16,ip_seq,338,0.000734,true,0.0001 +qp,p32i16,ip_seq,339,0.000765,true,0.0001 +qp,p32i16,ip_seq,340,0.000819,true,0.0001 +qp,p32i16,ip_seq,341,0.000699,true,0.0001 +qp,p32i16,ip_seq,342,0.022637,false,0.0001 +qp,p32i16,ip_seq,343,0.024132,false,0.0001 +qp,p32i16,ip_seq,344,0.000942,true,0.0001 +qp,p32i16,ip_seq,345,0.000609,true,0.0001 +qp,p32i16,ip_seq,346,0.037479,false,0.0001 +qp,p32i16,ip_seq,347,0.024721,false,0.0001 +qp,p32i16,ip_seq,348,0.004826,false,0.0001 +qp,p32i16,ip_seq,349,0.000825,true,0.0001 +qp,p32i16,ip_seq,350,0.00793,false,0.0001 +qp,p32i16,ip_seq,351,0.036836,false,0.0001 +qp,p32i16,ip_seq,352,0.041664,false,0.0001 +qp,p32i16,ip_seq,353,0.000792,true,0.0001 +qp,p32i16,ip_seq,354,0.038658,false,0.0001 +qp,p32i16,ip_seq,355,0.000868,true,0.0001 +qp,p32i16,ip_seq,356,0.001909,false,0.0001 +qp,p32i16,ip_seq,357,0.041146,false,0.0001 +qp,p32i16,ip_seq,358,0.022896,false,0.0001 +qp,p32i16,ip_seq,359,0.040372,false,0.0001 +qp,p32i16,ip_seq,360,0.023195,false,0.0001 +qp,p32i16,ip_seq,361,0.000983,true,0.0001 +qp,p32i16,ip_seq,362,0.001041,true,0.0001 +qp,p32i16,ip_seq,363,0.002227,false,0.0001 +qp,p32i16,ip_seq,364,0.027688,false,0.0001 +qp,p32i16,ip_seq,365,0.002308,false,0.0001 +qp,p32i16,ip_seq,366,0.002696,false,0.0001 +qp,p32i16,ip_seq,367,0.045047,false,0.0001 +qp,p32i16,ip_seq,368,0.038807,false,0.0001 +qp,p32i16,ip_seq,369,0.015725,false,0.0001 +qp,p32i16,ip_seq,370,0.003759,true,0.0001 +qp,p32i16,ip_seq,371,0.000729,true,0.0001 +qp,p32i16,ip_seq,372,0.021546,false,0.0001 +qp,p32i16,ip_seq,373,0.000887,true,0.0001 +qp,p32i16,ip_seq,374,0.000756,true,0.0001 +qp,p32i16,ip_seq,375,0.036783,false,0.0001 +qp,p32i16,ip_seq,376,0.002906,true,0.0001 +qp,p32i16,ip_seq,377,0.038233,false,0.0001 +qp,p32i16,ip_seq,378,0.027685,false,0.0001 +qp,p32i16,ip_seq,379,0.001005,true,0.0001 +qp,p32i16,ip_seq,380,0.001919,false,0.0001 +qp,p32i16,ip_seq,381,0.000699,true,0.0001 +qp,p32i16,ip_seq,382,0.000883,true,0.0001 +qp,p32i16,ip_seq,383,0.000845,true,0.0001 +qp,p32i16,ip_seq,384,0.047952,false,0.0001 +qp,p32i16,ip_seq,385,0.002715,true,0.0001 +qp,p32i16,ip_seq,386,0.041664,false,0.0001 +qp,p32i16,ip_seq,387,0.042975,false,0.0001 +qp,p32i16,ip_seq,388,0.002107,false,0.0001 +qp,p32i16,ip_seq,389,0.000678,true,0.0001 +qp,p32i16,ip_seq,390,0.000873,true,0.0001 +qp,p32i16,ip_seq,391,0.00252,false,0.0001 +qp,p32i16,ip_seq,392,0.037688,false,0.0001 +qp,p32i16,ip_seq,393,0.000819,true,0.0001 +qp,p32i16,ip_seq,394,0.000776,true,0.0001 +qp,p32i16,ip_seq,395,0.02308,false,0.0001 +qp,p32i16,ip_seq,396,0.000999,true,0.0001 +qp,p32i16,ip_seq,397,0.052622,false,0.0001 +qp,p32i16,ip_seq,398,0.000723,true,0.0001 +qp,p32i16,ip_seq,399,0.03798,false,0.0001 +qp,p32i16,ip_seq,400,0.035363,false,0.0001 +qp,p32i16,ip_seq,401,0.022409,false,0.0001 +qp,p32i16,ip_seq,402,0.000828,true,0.0001 +qp,p32i16,ip_seq,403,0.004084,false,0.0001 +qp,p32i16,ip_seq,404,0.000792,true,0.0001 +qp,p32i16,ip_seq,405,0.026061,false,0.0001 +qp,p32i16,ip_seq,406,0.006351,false,0.0001 +qp,p32i16,ip_seq,407,0.023592,false,0.0001 +qp,p32i16,ip_seq,408,0.037305,false,0.0001 +qp,p32i16,ip_seq,409,0.043667,false,0.0001 +qp,p32i16,ip_seq,410,0.002462,false,0.0001 +qp,p32i16,ip_seq,411,0.000947,true,0.0001 +qp,p32i16,ip_seq,412,0.025668,false,0.0001 +qp,p32i16,ip_seq,413,0.037468,false,0.0001 +qp,p32i16,ip_seq,414,0.024923,false,0.0001 +qp,p32i16,ip_seq,415,0.002128,false,0.0001 +qp,p32i16,ip_seq,416,0.000846,true,0.0001 +qp,p32i16,ip_seq,417,0.002009,false,0.0001 +qp,p32i16,ip_seq,418,0.034837,false,0.0001 +qp,p32i16,ip_seq,419,0.025989,false,0.0001 +qp,p32i16,ip_seq,420,0.000747,true,0.0001 +qp,p32i16,ip_seq,421,0.035718,false,0.0001 +qp,p32i16,ip_seq,422,0.022509,false,0.0001 +qp,p32i16,ip_seq,423,0.039698,false,0.0001 +qp,p32i16,ip_seq,424,0.000934,true,0.0001 +qp,p32i16,ip_seq,425,0.000703,true,0.0001 +qp,p32i16,ip_seq,426,0.039632,false,0.0001 +qp,p32i16,ip_seq,427,0.000718,true,0.0001 +qp,p32i16,ip_seq,428,0.000757,true,0.0001 +qp,p32i16,ip_seq,429,0.00539,false,0.0001 +qp,p32i16,ip_seq,430,0.000715,true,0.0001 +qp,p32i16,ip_seq,431,0.000766,true,0.0001 +qp,p32i16,ip_seq,432,0.037377,false,0.0001 +qp,p32i16,ip_seq,433,0.000885,true,0.0001 +qp,p32i16,ip_seq,434,0.000802,true,0.0001 +qp,p32i16,ip_seq,435,0.000788,true,0.0001 +qp,p32i16,ip_seq,436,0.002165,false,0.0001 +qp,p32i16,ip_seq,437,0.001988,false,0.0001 +qp,p32i16,ip_seq,438,0.000825,true,0.0001 +qp,p32i16,ip_seq,439,0.000978,true,0.0001 +qp,p32i16,ip_seq,440,0.000664,true,0.0001 +qp,p32i16,ip_seq,441,0.04815,false,0.0001 +qp,p32i16,ip_seq,442,0.00083,true,0.0001 +qp,p32i16,ip_seq,443,0.000874,true,0.0001 +qp,p32i16,ip_seq,444,0.032918,false,0.0001 +qp,p32i16,ip_seq,445,0.041023,false,0.0001 +qp,p32i16,ip_seq,446,0.040949,false,0.0001 +qp,p32i16,ip_seq,447,0.042242,false,0.0001 +qp,p32i16,ip_seq,448,0.000856,true,0.0001 +qp,p32i16,ip_seq,449,0.001079,true,0.0001 +qp,p32i16,ip_seq,450,0.000634,true,0.0001 +qp,p32i16,ip_seq,451,0.000664,true,0.0001 +qp,p32i16,ip_seq,452,0.0373,true,0.0001 +qp,p32i16,ip_seq,453,0.035757,false,0.0001 +qp,p32i16,ip_seq,454,0.000793,true,0.0001 +qp,p32i16,ip_seq,455,0.000622,true,0.0001 +qp,p32i16,ip_seq,456,0.000969,true,0.0001 +qp,p32i16,ip_seq,457,0.038401,false,0.0001 +qp,p32i16,ip_seq,458,0.002661,true,0.0001 +qp,p32i16,ip_seq,459,0.000799,true,0.0001 +qp,p32i16,ip_seq,460,0.027067,false,0.0001 +qp,p32i16,ip_seq,461,0.004379,false,0.0001 +qp,p32i16,ip_seq,462,0.001047,true,0.0001 +qp,p32i16,ip_seq,463,0.000799,true,0.0001 +qp,p32i16,ip_seq,464,0.000629,true,0.0001 +qp,p32i16,ip_seq,465,0.023467,false,0.0001 +qp,p32i16,ip_seq,466,0.002397,false,0.0001 +qp,p32i16,ip_seq,467,0.0028,true,0.0001 +qp,p32i16,ip_seq,468,0.000754,true,0.0001 +qp,p32i16,ip_seq,469,0.000701,true,0.0001 +qp,p32i16,ip_seq,470,0.035809,false,0.0001 +qp,p32i16,ip_seq,471,0.045094,false,0.0001 +qp,p32i16,ip_seq,472,0.000796,true,0.0001 +qp,p32i16,ip_seq,473,0.038173,false,0.0001 +qp,p32i16,ip_seq,474,0.000869,true,0.0001 +qp,p32i16,ip_seq,475,0.026036,false,0.0001 +qp,p32i16,ip_seq,476,0.004262,false,0.0001 +qp,p32i16,ip_seq,477,0.0021,false,0.0001 +qp,p32i16,ip_seq,478,0.000716,true,0.0001 +qp,p32i16,ip_seq,479,0.000725,true,0.0001 +qp,p32i16,ip_seq,480,0.002324,false,0.0001 +qp,p32i16,ip_seq,481,0.000853,true,0.0001 +qp,p32i16,ip_seq,482,0.039574,false,0.0001 +qp,p32i16,ip_seq,483,0.039634,false,0.0001 +qp,p32i16,ip_seq,484,0.001921,false,0.0001 +qp,p32i16,ip_seq,485,0.00062,true,0.0001 +qp,p32i16,ip_seq,486,0.041598,false,0.0001 +qp,p32i16,ip_seq,487,0.000912,true,0.0001 +qp,p32i16,ip_seq,488,0.002299,false,0.0001 +qp,p32i16,ip_seq,489,0.000802,true,0.0001 +qp,p32i16,ip_seq,490,0.039015,false,0.0001 +qp,p32i16,ip_seq,491,0.000848,true,0.0001 +qp,p32i16,ip_seq,492,0.002169,false,0.0001 +qp,p32i16,ip_seq,493,0.000805,true,0.0001 +qp,p32i16,ip_seq,494,0.028775,false,0.0001 +qp,p32i16,ip_seq,495,0.000804,true,0.0001 +qp,p32i16,ip_seq,496,0.00207,false,0.0001 +qp,p32i16,ip_seq,497,0.025442,false,0.0001 +qp,p32i16,ip_seq,498,0.041955,false,0.0001 +qp,p32i16,ip_seq,499,0.026151,false,0.0001 +qp,p32i16,ip_seq,500,0.000876,true,0.0001 +qp,p32i16,ip_seq,501,0.000718,true,0.0001 +qp,p32i16,ip_seq,502,0.029451,false,0.0001 +qp,p32i16,ip_seq,503,0.000806,true,0.0001 +qp,p32i16,ip_seq,504,0.034965,false,0.0001 +qp,p32i16,ip_seq,505,0.037219,false,0.0001 +qp,p32i16,ip_seq,506,0.023565,false,0.0001 +qp,p32i16,ip_seq,507,0.004495,false,0.0001 +qp,p32i16,ip_seq,508,0.000738,true,0.0001 +qp,p32i16,ip_seq,509,0.037936,false,0.0001 +qp,p32i16,ip_seq,510,0.000784,true,0.0001 +qp,p32i16,ip_seq,511,0.001963,false,0.0001 +qp,p32i16,ip_seq,512,0.000743,true,0.0001 +qp,p32i16,ip_seq,513,0.025105,false,0.0001 +qp,p32i16,ip_seq,514,0.000785,true,0.0001 +qp,p32i16,ip_seq,515,0.002926,true,0.0001 +qp,p32i16,ip_seq,516,0.001042,true,0.0001 +qp,p32i16,ip_seq,517,0.001243,true,0.0001 +qp,p32i16,ip_seq,518,0.000801,true,0.0001 +qp,p32i16,ip_seq,519,0.000912,true,0.0001 +qp,p32i16,ip_seq,520,0.039961,false,0.0001 +qp,p32i16,ip_seq,521,0.000926,true,0.0001 +qp,p32i16,ip_seq,522,0.034158,false,0.0001 +qp,p32i16,ip_seq,523,0.000849,true,0.0001 +qp,p32i16,ip_seq,524,0.038294,false,0.0001 +qp,p32i16,ip_seq,525,0.035871,false,0.0001 +qp,p32i16,ip_seq,526,0.00069,true,0.0001 +qp,p32i16,ip_seq,527,0.024786,false,0.0001 +qp,p32i16,ip_seq,528,0.000958,true,0.0001 +qp,p32i16,ip_seq,529,0.000786,true,0.0001 +qp,p32i16,ip_seq,530,0.000835,true,0.0001 +qp,p32i16,ip_seq,531,0.002396,false,0.0001 +qp,p32i16,ip_seq,532,0.096992,false,0.0001 +qp,p32i16,ip_seq,533,0.105556,false,0.0001 +qp,p32i16,ip_seq,534,0.036189,false,0.0001 +qp,p32i16,ip_seq,535,0.002005,false,0.0001 +qp,p32i16,ip_seq,536,0.036797,false,0.0001 +qp,p32i16,ip_seq,537,0.038641,false,0.0001 +qp,p32i16,ip_seq,538,0.002182,false,0.0001 +qp,p32i16,ip_seq,539,0.041647,false,0.0001 +qp,p32i16,ip_seq,540,0.002069,true,0.0001 +qp,p32i16,ip_seq,541,0.000784,true,0.0001 +qp,p32i16,ip_seq,542,0.00078,true,0.0001 +qp,p32i16,ip_seq,543,0.001934,false,0.0001 +qp,p32i16,ip_seq,544,0.002143,true,0.0001 +qp,p32i16,ip_seq,545,0.001969,false,0.0001 +qp,p32i16,ip_seq,546,0.000805,true,0.0001 +qp,p32i16,ip_seq,547,0.036228,false,0.0001 +qp,p32i16,ip_seq,548,0.000823,true,0.0001 +qp,p32i16,ip_seq,549,0.000899,true,0.0001 +qp,p32i16,ip_seq,550,0.00091,true,0.0001 +qp,p32i16,ip_seq,551,0.022473,false,0.0001 +qp,p32i16,ip_seq,552,0.002096,false,0.0001 +qp,p32i16,ip_seq,553,0.000703,true,0.0001 +qp,p32i16,ip_seq,554,0.00555,true,0.0001 +qp,p32i16,ip_seq,555,0.042962,false,0.0001 +qp,p32i16,ip_seq,556,0.002447,false,0.0001 +qp,p32i16,ip_seq,557,0.033063,false,0.0001 +qp,p32i16,ip_seq,558,0.024482,false,0.0001 +qp,p32i16,ip_seq,559,0.037337,false,0.0001 +qp,p32i16,ip_seq,560,0.000789,true,0.0001 +qp,p32i16,ip_seq,561,0.000805,true,0.0001 +qp,p32i16,ip_seq,562,0.002474,false,0.0001 +qp,p32i16,ip_seq,563,0.002038,false,0.0001 +qp,p32i16,ip_seq,564,0.000656,true,0.0001 +qp,p32i16,ip_seq,565,0.002263,false,0.0001 +qp,p32i16,ip_seq,566,0.037287,false,0.0001 +qp,p32i16,ip_seq,567,0.000784,true,0.0001 +qp,p32i16,ip_seq,568,0.045556,false,0.0001 +qp,p32i16,ip_seq,569,0.043953,false,0.0001 +qp,p32i16,ip_seq,570,0.027538,false,0.0001 +qp,p32i16,ip_seq,571,0.037634,false,0.0001 +qp,p32i16,ip_seq,572,0.043472,false,0.0001 +qp,p32i16,ip_seq,573,0.002177,false,0.0001 +qp,p32i16,ip_seq,574,0.000951,true,0.0001 +qp,p32i16,ip_seq,575,0.036589,false,0.0001 +qp,p32i16,ip_seq,576,0.035068,false,0.0001 +qp,p32i16,ip_seq,577,0.002204,false,0.0001 +qp,p32i16,ip_seq,578,0.000814,true,0.0001 +qp,p32i16,ip_seq,579,0.016787,false,0.0001 +qp,p32i16,ip_seq,580,0.000726,true,0.0001 +qp,p32i16,ip_seq,581,0.044328,false,0.0001 +qp,p32i16,ip_seq,582,0.002249,false,0.0001 +qp,p32i16,ip_seq,583,0.001371,true,0.0001 +qp,p32i16,ip_seq,584,0.000916,true,0.0001 +qp,p32i16,ip_seq,585,0.001024,true,0.0001 +qp,p32i16,ip_seq,586,0.040273,false,0.0001 +qp,p32i16,ip_seq,587,0.024762,false,0.0001 +qp,p32i16,ip_seq,588,0.001119,true,0.0001 +qp,p32i16,ip_seq,589,0.00108,true,0.0001 +qp,p32i16,ip_seq,590,0.000894,true,0.0001 +qp,p32i16,ip_seq,591,0.000738,true,0.0001 +qp,p32i16,ip_seq,592,0.001204,true,0.0001 +qp,p32i16,ip_seq,593,0.037351,false,0.0001 +qp,p32i16,ip_seq,594,0.000788,true,0.0001 +qp,p32i16,ip_seq,595,0.000573,true,0.0001 +qp,p32i16,ip_seq,596,0.004565,false,0.0001 +qp,p32i16,ip_seq,597,0.000891,true,0.0001 +qp,p32i16,ip_seq,598,0.000929,true,0.0001 +qp,p32i16,ip_seq,599,0.000902,true,0.0001 +qp,p32i16,ip_seq,600,0.000784,true,0.0001 +qp,p32i16,ip_seq,601,0.022622,false,0.0001 +qp,p32i16,ip_seq,602,0.000755,true,0.0001 +qp,p32i16,ip_seq,603,0.002358,false,0.0001 +qp,p32i16,ip_seq,604,0.004359,false,0.0001 +qp,p32i16,ip_seq,605,0.000719,true,0.0001 +qp,p32i16,ip_seq,606,0.035809,false,0.0001 +qp,p32i16,ip_seq,607,0.028379,false,0.0001 +qp,p32i16,ip_seq,608,0.041826,false,0.0001 +qp,p32i16,ip_seq,609,0.048685,false,0.0001 +qp,p32i16,ip_seq,610,0.041747,false,0.0001 +qp,p32i16,ip_seq,611,0.000782,true,0.0001 +qp,p32i16,ip_seq,612,0.03815,false,0.0001 +qp,p32i16,ip_seq,613,0.026605,false,0.0001 +qp,p32i16,ip_seq,614,0.000946,true,0.0001 +qp,p32i16,ip_seq,615,0.016377,true,0.0001 +qp,p32i16,ip_seq,616,0.035374,false,0.0001 +qp,p32i16,ip_seq,617,0.000621,true,0.0001 +qp,p32i16,ip_seq,618,0.000732,true,0.0001 +qp,p32i16,ip_seq,619,0.026579,false,0.0001 +qp,p32i16,ip_seq,620,0.000638,true,0.0001 +qp,p32i16,ip_seq,621,0.000821,true,0.0001 +qp,p32i16,ip_seq,622,0.002149,false,0.0001 +qp,p32i16,ip_seq,623,0.000637,true,0.0001 +qp,p32i16,ip_seq,624,0.037539,false,0.0001 +qp,p32i16,ip_seq,625,0.000851,true,0.0001 +qp,p32i16,ip_seq,626,0.02335,false,0.0001 +qp,p32i16,ip_seq,627,0.024874,false,0.0001 +qp,p32i16,ip_seq,628,0.04032,false,0.0001 +qp,p32i16,ip_seq,629,0.000816,true,0.0001 +qp,p32i16,ip_seq,630,0.000958,true,0.0001 +qp,p32i16,ip_seq,631,0.024433,false,0.0001 +qp,p32i16,ip_seq,632,0.000975,true,0.0001 +qp,p32i16,ip_seq,633,0.001814,false,0.0001 +qp,p32i16,ip_seq,634,0.035869,false,0.0001 +qp,p32i16,ip_seq,635,0.027315,false,0.0001 +qp,p32i16,ip_seq,636,0.000853,true,0.0001 +qp,p32i16,ip_seq,637,0.026772,false,0.0001 +qp,p32i16,ip_seq,638,0.00064,true,0.0001 +qp,p32i16,ip_seq,639,0.045659,false,0.0001 +qp,p32i16,ip_seq,640,0.001041,true,0.0001 +qp,p32i16,ip_seq,641,0.038985,false,0.0001 +qp,p32i16,ip_seq,642,0.00078,true,0.0001 +qp,p32i16,ip_seq,643,0.002775,false,0.0001 +qp,p32i16,ip_seq,644,0.025281,false,0.0001 +qp,p32i16,ip_seq,645,0.037528,false,0.0001 +qp,p32i16,ip_seq,646,0.002207,false,0.0001 +qp,p32i16,ip_seq,647,0.036372,false,0.0001 +qp,p32i16,ip_seq,648,0.038175,false,0.0001 +qp,p32i16,ip_seq,649,0.034934,false,0.0001 +qp,p32i16,ip_seq,650,0.002645,false,0.0001 +qp,p32i16,ip_seq,651,0.002057,false,0.0001 +qp,p32i16,ip_seq,652,0.002638,false,0.0001 +qp,p32i16,ip_seq,653,0.004036,false,0.0001 +qp,p32i16,ip_seq,654,0.02143,false,0.0001 +qp,p32i16,ip_seq,655,0.039709,false,0.0001 +qp,p32i16,ip_seq,656,0.037416,false,0.0001 +qp,p32i16,ip_seq,657,0.000771,true,0.0001 +qp,p32i16,ip_seq,658,0.028425,false,0.0001 +qp,p32i16,ip_seq,659,0.000833,true,0.0001 +qp,p32i16,ip_seq,660,0.002078,false,0.0001 +qp,p32i16,ip_seq,661,0.040999,false,0.0001 +qp,p32i16,ip_seq,662,0.000929,true,0.0001 +qp,p32i16,ip_seq,663,0.038868,false,0.0001 +qp,p32i16,ip_seq,664,0.037264,false,0.0001 +qp,p32i16,ip_seq,665,0.000706,true,0.0001 +qp,p32i16,ip_seq,666,0.000933,true,0.0001 +qp,p32i16,ip_seq,667,0.000995,true,0.0001 +qp,p32i16,ip_seq,668,0.035667,false,0.0001 +qp,p32i16,ip_seq,669,0.040335,false,0.0001 +qp,p32i16,ip_seq,670,0.00207,false,0.0001 +qp,p32i16,ip_seq,671,0.036686,false,0.0001 +qp,p32i16,ip_seq,672,0.000753,true,0.0001 +qp,p32i16,ip_seq,673,0.002896,true,0.0001 +qp,p32i16,ip_seq,674,0.026151,false,0.0001 +qp,p32i16,ip_seq,675,0.001956,false,0.0001 +qp,p32i16,ip_seq,676,0.004489,false,0.0001 +qp,p32i16,ip_seq,677,0.039167,false,0.0001 +qp,p32i16,ip_seq,678,0.000915,true,0.0001 +qp,p32i16,ip_seq,679,0.03998,false,0.0001 +qp,p32i16,ip_seq,680,0.035863,false,0.0001 +qp,p32i16,ip_seq,681,0.034655,false,0.0001 +qp,p32i16,ip_seq,682,0.000817,true,0.0001 +qp,p32i16,ip_seq,683,0.040457,false,0.0001 +qp,p32i16,ip_seq,684,0.000631,true,0.0001 +qp,p32i16,ip_seq,685,0.040837,false,0.0001 +qp,p32i16,ip_seq,686,0.000706,true,0.0001 +qp,p32i16,ip_seq,687,0.000742,true,0.0001 +qp,p32i16,ip_seq,688,0.000865,true,0.0001 +qp,p32i16,ip_seq,689,0.000762,true,0.0001 +qp,p32i16,ip_seq,690,0.044772,false,0.0001 +qp,p32i16,ip_seq,691,0.029911,false,0.0001 +qp,p32i16,ip_seq,692,0.026933,false,0.0001 +qp,p32i16,ip_seq,693,0.00074,true,0.0001 +qp,p32i16,ip_seq,694,0.001895,false,0.0001 +qp,p32i16,ip_seq,695,0.00064,true,0.0001 +qp,p32i16,ip_seq,696,0.042237,false,0.0001 +qp,p32i16,ip_seq,697,0.036833,false,0.0001 +qp,p32i16,ip_seq,698,0.019458,true,0.0001 +qp,p32i16,ip_seq,699,0.040623,false,0.0001 +qp,p32i16,ip_seq,700,0.002346,false,0.0001 +qp,p32i16,ip_seq,701,0.045812,false,0.0001 +qp,p32i16,ip_seq,702,0.045627,false,0.0001 +qp,p32i16,ip_seq,703,0.000617,true,0.0001 +qp,p32i16,ip_seq,704,0.026106,false,0.0001 +qp,p32i16,ip_seq,705,0.000719,true,0.0001 +qp,p32i16,ip_seq,706,0.000808,true,0.0001 +qp,p32i16,ip_seq,707,0.000768,true,0.0001 +qp,p32i16,ip_seq,708,0.000966,true,0.0001 +qp,p32i16,ip_seq,709,0.000832,true,0.0001 +qp,p32i16,ip_seq,710,0.026316,false,0.0001 +qp,p32i16,ip_seq,711,0.00057,true,0.0001 +qp,p32i16,ip_seq,712,0.036983,false,0.0001 +qp,p32i16,ip_seq,713,0.000906,true,0.0001 +qp,p32i16,ip_seq,714,0.000844,true,0.0001 +qp,p32i16,ip_seq,715,0.001994,false,0.0001 +qp,p32i16,ip_seq,716,0.001933,false,0.0001 +qp,p32i16,ip_seq,717,0.000806,true,0.0001 +qp,p32i16,ip_seq,718,0.00436,false,0.0001 +qp,p32i16,ip_seq,719,0.039428,false,0.0001 +qp,p32i16,ip_seq,720,0.000913,true,0.0001 +qp,p32i16,ip_seq,721,0.041553,false,0.0001 +qp,p32i16,ip_seq,722,0.000932,true,0.0001 +qp,p32i16,ip_seq,723,0.027718,false,0.0001 +qp,p32i16,ip_seq,724,0.000802,true,0.0001 +qp,p32i16,ip_seq,725,0.024937,false,0.0001 +qp,p32i16,ip_seq,726,0.001974,false,0.0001 +qp,p32i16,ip_seq,727,0.038566,false,0.0001 +qp,p32i16,ip_seq,728,0.000801,true,0.0001 +qp,p32i16,ip_seq,729,0.029346,false,0.0001 +qp,p32i16,ip_seq,730,0.03961,false,0.0001 +qp,p32i16,ip_seq,731,0.000977,true,0.0001 +qp,p32i16,ip_seq,732,0.000876,true,0.0001 +qp,p32i16,ip_seq,733,0.000712,true,0.0001 +qp,p32i16,ip_seq,734,0.000765,true,0.0001 +qp,p32i16,ip_seq,735,0.003126,true,0.0001 +qp,p32i16,ip_seq,736,0.037585,false,0.0001 +qp,p32i16,ip_seq,737,0.024198,false,0.0001 +qp,p32i16,ip_seq,738,0.002254,false,0.0001 +qp,p32i16,ip_seq,739,0.028102,false,0.0001 +qp,p32i16,ip_seq,740,0.000811,true,0.0001 +qp,p32i16,ip_seq,741,0.000771,true,0.0001 +qp,p32i16,ip_seq,742,0.000613,true,0.0001 +qp,p32i16,ip_seq,743,0.024074,false,0.0001 +qp,p32i16,ip_seq,744,0.036527,false,0.0001 +qp,p32i16,ip_seq,745,0.037364,false,0.0001 +qp,p32i16,ip_seq,746,0.043131,false,0.0001 +qp,p32i16,ip_seq,747,0.00192,false,0.0001 +qp,p32i16,ip_seq,748,0.000717,true,0.0001 +qp,p32i16,ip_seq,749,0.000941,true,0.0001 +qp,p32i16,ip_seq,750,0.000837,true,0.0001 +qp,p32i16,ip_seq,751,0.000897,true,0.0001 +qp,p32i16,ip_seq,752,0.027569,false,0.0001 +qp,p32i16,ip_seq,753,0.002275,false,0.0001 +qp,p32i16,ip_seq,754,0.024362,false,0.0001 +qp,p32i16,ip_seq,755,0.003025,true,0.0001 +qp,p32i16,ip_seq,756,0.000896,true,0.0001 +qp,p32i16,ip_seq,757,0.002269,false,0.0001 +qp,p32i16,ip_seq,758,0.038838,false,0.0001 +qp,p32i16,ip_seq,759,0.002089,false,0.0001 +qp,p32i16,ip_seq,760,0.004117,false,0.0001 +qp,p32i16,ip_seq,761,0.024741,false,0.0001 +qp,p32i16,ip_seq,762,0.000928,true,0.0001 +qp,p32i16,ip_seq,763,0.002323,false,0.0001 +qp,p32i16,ip_seq,764,0.045915,false,0.0001 +qp,p32i16,ip_seq,765,0.000851,true,0.0001 +qp,p32i16,ip_seq,766,0.043537,false,0.0001 +qp,p32i16,ip_seq,767,0.037545,false,0.0001 +qp,p32i16,ip_seq,768,0.039955,false,0.0001 +qp,p32i16,ip_seq,769,0.002291,false,0.0001 +qp,p32i16,ip_seq,770,0.004144,false,0.0001 +qp,p32i16,ip_seq,771,0.000765,true,0.0001 +qp,p32i16,ip_seq,772,0.038221,false,0.0001 +qp,p32i16,ip_seq,773,0.040466,false,0.0001 +qp,p32i16,ip_seq,774,0.002312,false,0.0001 +qp,p32i16,ip_seq,775,0.026495,false,0.0001 +qp,p32i16,ip_seq,776,0.023284,false,0.0001 +qp,p32i16,ip_seq,777,0.022672,false,0.0001 +qp,p32i16,ip_seq,778,0.00225,false,0.0001 +qp,p32i16,ip_seq,779,0.040292,false,0.0001 +qp,p32i16,ip_seq,780,0.000891,true,0.0001 +qp,p32i16,ip_seq,781,0.000642,true,0.0001 +qp,p32i16,ip_seq,782,0.002476,true,0.0001 +qp,p32i16,ip_seq,783,0.035022,false,0.0001 +qp,p32i16,ip_seq,784,0.041606,false,0.0001 +qp,p32i16,ip_seq,785,0.00087,true,0.0001 +qp,p32i16,ip_seq,786,0.00468,true,0.0001 +qp,p32i16,ip_seq,787,0.000746,true,0.0001 +qp,p32i16,ip_seq,788,0.001781,false,0.0001 +qp,p32i16,ip_seq,789,0.038432,false,0.0001 +qp,p32i16,ip_seq,790,0.042281,false,0.0001 +qp,p32i16,ip_seq,791,0.024315,false,0.0001 +qp,p32i16,ip_seq,792,0.037168,false,0.0001 +qp,p32i16,ip_seq,793,0.03369,false,0.0001 +qp,p32i16,ip_seq,794,0.000966,true,0.0001 +qp,p32i16,ip_seq,795,0.021363,false,0.0001 +qp,p32i16,ip_seq,796,0.002144,false,0.0001 +qp,p32i16,ip_seq,797,0.001026,true,0.0001 +qp,p32i16,ip_seq,798,0.002839,true,0.0001 +qp,p32i16,ip_seq,799,0.038243,false,0.0001 +qp,p32i16,ip_seq,800,0.00076,true,0.0001 +qp,p32i16,ip_seq,801,0.02685,false,0.0001 +qp,p32i16,ip_seq,802,0.000915,true,0.0001 +qp,p32i16,ip_seq,803,0.000907,true,0.0001 +qp,p32i16,ip_seq,804,0.000644,true,0.0001 +qp,p32i16,ip_seq,805,0.000784,true,0.0001 +qp,p32i16,ip_seq,806,0.00079,true,0.0001 +qp,p32i16,ip_seq,807,0.022963,false,0.0001 +qp,p32i16,ip_seq,808,0.037009,false,0.0001 +qp,p32i16,ip_seq,809,0.000779,true,0.0001 +qp,p32i16,ip_seq,810,0.043323,false,0.0001 +qp,p32i16,ip_seq,811,0.00103,true,0.0001 +qp,p32i16,ip_seq,812,0.001631,false,0.0001 +qp,p32i16,ip_seq,813,0.000786,true,0.0001 +qp,p32i16,ip_seq,814,0.023846,false,0.0001 +qp,p32i16,ip_seq,815,0.000689,true,0.0001 +qp,p32i16,ip_seq,816,0.038359,false,0.0001 +qp,p32i16,ip_seq,817,0.0008,true,0.0001 +qp,p32i16,ip_seq,818,0.000651,true,0.0001 +qp,p32i16,ip_seq,819,0.037915,false,0.0001 +qp,p32i16,ip_seq,820,0.00116,true,0.0001 +qp,p32i16,ip_seq,821,0.022393,false,0.0001 +qp,p32i16,ip_seq,822,0.00116,true,0.0001 +qp,p32i16,ip_seq,823,0.000904,true,0.0001 +qp,p32i16,ip_seq,824,0.000893,true,0.0001 +qp,p32i16,ip_seq,825,0.000856,true,0.0001 +qp,p32i16,ip_seq,826,0.002252,false,0.0001 +qp,p32i16,ip_seq,827,0.000887,true,0.0001 +qp,p32i16,ip_seq,828,0.000704,true,0.0001 +qp,p32i16,ip_seq,829,0.00286,false,0.0001 +qp,p32i16,ip_seq,830,0.002059,false,0.0001 +qp,p32i16,ip_seq,831,0.000813,true,0.0001 +qp,p32i16,ip_seq,832,0.045796,false,0.0001 +qp,p32i16,ip_seq,833,0.038624,false,0.0001 +qp,p32i16,ip_seq,834,0.004081,false,0.0001 +qp,p32i16,ip_seq,835,0.021159,false,0.0001 +qp,p32i16,ip_seq,836,0.038268,false,0.0001 +qp,p32i16,ip_seq,837,0.037748,false,0.0001 +qp,p32i16,ip_seq,838,0.022564,false,0.0001 +qp,p32i16,ip_seq,839,0.005284,false,0.0001 +qp,p32i16,ip_seq,840,0.001135,true,0.0001 +qp,p32i16,ip_seq,841,0.00202,false,0.0001 +qp,p32i16,ip_seq,842,0.039749,false,0.0001 +qp,p32i16,ip_seq,843,0.000845,true,0.0001 +qp,p32i16,ip_seq,844,0.000772,true,0.0001 +qp,p32i16,ip_seq,845,0.000659,true,0.0001 +qp,p32i16,ip_seq,846,0.029583,false,0.0001 +qp,p32i16,ip_seq,847,0.025142,false,0.0001 +qp,p32i16,ip_seq,848,0.000744,true,0.0001 +qp,p32i16,ip_seq,849,0.038632,false,0.0001 +qp,p32i16,ip_seq,850,0.00185,false,0.0001 +qp,p32i16,ip_seq,851,0.000832,true,0.0001 +qp,p32i16,ip_seq,852,0.000747,true,0.0001 +qp,p32i16,ip_seq,853,0.001031,true,0.0001 +qp,p32i16,ip_seq,854,0.037601,false,0.0001 +qp,p32i16,ip_seq,855,0.02659,false,0.0001 +qp,p32i16,ip_seq,856,0.029871,false,0.0001 +qp,p32i16,ip_seq,857,0.000863,true,0.0001 +qp,p32i16,ip_seq,858,0.000816,true,0.0001 +qp,p32i16,ip_seq,859,0.000716,true,0.0001 +qp,p32i16,ip_seq,860,0.000824,true,0.0001 +qp,p32i16,ip_seq,861,0.002212,false,0.0001 +qp,p32i16,ip_seq,862,0.027362,false,0.0001 +qp,p32i16,ip_seq,863,0.000672,true,0.0001 +qp,p32i16,ip_seq,864,0.000728,true,0.0001 +qp,p32i16,ip_seq,865,0.040128,false,0.0001 +qp,p32i16,ip_seq,866,0.028477,false,0.0001 +qp,p32i16,ip_seq,867,0.022555,false,0.0001 +qp,p32i16,ip_seq,868,0.002066,false,0.0001 +qp,p32i16,ip_seq,869,0.000549,true,0.0001 +qp,p32i16,ip_seq,870,0.04184,false,0.0001 +qp,p32i16,ip_seq,871,0.000856,true,0.0001 +qp,p32i16,ip_seq,872,0.000949,true,0.0001 +qp,p32i16,ip_seq,873,0.045234,false,0.0001 +qp,p32i16,ip_seq,874,0.000873,true,0.0001 +qp,p32i16,ip_seq,875,0.03034,false,0.0001 +qp,p32i16,ip_seq,876,0.037998,false,0.0001 +qp,p32i16,ip_seq,877,0.000981,true,0.0001 +qp,p32i16,ip_seq,878,0.041344,false,0.0001 +qp,p32i16,ip_seq,879,0.00084,true,0.0001 +qp,p32i16,ip_seq,880,0.000882,true,0.0001 +qp,p32i16,ip_seq,881,0.000934,true,0.0001 +qp,p32i16,ip_seq,882,0.000822,true,0.0001 +qp,p32i16,ip_seq,883,0.000863,true,0.0001 +qp,p32i16,ip_seq,884,0.000775,true,0.0001 +qp,p32i16,ip_seq,885,0.000933,true,0.0001 +qp,p32i16,ip_seq,886,0.037995,false,0.0001 +qp,p32i16,ip_seq,887,0.001194,true,0.0001 +qp,p32i16,ip_seq,888,0.000709,true,0.0001 +qp,p32i16,ip_seq,889,0.039063,false,0.0001 +qp,p32i16,ip_seq,890,0.004,false,0.0001 +qp,p32i16,ip_seq,891,0.036066,false,0.0001 +qp,p32i16,ip_seq,892,0.03729,false,0.0001 +qp,p32i16,ip_seq,893,0.004037,false,0.0001 +qp,p32i16,ip_seq,894,0.000879,true,0.0001 +qp,p32i16,ip_seq,895,0.036164,false,0.0001 +qp,p32i16,ip_seq,896,0.000884,true,0.0001 +qp,p32i16,ip_seq,897,0.041528,false,0.0001 +qp,p32i16,ip_seq,898,0.00194,false,0.0001 +qp,p32i16,ip_seq,899,0.03916,false,0.0001 +qp,p32i16,ip_seq,900,0.00096,true,0.0001 +qp,p32i16,ip_seq,901,0.000895,true,0.0001 +qp,p32i16,ip_seq,902,0.041643,false,0.0001 +qp,p32i16,ip_seq,903,0.000775,true,0.0001 +qp,p32i16,ip_seq,904,0.02377,false,0.0001 +qp,p32i16,ip_seq,905,0.038586,false,0.0001 +qp,p32i16,ip_seq,906,0.036789,false,0.0001 +qp,p32i16,ip_seq,907,0.000721,true,0.0001 +qp,p32i16,ip_seq,908,0.001183,true,0.0001 +qp,p32i16,ip_seq,909,0.000838,true,0.0001 +qp,p32i16,ip_seq,910,0.000971,true,0.0001 +qp,p32i16,ip_seq,911,0.002185,false,0.0001 +qp,p32i16,ip_seq,912,0.038665,false,0.0001 +qp,p32i16,ip_seq,913,0.000869,true,0.0001 +qp,p32i16,ip_seq,914,0.041219,false,0.0001 +qp,p32i16,ip_seq,915,0.002231,false,0.0001 +qp,p32i16,ip_seq,916,0.002096,false,0.0001 +qp,p32i16,ip_seq,917,0.043457,false,0.0001 +qp,p32i16,ip_seq,918,0.040413,false,0.0001 +qp,p32i16,ip_seq,919,0.00065,true,0.0001 +qp,p32i16,ip_seq,920,0.000842,true,0.0001 +qp,p32i16,ip_seq,921,0.031934,false,0.0001 +qp,p32i16,ip_seq,922,0.043422,false,0.0001 +qp,p32i16,ip_seq,923,0.00197,false,0.0001 +qp,p32i16,ip_seq,924,0.001055,true,0.0001 +qp,p32i16,ip_seq,925,0.027435,false,0.0001 +qp,p32i16,ip_seq,926,0.040583,false,0.0001 +qp,p32i16,ip_seq,927,0.000709,true,0.0001 +qp,p32i16,ip_seq,928,0.022786,false,0.0001 +qp,p32i16,ip_seq,929,0.038504,false,0.0001 +qp,p32i16,ip_seq,930,0.000867,true,0.0001 +qp,p32i16,ip_seq,931,0.036829,false,0.0001 +qp,p32i16,ip_seq,932,0.001967,true,0.0001 +qp,p32i16,ip_seq,933,0.025038,false,0.0001 +qp,p32i16,ip_seq,934,0.046071,false,0.0001 +qp,p32i16,ip_seq,935,0.002452,false,0.0001 +qp,p32i16,ip_seq,936,0.038431,false,0.0001 +qp,p32i16,ip_seq,937,0.001105,true,0.0001 +qp,p32i16,ip_seq,938,0.02337,false,0.0001 +qp,p32i16,ip_seq,939,0.000702,true,0.0001 +qp,p32i16,ip_seq,940,0.00094,true,0.0001 +qp,p32i16,ip_seq,941,0.00066,true,0.0001 +qp,p32i16,ip_seq,942,0.000869,true,0.0001 +qp,p32i16,ip_seq,943,0.004244,false,0.0001 +qp,p32i16,ip_seq,944,0.00231,false,0.0001 +qp,p32i16,ip_seq,945,0.042884,false,0.0001 +qp,p32i16,ip_seq,946,0.043701,false,0.0001 +qp,p32i16,ip_seq,947,0.000757,true,0.0001 +qp,p32i16,ip_seq,948,0.000813,true,0.0001 +qp,p32i16,ip_seq,949,0.001166,true,0.0001 +qp,p32i16,ip_seq,950,0.00247,false,0.0001 +qp,p32i16,ip_seq,951,0.020387,false,0.0001 +qp,p32i16,ip_seq,952,0.000832,true,0.0001 +qp,p32i16,ip_seq,953,0.002033,false,0.0001 +qp,p32i16,ip_seq,954,0.015935,false,0.0001 +qp,p32i16,ip_seq,955,0.025804,false,0.0001 +qp,p32i16,ip_seq,956,0.021287,false,0.0001 +qp,p32i16,ip_seq,957,0.000737,true,0.0001 +qp,p32i16,ip_seq,958,0.039427,false,0.0001 +qp,p32i16,ip_seq,959,0.002354,false,0.0001 +qp,p32i16,ip_seq,960,0.038784,false,0.0001 +qp,p32i16,ip_seq,961,0.047446,false,0.0001 +qp,p32i16,ip_seq,962,0.001129,true,0.0001 +qp,p32i16,ip_seq,963,0.021251,false,0.0001 +qp,p32i16,ip_seq,964,0.002651,false,0.0001 +qp,p32i16,ip_seq,965,0.000773,true,0.0001 +qp,p32i16,ip_seq,966,0.000686,true,0.0001 +qp,p32i16,ip_seq,967,0.040884,false,0.0001 +qp,p32i16,ip_seq,968,0.00061,true,0.0001 +qp,p32i16,ip_seq,969,0.042046,false,0.0001 +qp,p32i16,ip_seq,970,0.038956,false,0.0001 +qp,p32i16,ip_seq,971,0.03654,false,0.0001 +qp,p32i16,ip_seq,972,0.002227,false,0.0001 +qp,p32i16,ip_seq,973,0.040887,false,0.0001 +qp,p32i16,ip_seq,974,0.021849,false,0.0001 +qp,p32i16,ip_seq,975,0.001201,true,0.0001 +qp,p32i16,ip_seq,976,0.022713,false,0.0001 +qp,p32i16,ip_seq,977,0.003206,true,0.0001 +qp,p32i16,ip_seq,978,0.001039,true,0.0001 +qp,p32i16,ip_seq,979,0.002168,false,0.0001 +qp,p32i16,ip_seq,980,0.023404,false,0.0001 +qp,p32i16,ip_seq,981,0.040981,false,0.0001 +qp,p32i16,ip_seq,982,0.038124,false,0.0001 +qp,p32i16,ip_seq,983,0.022605,false,0.0001 +qp,p32i16,ip_seq,984,0.039283,false,0.0001 +qp,p32i16,ip_seq,985,0.000837,true,0.0001 +qp,p32i16,ip_seq,986,0.027196,false,0.0001 +qp,p32i16,ip_seq,987,0.000871,true,0.0001 +qp,p32i16,ip_seq,988,0.039471,false,0.0001 +qp,p32i16,ip_seq,989,0.001168,true,0.0001 +qp,p32i16,ip_seq,990,0.022652,false,0.0001 +qp,p32i16,ip_seq,991,0.036437,false,0.0001 +qp,p32i16,ip_seq,992,0.035647,false,0.0001 +qp,p32i16,ip_seq,993,0.000705,true,0.0001 +qp,p32i16,ip_seq,994,0.01194,true,0.0001 +qp,p32i16,ip_seq,995,0.000635,true,0.0001 +qp,p32i16,ip_seq,996,0.000972,true,0.0001 +qp,p32i16,ip_seq,997,0.00219,false,0.0001 +qp,p32i16,ip_seq,998,0.04676,false,0.0001 +qp,p32i16,ip_seq,999,0.00082,true,0.0001 +qp,p32i16,ip_seq,1000,0.034708,false,0.0001 +qp,p32i16,ip_seq,1001,0.002583,false,0.0001 +qp,p32i16,ip_seq,1002,0.0252,false,0.0001 +qp,p32i16,ip_seq,1003,0.000928,true,0.0001 +qp,p32i16,ip_seq,1004,0.002218,false,0.0001 +qp,p32i16,ip_seq,1005,0.00093,true,0.0001 +qp,p32i16,ip_seq,1006,0.000754,true,0.0001 +qp,p32i16,ip_seq,1007,0.025533,false,0.0001 +qp,p32i16,ip_seq,1008,0.02828,false,0.0001 +qp,p32i16,ip_seq,1009,0.03918,false,0.0001 +qp,p32i16,ip_seq,1010,0.000641,true,0.0001 +qp,p32i16,ip_seq,1011,0.000735,true,0.0001 +qp,p32i16,ip_seq,1012,0.000949,true,0.0001 +qp,p32i16,ip_seq,1013,0.035212,false,0.0001 +qp,p32i16,ip_seq,1014,0.025703,false,0.0001 +qp,p32i16,ip_seq,1015,0.000902,true,0.0001 +qp,p32i16,ip_seq,1016,0.00091,true,0.0001 +qp,p32i16,ip_seq,1017,0.000855,true,0.0001 +qp,p32i16,ip_seq,1018,0.000765,true,0.0001 +qp,p32i16,ip_seq,1019,0.000747,true,0.0001 +qp,p32i16,ip_seq,1020,0.001218,true,0.0001 +qp,p32i16,ip_seq,1021,0.000869,true,0.0001 +qp,p32i16,ip_seq,1022,0.002064,false,0.0001 +qp,p32i16,ip_seq,1023,0.002202,false,0.0001 +qp,p32i16,ip_seq,1024,0.04599,false,0.0001 +game,T10,ip_seq,1,0.004118,true,0.0001 +game,T10,ip_seq,2,0.004817,true,0.0001 +game,T10,ip_seq,3,0.003259,true,0.0001 +game,T10,ip_seq,4,0.006742,true,0.0001 +game,T10,ip_seq,5,0.004552,true,0.0001 +game,T10,ip_seq,6,0.0041,true,0.0001 +game,T10,ip_seq,7,0.004307,true,0.0001 +game,T10,ip_seq,8,0.006337,true,0.0001 +game,T10,ip_seq,9,0.003899,true,0.0001 +game,T10,ip_seq,10,0.003867,true,0.0001 +game,T10,ip_seq,11,0.003868,true,0.0001 +game,T10,ip_seq,12,0.005428,true,0.0001 +game,T10,ip_seq,13,0.00931,true,0.0001 +game,T10,ip_seq,14,0.004091,true,0.0001 +game,T10,ip_seq,15,0.004128,true,0.0001 +game,T10,ip_seq,16,0.006353,true,0.0001 +game,T10,ip_seq,17,0.005438,true,0.0001 +game,T10,ip_seq,18,0.00412,true,0.0001 +game,T10,ip_seq,19,0.005679,true,0.0001 +game,T10,ip_seq,20,0.007056,true,0.0001 +game,T10,ip_seq,21,0.004437,true,0.0001 +game,T10,ip_seq,22,0.005061,true,0.0001 +game,T10,ip_seq,23,0.004118,true,0.0001 +game,T10,ip_seq,24,0.006481,true,0.0001 +game,T10,ip_seq,25,0.003951,true,0.0001 +game,T10,ip_seq,26,0.005246,true,0.0001 +game,T10,ip_seq,27,0.003843,true,0.0001 +game,T10,ip_seq,28,0.004351,true,0.0001 +game,T10,ip_seq,29,0.006366,true,0.0001 +game,T10,ip_seq,30,0.004119,true,0.0001 +game,T10,ip_seq,31,0.005396,true,0.0001 +game,T10,ip_seq,32,0.003891,true,0.0001 +game,T10,ip_seq,33,0.008316,true,0.0001 +game,T10,ip_seq,34,0.004086,true,0.0001 +game,T10,ip_seq,35,0.004312,true,0.0001 +game,T10,ip_seq,36,0.007599,true,0.0001 +game,T10,ip_seq,37,0.004167,true,0.0001 +game,T10,ip_seq,38,0.004522,true,0.0001 +game,T10,ip_seq,39,0.004557,true,0.0001 +game,T10,ip_seq,40,0.003845,true,0.0001 +game,T10,ip_seq,41,0.006549,true,0.0001 +game,T10,ip_seq,42,0.00657,true,0.0001 +game,T10,ip_seq,43,0.005224,true,0.0001 +game,T10,ip_seq,44,0.007646,true,0.0001 +game,T10,ip_seq,45,0.004619,true,0.0001 +game,T10,ip_seq,46,0.004318,true,0.0001 +game,T10,ip_seq,47,0.005822,true,0.0001 +game,T10,ip_seq,48,0.068332,true,0.0001 +game,T10,ip_seq,49,0.004186,true,0.0001 +game,T10,ip_seq,50,0.006615,true,0.0001 +game,T10,ip_seq,51,0.004138,true,0.0001 +game,T10,ip_seq,52,0.092211,true,0.0001 +game,T10,ip_seq,53,0.004887,true,0.0001 +game,T10,ip_seq,54,0.004624,true,0.0001 +game,T10,ip_seq,55,0.005098,true,0.0001 +game,T10,ip_seq,56,0.003957,true,0.0001 +game,T10,ip_seq,57,0.004662,true,0.0001 +game,T10,ip_seq,58,0.00392,true,0.0001 +game,T10,ip_seq,59,0.004188,true,0.0001 +game,T10,ip_seq,60,0.005749,true,0.0001 +game,T10,ip_seq,61,0.004175,true,0.0001 +game,T10,ip_seq,62,0.008696,true,0.0001 +game,T10,ip_seq,63,0.004232,true,0.0001 +game,T10,ip_seq,64,0.003943,true,0.0001 +game,T10,ip_seq,65,0.004142,true,0.0001 +game,T10,ip_seq,66,0.004171,true,0.0001 +game,T10,ip_seq,67,0.004885,true,0.0001 +game,T10,ip_seq,68,0.00418,true,0.0001 +game,T10,ip_seq,69,0.008701,true,0.0001 +game,T10,ip_seq,70,0.00417,true,0.0001 +game,T10,ip_seq,71,0.004369,true,0.0001 +game,T10,ip_seq,72,0.0037,true,0.0001 +game,T10,ip_seq,73,0.004395,true,0.0001 +game,T10,ip_seq,74,0.00639,true,0.0001 +game,T10,ip_seq,75,0.005292,true,0.0001 +game,T10,ip_seq,76,0.004108,true,0.0001 +game,T10,ip_seq,77,0.003896,true,0.0001 +game,T10,ip_seq,78,0.006291,true,0.0001 +game,T10,ip_seq,79,0.004126,true,0.0001 +game,T10,ip_seq,80,0.00389,true,0.0001 +game,T10,ip_seq,81,0.00391,true,0.0001 +game,T10,ip_seq,82,0.008954,true,0.0001 +game,T10,ip_seq,83,0.003672,true,0.0001 +game,T10,ip_seq,84,0.003897,true,0.0001 +game,T10,ip_seq,85,0.004733,true,0.0001 +game,T10,ip_seq,86,0.007475,true,0.0001 +game,T10,ip_seq,87,0.005581,true,0.0001 +game,T10,ip_seq,88,0.003881,true,0.0001 +game,T10,ip_seq,89,0.005664,true,0.0001 +game,T10,ip_seq,90,0.008643,true,0.0001 +game,T10,ip_seq,91,0.003911,true,0.0001 +game,T10,ip_seq,92,0.006354,true,0.0001 +game,T10,ip_seq,93,0.007237,true,0.0001 +game,T10,ip_seq,94,0.004147,true,0.0001 +game,T10,ip_seq,95,0.003886,true,0.0001 +game,T10,ip_seq,96,0.003881,true,0.0001 +game,T10,ip_seq,97,0.004129,true,0.0001 +game,T10,ip_seq,98,0.006354,true,0.0001 +game,T10,ip_seq,99,0.003907,true,0.0001 +game,T10,ip_seq,100,0.003884,true,0.0001 +game,T10,ip_seq,101,0.004098,true,0.0001 +game,T10,ip_seq,102,0.006641,true,0.0001 +game,T10,ip_seq,103,0.006353,true,0.0001 +game,T10,ip_seq,104,0.004369,true,0.0001 +game,T10,ip_seq,105,0.005464,true,0.0001 +game,T10,ip_seq,106,0.008222,true,0.0001 +game,T10,ip_seq,107,0.004129,true,0.0001 +game,T10,ip_seq,108,0.006554,true,0.0001 +game,T10,ip_seq,109,0.006604,true,0.0001 +game,T10,ip_seq,110,0.003952,true,0.0001 +game,T10,ip_seq,111,0.00411,true,0.0001 +game,T10,ip_seq,112,0.004123,true,0.0001 +game,T10,ip_seq,113,0.004143,true,0.0001 +game,T10,ip_seq,114,0.007782,true,0.0001 +game,T10,ip_seq,115,0.004386,true,0.0001 +game,T10,ip_seq,116,0.0041,true,0.0001 +game,T10,ip_seq,117,0.003664,true,0.0001 +game,T10,ip_seq,118,0.006567,true,0.0001 +game,T10,ip_seq,119,0.00436,true,0.0001 +game,T10,ip_seq,120,0.00478,true,0.0001 +game,T10,ip_seq,121,0.004559,true,0.0001 +game,T10,ip_seq,122,0.006635,true,0.0001 +game,T10,ip_seq,123,0.004162,true,0.0001 +game,T10,ip_seq,124,0.004321,true,0.0001 +game,T10,ip_seq,125,0.005908,true,0.0001 +game,T10,ip_seq,126,0.00659,true,0.0001 +game,T10,ip_seq,127,0.003949,true,0.0001 +game,T10,ip_seq,128,0.00434,true,0.0001 +game,T10,ip_seq,129,0.00455,true,0.0001 +game,T10,ip_seq,130,0.007055,true,0.0001 +game,T10,ip_seq,131,0.004237,true,0.0001 +game,T10,ip_seq,132,0.004352,true,0.0001 +game,T10,ip_seq,133,0.003927,true,0.0001 +game,T10,ip_seq,134,0.006854,true,0.0001 +game,T10,ip_seq,135,0.004243,true,0.0001 +game,T10,ip_seq,136,0.004884,true,0.0001 +game,T10,ip_seq,137,0.003979,true,0.0001 +game,T10,ip_seq,138,0.004204,true,0.0001 +game,T10,ip_seq,139,0.00746,true,0.0001 +game,T10,ip_seq,140,0.004215,true,0.0001 +game,T10,ip_seq,141,0.004188,true,0.0001 +game,T10,ip_seq,142,0.004209,true,0.0001 +game,T10,ip_seq,143,0.007723,true,0.0001 +game,T10,ip_seq,144,0.004297,true,0.0001 +game,T10,ip_seq,145,0.003967,true,0.0001 +game,T10,ip_seq,146,0.004729,true,0.0001 +game,T10,ip_seq,147,0.005051,true,0.0001 +game,T10,ip_seq,148,0.008228,true,0.0001 +game,T10,ip_seq,149,0.004741,true,0.0001 +game,T10,ip_seq,150,0.006093,true,0.0001 +game,T10,ip_seq,151,0.00696,true,0.0001 +game,T10,ip_seq,152,0.004099,true,0.0001 +game,T10,ip_seq,153,0.004728,true,0.0001 +game,T10,ip_seq,154,0.004019,true,0.0001 +game,T10,ip_seq,155,0.006248,true,0.0001 +game,T10,ip_seq,156,0.00394,true,0.0001 +game,T10,ip_seq,157,0.004805,true,0.0001 +game,T10,ip_seq,158,0.003858,true,0.0001 +game,T10,ip_seq,159,0.004118,true,0.0001 +game,T10,ip_seq,160,0.006462,true,0.0001 +game,T10,ip_seq,161,0.003928,true,0.0001 +game,T10,ip_seq,162,0.004106,true,0.0001 +game,T10,ip_seq,163,0.003867,true,0.0001 +game,T10,ip_seq,164,0.008972,true,0.0001 +game,T10,ip_seq,165,0.003959,true,0.0001 +game,T10,ip_seq,166,0.005029,true,0.0001 +game,T10,ip_seq,167,0.005641,true,0.0001 +game,T10,ip_seq,168,0.006368,true,0.0001 +game,T10,ip_seq,169,0.004167,true,0.0001 +game,T10,ip_seq,170,0.003646,true,0.0001 +game,T10,ip_seq,171,0.004328,true,0.0001 +game,T10,ip_seq,172,0.009067,true,0.0001 +game,T10,ip_seq,173,0.004124,true,0.0001 +game,T10,ip_seq,174,0.006726,true,0.0001 +game,T10,ip_seq,175,0.006478,true,0.0001 +game,T10,ip_seq,176,0.004187,true,0.0001 +game,T10,ip_seq,177,0.004131,true,0.0001 +game,T10,ip_seq,178,0.003907,true,0.0001 +game,T10,ip_seq,179,0.005045,true,0.0001 +game,T10,ip_seq,180,0.007362,true,0.0001 +game,T10,ip_seq,181,0.005704,true,0.0001 +game,T10,ip_seq,182,0.004344,true,0.0001 +game,T10,ip_seq,183,0.006454,true,0.0001 +game,T10,ip_seq,184,0.00445,true,0.0001 +game,T10,ip_seq,185,0.00515,true,0.0001 +game,T10,ip_seq,186,0.00421,true,0.0001 +game,T10,ip_seq,187,0.003956,true,0.0001 +game,T10,ip_seq,188,0.007062,true,0.0001 +game,T10,ip_seq,189,0.004657,true,0.0001 +game,T10,ip_seq,190,0.004102,true,0.0001 +game,T10,ip_seq,191,0.004097,true,0.0001 +game,T10,ip_seq,192,0.00697,true,0.0001 +game,T10,ip_seq,193,0.003933,true,0.0001 +game,T10,ip_seq,194,0.003921,true,0.0001 +game,T10,ip_seq,195,0.004106,true,0.0001 +game,T10,ip_seq,196,0.004356,true,0.0001 +game,T10,ip_seq,197,0.008634,true,0.0001 +game,T10,ip_seq,198,0.005969,true,0.0001 +game,T10,ip_seq,199,0.004101,true,0.0001 +game,T10,ip_seq,200,0.008697,true,0.0001 +game,T10,ip_seq,201,0.003951,true,0.0001 +game,T10,ip_seq,202,0.00389,true,0.0001 +game,T10,ip_seq,203,0.004081,true,0.0001 +game,T10,ip_seq,204,0.007753,true,0.0001 +game,T10,ip_seq,205,0.004154,true,0.0001 +game,T10,ip_seq,206,0.004106,true,0.0001 +game,T10,ip_seq,207,0.004535,true,0.0001 +game,T10,ip_seq,208,0.006632,true,0.0001 +game,T10,ip_seq,209,0.004939,true,0.0001 +game,T10,ip_seq,210,0.004157,true,0.0001 +game,T10,ip_seq,211,0.011821,true,0.0001 +game,T10,ip_seq,212,0.004194,true,0.0001 +game,T10,ip_seq,213,0.003929,true,0.0001 +game,T10,ip_seq,214,0.004105,true,0.0001 +game,T10,ip_seq,215,0.007549,true,0.0001 +game,T10,ip_seq,216,0.004171,true,0.0001 +game,T10,ip_seq,217,0.003906,true,0.0001 +game,T10,ip_seq,218,0.005672,true,0.0001 +game,T10,ip_seq,219,0.003466,true,0.0001 +game,T10,ip_seq,220,0.006615,true,0.0001 +game,T10,ip_seq,221,0.006128,true,0.0001 +game,T10,ip_seq,222,0.003898,true,0.0001 +game,T10,ip_seq,223,0.004114,true,0.0001 +game,T10,ip_seq,224,0.006817,true,0.0001 +game,T10,ip_seq,225,0.003906,true,0.0001 +game,T10,ip_seq,226,0.005011,true,0.0001 +game,T10,ip_seq,227,0.004097,true,0.0001 +game,T10,ip_seq,228,0.006644,true,0.0001 +game,T10,ip_seq,229,0.004845,true,0.0001 +game,T10,ip_seq,230,0.003879,true,0.0001 +game,T10,ip_seq,231,0.003894,true,0.0001 +game,T10,ip_seq,232,0.006397,true,0.0001 +game,T10,ip_seq,233,0.004202,true,0.0001 +game,T10,ip_seq,234,0.006391,true,0.0001 +game,T10,ip_seq,235,0.004115,true,0.0001 +game,T10,ip_seq,236,0.006728,true,0.0001 +game,T10,ip_seq,237,0.003965,true,0.0001 +game,T10,ip_seq,238,0.00346,true,0.0001 +game,T10,ip_seq,239,0.005265,true,0.0001 +game,T10,ip_seq,240,0.007762,true,0.0001 +game,T10,ip_seq,241,0.004173,true,0.0001 +game,T10,ip_seq,242,0.004111,true,0.0001 +game,T10,ip_seq,243,0.003908,true,0.0001 +game,T10,ip_seq,244,0.004355,true,0.0001 +game,T10,ip_seq,245,0.00856,true,0.0001 +game,T10,ip_seq,246,0.006253,true,0.0001 +game,T10,ip_seq,247,0.004827,true,0.0001 +game,T10,ip_seq,248,0.006539,true,0.0001 +game,T10,ip_seq,249,0.008234,true,0.0001 +game,T10,ip_seq,250,0.004167,true,0.0001 +game,T10,ip_seq,251,0.004146,true,0.0001 +game,T10,ip_seq,252,0.004312,true,0.0001 +game,T10,ip_seq,253,0.00874,true,0.0001 +game,T10,ip_seq,254,0.006861,true,0.0001 +game,T10,ip_seq,255,0.004748,true,0.0001 +game,T10,ip_seq,256,0.004674,true,0.0001 +game,T10,ip_seq,257,0.003877,true,0.0001 +game,T10,ip_seq,258,0.006916,true,0.0001 +game,T10,ip_seq,259,0.004137,true,0.0001 +game,T10,ip_seq,260,0.004092,true,0.0001 +game,T10,ip_seq,261,0.004056,true,0.0001 +game,T10,ip_seq,262,0.006361,true,0.0001 +game,T10,ip_seq,263,0.005059,true,0.0001 +game,T10,ip_seq,264,0.003903,true,0.0001 +game,T10,ip_seq,265,0.003855,true,0.0001 +game,T10,ip_seq,266,0.003252,true,0.0001 +game,T10,ip_seq,267,0.007416,true,0.0001 +game,T10,ip_seq,268,0.004105,true,0.0001 +game,T10,ip_seq,269,0.003889,true,0.0001 +game,T10,ip_seq,270,0.00408,true,0.0001 +game,T10,ip_seq,271,0.006421,true,0.0001 +game,T10,ip_seq,272,0.004174,true,0.0001 +game,T10,ip_seq,273,0.004101,true,0.0001 +game,T10,ip_seq,274,0.004104,true,0.0001 +game,T10,ip_seq,275,0.006419,true,0.0001 +game,T10,ip_seq,276,0.004169,true,0.0001 +game,T10,ip_seq,277,0.006388,true,0.0001 +game,T10,ip_seq,278,0.005275,true,0.0001 +game,T10,ip_seq,279,0.006593,true,0.0001 +game,T10,ip_seq,280,0.005721,true,0.0001 +game,T10,ip_seq,281,0.004115,true,0.0001 +game,T10,ip_seq,282,0.003866,true,0.0001 +game,T10,ip_seq,283,0.006543,true,0.0001 +game,T10,ip_seq,284,0.00417,true,0.0001 +game,T10,ip_seq,285,0.0041,true,0.0001 +game,T10,ip_seq,286,0.003407,true,0.0001 +game,T10,ip_seq,287,0.003851,true,0.0001 +game,T10,ip_seq,288,0.00656,true,0.0001 +game,T10,ip_seq,289,0.004399,true,0.0001 +game,T10,ip_seq,290,0.005446,true,0.0001 +game,T10,ip_seq,291,0.004767,true,0.0001 +game,T10,ip_seq,292,0.006434,true,0.0001 +game,T10,ip_seq,293,0.004135,true,0.0001 +game,T10,ip_seq,294,0.00388,true,0.0001 +game,T10,ip_seq,295,0.004338,true,0.0001 +game,T10,ip_seq,296,0.006322,true,0.0001 +game,T10,ip_seq,297,0.004128,true,0.0001 +game,T10,ip_seq,298,0.004131,true,0.0001 +game,T10,ip_seq,299,0.00387,true,0.0001 +game,T10,ip_seq,300,0.004116,true,0.0001 +game,T10,ip_seq,301,0.006604,true,0.0001 +game,T10,ip_seq,302,0.003925,true,0.0001 +game,T10,ip_seq,303,0.005204,true,0.0001 +game,T10,ip_seq,304,0.003879,true,0.0001 +game,T10,ip_seq,305,0.007717,true,0.0001 +game,T10,ip_seq,306,0.004151,true,0.0001 +game,T10,ip_seq,307,0.00429,true,0.0001 +game,T10,ip_seq,308,0.005871,true,0.0001 +game,T10,ip_seq,309,0.006684,true,0.0001 +game,T10,ip_seq,310,0.003927,true,0.0001 +game,T10,ip_seq,311,0.004102,true,0.0001 +game,T10,ip_seq,312,0.005472,true,0.0001 +game,T10,ip_seq,313,0.006758,true,0.0001 +game,T10,ip_seq,314,0.00395,true,0.0001 +game,T10,ip_seq,315,0.004812,true,0.0001 +game,T10,ip_seq,316,0.00409,true,0.0001 +game,T10,ip_seq,317,0.006482,true,0.0001 +game,T10,ip_seq,318,0.006592,true,0.0001 +game,T10,ip_seq,319,0.00405,true,0.0001 +game,T10,ip_seq,320,0.004118,true,0.0001 +game,T10,ip_seq,321,0.006573,true,0.0001 +game,T10,ip_seq,322,0.004154,true,0.0001 +game,T10,ip_seq,323,0.003883,true,0.0001 +game,T10,ip_seq,324,0.003888,true,0.0001 +game,T10,ip_seq,325,0.004332,true,0.0001 +game,T10,ip_seq,326,0.006597,true,0.0001 +game,T10,ip_seq,327,0.004119,true,0.0001 +game,T10,ip_seq,328,0.00409,true,0.0001 +game,T10,ip_seq,329,0.003863,true,0.0001 +game,T10,ip_seq,330,0.006281,true,0.0001 +game,T10,ip_seq,331,0.004159,true,0.0001 +game,T10,ip_seq,332,0.005715,true,0.0001 +game,T10,ip_seq,333,0.003889,true,0.0001 +game,T10,ip_seq,334,0.006684,true,0.0001 +game,T10,ip_seq,335,0.004847,true,0.0001 +game,T10,ip_seq,336,0.004132,true,0.0001 +game,T10,ip_seq,337,0.003884,true,0.0001 +game,T10,ip_seq,338,0.004127,true,0.0001 +game,T10,ip_seq,339,0.006371,true,0.0001 +game,T10,ip_seq,340,0.004826,true,0.0001 +game,T10,ip_seq,341,0.003885,true,0.0001 +game,T10,ip_seq,342,0.004094,true,0.0001 +game,T10,ip_seq,343,0.006227,true,0.0001 +game,T10,ip_seq,344,0.005723,true,0.0001 +game,T10,ip_seq,345,0.004362,true,0.0001 +game,T10,ip_seq,346,0.00392,true,0.0001 +game,T10,ip_seq,347,0.006405,true,0.0001 +game,T10,ip_seq,348,0.00418,true,0.0001 +game,T10,ip_seq,349,0.004594,true,0.0001 +game,T10,ip_seq,350,0.004073,true,0.0001 +game,T10,ip_seq,351,0.006465,true,0.0001 +game,T10,ip_seq,352,0.00399,true,0.0001 +game,T10,ip_seq,353,0.004133,true,0.0001 +game,T10,ip_seq,354,0.004974,true,0.0001 +game,T10,ip_seq,355,0.004087,true,0.0001 +game,T10,ip_seq,356,0.006621,true,0.0001 +game,T10,ip_seq,357,0.004168,true,0.0001 +game,T10,ip_seq,358,0.004063,true,0.0001 +game,T10,ip_seq,359,0.003846,true,0.0001 +game,T10,ip_seq,360,0.006601,true,0.0001 +game,T10,ip_seq,361,0.003694,true,0.0001 +game,T10,ip_seq,362,0.005432,true,0.0001 +game,T10,ip_seq,363,0.003934,true,0.0001 +game,T10,ip_seq,364,0.007307,true,0.0001 +game,T10,ip_seq,365,0.003962,true,0.0001 +game,T10,ip_seq,366,0.004154,true,0.0001 +game,T10,ip_seq,367,0.003894,true,0.0001 +game,T10,ip_seq,368,0.003449,true,0.0001 +game,T10,ip_seq,369,0.009239,true,0.0001 +game,T10,ip_seq,370,0.004168,true,0.0001 +game,T10,ip_seq,371,0.003842,true,0.0001 +game,T10,ip_seq,372,0.004076,true,0.0001 +game,T10,ip_seq,373,0.0066,true,0.0001 +game,T10,ip_seq,374,0.004165,true,0.0001 +game,T10,ip_seq,375,0.004102,true,0.0001 +game,T10,ip_seq,376,0.00526,true,0.0001 +game,T10,ip_seq,377,0.006866,true,0.0001 +game,T10,ip_seq,378,0.004202,true,0.0001 +game,T10,ip_seq,379,0.004833,true,0.0001 +game,T10,ip_seq,380,0.006095,true,0.0001 +game,T10,ip_seq,381,0.006538,true,0.0001 +game,T10,ip_seq,382,0.004121,true,0.0001 +game,T10,ip_seq,383,0.004181,true,0.0001 +game,T10,ip_seq,384,0.004276,true,0.0001 +game,T10,ip_seq,385,0.007521,true,0.0001 +game,T10,ip_seq,386,0.004207,true,0.0001 +game,T10,ip_seq,387,0.004851,true,0.0001 +game,T10,ip_seq,388,0.004371,true,0.0001 +game,T10,ip_seq,389,0.004111,true,0.0001 +game,T10,ip_seq,390,0.007744,true,0.0001 +game,T10,ip_seq,391,0.004151,true,0.0001 +game,T10,ip_seq,392,0.004116,true,0.0001 +game,T10,ip_seq,393,0.004125,true,0.0001 +game,T10,ip_seq,394,0.006734,true,0.0001 +game,T10,ip_seq,395,0.003925,true,0.0001 +game,T10,ip_seq,396,0.004105,true,0.0001 +game,T10,ip_seq,397,0.004105,true,0.0001 +game,T10,ip_seq,398,0.007731,true,0.0001 +game,T10,ip_seq,399,0.004161,true,0.0001 +game,T10,ip_seq,400,0.00413,true,0.0001 +game,T10,ip_seq,401,0.004092,true,0.0001 +game,T10,ip_seq,402,0.006555,true,0.0001 +game,T10,ip_seq,403,0.003755,true,0.0001 +game,T10,ip_seq,404,0.003972,true,0.0001 +game,T10,ip_seq,405,0.007201,true,0.0001 +game,T10,ip_seq,406,0.006356,true,0.0001 +game,T10,ip_seq,407,0.007835,true,0.0001 +game,T10,ip_seq,408,0.004079,true,0.0001 +game,T10,ip_seq,409,0.004342,true,0.0001 +game,T10,ip_seq,410,0.006679,true,0.0001 +game,T10,ip_seq,411,0.004595,true,0.0001 +game,T10,ip_seq,412,0.004112,true,0.0001 +game,T10,ip_seq,413,0.005238,true,0.0001 +game,T10,ip_seq,414,0.006565,true,0.0001 +game,T10,ip_seq,415,0.004161,true,0.0001 +game,T10,ip_seq,416,0.004143,true,0.0001 +game,T10,ip_seq,417,0.004083,true,0.0001 +game,T10,ip_seq,418,0.003881,true,0.0001 +game,T10,ip_seq,419,0.006649,true,0.0001 +game,T10,ip_seq,420,0.003702,true,0.0001 +game,T10,ip_seq,421,0.00522,true,0.0001 +game,T10,ip_seq,422,0.004129,true,0.0001 +game,T10,ip_seq,423,0.007341,true,0.0001 +game,T10,ip_seq,424,0.003666,true,0.0001 +game,T10,ip_seq,425,0.005676,true,0.0001 +game,T10,ip_seq,426,0.00502,true,0.0001 +game,T10,ip_seq,427,0.008704,true,0.0001 +game,T10,ip_seq,428,0.003926,true,0.0001 +game,T10,ip_seq,429,0.004572,true,0.0001 +game,T10,ip_seq,430,0.004107,true,0.0001 +game,T10,ip_seq,431,0.006738,true,0.0001 +game,T10,ip_seq,432,0.005096,true,0.0001 +game,T10,ip_seq,433,0.005242,true,0.0001 +game,T10,ip_seq,434,0.004546,true,0.0001 +game,T10,ip_seq,435,0.006696,true,0.0001 +game,T10,ip_seq,436,0.004136,true,0.0001 +game,T10,ip_seq,437,0.004165,true,0.0001 +game,T10,ip_seq,438,0.003898,true,0.0001 +game,T10,ip_seq,439,0.003903,true,0.0001 +game,T10,ip_seq,440,0.006673,true,0.0001 +game,T10,ip_seq,441,0.004416,true,0.0001 +game,T10,ip_seq,442,0.00408,true,0.0001 +game,T10,ip_seq,443,0.004098,true,0.0001 +game,T10,ip_seq,444,0.006681,true,0.0001 +game,T10,ip_seq,445,0.003969,true,0.0001 +game,T10,ip_seq,446,0.004983,true,0.0001 +game,T10,ip_seq,447,0.003439,true,0.0001 +game,T10,ip_seq,448,0.004131,true,0.0001 +game,T10,ip_seq,449,0.006825,true,0.0001 +game,T10,ip_seq,450,0.004216,true,0.0001 +game,T10,ip_seq,451,0.003875,true,0.0001 +game,T10,ip_seq,452,0.003893,true,0.0001 +game,T10,ip_seq,453,0.005286,true,0.0001 +game,T10,ip_seq,454,0.006664,true,0.0001 +game,T10,ip_seq,455,0.003882,true,0.0001 +game,T10,ip_seq,456,0.004117,true,0.0001 +game,T10,ip_seq,457,0.005055,true,0.0001 +game,T10,ip_seq,458,0.006683,true,0.0001 +game,T10,ip_seq,459,0.003956,true,0.0001 +game,T10,ip_seq,460,0.003937,true,0.0001 +game,T10,ip_seq,461,0.004825,true,0.0001 +game,T10,ip_seq,462,0.004108,true,0.0001 +game,T10,ip_seq,463,0.006941,true,0.0001 +game,T10,ip_seq,464,0.004161,true,0.0001 +game,T10,ip_seq,465,0.004608,true,0.0001 +game,T10,ip_seq,466,0.004111,true,0.0001 +game,T10,ip_seq,467,0.004132,true,0.0001 +game,T10,ip_seq,468,0.006514,true,0.0001 +game,T10,ip_seq,469,0.004112,true,0.0001 +game,T10,ip_seq,470,0.004089,true,0.0001 +game,T10,ip_seq,471,0.003891,true,0.0001 +game,T10,ip_seq,472,0.007407,true,0.0001 +game,T10,ip_seq,473,0.004002,true,0.0001 +game,T10,ip_seq,474,0.004116,true,0.0001 +game,T10,ip_seq,475,0.004135,true,0.0001 +game,T10,ip_seq,476,0.003914,true,0.0001 +game,T10,ip_seq,477,0.003674,true,0.0001 +game,T10,ip_seq,478,0.006975,true,0.0001 +game,T10,ip_seq,479,0.00395,true,0.0001 +game,T10,ip_seq,480,0.005453,true,0.0001 +game,T10,ip_seq,481,0.003916,true,0.0001 +game,T10,ip_seq,482,0.003885,true,0.0001 +game,T10,ip_seq,483,0.006539,true,0.0001 +game,T10,ip_seq,484,0.004118,true,0.0001 +game,T10,ip_seq,485,0.004136,true,0.0001 +game,T10,ip_seq,486,0.004359,true,0.0001 +game,T10,ip_seq,487,0.003672,true,0.0001 +game,T10,ip_seq,488,0.006895,true,0.0001 +game,T10,ip_seq,489,0.003923,true,0.0001 +game,T10,ip_seq,490,0.003908,true,0.0001 +game,T10,ip_seq,491,0.006134,true,0.0001 +game,T10,ip_seq,492,0.00684,true,0.0001 +game,T10,ip_seq,493,0.003916,true,0.0001 +game,T10,ip_seq,494,0.00391,true,0.0001 +game,T10,ip_seq,495,0.004111,true,0.0001 +game,T10,ip_seq,496,0.003909,true,0.0001 +game,T10,ip_seq,497,0.004843,true,0.0001 +game,T10,ip_seq,498,0.007186,true,0.0001 +game,T10,ip_seq,499,0.004408,true,0.0001 +game,T10,ip_seq,500,0.005956,true,0.0001 +game,T10,ip_seq,501,0.004137,true,0.0001 +game,T10,ip_seq,502,0.003892,true,0.0001 +game,T10,ip_seq,503,0.006422,true,0.0001 +game,T10,ip_seq,504,0.003939,true,0.0001 +game,T10,ip_seq,505,0.005686,true,0.0001 +game,T10,ip_seq,506,0.004382,true,0.0001 +game,T10,ip_seq,507,0.006871,true,0.0001 +game,T10,ip_seq,508,0.006934,true,0.0001 +game,T10,ip_seq,509,0.004154,true,0.0001 +game,T10,ip_seq,510,0.004357,true,0.0001 +game,T10,ip_seq,511,0.004099,true,0.0001 +game,T10,ip_seq,512,0.00681,true,0.0001 +game,T10,ip_seq,513,0.005518,true,0.0001 +game,T10,ip_seq,514,0.003888,true,0.0001 +game,T10,ip_seq,515,0.004128,true,0.0001 +game,T10,ip_seq,516,0.004114,true,0.0001 +game,T10,ip_seq,517,0.00671,true,0.0001 +game,T10,ip_seq,518,0.003969,true,0.0001 +game,T10,ip_seq,519,0.004324,true,0.0001 +game,T10,ip_seq,520,0.003895,true,0.0001 +game,T10,ip_seq,521,0.003646,true,0.0001 +game,T10,ip_seq,522,0.007026,true,0.0001 +game,T10,ip_seq,523,0.004137,true,0.0001 +game,T10,ip_seq,524,0.003894,true,0.0001 +game,T10,ip_seq,525,0.004546,true,0.0001 +game,T10,ip_seq,526,0.004332,true,0.0001 +game,T10,ip_seq,527,0.006523,true,0.0001 +game,T10,ip_seq,528,0.005263,true,0.0001 +game,T10,ip_seq,529,0.003934,true,0.0001 +game,T10,ip_seq,530,0.003908,true,0.0001 +game,T10,ip_seq,531,0.004107,true,0.0001 +game,T10,ip_seq,532,0.006456,true,0.0001 +game,T10,ip_seq,533,0.004144,true,0.0001 +game,T10,ip_seq,534,0.004115,true,0.0001 +game,T10,ip_seq,535,0.004107,true,0.0001 +game,T10,ip_seq,536,0.003676,true,0.0001 +game,T10,ip_seq,537,0.006825,true,0.0001 +game,T10,ip_seq,538,0.00436,true,0.0001 +game,T10,ip_seq,539,0.004315,true,0.0001 +game,T10,ip_seq,540,0.003912,true,0.0001 +game,T10,ip_seq,541,0.004571,true,0.0001 +game,T10,ip_seq,542,0.006637,true,0.0001 +game,T10,ip_seq,543,0.003714,true,0.0001 +game,T10,ip_seq,544,0.003912,true,0.0001 +game,T10,ip_seq,545,0.003887,true,0.0001 +game,T10,ip_seq,546,0.004123,true,0.0001 +game,T10,ip_seq,547,0.003911,true,0.0001 +game,T10,ip_seq,548,0.006873,true,0.0001 +game,T10,ip_seq,549,0.00416,true,0.0001 +game,T10,ip_seq,550,0.003889,true,0.0001 +game,T10,ip_seq,551,0.004456,true,0.0001 +game,T10,ip_seq,552,0.004372,true,0.0001 +game,T10,ip_seq,553,0.006878,true,0.0001 +game,T10,ip_seq,554,0.004271,true,0.0001 +game,T10,ip_seq,555,0.004841,true,0.0001 +game,T10,ip_seq,556,0.004151,true,0.0001 +game,T10,ip_seq,557,0.004154,true,0.0001 +game,T10,ip_seq,558,0.007763,true,0.0001 +game,T10,ip_seq,559,0.004178,true,0.0001 +game,T10,ip_seq,560,0.004132,true,0.0001 +game,T10,ip_seq,561,0.004144,true,0.0001 +game,T10,ip_seq,562,0.004007,true,0.0001 +game,T10,ip_seq,563,0.003953,true,0.0001 +game,T10,ip_seq,564,0.007979,true,0.0001 +game,T10,ip_seq,565,0.00429,true,0.0001 +game,T10,ip_seq,566,0.004145,true,0.0001 +game,T10,ip_seq,567,0.006825,true,0.0001 +game,T10,ip_seq,568,0.004124,true,0.0001 +game,T10,ip_seq,569,0.004222,true,0.0001 +game,T10,ip_seq,570,0.007762,true,0.0001 +game,T10,ip_seq,571,0.006386,true,0.0001 +game,T10,ip_seq,572,0.004145,true,0.0001 +game,T10,ip_seq,573,0.004122,true,0.0001 +game,T10,ip_seq,574,0.003682,true,0.0001 +game,T10,ip_seq,575,0.007041,true,0.0001 +game,T10,ip_seq,576,0.003959,true,0.0001 +game,T10,ip_seq,577,0.003256,true,0.0001 +game,T10,ip_seq,578,0.00415,true,0.0001 +game,T10,ip_seq,579,0.005231,true,0.0001 +game,T10,ip_seq,580,0.008481,true,0.0001 +game,T10,ip_seq,581,0.004174,true,0.0001 +game,T10,ip_seq,582,0.004376,true,0.0001 +game,T10,ip_seq,583,0.006288,true,0.0001 +game,T10,ip_seq,584,0.004107,true,0.0001 +game,T10,ip_seq,585,0.006857,true,0.0001 +game,T10,ip_seq,586,0.003714,true,0.0001 +game,T10,ip_seq,587,0.005297,true,0.0001 +game,T10,ip_seq,588,0.004282,true,0.0001 +game,T10,ip_seq,589,0.004161,true,0.0001 +game,T10,ip_seq,590,0.009171,true,0.0001 +game,T10,ip_seq,591,0.003978,true,0.0001 +game,T10,ip_seq,592,0.005115,true,0.0001 +game,T10,ip_seq,593,0.004358,true,0.0001 +game,T10,ip_seq,594,0.004155,true,0.0001 +game,T10,ip_seq,595,0.007531,true,0.0001 +game,T10,ip_seq,596,0.004177,true,0.0001 +game,T10,ip_seq,597,0.005261,true,0.0001 +game,T10,ip_seq,598,0.005263,true,0.0001 +game,T10,ip_seq,599,0.004378,true,0.0001 +game,T10,ip_seq,600,0.007336,true,0.0001 +game,T10,ip_seq,601,0.004563,true,0.0001 +game,T10,ip_seq,602,0.004143,true,0.0001 +game,T10,ip_seq,603,0.004553,true,0.0001 +game,T10,ip_seq,604,0.006627,true,0.0001 +game,T10,ip_seq,605,0.00537,true,0.0001 +game,T10,ip_seq,606,0.004183,true,0.0001 +game,T10,ip_seq,607,0.004103,true,0.0001 +game,T10,ip_seq,608,0.004073,true,0.0001 +game,T10,ip_seq,609,0.004114,true,0.0001 +game,T10,ip_seq,610,0.006825,true,0.0001 +game,T10,ip_seq,611,0.003931,true,0.0001 +game,T10,ip_seq,612,0.004335,true,0.0001 +game,T10,ip_seq,613,0.004304,true,0.0001 +game,T10,ip_seq,614,0.004377,true,0.0001 +game,T10,ip_seq,615,0.006713,true,0.0001 +game,T10,ip_seq,616,0.004178,true,0.0001 +game,T10,ip_seq,617,0.004113,true,0.0001 +game,T10,ip_seq,618,0.004127,true,0.0001 +game,T10,ip_seq,619,0.004111,true,0.0001 +game,T10,ip_seq,620,0.007275,true,0.0001 +game,T10,ip_seq,621,0.003698,true,0.0001 +game,T10,ip_seq,622,0.004138,true,0.0001 +game,T10,ip_seq,623,0.004118,true,0.0001 +game,T10,ip_seq,624,0.005277,true,0.0001 +game,T10,ip_seq,625,0.006695,true,0.0001 +game,T10,ip_seq,626,0.004278,true,0.0001 +game,T10,ip_seq,627,0.004121,true,0.0001 +game,T10,ip_seq,628,0.003878,true,0.0001 +game,T10,ip_seq,629,0.004533,true,0.0001 +game,T10,ip_seq,630,0.005046,true,0.0001 +game,T10,ip_seq,631,0.006864,true,0.0001 +game,T10,ip_seq,632,0.004133,true,0.0001 +game,T10,ip_seq,633,0.00501,true,0.0001 +game,T10,ip_seq,634,0.004144,true,0.0001 +game,T10,ip_seq,635,0.004382,true,0.0001 +game,T10,ip_seq,636,0.006926,true,0.0001 +game,T10,ip_seq,637,0.003933,true,0.0001 +game,T10,ip_seq,638,0.004124,true,0.0001 +game,T10,ip_seq,639,0.004096,true,0.0001 +game,T10,ip_seq,640,0.004122,true,0.0001 +game,T10,ip_seq,641,0.006892,true,0.0001 +game,T10,ip_seq,642,0.004159,true,0.0001 +game,T10,ip_seq,643,0.003916,true,0.0001 +game,T10,ip_seq,644,0.004107,true,0.0001 +game,T10,ip_seq,645,0.004098,true,0.0001 +game,T10,ip_seq,646,0.009157,true,0.0001 +game,T10,ip_seq,647,0.004155,true,0.0001 +game,T10,ip_seq,648,0.004086,true,0.0001 +game,T10,ip_seq,649,0.005687,true,0.0001 +game,T10,ip_seq,650,0.003867,true,0.0001 +game,T10,ip_seq,651,0.006732,true,0.0001 +game,T10,ip_seq,652,0.005288,true,0.0001 +game,T10,ip_seq,653,0.004359,true,0.0001 +game,T10,ip_seq,654,0.004364,true,0.0001 +game,T10,ip_seq,655,0.004098,true,0.0001 +game,T10,ip_seq,656,0.007019,true,0.0001 +game,T10,ip_seq,657,0.00507,true,0.0001 +game,T10,ip_seq,658,0.004144,true,0.0001 +game,T10,ip_seq,659,0.003876,true,0.0001 +game,T10,ip_seq,660,0.004137,true,0.0001 +game,T10,ip_seq,661,0.00752,true,0.0001 +game,T10,ip_seq,662,0.004121,true,0.0001 +game,T10,ip_seq,663,0.00412,true,0.0001 +game,T10,ip_seq,664,0.00527,true,0.0001 +game,T10,ip_seq,665,0.004135,true,0.0001 +game,T10,ip_seq,666,0.006522,true,0.0001 +game,T10,ip_seq,667,0.004156,true,0.0001 +game,T10,ip_seq,668,0.004106,true,0.0001 +game,T10,ip_seq,669,0.003886,true,0.0001 +game,T10,ip_seq,670,0.003892,true,0.0001 +game,T10,ip_seq,671,0.006522,true,0.0001 +game,T10,ip_seq,672,0.0042,true,0.0001 +game,T10,ip_seq,673,0.00411,true,0.0001 +game,T10,ip_seq,674,0.004113,true,0.0001 +game,T10,ip_seq,675,0.004332,true,0.0001 +game,T10,ip_seq,676,0.004342,true,0.0001 +game,T10,ip_seq,677,0.006874,true,0.0001 +game,T10,ip_seq,678,0.003935,true,0.0001 +game,T10,ip_seq,679,0.00502,true,0.0001 +game,T10,ip_seq,680,0.003905,true,0.0001 +game,T10,ip_seq,681,0.003881,true,0.0001 +game,T10,ip_seq,682,0.00704,true,0.0001 +game,T10,ip_seq,683,0.003927,true,0.0001 +game,T10,ip_seq,684,0.005282,true,0.0001 +game,T10,ip_seq,685,0.005023,true,0.0001 +game,T10,ip_seq,686,0.004087,true,0.0001 +game,T10,ip_seq,687,0.008025,true,0.0001 +game,T10,ip_seq,688,0.003964,true,0.0001 +game,T10,ip_seq,689,0.005711,true,0.0001 +game,T10,ip_seq,690,0.004112,true,0.0001 +game,T10,ip_seq,691,0.006705,true,0.0001 +game,T10,ip_seq,692,0.006528,true,0.0001 +game,T10,ip_seq,693,0.004125,true,0.0001 +game,T10,ip_seq,694,0.00412,true,0.0001 +game,T10,ip_seq,695,0.003885,true,0.0001 +game,T10,ip_seq,696,0.007652,true,0.0001 +game,T10,ip_seq,697,0.004216,true,0.0001 +game,T10,ip_seq,698,0.003922,true,0.0001 +game,T10,ip_seq,699,0.004384,true,0.0001 +game,T10,ip_seq,700,0.003875,true,0.0001 +game,T10,ip_seq,701,0.004136,true,0.0001 +game,T10,ip_seq,702,0.007057,true,0.0001 +game,T10,ip_seq,703,0.003952,true,0.0001 +game,T10,ip_seq,704,0.00417,true,0.0001 +game,T10,ip_seq,705,0.00369,true,0.0001 +game,T10,ip_seq,706,0.003886,true,0.0001 +game,T10,ip_seq,707,0.003875,true,0.0001 +game,T10,ip_seq,708,0.007394,true,0.0001 +game,T10,ip_seq,709,0.003702,true,0.0001 +game,T10,ip_seq,710,0.003911,true,0.0001 +game,T10,ip_seq,711,0.004088,true,0.0001 +game,T10,ip_seq,712,0.004068,true,0.0001 +game,T10,ip_seq,713,0.006491,true,0.0001 +game,T10,ip_seq,714,0.0042,true,0.0001 +game,T10,ip_seq,715,0.004156,true,0.0001 +game,T10,ip_seq,716,0.004114,true,0.0001 +game,T10,ip_seq,717,0.006586,true,0.0001 +game,T10,ip_seq,718,0.006827,true,0.0001 +game,T10,ip_seq,719,0.004189,true,0.0001 +game,T10,ip_seq,720,0.00372,true,0.0001 +game,T10,ip_seq,721,0.004173,true,0.0001 +game,T10,ip_seq,722,0.004149,true,0.0001 +game,T10,ip_seq,723,0.00421,true,0.0001 +game,T10,ip_seq,724,0.00741,true,0.0001 +game,T10,ip_seq,725,0.003748,true,0.0001 +game,T10,ip_seq,726,0.005536,true,0.0001 +game,T10,ip_seq,727,0.004126,true,0.0001 +game,T10,ip_seq,728,0.004124,true,0.0001 +game,T10,ip_seq,729,0.003968,true,0.0001 +game,T10,ip_seq,730,0.007481,true,0.0001 +game,T10,ip_seq,731,0.004397,true,0.0001 +game,T10,ip_seq,732,0.004371,true,0.0001 +game,T10,ip_seq,733,0.003861,true,0.0001 +game,T10,ip_seq,734,0.00568,true,0.0001 +game,T10,ip_seq,735,0.003727,true,0.0001 +game,T10,ip_seq,736,0.006947,true,0.0001 +game,T10,ip_seq,737,0.003487,true,0.0001 +game,T10,ip_seq,738,0.005529,true,0.0001 +game,T10,ip_seq,739,0.004105,true,0.0001 +game,T10,ip_seq,740,0.004118,true,0.0001 +game,T10,ip_seq,741,0.007573,true,0.0001 +game,T10,ip_seq,742,0.003943,true,0.0001 +game,T10,ip_seq,743,0.004109,true,0.0001 +game,T10,ip_seq,744,0.003887,true,0.0001 +game,T10,ip_seq,745,0.004088,true,0.0001 +game,T10,ip_seq,746,0.006592,true,0.0001 +game,T10,ip_seq,747,0.003976,true,0.0001 +game,T10,ip_seq,748,0.004127,true,0.0001 +game,T10,ip_seq,749,0.004303,true,0.0001 +game,T10,ip_seq,750,0.004108,true,0.0001 +game,T10,ip_seq,751,0.009076,true,0.0001 +game,T10,ip_seq,752,0.00415,true,0.0001 +game,T10,ip_seq,753,0.005282,true,0.0001 +game,T10,ip_seq,754,0.004105,true,0.0001 +game,T10,ip_seq,755,0.003868,true,0.0001 +game,T10,ip_seq,756,0.007735,true,0.0001 +game,T10,ip_seq,757,0.004137,true,0.0001 +game,T10,ip_seq,758,0.004361,true,0.0001 +game,T10,ip_seq,759,0.003901,true,0.0001 +game,T10,ip_seq,760,0.003898,true,0.0001 +game,T10,ip_seq,761,0.004101,true,0.0001 +game,T10,ip_seq,762,0.007222,true,0.0001 +game,T10,ip_seq,763,0.005488,true,0.0001 +game,T10,ip_seq,764,0.004134,true,0.0001 +game,T10,ip_seq,765,0.003886,true,0.0001 +game,T10,ip_seq,766,0.003651,true,0.0001 +game,T10,ip_seq,767,0.00941,true,0.0001 +game,T10,ip_seq,768,0.004128,true,0.0001 +game,T10,ip_seq,769,0.003685,true,0.0001 +game,T10,ip_seq,770,0.004809,true,0.0001 +game,T10,ip_seq,771,0.007971,true,0.0001 +game,T10,ip_seq,772,0.003981,true,0.0001 +game,T10,ip_seq,773,0.004146,true,0.0001 +game,T10,ip_seq,774,0.003661,true,0.0001 +game,T10,ip_seq,775,0.003878,true,0.0001 +game,T10,ip_seq,776,0.004136,true,0.0001 +game,T10,ip_seq,777,0.006635,true,0.0001 +game,T10,ip_seq,778,0.005386,true,0.0001 +game,T10,ip_seq,779,0.004346,true,0.0001 +game,T10,ip_seq,780,0.003905,true,0.0001 +game,T10,ip_seq,781,0.004102,true,0.0001 +game,T10,ip_seq,782,0.00748,true,0.0001 +game,T10,ip_seq,783,0.003946,true,0.0001 +game,T10,ip_seq,784,0.004124,true,0.0001 +game,T10,ip_seq,785,0.00568,true,0.0001 +game,T10,ip_seq,786,0.004072,true,0.0001 +game,T10,ip_seq,787,0.006825,true,0.0001 +game,T10,ip_seq,788,0.004179,true,0.0001 +game,T10,ip_seq,789,0.004373,true,0.0001 +game,T10,ip_seq,790,0.005503,true,0.0001 +game,T10,ip_seq,791,0.004079,true,0.0001 +game,T10,ip_seq,792,0.008779,true,0.0001 +game,T10,ip_seq,793,0.004953,true,0.0001 +game,T10,ip_seq,794,0.004151,true,0.0001 +game,T10,ip_seq,795,0.004154,true,0.0001 +game,T10,ip_seq,796,0.006412,true,0.0001 +game,T10,ip_seq,797,0.007118,true,0.0001 +game,T10,ip_seq,798,0.004178,true,0.0001 +game,T10,ip_seq,799,0.004128,true,0.0001 +game,T10,ip_seq,800,0.003905,true,0.0001 +game,T10,ip_seq,801,0.004754,true,0.0001 +game,T10,ip_seq,802,0.006906,true,0.0001 +game,T10,ip_seq,803,0.004633,true,0.0001 +game,T10,ip_seq,804,0.005708,true,0.0001 +game,T10,ip_seq,805,0.00526,true,0.0001 +game,T10,ip_seq,806,0.004107,true,0.0001 +game,T10,ip_seq,807,0.006631,true,0.0001 +game,T10,ip_seq,808,0.003978,true,0.0001 +game,T10,ip_seq,809,0.004157,true,0.0001 +game,T10,ip_seq,810,0.004156,true,0.0001 +game,T10,ip_seq,811,0.004109,true,0.0001 +game,T10,ip_seq,812,0.0142,true,0.0001 +game,T10,ip_seq,813,0.005011,true,0.0001 +game,T10,ip_seq,814,0.004347,true,0.0001 +game,T10,ip_seq,815,0.004108,true,0.0001 +game,T10,ip_seq,816,0.006658,true,0.0001 +game,T10,ip_seq,817,0.004199,true,0.0001 +game,T10,ip_seq,818,0.003955,true,0.0001 +game,T10,ip_seq,819,0.004343,true,0.0001 +game,T10,ip_seq,820,0.004321,true,0.0001 +game,T10,ip_seq,821,0.006764,true,0.0001 +game,T10,ip_seq,822,0.005106,true,0.0001 +game,T10,ip_seq,823,0.004169,true,0.0001 +game,T10,ip_seq,824,0.004113,true,0.0001 +game,T10,ip_seq,825,0.005199,true,0.0001 +game,T10,ip_seq,826,0.00676,true,0.0001 +game,T10,ip_seq,827,0.004191,true,0.0001 +game,T10,ip_seq,828,0.005081,true,0.0001 +game,T10,ip_seq,829,0.004114,true,0.0001 +game,T10,ip_seq,830,0.003855,true,0.0001 +game,T10,ip_seq,831,0.00413,true,0.0001 +game,T10,ip_seq,832,0.006673,true,0.0001 +game,T10,ip_seq,833,0.003932,true,0.0001 +game,T10,ip_seq,834,0.003887,true,0.0001 +game,T10,ip_seq,835,0.004105,true,0.0001 +game,T10,ip_seq,836,0.005978,true,0.0001 +game,T10,ip_seq,837,0.007761,true,0.0001 +game,T10,ip_seq,838,0.004383,true,0.0001 +game,T10,ip_seq,839,0.004151,true,0.0001 +game,T10,ip_seq,840,0.004106,true,0.0001 +game,T10,ip_seq,841,0.00389,true,0.0001 +game,T10,ip_seq,842,0.008909,true,0.0001 +game,T10,ip_seq,843,0.004141,true,0.0001 +game,T10,ip_seq,844,0.004138,true,0.0001 +game,T10,ip_seq,845,0.003871,true,0.0001 +game,T10,ip_seq,846,0.003903,true,0.0001 +game,T10,ip_seq,847,0.008266,true,0.0001 +game,T10,ip_seq,848,0.004551,true,0.0001 +game,T10,ip_seq,849,0.005498,true,0.0001 +game,T10,ip_seq,850,0.003877,true,0.0001 +game,T10,ip_seq,851,0.003905,true,0.0001 +game,T10,ip_seq,852,0.006883,true,0.0001 +game,T10,ip_seq,853,0.005977,true,0.0001 +game,T10,ip_seq,854,0.004345,true,0.0001 +game,T10,ip_seq,855,0.005481,true,0.0001 +game,T10,ip_seq,856,0.006804,true,0.0001 +game,T10,ip_seq,857,0.004453,true,0.0001 +game,T10,ip_seq,858,0.004211,true,0.0001 +game,T10,ip_seq,859,0.004151,true,0.0001 +game,T10,ip_seq,860,0.004868,true,0.0001 +game,T10,ip_seq,861,0.006714,true,0.0001 +game,T10,ip_seq,862,0.004202,true,0.0001 +game,T10,ip_seq,863,0.004152,true,0.0001 +game,T10,ip_seq,864,0.004147,true,0.0001 +game,T10,ip_seq,865,0.005022,true,0.0001 +game,T10,ip_seq,866,0.003892,true,0.0001 +game,T10,ip_seq,867,0.006602,true,0.0001 +game,T10,ip_seq,868,0.004146,true,0.0001 +game,T10,ip_seq,869,0.004103,true,0.0001 +game,T10,ip_seq,870,0.004133,true,0.0001 +game,T10,ip_seq,871,0.004363,true,0.0001 +game,T10,ip_seq,872,0.007687,true,0.0001 +game,T10,ip_seq,873,0.004283,true,0.0001 +game,T10,ip_seq,874,0.005484,true,0.0001 +game,T10,ip_seq,875,0.004349,true,0.0001 +game,T10,ip_seq,876,0.004791,true,0.0001 +game,T10,ip_seq,877,0.008442,true,0.0001 +game,T10,ip_seq,878,0.004421,true,0.0001 +game,T10,ip_seq,879,0.004127,true,0.0001 +game,T10,ip_seq,880,0.004104,true,0.0001 +game,T10,ip_seq,881,0.003896,true,0.0001 +game,T10,ip_seq,882,0.006884,true,0.0001 +game,T10,ip_seq,883,0.003964,true,0.0001 +game,T10,ip_seq,884,0.004385,true,0.0001 +game,T10,ip_seq,885,0.006325,true,0.0001 +game,T10,ip_seq,886,0.004574,true,0.0001 +game,T10,ip_seq,887,0.007129,true,0.0001 +game,T10,ip_seq,888,0.005559,true,0.0001 +game,T10,ip_seq,889,0.004222,true,0.0001 +game,T10,ip_seq,890,0.005683,true,0.0001 +game,T10,ip_seq,891,0.007787,true,0.0001 +game,T10,ip_seq,892,0.004214,true,0.0001 +game,T10,ip_seq,893,0.00389,true,0.0001 +game,T10,ip_seq,894,0.004396,true,0.0001 +game,T10,ip_seq,895,0.004113,true,0.0001 +game,T10,ip_seq,896,0.004349,true,0.0001 +game,T10,ip_seq,897,0.007167,true,0.0001 +game,T10,ip_seq,898,0.004165,true,0.0001 +game,T10,ip_seq,899,0.004517,true,0.0001 +game,T10,ip_seq,900,0.004156,true,0.0001 +game,T10,ip_seq,901,0.00415,true,0.0001 +game,T10,ip_seq,902,0.007466,true,0.0001 +game,T10,ip_seq,903,0.004219,true,0.0001 +game,T10,ip_seq,904,0.004666,true,0.0001 +game,T10,ip_seq,905,0.003915,true,0.0001 +game,T10,ip_seq,906,0.005948,true,0.0001 +game,T10,ip_seq,907,0.007064,true,0.0001 +game,T10,ip_seq,908,0.004655,true,0.0001 +game,T10,ip_seq,909,0.004181,true,0.0001 +game,T10,ip_seq,910,0.006119,true,0.0001 +game,T10,ip_seq,911,0.00501,true,0.0001 +game,T10,ip_seq,912,0.007941,true,0.0001 +game,T10,ip_seq,913,0.003721,true,0.0001 +game,T10,ip_seq,914,0.004142,true,0.0001 +game,T10,ip_seq,915,0.004127,true,0.0001 +game,T10,ip_seq,916,0.004554,true,0.0001 +game,T10,ip_seq,917,0.006891,true,0.0001 +game,T10,ip_seq,918,0.005385,true,0.0001 +game,T10,ip_seq,919,0.004567,true,0.0001 +game,T10,ip_seq,920,0.004377,true,0.0001 +game,T10,ip_seq,921,0.003899,true,0.0001 +game,T10,ip_seq,922,0.007159,true,0.0001 +game,T10,ip_seq,923,0.006913,true,0.0001 +game,T10,ip_seq,924,0.004135,true,0.0001 +game,T10,ip_seq,925,0.004329,true,0.0001 +game,T10,ip_seq,926,0.004308,true,0.0001 +game,T10,ip_seq,927,0.006852,true,0.0001 +game,T10,ip_seq,928,0.003949,true,0.0001 +game,T10,ip_seq,929,0.004114,true,0.0001 +game,T10,ip_seq,930,0.003904,true,0.0001 +game,T10,ip_seq,931,0.005266,true,0.0001 +game,T10,ip_seq,932,0.006904,true,0.0001 +game,T10,ip_seq,933,0.005386,true,0.0001 +game,T10,ip_seq,934,0.004172,true,0.0001 +game,T10,ip_seq,935,0.004122,true,0.0001 +game,T10,ip_seq,936,0.00501,true,0.0001 +game,T10,ip_seq,937,0.006815,true,0.0001 +game,T10,ip_seq,938,0.004195,true,0.0001 +game,T10,ip_seq,939,0.005349,true,0.0001 +game,T10,ip_seq,940,0.004128,true,0.0001 +game,T10,ip_seq,941,0.004314,true,0.0001 +game,T10,ip_seq,942,0.006887,true,0.0001 +game,T10,ip_seq,943,0.004222,true,0.0001 +game,T10,ip_seq,944,0.00415,true,0.0001 +game,T10,ip_seq,945,0.00391,true,0.0001 +game,T10,ip_seq,946,0.004129,true,0.0001 +game,T10,ip_seq,947,0.008331,true,0.0001 +game,T10,ip_seq,948,0.003986,true,0.0001 +game,T10,ip_seq,949,0.005484,true,0.0001 +game,T10,ip_seq,950,0.004353,true,0.0001 +game,T10,ip_seq,951,0.004534,true,0.0001 +game,T10,ip_seq,952,0.008063,true,0.0001 +game,T10,ip_seq,953,0.003952,true,0.0001 +game,T10,ip_seq,954,0.00437,true,0.0001 +game,T10,ip_seq,955,0.004105,true,0.0001 +game,T10,ip_seq,956,0.012552,true,0.0001 +game,T10,ip_seq,957,0.003937,true,0.0001 +game,T10,ip_seq,958,0.005273,true,0.0001 +game,T10,ip_seq,959,0.004158,true,0.0001 +game,T10,ip_seq,960,0.004114,true,0.0001 +game,T10,ip_seq,961,0.00967,true,0.0001 +game,T10,ip_seq,962,0.004167,true,0.0001 +game,T10,ip_seq,963,0.004392,true,0.0001 +game,T10,ip_seq,964,0.003965,true,0.0001 +game,T10,ip_seq,965,0.004189,true,0.0001 +game,T10,ip_seq,966,0.003979,true,0.0001 +game,T10,ip_seq,967,0.008147,true,0.0001 +game,T10,ip_seq,968,0.005168,true,0.0001 +game,T10,ip_seq,969,0.004168,true,0.0001 +game,T10,ip_seq,970,0.0051,true,0.0001 +game,T10,ip_seq,971,0.004167,true,0.0001 +game,T10,ip_seq,972,0.004219,true,0.0001 +game,T10,ip_seq,973,0.008203,true,0.0001 +game,T10,ip_seq,974,0.004596,true,0.0001 +game,T10,ip_seq,975,0.004219,true,0.0001 +game,T10,ip_seq,976,0.004471,true,0.0001 +game,T10,ip_seq,977,0.004201,true,0.0001 +game,T10,ip_seq,978,0.004192,true,0.0001 +game,T10,ip_seq,979,0.007966,true,0.0001 +game,T10,ip_seq,980,0.004167,true,0.0001 +game,T10,ip_seq,981,0.005552,true,0.0001 +game,T10,ip_seq,982,0.004184,true,0.0001 +game,T10,ip_seq,983,0.004126,true,0.0001 +game,T10,ip_seq,984,0.007197,true,0.0001 +game,T10,ip_seq,985,0.004042,true,0.0001 +game,T10,ip_seq,986,0.004164,true,0.0001 +game,T10,ip_seq,987,0.004555,true,0.0001 +game,T10,ip_seq,988,0.005605,true,0.0001 +game,T10,ip_seq,989,0.008408,true,0.0001 +game,T10,ip_seq,990,0.004497,true,0.0001 +game,T10,ip_seq,991,0.004186,true,0.0001 +game,T10,ip_seq,992,0.003893,true,0.0001 +game,T10,ip_seq,993,0.004824,true,0.0001 +game,T10,ip_seq,994,0.005501,true,0.0001 +game,T10,ip_seq,995,0.008314,true,0.0001 +game,T10,ip_seq,996,0.004887,true,0.0001 +game,T10,ip_seq,997,0.004559,true,0.0001 +game,T10,ip_seq,998,0.004095,true,0.0001 +game,T10,ip_seq,999,0.004094,true,0.0001 +game,T10,ip_seq,1000,0.006679,true,0.0001 +game,T10,ip_seq,1001,0.003942,true,0.0001 +game,T10,ip_seq,1002,0.004164,true,0.0001 +game,T10,ip_seq,1003,0.005426,true,0.0001 +game,T10,ip_seq,1004,0.004106,true,0.0001 +game,T10,ip_seq,1005,0.006878,true,0.0001 +game,T10,ip_seq,1006,0.003727,true,0.0001 +game,T10,ip_seq,1007,0.004122,true,0.0001 +game,T10,ip_seq,1008,0.004108,true,0.0001 +game,T10,ip_seq,1009,0.004152,true,0.0001 +game,T10,ip_seq,1010,0.00828,true,0.0001 +game,T10,ip_seq,1011,0.003969,true,0.0001 +game,T10,ip_seq,1012,0.003936,true,0.0001 +game,T10,ip_seq,1013,0.004821,true,0.0001 +game,T10,ip_seq,1014,0.003651,true,0.0001 +game,T10,ip_seq,1015,0.003908,true,0.0001 +game,T10,ip_seq,1016,0.00682,true,0.0001 +game,T10,ip_seq,1017,0.003731,true,0.0001 +game,T10,ip_seq,1018,0.005305,true,0.0001 +game,T10,ip_seq,1019,0.004367,true,0.0001 +game,T10,ip_seq,1020,0.00412,true,0.0001 +game,T10,ip_seq,1021,0.006794,true,0.0001 +game,T10,ip_seq,1022,0.004169,true,0.0001 +game,T10,ip_seq,1023,0.004119,true,0.0001 +game,T10,ip_seq,1024,0.004341,true,0.0001 +game,T10,path,1,0.059047,true,0.0001 +game,T10,path,2,0.041431,true,0.0001 +game,T10,path,3,0.029015,true,0.0001 +game,T10,path,4,0.048331,true,0.0001 +game,T10,path,5,0.058194,true,0.0001 +game,T10,path,6,0.042952,true,0.0001 +game,T10,path,7,0.028199,true,0.0001 +game,T10,path,8,0.023337,true,0.0001 +game,T10,path,9,0.031856,true,0.0001 +game,T10,path,10,0.061212,true,0.0001 +game,T10,path,11,0.026706,true,0.0001 +game,T10,path,12,0.028541,true,0.0001 +game,T10,path,13,0.022396,true,0.0001 +game,T10,path,14,0.03193,true,0.0001 +game,T10,path,15,0.056334,true,0.0001 +game,T10,path,16,0.040631,true,0.0001 +game,T10,path,17,0.064279,true,0.0001 +game,T10,path,18,0.03422,true,0.0001 +game,T10,path,19,0.022416,true,0.0001 +game,T10,path,20,0.043982,true,0.0001 +game,T10,path,21,0.031904,true,0.0001 +game,T10,path,22,0.060629,true,0.0001 +game,T10,path,23,0.040808,true,0.0001 +game,T10,path,24,0.023811,true,0.0001 +game,T10,path,25,0.048819,true,0.0001 +game,T10,path,26,0.065637,true,0.0001 +game,T10,path,27,0.036384,true,0.0001 +game,T10,path,28,0.031122,true,0.0001 +game,T10,path,29,0.033276,true,0.0001 +game,T10,path,30,0.032443,true,0.0001 +game,T10,path,31,0.021816,true,0.0001 +game,T10,path,32,0.016555,true,0.0001 +game,T10,path,33,0.027393,true,0.0001 +game,T10,path,34,0.039009,true,0.0001 +game,T10,path,35,0.021349,true,0.0001 +game,T10,path,36,0.023897,true,0.0001 +game,T10,path,37,0.021195,true,0.0001 +game,T10,path,38,0.040232,true,0.0001 +game,T10,path,39,0.045699,true,0.0001 +game,T10,path,40,0.038672,true,0.0001 +game,T10,path,41,0.03355,true,0.0001 +game,T10,path,42,0.014477,true,0.0001 +game,T10,path,43,0.051755,true,0.0001 +game,T10,path,44,0.133682,false,0.0001 +game,T10,path,45,0.069961,true,0.0001 +game,T10,path,46,0.046311,true,0.0001 +game,T10,path,47,0.012788,true,0.0001 +game,T10,path,48,0.030076,true,0.0001 +game,T10,path,49,0.033923,true,0.0001 +game,T10,path,50,0.070793,true,0.0001 +game,T10,path,51,0.046606,true,0.0001 +game,T10,path,52,0.04056,true,0.0001 +game,T10,path,53,0.056292,true,0.0001 +game,T10,path,54,0.089312,true,0.0001 +game,T10,path,55,0.060301,true,0.0001 +game,T10,path,56,0.03454,true,0.0001 +game,T10,path,57,0.03315,true,0.0001 +game,T10,path,58,0.03021,true,0.0001 +game,T10,path,59,0.046223,true,0.0001 +game,T10,path,60,0.024117,true,0.0001 +game,T10,path,61,0.041187,true,0.0001 +game,T10,path,62,0.057106,true,0.0001 +game,T10,path,63,0.037605,true,0.0001 +game,T10,path,64,0.037056,true,0.0001 +game,T10,path,65,0.042639,true,0.0001 +game,T10,path,66,0.083667,true,0.0001 +game,T10,path,67,0.068012,true,0.0001 +game,T10,path,68,0.04736,true,0.0001 +game,T10,path,69,0.052033,true,0.0001 +game,T10,path,70,0.044437,true,0.0001 +game,T10,path,71,0.059546,true,0.0001 +game,T10,path,72,0.024886,true,0.0001 +game,T10,path,73,0.039409,true,0.0001 +game,T10,path,74,0.034438,true,0.0001 +game,T10,path,75,0.052557,true,0.0001 +game,T10,path,76,0.036876,true,0.0001 +game,T10,path,77,0.076643,true,0.0001 +game,T10,path,78,0.029315,true,0.0001 +game,T10,path,79,0.097236,true,0.0001 +game,T10,path,80,0.053386,true,0.0001 +game,T10,path,81,0.027304,true,0.0001 +game,T10,path,82,0.010744,true,0.0001 +game,T10,path,83,0.043748,true,0.0001 +game,T10,path,84,0.055762,true,0.0001 +game,T10,path,85,0.029837,true,0.0001 +game,T10,path,86,0.017697,true,0.0001 +game,T10,path,87,0.014258,true,0.0001 +game,T10,path,88,0.03931,true,0.0001 +game,T10,path,89,0.019293,true,0.0001 +game,T10,path,90,0.014485,true,0.0001 +game,T10,path,91,0.025322,true,0.0001 +game,T10,path,92,0.014042,true,0.0001 +game,T10,path,93,0.064196,true,0.0001 +game,T10,path,94,0.017628,true,0.0001 +game,T10,path,95,0.044405,true,0.0001 +game,T10,path,96,0.026771,true,0.0001 +game,T10,path,97,0.044671,true,0.0001 +game,T10,path,98,0.052125,true,0.0001 +game,T10,path,99,0.029849,true,0.0001 +game,T10,path,100,0.031026,true,0.0001 +game,T10,path,101,0.03533,true,0.0001 +game,T10,path,102,0.044199,true,0.0001 +game,T10,path,103,0.015364,true,0.0001 +game,T10,path,104,0.064104,true,0.0001 +game,T10,path,105,0.037147,true,0.0001 +game,T10,path,106,0.024284,true,0.0001 +game,T10,path,107,0.029934,true,0.0001 +game,T10,path,108,0.021838,true,0.0001 +game,T10,path,109,0.040416,true,0.0001 +game,T10,path,110,0.028442,true,0.0001 +game,T10,path,111,0.045204,true,0.0001 +game,T10,path,112,0.051844,true,0.0001 +game,T10,path,113,0.062487,true,0.0001 +game,T10,path,114,0.063863,true,0.0001 +game,T10,path,115,0.026768,true,0.0001 +game,T10,path,116,0.040245,true,0.0001 +game,T10,path,117,0.027885,true,0.0001 +game,T10,path,118,0.036468,true,0.0001 +game,T10,path,119,0.059213,true,0.0001 +game,T10,path,120,0.072426,true,0.0001 +game,T10,path,121,0.047608,true,0.0001 +game,T10,path,122,0.059167,true,0.0001 +game,T10,path,123,0.051396,true,0.0001 +game,T10,path,124,0.05264,true,0.0001 +game,T10,path,125,0.045372,true,0.0001 +game,T10,path,126,0.042801,true,0.0001 +game,T10,path,127,0.041859,true,0.0001 +game,T10,path,128,0.047237,true,0.0001 +game,T10,path,129,0.043407,true,0.0001 +game,T10,path,130,0.028341,true,0.0001 +game,T10,path,131,0.058127,true,0.0001 +game,T10,path,132,0.064473,true,0.0001 +game,T10,path,133,0.038874,true,0.0001 +game,T10,path,134,0.018512,true,0.0001 +game,T10,path,135,0.028113,true,0.0001 +game,T10,path,136,0.05445,true,0.0001 +game,T10,path,137,0.024614,true,0.0001 +game,T10,path,138,0.053914,true,0.0001 +game,T10,path,139,0.037193,true,0.0001 +game,T10,path,140,0.033229,true,0.0001 +game,T10,path,141,0.049082,true,0.0001 +game,T10,path,142,0.060504,true,0.0001 +game,T10,path,143,0.068805,true,0.0001 +game,T10,path,144,0.042189,true,0.0001 +game,T10,path,145,0.019698,true,0.0001 +game,T10,path,146,0.128132,false,0.0001 +game,T10,path,147,0.134961,false,0.0001 +game,T10,path,148,0.066958,true,0.0001 +game,T10,path,149,0.060483,true,0.0001 +game,T10,path,150,0.009076,true,0.0001 +game,T10,path,151,0.043142,true,0.0001 +game,T10,path,152,0.039183,true,0.0001 +game,T10,path,153,0.078535,true,0.0001 +game,T10,path,154,0.035564,true,0.0001 +game,T10,path,155,0.037982,true,0.0001 +game,T10,path,156,0.028471,true,0.0001 +game,T10,path,157,0.030603,true,0.0001 +game,T10,path,158,0.02328,true,0.0001 +game,T10,path,159,0.05634,true,0.0001 +game,T10,path,160,0.027354,true,0.0001 +game,T10,path,161,0.048547,true,0.0001 +game,T10,path,162,0.047062,true,0.0001 +game,T10,path,163,0.035739,true,0.0001 +game,T10,path,164,0.014188,true,0.0001 +game,T10,path,165,0.037166,true,0.0001 +game,T10,path,166,0.035555,true,0.0001 +game,T10,path,167,0.096412,true,0.0001 +game,T10,path,168,0.03388,true,0.0001 +game,T10,path,169,0.049572,true,0.0001 +game,T10,path,170,0.043878,true,0.0001 +game,T10,path,171,0.069887,true,0.0001 +game,T10,path,172,0.032007,true,0.0001 +game,T10,path,173,0.047224,true,0.0001 +game,T10,path,174,0.012958,true,0.0001 +game,T10,path,175,0.028524,true,0.0001 +game,T10,path,176,0.048738,true,0.0001 +game,T10,path,177,0.058888,true,0.0001 +game,T10,path,178,0.018778,true,0.0001 +game,T10,path,179,0.065237,true,0.0001 +game,T10,path,180,0.044771,true,0.0001 +game,T10,path,181,0.051146,true,0.0001 +game,T10,path,182,0.058036,true,0.0001 +game,T10,path,183,0.041736,true,0.0001 +game,T10,path,184,0.035688,true,0.0001 +game,T10,path,185,0.07958,true,0.0001 +game,T10,path,186,0.041533,true,0.0001 +game,T10,path,187,0.044183,true,0.0001 +game,T10,path,188,0.04853,true,0.0001 +game,T10,path,189,0.082099,true,0.0001 +game,T10,path,190,0.031297,true,0.0001 +game,T10,path,191,0.065608,true,0.0001 +game,T10,path,192,0.06736,true,0.0001 +game,T10,path,193,0.037194,true,0.0001 +game,T10,path,194,0.028724,true,0.0001 +game,T10,path,195,0.039806,true,0.0001 +game,T10,path,196,0.050587,true,0.0001 +game,T10,path,197,0.021422,true,0.0001 +game,T10,path,198,0.017175,true,0.0001 +game,T10,path,199,0.042674,true,0.0001 +game,T10,path,200,0.024449,true,0.0001 +game,T10,path,201,0.048291,true,0.0001 +game,T10,path,202,0.02579,true,0.0001 +game,T10,path,203,0.036151,true,0.0001 +game,T10,path,204,0.040715,true,0.0001 +game,T10,path,205,0.050645,true,0.0001 +game,T10,path,206,0.053985,true,0.0001 +game,T10,path,207,0.046323,true,0.0001 +game,T10,path,208,0.036742,true,0.0001 +game,T10,path,209,0.05262,true,0.0001 +game,T10,path,210,0.062723,true,0.0001 +game,T10,path,211,0.068515,true,0.0001 +game,T10,path,212,0.052027,true,0.0001 +game,T10,path,213,0.031152,true,0.0001 +game,T10,path,214,0.048902,true,0.0001 +game,T10,path,215,0.04378,true,0.0001 +game,T10,path,216,0.111874,true,0.0001 +game,T10,path,217,0.040098,true,0.0001 +game,T10,path,218,0.018487,true,0.0001 +game,T10,path,219,0.044314,true,0.0001 +game,T10,path,220,0.044706,true,0.0001 +game,T10,path,221,0.012727,true,0.0001 +game,T10,path,222,0.027422,true,0.0001 +game,T10,path,223,0.112732,true,0.0001 +game,T10,path,224,0.055775,true,0.0001 +game,T10,path,225,0.027746,true,0.0001 +game,T10,path,226,0.053469,true,0.0001 +game,T10,path,227,0.027206,true,0.0001 +game,T10,path,228,0.027906,true,0.0001 +game,T10,path,229,0.08683,true,0.0001 +game,T10,path,230,0.042799,true,0.0001 +game,T10,path,231,0.030111,true,0.0001 +game,T10,path,232,0.030688,true,0.0001 +game,T10,path,233,0.044112,true,0.0001 +game,T10,path,234,0.011968,true,0.0001 +game,T10,path,235,0.045144,true,0.0001 +game,T10,path,236,0.06104,true,0.0001 +game,T10,path,237,0.027882,true,0.0001 +game,T10,path,238,0.054498,true,0.0001 +game,T10,path,239,0.038122,true,0.0001 +game,T10,path,240,0.07746,true,0.0001 +game,T10,path,241,0.051402,true,0.0001 +game,T10,path,242,0.040722,true,0.0001 +game,T10,path,243,0.039287,true,0.0001 +game,T10,path,244,0.022046,true,0.0001 +game,T10,path,245,0.04453,true,0.0001 +game,T10,path,246,0.020714,true,0.0001 +game,T10,path,247,0.027073,true,0.0001 +game,T10,path,248,0.051155,true,0.0001 +game,T10,path,249,0.037402,true,0.0001 +game,T10,path,250,0.126983,false,0.0001 +game,T10,path,251,0.044198,true,0.0001 +game,T10,path,252,0.032762,true,0.0001 +game,T10,path,253,0.039626,true,0.0001 +game,T10,path,254,0.063202,true,0.0001 +game,T10,path,255,0.037506,true,0.0001 +game,T10,path,256,0.076216,true,0.0001 +game,T10,path,257,0.06928,true,0.0001 +game,T10,path,258,0.02918,true,0.0001 +game,T10,path,259,0.049125,true,0.0001 +game,T10,path,260,0.029988,true,0.0001 +game,T10,path,261,0.032553,true,0.0001 +game,T10,path,262,0.040053,true,0.0001 +game,T10,path,263,0.063655,true,0.0001 +game,T10,path,264,0.041909,true,0.0001 +game,T10,path,265,0.047551,true,0.0001 +game,T10,path,266,0.051938,true,0.0001 +game,T10,path,267,0.052724,true,0.0001 +game,T10,path,268,0.034911,true,0.0001 +game,T10,path,269,0.028406,true,0.0001 +game,T10,path,270,0.064853,true,0.0001 +game,T10,path,271,0.046478,true,0.0001 +game,T10,path,272,0.042484,true,0.0001 +game,T10,path,273,0.033637,true,0.0001 +game,T10,path,274,0.043619,true,0.0001 +game,T10,path,275,0.03591,true,0.0001 +game,T10,path,276,0.059474,true,0.0001 +game,T10,path,277,0.021042,true,0.0001 +game,T10,path,278,0.067146,true,0.0001 +game,T10,path,279,0.022078,true,0.0001 +game,T10,path,280,0.074922,true,0.0001 +game,T10,path,281,0.061834,true,0.0001 +game,T10,path,282,0.021696,true,0.0001 +game,T10,path,283,0.059738,true,0.0001 +game,T10,path,284,0.03009,true,0.0001 +game,T10,path,285,0.024938,true,0.0001 +game,T10,path,286,0.025835,true,0.0001 +game,T10,path,287,0.04739,true,0.0001 +game,T10,path,288,0.045557,true,0.0001 +game,T10,path,289,0.052707,true,0.0001 +game,T10,path,290,0.022164,true,0.0001 +game,T10,path,291,0.063421,true,0.0001 +game,T10,path,292,0.022548,true,0.0001 +game,T10,path,293,0.033699,true,0.0001 +game,T10,path,294,0.113067,true,0.0001 +game,T10,path,295,0.020766,true,0.0001 +game,T10,path,296,0.02353,true,0.0001 +game,T10,path,297,0.020897,true,0.0001 +game,T10,path,298,0.047869,true,0.0001 +game,T10,path,299,0.032551,true,0.0001 +game,T10,path,300,0.056477,true,0.0001 +game,T10,path,301,0.034463,true,0.0001 +game,T10,path,302,0.038728,true,0.0001 +game,T10,path,303,0.061378,true,0.0001 +game,T10,path,304,0.02261,true,0.0001 +game,T10,path,305,0.060813,true,0.0001 +game,T10,path,306,0.034799,true,0.0001 +game,T10,path,307,0.026743,true,0.0001 +game,T10,path,308,0.019632,true,0.0001 +game,T10,path,309,0.037416,true,0.0001 +game,T10,path,310,0.036991,true,0.0001 +game,T10,path,311,0.042736,true,0.0001 +game,T10,path,312,0.086969,true,0.0001 +game,T10,path,313,0.056881,true,0.0001 +game,T10,path,314,0.026917,true,0.0001 +game,T10,path,315,0.050621,true,0.0001 +game,T10,path,316,0.045648,true,0.0001 +game,T10,path,317,0.028414,true,0.0001 +game,T10,path,318,0.023626,true,0.0001 +game,T10,path,319,0.031872,true,0.0001 +game,T10,path,320,0.041209,true,0.0001 +game,T10,path,321,0.030288,true,0.0001 +game,T10,path,322,0.042718,true,0.0001 +game,T10,path,323,0.026473,true,0.0001 +game,T10,path,324,0.137047,false,0.0001 +game,T10,path,325,0.042348,true,0.0001 +game,T10,path,326,0.044067,true,0.0001 +game,T10,path,327,0.040833,true,0.0001 +game,T10,path,328,0.035196,true,0.0001 +game,T10,path,329,0.037035,true,0.0001 +game,T10,path,330,0.030706,true,0.0001 +game,T10,path,331,0.039371,true,0.0001 +game,T10,path,332,0.061525,true,0.0001 +game,T10,path,333,0.024189,true,0.0001 +game,T10,path,334,0.031609,true,0.0001 +game,T10,path,335,0.03635,true,0.0001 +game,T10,path,336,0.036853,true,0.0001 +game,T10,path,337,0.043955,true,0.0001 +game,T10,path,338,0.046207,true,0.0001 +game,T10,path,339,0.137197,false,0.0001 +game,T10,path,340,0.063126,true,0.0001 +game,T10,path,341,0.021098,true,0.0001 +game,T10,path,342,0.036604,true,0.0001 +game,T10,path,343,0.02964,true,0.0001 +game,T10,path,344,0.136845,false,0.0001 +game,T10,path,345,0.050013,true,0.0001 +game,T10,path,346,0.045288,true,0.0001 +game,T10,path,347,0.023919,true,0.0001 +game,T10,path,348,0.023617,true,0.0001 +game,T10,path,349,0.130053,false,0.0001 +game,T10,path,350,0.045288,true,0.0001 +game,T10,path,351,0.055205,true,0.0001 +game,T10,path,352,0.038285,true,0.0001 +game,T10,path,353,0.078151,true,0.0001 +game,T10,path,354,0.064809,true,0.0001 +game,T10,path,355,0.055364,true,0.0001 +game,T10,path,356,0.024285,true,0.0001 +game,T10,path,357,0.054648,true,0.0001 +game,T10,path,358,0.02158,true,0.0001 +game,T10,path,359,0.040248,true,0.0001 +game,T10,path,360,0.027754,true,0.0001 +game,T10,path,361,0.047788,true,0.0001 +game,T10,path,362,0.017583,true,0.0001 +game,T10,path,363,0.035926,true,0.0001 +game,T10,path,364,0.074294,true,0.0001 +game,T10,path,365,0.05109,true,0.0001 +game,T10,path,366,0.028895,true,0.0001 +game,T10,path,367,0.035135,true,0.0001 +game,T10,path,368,0.0445,true,0.0001 +game,T10,path,369,0.02124,true,0.0001 +game,T10,path,370,0.135782,false,0.0001 +game,T10,path,371,0.029895,true,0.0001 +game,T10,path,372,0.095838,true,0.0001 +game,T10,path,373,0.029829,true,0.0001 +game,T10,path,374,0.062306,true,0.0001 +game,T10,path,375,0.03471,true,0.0001 +game,T10,path,376,0.06628,true,0.0001 +game,T10,path,377,0.069925,true,0.0001 +game,T10,path,378,0.083662,true,0.0001 +game,T10,path,379,0.081007,true,0.0001 +game,T10,path,380,0.021404,true,0.0001 +game,T10,path,381,0.040444,true,0.0001 +game,T10,path,382,0.023793,true,0.0001 +game,T10,path,383,0.038605,true,0.0001 +game,T10,path,384,0.023586,true,0.0001 +game,T10,path,385,0.027306,true,0.0001 +game,T10,path,386,0.023735,true,0.0001 +game,T10,path,387,0.095852,true,0.0001 +game,T10,path,388,0.078412,true,0.0001 +game,T10,path,389,0.059933,true,0.0001 +game,T10,path,390,0.054718,true,0.0001 +game,T10,path,391,0.049084,true,0.0001 +game,T10,path,392,0.037699,true,0.0001 +game,T10,path,393,0.06807,true,0.0001 +game,T10,path,394,0.027826,true,0.0001 +game,T10,path,395,0.031588,true,0.0001 +game,T10,path,396,0.036273,true,0.0001 +game,T10,path,397,0.020886,true,0.0001 +game,T10,path,398,0.058377,true,0.0001 +game,T10,path,399,0.040481,true,0.0001 +game,T10,path,400,0.037311,true,0.0001 +game,T10,path,401,0.04047,true,0.0001 +game,T10,path,402,0.047126,true,0.0001 +game,T10,path,403,0.065448,true,0.0001 +game,T10,path,404,0.018708,true,0.0001 +game,T10,path,405,0.03469,true,0.0001 +game,T10,path,406,0.031482,true,0.0001 +game,T10,path,407,0.012527,true,0.0001 +game,T10,path,408,0.059603,true,0.0001 +game,T10,path,409,0.041312,true,0.0001 +game,T10,path,410,0.040806,true,0.0001 +game,T10,path,411,0.082609,true,0.0001 +game,T10,path,412,0.061147,true,0.0001 +game,T10,path,413,0.018602,true,0.0001 +game,T10,path,414,0.045083,true,0.0001 +game,T10,path,415,0.02896,true,0.0001 +game,T10,path,416,0.04083,true,0.0001 +game,T10,path,417,0.041558,true,0.0001 +game,T10,path,418,0.024105,true,0.0001 +game,T10,path,419,0.048697,true,0.0001 +game,T10,path,420,0.041837,true,0.0001 +game,T10,path,421,0.048687,true,0.0001 +game,T10,path,422,0.030914,true,0.0001 +game,T10,path,423,0.06555,true,0.0001 +game,T10,path,424,0.129967,false,0.0001 +game,T10,path,425,0.018372,true,0.0001 +game,T10,path,426,0.062196,true,0.0001 +game,T10,path,427,0.016914,true,0.0001 +game,T10,path,428,0.042015,true,0.0001 +game,T10,path,429,0.037016,true,0.0001 +game,T10,path,430,0.030898,true,0.0001 +game,T10,path,431,0.053983,true,0.0001 +game,T10,path,432,0.057279,true,0.0001 +game,T10,path,433,0.061679,true,0.0001 +game,T10,path,434,0.046744,true,0.0001 +game,T10,path,435,0.036,true,0.0001 +game,T10,path,436,0.116932,true,0.0001 +game,T10,path,437,0.027334,true,0.0001 +game,T10,path,438,0.032748,true,0.0001 +game,T10,path,439,0.036262,true,0.0001 +game,T10,path,440,0.035898,true,0.0001 +game,T10,path,441,0.041353,true,0.0001 +game,T10,path,442,0.066523,true,0.0001 +game,T10,path,443,0.119941,false,0.0001 +game,T10,path,444,0.113913,true,0.0001 +game,T10,path,445,0.022682,true,0.0001 +game,T10,path,446,0.071092,true,0.0001 +game,T10,path,447,0.03977,true,0.0001 +game,T10,path,448,0.028358,true,0.0001 +game,T10,path,449,0.025651,true,0.0001 +game,T10,path,450,0.037047,true,0.0001 +game,T10,path,451,0.045461,true,0.0001 +game,T10,path,452,0.024509,true,0.0001 +game,T10,path,453,0.066857,true,0.0001 +game,T10,path,454,0.056193,true,0.0001 +game,T10,path,455,0.051303,true,0.0001 +game,T10,path,456,0.048758,true,0.0001 +game,T10,path,457,0.02211,true,0.0001 +game,T10,path,458,0.035023,true,0.0001 +game,T10,path,459,0.030203,true,0.0001 +game,T10,path,460,0.030906,true,0.0001 +game,T10,path,461,0.041216,true,0.0001 +game,T10,path,462,0.022966,true,0.0001 +game,T10,path,463,0.040379,true,0.0001 +game,T10,path,464,0.073621,true,0.0001 +game,T10,path,465,0.06654,true,0.0001 +game,T10,path,466,0.024713,true,0.0001 +game,T10,path,467,0.052774,true,0.0001 +game,T10,path,468,0.028778,true,0.0001 +game,T10,path,469,0.041881,true,0.0001 +game,T10,path,470,0.037591,true,0.0001 +game,T10,path,471,0.038032,true,0.0001 +game,T10,path,472,0.055692,true,0.0001 +game,T10,path,473,0.123124,false,0.0001 +game,T10,path,474,0.040302,true,0.0001 +game,T10,path,475,0.046726,true,0.0001 +game,T10,path,476,0.049846,true,0.0001 +game,T10,path,477,0.03471,true,0.0001 +game,T10,path,478,0.032372,true,0.0001 +game,T10,path,479,0.033948,true,0.0001 +game,T10,path,480,0.071883,true,0.0001 +game,T10,path,481,0.037601,true,0.0001 +game,T10,path,482,0.027333,true,0.0001 +game,T10,path,483,0.029174,true,0.0001 +game,T10,path,484,0.045429,true,0.0001 +game,T10,path,485,0.056184,true,0.0001 +game,T10,path,486,0.053321,true,0.0001 +game,T10,path,487,0.043934,true,0.0001 +game,T10,path,488,0.072278,true,0.0001 +game,T10,path,489,0.033793,true,0.0001 +game,T10,path,490,0.028921,true,0.0001 +game,T10,path,491,0.0166,true,0.0001 +game,T10,path,492,0.024857,true,0.0001 +game,T10,path,493,0.050589,true,0.0001 +game,T10,path,494,0.034987,true,0.0001 +game,T10,path,495,0.030677,true,0.0001 +game,T10,path,496,0.030453,true,0.0001 +game,T10,path,497,0.052707,true,0.0001 +game,T10,path,498,0.060797,true,0.0001 +game,T10,path,499,0.026861,true,0.0001 +game,T10,path,500,0.070058,true,0.0001 +game,T10,path,501,0.06338,true,0.0001 +game,T10,path,502,0.03,true,0.0001 +game,T10,path,503,0.039016,true,0.0001 +game,T10,path,504,0.025061,true,0.0001 +game,T10,path,505,0.022609,true,0.0001 +game,T10,path,506,0.043722,true,0.0001 +game,T10,path,507,0.052896,true,0.0001 +game,T10,path,508,0.01447,true,0.0001 +game,T10,path,509,0.046465,true,0.0001 +game,T10,path,510,0.051165,true,0.0001 +game,T10,path,511,0.059479,true,0.0001 +game,T10,path,512,0.039149,true,0.0001 +game,T10,path,513,0.015008,true,0.0001 +game,T10,path,514,0.025668,true,0.0001 +game,T10,path,515,0.07628,true,0.0001 +game,T10,path,516,0.066958,true,0.0001 +game,T10,path,517,0.054851,true,0.0001 +game,T10,path,518,0.054319,true,0.0001 +game,T10,path,519,0.030124,true,0.0001 +game,T10,path,520,0.029369,true,0.0001 +game,T10,path,521,0.0443,true,0.0001 +game,T10,path,522,0.045573,true,0.0001 +game,T10,path,523,0.06553,true,0.0001 +game,T10,path,524,0.022247,true,0.0001 +game,T10,path,525,0.059757,true,0.0001 +game,T10,path,526,0.050204,true,0.0001 +game,T10,path,527,0.037564,true,0.0001 +game,T10,path,528,0.04207,true,0.0001 +game,T10,path,529,0.044312,true,0.0001 +game,T10,path,530,0.024418,true,0.0001 +game,T10,path,531,0.060743,true,0.0001 +game,T10,path,532,0.019825,true,0.0001 +game,T10,path,533,0.081837,true,0.0001 +game,T10,path,534,0.031405,true,0.0001 +game,T10,path,535,0.049752,true,0.0001 +game,T10,path,536,0.038399,true,0.0001 +game,T10,path,537,0.035103,true,0.0001 +game,T10,path,538,0.02128,true,0.0001 +game,T10,path,539,0.127786,false,0.0001 +game,T10,path,540,0.029624,true,0.0001 +game,T10,path,541,0.035233,true,0.0001 +game,T10,path,542,0.043206,true,0.0001 +game,T10,path,543,0.027462,true,0.0001 +game,T10,path,544,0.028472,true,0.0001 +game,T10,path,545,0.03939,true,0.0001 +game,T10,path,546,0.042114,true,0.0001 +game,T10,path,547,0.027009,true,0.0001 +game,T10,path,548,0.027798,true,0.0001 +game,T10,path,549,0.042805,true,0.0001 +game,T10,path,550,0.037392,true,0.0001 +game,T10,path,551,0.033969,true,0.0001 +game,T10,path,552,0.073879,true,0.0001 +game,T10,path,553,0.030036,true,0.0001 +game,T10,path,554,0.045322,true,0.0001 +game,T10,path,555,0.061977,true,0.0001 +game,T10,path,556,0.061847,true,0.0001 +game,T10,path,557,0.05854,true,0.0001 +game,T10,path,558,0.02418,true,0.0001 +game,T10,path,559,0.05727,true,0.0001 +game,T10,path,560,0.062397,true,0.0001 +game,T10,path,561,0.074263,true,0.0001 +game,T10,path,562,0.031549,true,0.0001 +game,T10,path,563,0.02772,true,0.0001 +game,T10,path,564,0.033411,true,0.0001 +game,T10,path,565,0.047554,true,0.0001 +game,T10,path,566,0.059644,true,0.0001 +game,T10,path,567,0.015757,true,0.0001 +game,T10,path,568,0.043594,true,0.0001 +game,T10,path,569,0.045214,true,0.0001 +game,T10,path,570,0.050229,true,0.0001 +game,T10,path,571,0.013757,true,0.0001 +game,T10,path,572,0.049754,true,0.0001 +game,T10,path,573,0.047355,true,0.0001 +game,T10,path,574,0.02794,true,0.0001 +game,T10,path,575,0.035346,true,0.0001 +game,T10,path,576,0.134593,true,0.0001 +game,T10,path,577,0.037136,true,0.0001 +game,T10,path,578,0.03732,true,0.0001 +game,T10,path,579,0.047854,true,0.0001 +game,T10,path,580,0.017535,true,0.0001 +game,T10,path,581,0.044069,true,0.0001 +game,T10,path,582,0.051226,true,0.0001 +game,T10,path,583,0.021411,true,0.0001 +game,T10,path,584,0.041824,true,0.0001 +game,T10,path,585,0.054048,true,0.0001 +game,T10,path,586,0.034621,true,0.0001 +game,T10,path,587,0.080709,true,0.0001 +game,T10,path,588,0.043544,true,0.0001 +game,T10,path,589,0.054066,true,0.0001 +game,T10,path,590,0.012469,true,0.0001 +game,T10,path,591,0.046304,true,0.0001 +game,T10,path,592,0.056209,true,0.0001 +game,T10,path,593,0.05225,true,0.0001 +game,T10,path,594,0.062811,true,0.0001 +game,T10,path,595,0.051272,true,0.0001 +game,T10,path,596,0.044798,true,0.0001 +game,T10,path,597,0.072666,true,0.0001 +game,T10,path,598,0.079409,true,0.0001 +game,T10,path,599,0.042458,true,0.0001 +game,T10,path,600,0.035939,true,0.0001 +game,T10,path,601,0.072996,true,0.0001 +game,T10,path,602,0.045049,true,0.0001 +game,T10,path,603,0.038074,true,0.0001 +game,T10,path,604,0.041478,true,0.0001 +game,T10,path,605,0.065164,true,0.0001 +game,T10,path,606,0.059584,true,0.0001 +game,T10,path,607,0.051185,true,0.0001 +game,T10,path,608,0.045947,true,0.0001 +game,T10,path,609,0.042733,true,0.0001 +game,T10,path,610,0.046106,true,0.0001 +game,T10,path,611,0.050327,true,0.0001 +game,T10,path,612,0.050817,true,0.0001 +game,T10,path,613,0.034331,true,0.0001 +game,T10,path,614,0.051801,true,0.0001 +game,T10,path,615,0.024734,true,0.0001 +game,T10,path,616,0.058747,true,0.0001 +game,T10,path,617,0.045978,true,0.0001 +game,T10,path,618,0.066615,true,0.0001 +game,T10,path,619,0.051562,true,0.0001 +game,T10,path,620,0.051113,true,0.0001 +game,T10,path,621,0.065732,true,0.0001 +game,T10,path,622,0.029252,true,0.0001 +game,T10,path,623,0.028593,true,0.0001 +game,T10,path,624,0.128051,false,0.0001 +game,T10,path,625,0.026801,true,0.0001 +game,T10,path,626,0.041485,true,0.0001 +game,T10,path,627,0.036236,true,0.0001 +game,T10,path,628,0.030951,true,0.0001 +game,T10,path,629,0.11997,false,0.0001 +game,T10,path,630,0.061711,true,0.0001 +game,T10,path,631,0.066317,true,0.0001 +game,T10,path,632,0.035464,true,0.0001 +game,T10,path,633,0.059064,true,0.0001 +game,T10,path,634,0.046921,true,0.0001 +game,T10,path,635,0.06422,true,0.0001 +game,T10,path,636,0.039102,true,0.0001 +game,T10,path,637,0.060839,true,0.0001 +game,T10,path,638,0.039617,true,0.0001 +game,T10,path,639,0.073273,true,0.0001 +game,T10,path,640,0.027252,true,0.0001 +game,T10,path,641,0.038158,true,0.0001 +game,T10,path,642,0.047121,true,0.0001 +game,T10,path,643,0.033702,true,0.0001 +game,T10,path,644,0.038325,true,0.0001 +game,T10,path,645,0.049432,true,0.0001 +game,T10,path,646,0.011049,true,0.0001 +game,T10,path,647,0.042482,true,0.0001 +game,T10,path,648,0.03344,true,0.0001 +game,T10,path,649,0.015252,true,0.0001 +game,T10,path,650,0.034164,true,0.0001 +game,T10,path,651,0.02682,true,0.0001 +game,T10,path,652,0.017652,true,0.0001 +game,T10,path,653,0.037248,true,0.0001 +game,T10,path,654,0.055803,true,0.0001 +game,T10,path,655,0.045606,true,0.0001 +game,T10,path,656,0.060724,true,0.0001 +game,T10,path,657,0.037412,true,0.0001 +game,T10,path,658,0.02659,true,0.0001 +game,T10,path,659,0.044258,true,0.0001 +game,T10,path,660,0.10734,true,0.0001 +game,T10,path,661,0.05709,true,0.0001 +game,T10,path,662,0.038195,true,0.0001 +game,T10,path,663,0.040812,true,0.0001 +game,T10,path,664,0.050324,true,0.0001 +game,T10,path,665,0.046645,true,0.0001 +game,T10,path,666,0.028443,true,0.0001 +game,T10,path,667,0.030589,true,0.0001 +game,T10,path,668,0.062894,true,0.0001 +game,T10,path,669,0.036422,true,0.0001 +game,T10,path,670,0.068795,true,0.0001 +game,T10,path,671,0.039276,true,0.0001 +game,T10,path,672,0.04203,true,0.0001 +game,T10,path,673,0.034149,true,0.0001 +game,T10,path,674,0.049155,true,0.0001 +game,T10,path,675,0.024868,true,0.0001 +game,T10,path,676,0.039834,true,0.0001 +game,T10,path,677,0.024383,true,0.0001 +game,T10,path,678,0.030948,true,0.0001 +game,T10,path,679,0.052095,true,0.0001 +game,T10,path,680,0.028159,true,0.0001 +game,T10,path,681,0.037286,true,0.0001 +game,T10,path,682,0.051663,true,0.0001 +game,T10,path,683,0.019202,true,0.0001 +game,T10,path,684,0.074106,true,0.0001 +game,T10,path,685,0.059045,true,0.0001 +game,T10,path,686,0.049094,true,0.0001 +game,T10,path,687,0.129875,false,0.0001 +game,T10,path,688,0.047459,true,0.0001 +game,T10,path,689,0.01652,true,0.0001 +game,T10,path,690,0.070668,true,0.0001 +game,T10,path,691,0.022495,true,0.0001 +game,T10,path,692,0.017946,true,0.0001 +game,T10,path,693,0.06392,true,0.0001 +game,T10,path,694,0.056123,true,0.0001 +game,T10,path,695,0.054001,true,0.0001 +game,T10,path,696,0.050942,true,0.0001 +game,T10,path,697,0.05761,true,0.0001 +game,T10,path,698,0.038436,true,0.0001 +game,T10,path,699,0.058319,true,0.0001 +game,T10,path,700,0.034781,true,0.0001 +game,T10,path,701,0.031566,true,0.0001 +game,T10,path,702,0.045267,true,0.0001 +game,T10,path,703,0.046476,true,0.0001 +game,T10,path,704,0.042212,true,0.0001 +game,T10,path,705,0.044332,true,0.0001 +game,T10,path,706,0.033609,true,0.0001 +game,T10,path,707,0.022723,true,0.0001 +game,T10,path,708,0.03247,true,0.0001 +game,T10,path,709,0.052799,true,0.0001 +game,T10,path,710,0.026022,true,0.0001 +game,T10,path,711,0.042652,true,0.0001 +game,T10,path,712,0.0539,true,0.0001 +game,T10,path,713,0.039975,true,0.0001 +game,T10,path,714,0.064931,true,0.0001 +game,T10,path,715,0.029951,true,0.0001 +game,T10,path,716,0.024886,true,0.0001 +game,T10,path,717,0.014673,true,0.0001 +game,T10,path,718,0.051582,true,0.0001 +game,T10,path,719,0.046357,true,0.0001 +game,T10,path,720,0.045319,true,0.0001 +game,T10,path,721,0.033892,true,0.0001 +game,T10,path,722,0.037016,true,0.0001 +game,T10,path,723,0.031963,true,0.0001 +game,T10,path,724,0.041085,true,0.0001 +game,T10,path,725,0.031114,true,0.0001 +game,T10,path,726,0.047815,true,0.0001 +game,T10,path,727,0.036764,true,0.0001 +game,T10,path,728,0.040609,true,0.0001 +game,T10,path,729,0.039374,true,0.0001 +game,T10,path,730,0.02929,true,0.0001 +game,T10,path,731,0.025333,true,0.0001 +game,T10,path,732,0.051592,true,0.0001 +game,T10,path,733,0.045727,true,0.0001 +game,T10,path,734,0.01145,true,0.0001 +game,T10,path,735,0.05132,true,0.0001 +game,T10,path,736,0.033636,true,0.0001 +game,T10,path,737,0.05203,true,0.0001 +game,T10,path,738,0.014686,true,0.0001 +game,T10,path,739,0.062423,true,0.0001 +game,T10,path,740,0.041638,true,0.0001 +game,T10,path,741,0.064542,true,0.0001 +game,T10,path,742,0.042594,true,0.0001 +game,T10,path,743,0.055675,true,0.0001 +game,T10,path,744,0.024865,true,0.0001 +game,T10,path,745,0.037754,true,0.0001 +game,T10,path,746,0.025424,true,0.0001 +game,T10,path,747,0.064534,true,0.0001 +game,T10,path,748,0.05873,true,0.0001 +game,T10,path,749,0.069104,true,0.0001 +game,T10,path,750,0.02965,true,0.0001 +game,T10,path,751,0.014603,true,0.0001 +game,T10,path,752,0.039065,true,0.0001 +game,T10,path,753,0.132751,false,0.0001 +game,T10,path,754,0.035959,true,0.0001 +game,T10,path,755,0.035607,true,0.0001 +game,T10,path,756,0.049096,true,0.0001 +game,T10,path,757,0.044042,true,0.0001 +game,T10,path,758,0.031807,true,0.0001 +game,T10,path,759,0.032309,true,0.0001 +game,T10,path,760,0.033307,true,0.0001 +game,T10,path,761,0.052054,true,0.0001 +game,T10,path,762,0.079089,true,0.0001 +game,T10,path,763,0.069371,true,0.0001 +game,T10,path,764,0.034081,true,0.0001 +game,T10,path,765,0.033997,true,0.0001 +game,T10,path,766,0.031837,true,0.0001 +game,T10,path,767,0.013255,true,0.0001 +game,T10,path,768,0.02848,true,0.0001 +game,T10,path,769,0.030551,true,0.0001 +game,T10,path,770,0.144869,false,0.0001 +game,T10,path,771,0.058044,true,0.0001 +game,T10,path,772,0.032815,true,0.0001 +game,T10,path,773,0.029507,true,0.0001 +game,T10,path,774,0.027561,true,0.0001 +game,T10,path,775,0.024538,true,0.0001 +game,T10,path,776,0.045235,true,0.0001 +game,T10,path,777,0.029591,true,0.0001 +game,T10,path,778,0.052765,true,0.0001 +game,T10,path,779,0.054891,true,0.0001 +game,T10,path,780,0.024575,true,0.0001 +game,T10,path,781,0.072153,true,0.0001 +game,T10,path,782,0.041632,true,0.0001 +game,T10,path,783,0.039919,true,0.0001 +game,T10,path,784,0.050311,true,0.0001 +game,T10,path,785,0.013619,true,0.0001 +game,T10,path,786,0.049839,true,0.0001 +game,T10,path,787,0.123803,false,0.0001 +game,T10,path,788,0.041029,true,0.0001 +game,T10,path,789,0.040233,true,0.0001 +game,T10,path,790,0.027474,true,0.0001 +game,T10,path,791,0.02667,true,0.0001 +game,T10,path,792,0.047722,true,0.0001 +game,T10,path,793,0.026812,true,0.0001 +game,T10,path,794,0.046815,true,0.0001 +game,T10,path,795,0.039576,true,0.0001 +game,T10,path,796,0.055419,true,0.0001 +game,T10,path,797,0.041429,true,0.0001 +game,T10,path,798,0.065223,true,0.0001 +game,T10,path,799,0.035681,true,0.0001 +game,T10,path,800,0.041819,true,0.0001 +game,T10,path,801,0.084356,true,0.0001 +game,T10,path,802,0.056035,true,0.0001 +game,T10,path,803,0.081938,true,0.0001 +game,T10,path,804,0.085143,true,0.0001 +game,T10,path,805,0.034234,true,0.0001 +game,T10,path,806,0.040643,true,0.0001 +game,T10,path,807,0.028261,true,0.0001 +game,T10,path,808,0.037124,true,0.0001 +game,T10,path,809,0.0556,true,0.0001 +game,T10,path,810,0.04898,true,0.0001 +game,T10,path,811,0.05358,true,0.0001 +game,T10,path,812,0.019414,true,0.0001 +game,T10,path,813,0.046475,true,0.0001 +game,T10,path,814,0.060567,true,0.0001 +game,T10,path,815,0.039515,true,0.0001 +game,T10,path,816,0.063955,true,0.0001 +game,T10,path,817,0.037937,true,0.0001 +game,T10,path,818,0.03411,true,0.0001 +game,T10,path,819,0.030833,true,0.0001 +game,T10,path,820,0.037495,true,0.0001 +game,T10,path,821,0.048091,true,0.0001 +game,T10,path,822,0.064286,true,0.0001 +game,T10,path,823,0.047854,true,0.0001 +game,T10,path,824,0.031707,true,0.0001 +game,T10,path,825,0.015174,true,0.0001 +game,T10,path,826,0.03844,true,0.0001 +game,T10,path,827,0.028972,true,0.0001 +game,T10,path,828,0.079199,true,0.0001 +game,T10,path,829,0.04892,true,0.0001 +game,T10,path,830,0.038968,true,0.0001 +game,T10,path,831,0.039137,true,0.0001 +game,T10,path,832,0.021958,true,0.0001 +game,T10,path,833,0.03937,true,0.0001 +game,T10,path,834,0.037714,true,0.0001 +game,T10,path,835,0.033792,true,0.0001 +game,T10,path,836,0.043439,true,0.0001 +game,T10,path,837,0.080812,true,0.0001 +game,T10,path,838,0.045802,true,0.0001 +game,T10,path,839,0.026066,true,0.0001 +game,T10,path,840,0.042887,true,0.0001 +game,T10,path,841,0.028368,true,0.0001 +game,T10,path,842,0.014353,true,0.0001 +game,T10,path,843,0.03518,true,0.0001 +game,T10,path,844,0.069096,true,0.0001 +game,T10,path,845,0.028991,true,0.0001 +game,T10,path,846,0.029718,true,0.0001 +game,T10,path,847,0.134018,false,0.0001 +game,T10,path,848,0.033724,true,0.0001 +game,T10,path,849,0.045331,true,0.0001 +game,T10,path,850,0.034428,true,0.0001 +game,T10,path,851,0.036372,true,0.0001 +game,T10,path,852,0.037053,true,0.0001 +game,T10,path,853,0.016302,true,0.0001 +game,T10,path,854,0.13258,false,0.0001 +game,T10,path,855,0.047463,true,0.0001 +game,T10,path,856,0.035048,true,0.0001 +game,T10,path,857,0.075423,true,0.0001 +game,T10,path,858,0.047938,true,0.0001 +game,T10,path,859,0.043557,true,0.0001 +game,T10,path,860,0.037924,true,0.0001 +game,T10,path,861,0.024193,true,0.0001 +game,T10,path,862,0.04271,true,0.0001 +game,T10,path,863,0.037366,true,0.0001 +game,T10,path,864,0.02132,true,0.0001 +game,T10,path,865,0.036469,true,0.0001 +game,T10,path,866,0.0261,true,0.0001 +game,T10,path,867,0.024468,true,0.0001 +game,T10,path,868,0.053612,true,0.0001 +game,T10,path,869,0.061614,true,0.0001 +game,T10,path,870,0.036241,true,0.0001 +game,T10,path,871,0.054229,true,0.0001 +game,T10,path,872,0.058994,true,0.0001 +game,T10,path,873,0.026659,true,0.0001 +game,T10,path,874,0.019545,true,0.0001 +game,T10,path,875,0.047559,true,0.0001 +game,T10,path,876,0.055953,true,0.0001 +game,T10,path,877,0.124099,false,0.0001 +game,T10,path,878,0.046008,true,0.0001 +game,T10,path,879,0.045365,true,0.0001 +game,T10,path,880,0.114195,true,0.0001 +game,T10,path,881,0.056875,true,0.0001 +game,T10,path,882,0.029961,true,0.0001 +game,T10,path,883,0.067868,true,0.0001 +game,T10,path,884,0.047061,true,0.0001 +game,T10,path,885,0.014721,true,0.0001 +game,T10,path,886,0.054093,true,0.0001 +game,T10,path,887,0.024843,true,0.0001 +game,T10,path,888,0.020065,true,0.0001 +game,T10,path,889,0.057532,true,0.0001 +game,T10,path,890,0.01294,true,0.0001 +game,T10,path,891,0.056088,true,0.0001 +game,T10,path,892,0.040901,true,0.0001 +game,T10,path,893,0.074585,true,0.0001 +game,T10,path,894,0.05731,true,0.0001 +game,T10,path,895,0.043493,true,0.0001 +game,T10,path,896,0.068563,true,0.0001 +game,T10,path,897,0.044071,true,0.0001 +game,T10,path,898,0.12087,false,0.0001 +game,T10,path,899,0.020228,true,0.0001 +game,T10,path,900,0.042308,true,0.0001 +game,T10,path,901,0.054892,true,0.0001 +game,T10,path,902,0.065257,true,0.0001 +game,T10,path,903,0.021801,true,0.0001 +game,T10,path,904,0.037198,true,0.0001 +game,T10,path,905,0.057959,true,0.0001 +game,T10,path,906,0.044384,true,0.0001 +game,T10,path,907,0.041422,true,0.0001 +game,T10,path,908,0.04497,true,0.0001 +game,T10,path,909,0.058181,true,0.0001 +game,T10,path,910,0.024614,true,0.0001 +game,T10,path,911,0.063741,true,0.0001 +game,T10,path,912,0.094783,true,0.0001 +game,T10,path,913,0.024818,true,0.0001 +game,T10,path,914,0.112633,true,0.0001 +game,T10,path,915,0.048833,true,0.0001 +game,T10,path,916,0.048253,true,0.0001 +game,T10,path,917,0.041198,true,0.0001 +game,T10,path,918,0.037239,true,0.0001 +game,T10,path,919,0.036791,true,0.0001 +game,T10,path,920,0.047473,true,0.0001 +game,T10,path,921,0.021746,true,0.0001 +game,T10,path,922,0.05414,true,0.0001 +game,T10,path,923,0.128918,false,0.0001 +game,T10,path,924,0.026133,true,0.0001 +game,T10,path,925,0.04674,true,0.0001 +game,T10,path,926,0.063728,true,0.0001 +game,T10,path,927,0.047349,true,0.0001 +game,T10,path,928,0.025463,true,0.0001 +game,T10,path,929,0.043552,true,0.0001 +game,T10,path,930,0.057767,true,0.0001 +game,T10,path,931,0.047955,true,0.0001 +game,T10,path,932,0.064798,true,0.0001 +game,T10,path,933,0.044009,true,0.0001 +game,T10,path,934,0.048194,true,0.0001 +game,T10,path,935,0.053676,true,0.0001 +game,T10,path,936,0.056125,true,0.0001 +game,T10,path,937,0.045457,true,0.0001 +game,T10,path,938,0.045011,true,0.0001 +game,T10,path,939,0.074448,true,0.0001 +game,T10,path,940,0.042357,true,0.0001 +game,T10,path,941,0.029567,true,0.0001 +game,T10,path,942,0.04332,true,0.0001 +game,T10,path,943,0.066289,true,0.0001 +game,T10,path,944,0.038892,true,0.0001 +game,T10,path,945,0.029834,true,0.0001 +game,T10,path,946,0.047346,true,0.0001 +game,T10,path,947,0.015087,true,0.0001 +game,T10,path,948,0.028032,true,0.0001 +game,T10,path,949,0.033005,true,0.0001 +game,T10,path,950,0.064613,true,0.0001 +game,T10,path,951,0.094342,true,0.0001 +game,T10,path,952,0.048216,true,0.0001 +game,T10,path,953,0.038477,true,0.0001 +game,T10,path,954,0.026189,true,0.0001 +game,T10,path,955,0.039223,true,0.0001 +game,T10,path,956,0.021573,true,0.0001 +game,T10,path,957,0.044167,true,0.0001 +game,T10,path,958,0.074169,true,0.0001 +game,T10,path,959,0.038813,true,0.0001 +game,T10,path,960,0.03838,true,0.0001 +game,T10,path,961,0.027056,true,0.0001 +game,T10,path,962,0.038373,true,0.0001 +game,T10,path,963,0.034372,true,0.0001 +game,T10,path,964,0.029756,true,0.0001 +game,T10,path,965,0.041813,true,0.0001 +game,T10,path,966,0.05573,true,0.0001 +game,T10,path,967,0.042243,true,0.0001 +game,T10,path,968,0.052351,true,0.0001 +game,T10,path,969,0.043988,true,0.0001 +game,T10,path,970,0.045737,true,0.0001 +game,T10,path,971,0.045204,true,0.0001 +game,T10,path,972,0.0483,true,0.0001 +game,T10,path,973,0.04782,true,0.0001 +game,T10,path,974,0.050042,true,0.0001 +game,T10,path,975,0.023349,true,0.0001 +game,T10,path,976,0.133743,false,0.0001 +game,T10,path,977,0.0344,true,0.0001 +game,T10,path,978,0.047272,true,0.0001 +game,T10,path,979,0.047972,true,0.0001 +game,T10,path,980,0.043786,true,0.0001 +game,T10,path,981,0.0129,true,0.0001 +game,T10,path,982,0.056278,true,0.0001 +game,T10,path,983,0.129826,false,0.0001 +game,T10,path,984,0.035238,true,0.0001 +game,T10,path,985,0.024711,true,0.0001 +game,T10,path,986,0.037903,true,0.0001 +game,T10,path,987,0.046218,true,0.0001 +game,T10,path,988,0.014274,true,0.0001 +game,T10,path,989,0.052865,true,0.0001 +game,T10,path,990,0.040774,true,0.0001 +game,T10,path,991,0.055231,true,0.0001 +game,T10,path,992,0.028162,true,0.0001 +game,T10,path,993,0.058927,true,0.0001 +game,T10,path,994,0.078618,true,0.0001 +game,T10,path,995,0.119926,false,0.0001 +game,T10,path,996,0.053814,true,0.0001 +game,T10,path,997,0.063387,true,0.0001 +game,T10,path,998,0.057586,true,0.0001 +game,T10,path,999,0.048905,true,0.0001 +game,T10,path,1000,0.049535,true,0.0001 +game,T10,path,1001,0.034539,true,0.0001 +game,T10,path,1002,0.055744,true,0.0001 +game,T10,path,1003,0.015512,true,0.0001 +game,T10,path,1004,0.029054,true,0.0001 +game,T10,path,1005,0.054799,true,0.0001 +game,T10,path,1006,0.029774,true,0.0001 +game,T10,path,1007,0.020752,true,0.0001 +game,T10,path,1008,0.048763,true,0.0001 +game,T10,path,1009,0.050188,true,0.0001 +game,T10,path,1010,0.015932,true,0.0001 +game,T10,path,1011,0.0185,true,0.0001 +game,T10,path,1012,0.041663,true,0.0001 +game,T10,path,1013,0.133923,false,0.0001 +game,T10,path,1014,0.078546,true,0.0001 +game,T10,path,1015,0.024005,true,0.0001 +game,T10,path,1016,0.04257,true,0.0001 +game,T10,path,1017,0.032378,true,0.0001 +game,T10,path,1018,0.052755,true,0.0001 +game,T10,path,1019,0.062188,true,0.0001 +game,T10,path,1020,0.041355,true,0.0001 +game,T10,path,1021,0.091967,true,0.0001 +game,T10,path,1022,0.039452,true,0.0001 +game,T10,path,1023,0.028235,true,0.0001 +game,T10,path,1024,0.04769,true,0.0001 +qp,p32i16,path,1,0.005042,false,0.0001 +qp,p32i16,path,2,0.006857,false,0.0001 +qp,p32i16,path,3,0.004777,false,0.0001 +qp,p32i16,path,4,0.000282,true,0.0001 +qp,p32i16,path,5,0.000279,true,0.0001 +qp,p32i16,path,6,0.005782,false,0.0001 +qp,p32i16,path,7,0.005355,false,0.0001 +qp,p32i16,path,8,0.025464,false,0.0001 +qp,p32i16,path,9,0.006482,false,0.0001 +qp,p32i16,path,10,0.00902,false,0.0001 +qp,p32i16,path,11,0.000366,true,0.0001 +qp,p32i16,path,12,0.000293,true,0.0001 +qp,p32i16,path,13,0.005998,false,0.0001 +qp,p32i16,path,14,0.006106,false,0.0001 +qp,p32i16,path,15,0.000384,true,0.0001 +qp,p32i16,path,16,0.005547,false,0.0001 +qp,p32i16,path,17,0.000387,true,0.0001 +qp,p32i16,path,18,0.019847,false,0.0001 +qp,p32i16,path,19,0.005098,false,0.0001 +qp,p32i16,path,20,0.004678,false,0.0001 +qp,p32i16,path,21,0.000303,true,0.0001 +qp,p32i16,path,22,0.004514,false,0.0001 +qp,p32i16,path,23,0.005896,false,0.0001 +qp,p32i16,path,24,0.009108,false,0.0001 +qp,p32i16,path,25,0.00373,false,0.0001 +qp,p32i16,path,26,0.000302,true,0.0001 +qp,p32i16,path,27,0.003377,false,0.0001 +qp,p32i16,path,28,0.006615,false,0.0001 +qp,p32i16,path,29,0.005148,false,0.0001 +qp,p32i16,path,30,0.010475,false,0.0001 +qp,p32i16,path,31,0.000317,true,0.0001 +qp,p32i16,path,32,0.011981,false,0.0001 +qp,p32i16,path,33,0.000313,true,0.0001 +qp,p32i16,path,34,0.000307,true,0.0001 +qp,p32i16,path,35,0.006932,false,0.0001 +qp,p32i16,path,36,0.008687,false,0.0001 +qp,p32i16,path,37,0.004832,false,0.0001 +qp,p32i16,path,38,0.003508,false,0.0001 +qp,p32i16,path,39,0.011097,false,0.0001 +qp,p32i16,path,40,0.00036,true,0.0001 +qp,p32i16,path,41,0.000355,true,0.0001 +qp,p32i16,path,42,0.004888,false,0.0001 +qp,p32i16,path,43,0.000334,true,0.0001 +qp,p32i16,path,44,0.003645,false,0.0001 +qp,p32i16,path,45,0.008207,false,0.0001 +qp,p32i16,path,46,0.005096,false,0.0001 +qp,p32i16,path,47,0.005121,false,0.0001 +qp,p32i16,path,48,0.000291,true,0.0001 +qp,p32i16,path,49,0.000284,true,0.0001 +qp,p32i16,path,50,0.000282,true,0.0001 +qp,p32i16,path,51,0.009674,false,0.0001 +qp,p32i16,path,52,0.004178,false,0.0001 +qp,p32i16,path,53,0.000294,true,0.0001 +qp,p32i16,path,54,0.000313,true,0.0001 +qp,p32i16,path,55,0.004452,false,0.0001 +qp,p32i16,path,56,0.000412,true,0.0001 +qp,p32i16,path,57,0.004347,false,0.0001 +qp,p32i16,path,58,0.000304,true,0.0001 +qp,p32i16,path,59,0.0003,true,0.0001 +qp,p32i16,path,60,0.000284,true,0.0001 +qp,p32i16,path,61,0.009919,false,0.0001 +qp,p32i16,path,62,0.000317,true,0.0001 +qp,p32i16,path,63,0.000286,true,0.0001 +qp,p32i16,path,64,0.007275,false,0.0001 +qp,p32i16,path,65,0.000314,true,0.0001 +qp,p32i16,path,66,0.000517,true,0.0001 +qp,p32i16,path,67,0.010148,false,0.0001 +qp,p32i16,path,68,0.000311,true,0.0001 +qp,p32i16,path,69,0.005172,false,0.0001 +qp,p32i16,path,70,0.005488,false,0.0001 +qp,p32i16,path,71,0.004129,false,0.0001 +qp,p32i16,path,72,0.000289,true,0.0001 +qp,p32i16,path,73,0.006621,false,0.0001 +qp,p32i16,path,74,0.000311,true,0.0001 +qp,p32i16,path,75,0.004209,false,0.0001 +qp,p32i16,path,76,0.008244,false,0.0001 +qp,p32i16,path,77,0.007298,false,0.0001 +qp,p32i16,path,78,0.004555,false,0.0001 +qp,p32i16,path,79,0.000293,true,0.0001 +qp,p32i16,path,80,0.009543,false,0.0001 +qp,p32i16,path,81,0.004651,false,0.0001 +qp,p32i16,path,82,0.008932,false,0.0001 +qp,p32i16,path,83,0.000293,true,0.0001 +qp,p32i16,path,84,0.000292,true,0.0001 +qp,p32i16,path,85,0.006615,false,0.0001 +qp,p32i16,path,86,0.006823,false,0.0001 +qp,p32i16,path,87,0.005728,false,0.0001 +qp,p32i16,path,88,0.000284,true,0.0001 +qp,p32i16,path,89,0.000307,true,0.0001 +qp,p32i16,path,90,0.008748,false,0.0001 +qp,p32i16,path,91,0.00506,false,0.0001 +qp,p32i16,path,92,0.005519,false,0.0001 +qp,p32i16,path,93,0.000312,true,0.0001 +qp,p32i16,path,94,0.007476,false,0.0001 +qp,p32i16,path,95,0.00031,true,0.0001 +qp,p32i16,path,96,0.000308,true,0.0001 +qp,p32i16,path,97,0.000304,true,0.0001 +qp,p32i16,path,98,0.000652,true,0.0001 +qp,p32i16,path,99,0.000288,true,0.0001 +qp,p32i16,path,100,0.003911,false,0.0001 +qp,p32i16,path,101,0.009107,false,0.0001 +qp,p32i16,path,102,0.005387,false,0.0001 +qp,p32i16,path,103,0.000299,true,0.0001 +qp,p32i16,path,104,0.000298,true,0.0001 +qp,p32i16,path,105,0.004763,false,0.0001 +qp,p32i16,path,106,0.006338,false,0.0001 +qp,p32i16,path,107,0.000324,true,0.0001 +qp,p32i16,path,108,0.0066,false,0.0001 +qp,p32i16,path,109,0.00397,false,0.0001 +qp,p32i16,path,110,0.004502,false,0.0001 +qp,p32i16,path,111,0.000288,true,0.0001 +qp,p32i16,path,112,0.000292,true,0.0001 +qp,p32i16,path,113,0.000305,true,0.0001 +qp,p32i16,path,114,0.000276,true,0.0001 +qp,p32i16,path,115,0.000276,true,0.0001 +qp,p32i16,path,116,0.005718,false,0.0001 +qp,p32i16,path,117,0.003837,false,0.0001 +qp,p32i16,path,118,0.000299,true,0.0001 +qp,p32i16,path,119,0.006604,false,0.0001 +qp,p32i16,path,120,0.000327,true,0.0001 +qp,p32i16,path,121,0.0003,true,0.0001 +qp,p32i16,path,122,0.000298,true,0.0001 +qp,p32i16,path,123,0.000271,true,0.0001 +qp,p32i16,path,124,0.005599,false,0.0001 +qp,p32i16,path,125,0.00656,false,0.0001 +qp,p32i16,path,126,0.000329,true,0.0001 +qp,p32i16,path,127,0.000341,true,0.0001 +qp,p32i16,path,128,0.003517,false,0.0001 +qp,p32i16,path,129,0.006036,false,0.0001 +qp,p32i16,path,130,0.011487,false,0.0001 +qp,p32i16,path,131,0.000311,true,0.0001 +qp,p32i16,path,132,0.000293,true,0.0001 +qp,p32i16,path,133,0.006407,false,0.0001 +qp,p32i16,path,134,0.00513,false,0.0001 +qp,p32i16,path,135,0.007813,false,0.0001 +qp,p32i16,path,136,0.006245,false,0.0001 +qp,p32i16,path,137,0.005617,false,0.0001 +qp,p32i16,path,138,0.006903,false,0.0001 +qp,p32i16,path,139,0.012201,false,0.0001 +qp,p32i16,path,140,0.00032,true,0.0001 +qp,p32i16,path,141,0.00592,false,0.0001 +qp,p32i16,path,142,0.000529,true,0.0001 +qp,p32i16,path,143,0.004717,false,0.0001 +qp,p32i16,path,144,0.000566,true,0.0001 +qp,p32i16,path,145,0.003865,false,0.0001 +qp,p32i16,path,146,0.000303,true,0.0001 +qp,p32i16,path,147,0.00607,false,0.0001 +qp,p32i16,path,148,0.007077,false,0.0001 +qp,p32i16,path,149,0.000302,true,0.0001 +qp,p32i16,path,150,0.004882,false,0.0001 +qp,p32i16,path,151,0.000319,true,0.0001 +qp,p32i16,path,152,0.006638,false,0.0001 +qp,p32i16,path,153,0.000324,true,0.0001 +qp,p32i16,path,154,0.008448,false,0.0001 +qp,p32i16,path,155,0.00632,false,0.0001 +qp,p32i16,path,156,0.010241,false,0.0001 +qp,p32i16,path,157,0.00033,true,0.0001 +qp,p32i16,path,158,0.012144,false,0.0001 +qp,p32i16,path,159,0.000291,true,0.0001 +qp,p32i16,path,160,0.005335,false,0.0001 +qp,p32i16,path,161,0.000306,true,0.0001 +qp,p32i16,path,162,0.000295,true,0.0001 +qp,p32i16,path,163,0.000326,true,0.0001 +qp,p32i16,path,164,0.000305,true,0.0001 +qp,p32i16,path,165,0.007075,false,0.0001 +qp,p32i16,path,166,0.000302,true,0.0001 +qp,p32i16,path,167,0.009628,false,0.0001 +qp,p32i16,path,168,0.004936,false,0.0001 +qp,p32i16,path,169,0.005112,false,0.0001 +qp,p32i16,path,170,0.000303,true,0.0001 +qp,p32i16,path,171,0.006421,false,0.0001 +qp,p32i16,path,172,0.000331,true,0.0001 +qp,p32i16,path,173,0.000276,true,0.0001 +qp,p32i16,path,174,0.008021,false,0.0001 +qp,p32i16,path,175,0.004465,false,0.0001 +qp,p32i16,path,176,0.00029,true,0.0001 +qp,p32i16,path,177,0.004887,false,0.0001 +qp,p32i16,path,178,0.007311,false,0.0001 +qp,p32i16,path,179,0.000297,true,0.0001 +qp,p32i16,path,180,0.005863,false,0.0001 +qp,p32i16,path,181,0.005073,false,0.0001 +qp,p32i16,path,182,0.008652,false,0.0001 +qp,p32i16,path,183,0.010762,false,0.0001 +qp,p32i16,path,184,0.004372,false,0.0001 +qp,p32i16,path,185,0.011512,false,0.0001 +qp,p32i16,path,186,0.007616,false,0.0001 +qp,p32i16,path,187,0.006472,false,0.0001 +qp,p32i16,path,188,0.000323,true,0.0001 +qp,p32i16,path,189,0.000628,true,0.0001 +qp,p32i16,path,190,0.010822,false,0.0001 +qp,p32i16,path,191,0.0044,false,0.0001 +qp,p32i16,path,192,0.004079,false,0.0001 +qp,p32i16,path,193,0.000346,true,0.0001 +qp,p32i16,path,194,0.005771,false,0.0001 +qp,p32i16,path,195,0.000313,true,0.0001 +qp,p32i16,path,196,0.008547,false,0.0001 +qp,p32i16,path,197,0.005091,false,0.0001 +qp,p32i16,path,198,0.003439,false,0.0001 +qp,p32i16,path,199,0.000343,true,0.0001 +qp,p32i16,path,200,0.000298,true,0.0001 +qp,p32i16,path,201,0.015202,false,0.0001 +qp,p32i16,path,202,0.005532,false,0.0001 +qp,p32i16,path,203,0.01054,false,0.0001 +qp,p32i16,path,204,0.005259,false,0.0001 +qp,p32i16,path,205,0.004903,false,0.0001 +qp,p32i16,path,206,0.005576,false,0.0001 +qp,p32i16,path,207,0.009207,false,0.0001 +qp,p32i16,path,208,0.003972,false,0.0001 +qp,p32i16,path,209,0.000311,true,0.0001 +qp,p32i16,path,210,0.007181,false,0.0001 +qp,p32i16,path,211,0.009967,false,0.0001 +qp,p32i16,path,212,0.007203,false,0.0001 +qp,p32i16,path,213,0.000316,true,0.0001 +qp,p32i16,path,214,0.006191,false,0.0001 +qp,p32i16,path,215,0.003328,false,0.0001 +qp,p32i16,path,216,0.000288,true,0.0001 +qp,p32i16,path,217,0.010692,false,0.0001 +qp,p32i16,path,218,0.005843,false,0.0001 +qp,p32i16,path,219,0.000586,true,0.0001 +qp,p32i16,path,220,0.009939,false,0.0001 +qp,p32i16,path,221,0.007161,false,0.0001 +qp,p32i16,path,222,0.000324,true,0.0001 +qp,p32i16,path,223,0.00729,false,0.0001 +qp,p32i16,path,224,0.006933,false,0.0001 +qp,p32i16,path,225,0.007372,false,0.0001 +qp,p32i16,path,226,0.006897,false,0.0001 +qp,p32i16,path,227,0.003584,false,0.0001 +qp,p32i16,path,228,0.000309,true,0.0001 +qp,p32i16,path,229,0.000315,true,0.0001 +qp,p32i16,path,230,0.006199,false,0.0001 +qp,p32i16,path,231,0.005431,false,0.0001 +qp,p32i16,path,232,0.007496,false,0.0001 +qp,p32i16,path,233,0.00518,false,0.0001 +qp,p32i16,path,234,0.00053,true,0.0001 +qp,p32i16,path,235,0.005903,false,0.0001 +qp,p32i16,path,236,0.000814,true,0.0001 +qp,p32i16,path,237,0.005171,false,0.0001 +qp,p32i16,path,238,0.000282,true,0.0001 +qp,p32i16,path,239,0.004884,false,0.0001 +qp,p32i16,path,240,0.00028,true,0.0001 +qp,p32i16,path,241,0.004552,false,0.0001 +qp,p32i16,path,242,0.003627,false,0.0001 +qp,p32i16,path,243,0.000334,true,0.0001 +qp,p32i16,path,244,0.000281,true,0.0001 +qp,p32i16,path,245,0.000287,true,0.0001 +qp,p32i16,path,246,0.000286,true,0.0001 +qp,p32i16,path,247,0.000264,true,0.0001 +qp,p32i16,path,248,0.005106,false,0.0001 +qp,p32i16,path,249,0.00476,false,0.0001 +qp,p32i16,path,250,0.009071,false,0.0001 +qp,p32i16,path,251,0.000348,true,0.0001 +qp,p32i16,path,252,0.005163,false,0.0001 +qp,p32i16,path,253,0.006717,false,0.0001 +qp,p32i16,path,254,0.004606,false,0.0001 +qp,p32i16,path,255,0.000603,true,0.0001 +qp,p32i16,path,256,0.003838,false,0.0001 +qp,p32i16,path,257,0.009586,false,0.0001 +qp,p32i16,path,258,0.011889,false,0.0001 +qp,p32i16,path,259,0.005253,false,0.0001 +qp,p32i16,path,260,0.005367,false,0.0001 +qp,p32i16,path,261,0.000344,true,0.0001 +qp,p32i16,path,262,0.005462,false,0.0001 +qp,p32i16,path,263,0.007439,false,0.0001 +qp,p32i16,path,264,0.00032,true,0.0001 +qp,p32i16,path,265,0.00486,false,0.0001 +qp,p32i16,path,266,0.003518,false,0.0001 +qp,p32i16,path,267,0.000325,true,0.0001 +qp,p32i16,path,268,0.000306,true,0.0001 +qp,p32i16,path,269,0.000284,true,0.0001 +qp,p32i16,path,270,0.000272,true,0.0001 +qp,p32i16,path,271,0.00928,false,0.0001 +qp,p32i16,path,272,0.004795,false,0.0001 +qp,p32i16,path,273,0.00606,false,0.0001 +qp,p32i16,path,274,0.006793,false,0.0001 +qp,p32i16,path,275,0.004838,false,0.0001 +qp,p32i16,path,276,0.007735,false,0.0001 +qp,p32i16,path,277,0.008461,false,0.0001 +qp,p32i16,path,278,0.005731,false,0.0001 +qp,p32i16,path,279,0.007477,false,0.0001 +qp,p32i16,path,280,0.007228,false,0.0001 +qp,p32i16,path,281,0.007208,false,0.0001 +qp,p32i16,path,282,0.004287,false,0.0001 +qp,p32i16,path,283,0.005439,false,0.0001 +qp,p32i16,path,284,0.008436,false,0.0001 +qp,p32i16,path,285,0.008101,false,0.0001 +qp,p32i16,path,286,0.000336,true,0.0001 +qp,p32i16,path,287,0.006435,false,0.0001 +qp,p32i16,path,288,0.003728,false,0.0001 +qp,p32i16,path,289,0.005148,false,0.0001 +qp,p32i16,path,290,0.000316,true,0.0001 +qp,p32i16,path,291,0.000548,true,0.0001 +qp,p32i16,path,292,0.000591,true,0.0001 +qp,p32i16,path,293,0.000329,true,0.0001 +qp,p32i16,path,294,0.003697,false,0.0001 +qp,p32i16,path,295,0.000559,true,0.0001 +qp,p32i16,path,296,0.000506,true,0.0001 +qp,p32i16,path,297,0.000299,true,0.0001 +qp,p32i16,path,298,0.005087,false,0.0001 +qp,p32i16,path,299,0.000302,true,0.0001 +qp,p32i16,path,300,0.00692,false,0.0001 +qp,p32i16,path,301,0.00033,true,0.0001 +qp,p32i16,path,302,0.004204,false,0.0001 +qp,p32i16,path,303,0.007127,false,0.0001 +qp,p32i16,path,304,0.007239,false,0.0001 +qp,p32i16,path,305,0.005419,false,0.0001 +qp,p32i16,path,306,0.000533,true,0.0001 +qp,p32i16,path,307,0.000299,true,0.0001 +qp,p32i16,path,308,0.003962,false,0.0001 +qp,p32i16,path,309,0.007087,false,0.0001 +qp,p32i16,path,310,0.008863,false,0.0001 +qp,p32i16,path,311,0.007369,false,0.0001 +qp,p32i16,path,312,0.004326,false,0.0001 +qp,p32i16,path,313,0.010169,false,0.0001 +qp,p32i16,path,314,0.006073,false,0.0001 +qp,p32i16,path,315,0.005256,false,0.0001 +qp,p32i16,path,316,0.000321,true,0.0001 +qp,p32i16,path,317,0.000297,true,0.0001 +qp,p32i16,path,318,0.000538,true,0.0001 +qp,p32i16,path,319,0.0003,true,0.0001 +qp,p32i16,path,320,0.00333,false,0.0001 +qp,p32i16,path,321,0.000346,true,0.0001 +qp,p32i16,path,322,0.000321,true,0.0001 +qp,p32i16,path,323,0.003703,false,0.0001 +qp,p32i16,path,324,0.001579,true,0.0001 +qp,p32i16,path,325,0.008603,false,0.0001 +qp,p32i16,path,326,0.000309,true,0.0001 +qp,p32i16,path,327,0.006886,false,0.0001 +qp,p32i16,path,328,0.000323,true,0.0001 +qp,p32i16,path,329,0.000296,true,0.0001 +qp,p32i16,path,330,0.00033,true,0.0001 +qp,p32i16,path,331,0.005603,false,0.0001 +qp,p32i16,path,332,0.004133,false,0.0001 +qp,p32i16,path,333,0.004579,false,0.0001 +qp,p32i16,path,334,0.004958,false,0.0001 +qp,p32i16,path,335,0.000299,true,0.0001 +qp,p32i16,path,336,0.000305,true,0.0001 +qp,p32i16,path,337,0.006298,false,0.0001 +qp,p32i16,path,338,0.000549,true,0.0001 +qp,p32i16,path,339,0.000317,true,0.0001 +qp,p32i16,path,340,0.000289,true,0.0001 +qp,p32i16,path,341,0.000534,true,0.0001 +qp,p32i16,path,342,0.008509,false,0.0001 +qp,p32i16,path,343,0.003261,false,0.0001 +qp,p32i16,path,344,0.000339,true,0.0001 +qp,p32i16,path,345,0.000289,true,0.0001 +qp,p32i16,path,346,0.011059,false,0.0001 +qp,p32i16,path,347,0.004273,false,0.0001 +qp,p32i16,path,348,0.005079,false,0.0001 +qp,p32i16,path,349,0.000362,true,0.0001 +qp,p32i16,path,350,0.009507,false,0.0001 +qp,p32i16,path,351,0.00747,false,0.0001 +qp,p32i16,path,352,0.005994,false,0.0001 +qp,p32i16,path,353,0.000586,true,0.0001 +qp,p32i16,path,354,0.006487,false,0.0001 +qp,p32i16,path,355,0.000604,true,0.0001 +qp,p32i16,path,356,0.007333,false,0.0001 +qp,p32i16,path,357,0.009786,false,0.0001 +qp,p32i16,path,358,0.003847,false,0.0001 +qp,p32i16,path,359,0.004963,false,0.0001 +qp,p32i16,path,360,0.012052,false,0.0001 +qp,p32i16,path,361,0.000397,true,0.0001 +qp,p32i16,path,362,0.000336,true,0.0001 +qp,p32i16,path,363,0.006209,false,0.0001 +qp,p32i16,path,364,0.008572,false,0.0001 +qp,p32i16,path,365,0.005699,false,0.0001 +qp,p32i16,path,366,0.006067,false,0.0001 +qp,p32i16,path,367,0.011088,false,0.0001 +qp,p32i16,path,368,0.005496,false,0.0001 +qp,p32i16,path,369,0.007077,false,0.0001 +qp,p32i16,path,370,0.000297,true,0.0001 +qp,p32i16,path,371,0.000608,true,0.0001 +qp,p32i16,path,372,0.004174,false,0.0001 +qp,p32i16,path,373,0.000314,true,0.0001 +qp,p32i16,path,374,0.000285,true,0.0001 +qp,p32i16,path,375,0.008516,false,0.0001 +qp,p32i16,path,376,0.000313,true,0.0001 +qp,p32i16,path,377,0.003551,false,0.0001 +qp,p32i16,path,378,0.005464,false,0.0001 +qp,p32i16,path,379,0.000277,true,0.0001 +qp,p32i16,path,380,0.00825,false,0.0001 +qp,p32i16,path,381,0.000289,true,0.0001 +qp,p32i16,path,382,0.00032,true,0.0001 +qp,p32i16,path,383,0.000282,true,0.0001 +qp,p32i16,path,384,0.005635,false,0.0001 +qp,p32i16,path,385,0.000288,true,0.0001 +qp,p32i16,path,386,0.006998,false,0.0001 +qp,p32i16,path,387,0.005904,false,0.0001 +qp,p32i16,path,388,0.008961,false,0.0001 +qp,p32i16,path,389,0.000494,true,0.0001 +qp,p32i16,path,390,0.000297,true,0.0001 +qp,p32i16,path,391,0.007838,false,0.0001 +qp,p32i16,path,392,0.003423,false,0.0001 +qp,p32i16,path,393,0.000295,true,0.0001 +qp,p32i16,path,394,0.000286,true,0.0001 +qp,p32i16,path,395,0.007372,false,0.0001 +qp,p32i16,path,396,0.000598,true,0.0001 +qp,p32i16,path,397,0.006652,false,0.0001 +qp,p32i16,path,398,0.000298,true,0.0001 +qp,p32i16,path,399,0.00441,false,0.0001 +qp,p32i16,path,400,0.003731,false,0.0001 +qp,p32i16,path,401,0.009162,false,0.0001 +qp,p32i16,path,402,0.00032,true,0.0001 +qp,p32i16,path,403,0.005442,false,0.0001 +qp,p32i16,path,404,0.000323,true,0.0001 +qp,p32i16,path,405,0.004352,false,0.0001 +qp,p32i16,path,406,0.008499,false,0.0001 +qp,p32i16,path,407,0.00805,false,0.0001 +qp,p32i16,path,408,0.005438,false,0.0001 +qp,p32i16,path,409,0.003713,false,0.0001 +qp,p32i16,path,410,0.005758,false,0.0001 +qp,p32i16,path,411,0.000297,true,0.0001 +qp,p32i16,path,412,0.011199,false,0.0001 +qp,p32i16,path,413,0.00343,false,0.0001 +qp,p32i16,path,414,0.007298,false,0.0001 +qp,p32i16,path,415,0.00555,false,0.0001 +qp,p32i16,path,416,0.000323,true,0.0001 +qp,p32i16,path,417,0.000313,true,0.0001 +qp,p32i16,path,418,0.011142,false,0.0001 +qp,p32i16,path,419,0.006258,false,0.0001 +qp,p32i16,path,420,0.000567,true,0.0001 +qp,p32i16,path,421,0.004744,false,0.0001 +qp,p32i16,path,422,0.003998,false,0.0001 +qp,p32i16,path,423,0.003686,false,0.0001 +qp,p32i16,path,424,0.00268,true,0.0001 +qp,p32i16,path,425,0.000535,true,0.0001 +qp,p32i16,path,426,0.008293,false,0.0001 +qp,p32i16,path,427,0.000295,true,0.0001 +qp,p32i16,path,428,0.000323,true,0.0001 +qp,p32i16,path,429,0.004577,false,0.0001 +qp,p32i16,path,430,0.000302,true,0.0001 +qp,p32i16,path,431,0.000278,true,0.0001 +qp,p32i16,path,432,0.004003,false,0.0001 +qp,p32i16,path,433,0.00034,true,0.0001 +qp,p32i16,path,434,0.000302,true,0.0001 +qp,p32i16,path,435,0.000538,true,0.0001 +qp,p32i16,path,436,0.008968,false,0.0001 +qp,p32i16,path,437,0.006158,false,0.0001 +qp,p32i16,path,438,0.000288,true,0.0001 +qp,p32i16,path,439,0.000302,true,0.0001 +qp,p32i16,path,440,0.000309,true,0.0001 +qp,p32i16,path,441,0.008614,false,0.0001 +qp,p32i16,path,442,0.000305,true,0.0001 +qp,p32i16,path,443,0.000291,true,0.0001 +qp,p32i16,path,444,0.005057,false,0.0001 +qp,p32i16,path,445,0.005581,false,0.0001 +qp,p32i16,path,446,0.008893,false,0.0001 +qp,p32i16,path,447,0.008866,false,0.0001 +qp,p32i16,path,448,0.000309,true,0.0001 +qp,p32i16,path,449,0.000299,true,0.0001 +qp,p32i16,path,450,0.000302,true,0.0001 +qp,p32i16,path,451,0.000258,true,0.0001 +qp,p32i16,path,452,0.000283,true,0.0001 +qp,p32i16,path,453,0.004886,false,0.0001 +qp,p32i16,path,454,0.000303,true,0.0001 +qp,p32i16,path,455,0.000277,true,0.0001 +qp,p32i16,path,456,0.000304,true,0.0001 +qp,p32i16,path,457,0.010609,false,0.0001 +qp,p32i16,path,458,0.000314,true,0.0001 +qp,p32i16,path,459,0.000308,true,0.0001 +qp,p32i16,path,460,0.008129,false,0.0001 +qp,p32i16,path,461,0.005901,false,0.0001 +qp,p32i16,path,462,0.000348,true,0.0001 +qp,p32i16,path,463,0.000322,true,0.0001 +qp,p32i16,path,464,0.00043,true,0.0001 +qp,p32i16,path,465,0.008619,false,0.0001 +qp,p32i16,path,466,0.004831,false,0.0001 +qp,p32i16,path,467,0.000588,true,0.0001 +qp,p32i16,path,468,0.000323,true,0.0001 +qp,p32i16,path,469,0.000449,true,0.0001 +qp,p32i16,path,470,0.005543,false,0.0001 +qp,p32i16,path,471,0.004539,false,0.0001 +qp,p32i16,path,472,0.000281,true,0.0001 +qp,p32i16,path,473,0.003638,false,0.0001 +qp,p32i16,path,474,0.000327,true,0.0001 +qp,p32i16,path,475,0.011172,false,0.0001 +qp,p32i16,path,476,0.006474,false,0.0001 +qp,p32i16,path,477,0.005391,false,0.0001 +qp,p32i16,path,478,0.000562,true,0.0001 +qp,p32i16,path,479,0.00058,true,0.0001 +qp,p32i16,path,480,0.007923,false,0.0001 +qp,p32i16,path,481,0.000287,true,0.0001 +qp,p32i16,path,482,0.007762,false,0.0001 +qp,p32i16,path,483,0.008289,false,0.0001 +qp,p32i16,path,484,0.0071,false,0.0001 +qp,p32i16,path,485,0.000312,true,0.0001 +qp,p32i16,path,486,0.005417,false,0.0001 +qp,p32i16,path,487,0.000314,true,0.0001 +qp,p32i16,path,488,0.004039,false,0.0001 +qp,p32i16,path,489,0.000327,true,0.0001 +qp,p32i16,path,490,0.009553,false,0.0001 +qp,p32i16,path,491,0.00032,true,0.0001 +qp,p32i16,path,492,0.008616,false,0.0001 +qp,p32i16,path,493,0.000312,true,0.0001 +qp,p32i16,path,494,0.009779,false,0.0001 +qp,p32i16,path,495,0.000303,true,0.0001 +qp,p32i16,path,496,0.005157,false,0.0001 +qp,p32i16,path,497,0.007113,false,0.0001 +qp,p32i16,path,498,0.008877,false,0.0001 +qp,p32i16,path,499,0.007311,false,0.0001 +qp,p32i16,path,500,0.000808,true,0.0001 +qp,p32i16,path,501,0.000334,true,0.0001 +qp,p32i16,path,502,0.003957,false,0.0001 +qp,p32i16,path,503,0.000294,true,0.0001 +qp,p32i16,path,504,0.008974,false,0.0001 +qp,p32i16,path,505,0.003942,false,0.0001 +qp,p32i16,path,506,0.004984,false,0.0001 +qp,p32i16,path,507,0.006018,false,0.0001 +qp,p32i16,path,508,0.000648,true,0.0001 +qp,p32i16,path,509,0.004885,false,0.0001 +qp,p32i16,path,510,0.000348,true,0.0001 +qp,p32i16,path,511,0.006574,false,0.0001 +qp,p32i16,path,512,0.000288,true,0.0001 +qp,p32i16,path,513,0.00405,false,0.0001 +qp,p32i16,path,514,0.000333,true,0.0001 +qp,p32i16,path,515,0.000509,true,0.0001 +qp,p32i16,path,516,0.000544,true,0.0001 +qp,p32i16,path,517,0.000745,true,0.0001 +qp,p32i16,path,518,0.000312,true,0.0001 +qp,p32i16,path,519,0.000275,true,0.0001 +qp,p32i16,path,520,0.006758,false,0.0001 +qp,p32i16,path,521,0.000296,true,0.0001 +qp,p32i16,path,522,0.005402,false,0.0001 +qp,p32i16,path,523,0.000289,true,0.0001 +qp,p32i16,path,524,0.004885,false,0.0001 +qp,p32i16,path,525,0.004715,false,0.0001 +qp,p32i16,path,526,0.000502,true,0.0001 +qp,p32i16,path,527,0.007732,false,0.0001 +qp,p32i16,path,528,0.000322,true,0.0001 +qp,p32i16,path,529,0.000534,true,0.0001 +qp,p32i16,path,530,0.000293,true,0.0001 +qp,p32i16,path,531,0.007794,false,0.0001 +qp,p32i16,path,532,0.010522,false,0.0001 +qp,p32i16,path,533,0.004584,false,0.0001 +qp,p32i16,path,534,0.005354,false,0.0001 +qp,p32i16,path,535,0.004088,false,0.0001 +qp,p32i16,path,536,0.009281,false,0.0001 +qp,p32i16,path,537,0.00775,false,0.0001 +qp,p32i16,path,538,0.005991,false,0.0001 +qp,p32i16,path,539,0.007386,false,0.0001 +qp,p32i16,path,540,0.000326,true,0.0001 +qp,p32i16,path,541,0.000279,true,0.0001 +qp,p32i16,path,542,0.00029,true,0.0001 +qp,p32i16,path,543,0.005454,false,0.0001 +qp,p32i16,path,544,0.000839,true,0.0001 +qp,p32i16,path,545,0.00671,false,0.0001 +qp,p32i16,path,546,0.000291,true,0.0001 +qp,p32i16,path,547,0.009818,false,0.0001 +qp,p32i16,path,548,0.000302,true,0.0001 +qp,p32i16,path,549,0.000282,true,0.0001 +qp,p32i16,path,550,0.000281,true,0.0001 +qp,p32i16,path,551,0.004704,false,0.0001 +qp,p32i16,path,552,0.004809,false,0.0001 +qp,p32i16,path,553,0.000279,true,0.0001 +qp,p32i16,path,554,0.000769,true,0.0001 +qp,p32i16,path,555,0.007712,false,0.0001 +qp,p32i16,path,556,0.004341,false,0.0001 +qp,p32i16,path,557,0.007876,false,0.0001 +qp,p32i16,path,558,0.00953,false,0.0001 +qp,p32i16,path,559,0.00553,false,0.0001 +qp,p32i16,path,560,0.000524,true,0.0001 +qp,p32i16,path,561,0.000335,true,0.0001 +qp,p32i16,path,562,0.004797,false,0.0001 +qp,p32i16,path,563,0.001064,true,0.0001 +qp,p32i16,path,564,0.000317,true,0.0001 +qp,p32i16,path,565,0.00705,false,0.0001 +qp,p32i16,path,566,0.005567,false,0.0001 +qp,p32i16,path,567,0.003293,true,0.0001 +qp,p32i16,path,568,0.003916,false,0.0001 +qp,p32i16,path,569,0.005637,false,0.0001 +qp,p32i16,path,570,0.004503,false,0.0001 +qp,p32i16,path,571,0.004173,false,0.0001 +qp,p32i16,path,572,0.004406,false,0.0001 +qp,p32i16,path,573,0.008458,false,0.0001 +qp,p32i16,path,574,0.000283,true,0.0001 +qp,p32i16,path,575,0.007106,false,0.0001 +qp,p32i16,path,576,0.006538,false,0.0001 +qp,p32i16,path,577,0.004647,false,0.0001 +qp,p32i16,path,578,0.000465,true,0.0001 +qp,p32i16,path,579,0.005836,false,0.0001 +qp,p32i16,path,580,0.000319,true,0.0001 +qp,p32i16,path,581,0.007289,false,0.0001 +qp,p32i16,path,582,0.007029,false,0.0001 +qp,p32i16,path,583,0.000338,true,0.0001 +qp,p32i16,path,584,0.000327,true,0.0001 +qp,p32i16,path,585,0.000354,true,0.0001 +qp,p32i16,path,586,0.006799,false,0.0001 +qp,p32i16,path,587,0.007082,false,0.0001 +qp,p32i16,path,588,0.000551,true,0.0001 +qp,p32i16,path,589,0.000297,true,0.0001 +qp,p32i16,path,590,0.000278,true,0.0001 +qp,p32i16,path,591,0.000298,true,0.0001 +qp,p32i16,path,592,0.000293,true,0.0001 +qp,p32i16,path,593,0.010164,false,0.0001 +qp,p32i16,path,594,0.000323,true,0.0001 +qp,p32i16,path,595,0.000284,true,0.0001 +qp,p32i16,path,596,0.004295,false,0.0001 +qp,p32i16,path,597,0.00033,true,0.0001 +qp,p32i16,path,598,0.00031,true,0.0001 +qp,p32i16,path,599,0.000282,true,0.0001 +qp,p32i16,path,600,0.000311,true,0.0001 +qp,p32i16,path,601,0.004847,false,0.0001 +qp,p32i16,path,602,0.000324,true,0.0001 +qp,p32i16,path,603,0.007743,false,0.0001 +qp,p32i16,path,604,0.009838,false,0.0001 +qp,p32i16,path,605,0.000294,true,0.0001 +qp,p32i16,path,606,0.005604,false,0.0001 +qp,p32i16,path,607,0.005883,false,0.0001 +qp,p32i16,path,608,0.007483,false,0.0001 +qp,p32i16,path,609,0.006197,false,0.0001 +qp,p32i16,path,610,0.007508,false,0.0001 +qp,p32i16,path,611,0.000309,true,0.0001 +qp,p32i16,path,612,0.003755,false,0.0001 +qp,p32i16,path,613,0.006123,false,0.0001 +qp,p32i16,path,614,0.000293,true,0.0001 +qp,p32i16,path,615,0.000316,true,0.0001 +qp,p32i16,path,616,0.006759,false,0.0001 +qp,p32i16,path,617,0.000297,true,0.0001 +qp,p32i16,path,618,0.000566,true,0.0001 +qp,p32i16,path,619,0.008539,false,0.0001 +qp,p32i16,path,620,0.000483,true,0.0001 +qp,p32i16,path,621,0.000349,true,0.0001 +qp,p32i16,path,622,0.00586,false,0.0001 +qp,p32i16,path,623,0.000347,true,0.0001 +qp,p32i16,path,624,0.006008,false,0.0001 +qp,p32i16,path,625,0.000307,true,0.0001 +qp,p32i16,path,626,0.005133,false,0.0001 +qp,p32i16,path,627,0.012309,false,0.0001 +qp,p32i16,path,628,0.00523,false,0.0001 +qp,p32i16,path,629,0.000292,true,0.0001 +qp,p32i16,path,630,0.000311,true,0.0001 +qp,p32i16,path,631,0.004985,false,0.0001 +qp,p32i16,path,632,0.000312,true,0.0001 +qp,p32i16,path,633,0.003743,false,0.0001 +qp,p32i16,path,634,0.004672,false,0.0001 +qp,p32i16,path,635,0.008925,false,0.0001 +qp,p32i16,path,636,0.000309,true,0.0001 +qp,p32i16,path,637,0.00588,false,0.0001 +qp,p32i16,path,638,0.000331,true,0.0001 +qp,p32i16,path,639,0.006377,false,0.0001 +qp,p32i16,path,640,0.000292,true,0.0001 +qp,p32i16,path,641,0.004909,false,0.0001 +qp,p32i16,path,642,0.000289,true,0.0001 +qp,p32i16,path,643,0.014818,false,0.0001 +qp,p32i16,path,644,0.008557,false,0.0001 +qp,p32i16,path,645,0.004742,false,0.0001 +qp,p32i16,path,646,0.007214,false,0.0001 +qp,p32i16,path,647,0.006652,false,0.0001 +qp,p32i16,path,648,0.00387,false,0.0001 +qp,p32i16,path,649,0.003175,false,0.0001 +qp,p32i16,path,650,0.006328,false,0.0001 +qp,p32i16,path,651,0.015165,false,0.0001 +qp,p32i16,path,652,0.01136,false,0.0001 +qp,p32i16,path,653,0.008644,false,0.0001 +qp,p32i16,path,654,0.000355,true,0.0001 +qp,p32i16,path,655,0.003797,false,0.0001 +qp,p32i16,path,656,0.006694,false,0.0001 +qp,p32i16,path,657,0.000325,true,0.0001 +qp,p32i16,path,658,0.007132,false,0.0001 +qp,p32i16,path,659,0.000305,true,0.0001 +qp,p32i16,path,660,0.007394,false,0.0001 +qp,p32i16,path,661,0.00561,false,0.0001 +qp,p32i16,path,662,0.000333,true,0.0001 +qp,p32i16,path,663,0.003678,false,0.0001 +qp,p32i16,path,664,0.011759,false,0.0001 +qp,p32i16,path,665,0.000299,true,0.0001 +qp,p32i16,path,666,0.000297,true,0.0001 +qp,p32i16,path,667,0.000544,true,0.0001 +qp,p32i16,path,668,0.005641,false,0.0001 +qp,p32i16,path,669,0.005787,false,0.0001 +qp,p32i16,path,670,0.007315,false,0.0001 +qp,p32i16,path,671,0.00402,false,0.0001 +qp,p32i16,path,672,0.000297,true,0.0001 +qp,p32i16,path,673,0.00031,true,0.0001 +qp,p32i16,path,674,0.006726,false,0.0001 +qp,p32i16,path,675,0.004063,false,0.0001 +qp,p32i16,path,676,0.004824,false,0.0001 +qp,p32i16,path,677,0.003692,false,0.0001 +qp,p32i16,path,678,0.000381,true,0.0001 +qp,p32i16,path,679,0.004499,false,0.0001 +qp,p32i16,path,680,0.004335,false,0.0001 +qp,p32i16,path,681,0.003448,false,0.0001 +qp,p32i16,path,682,0.00075,true,0.0001 +qp,p32i16,path,683,0.006542,false,0.0001 +qp,p32i16,path,684,0.000369,true,0.0001 +qp,p32i16,path,685,0.005184,false,0.0001 +qp,p32i16,path,686,0.000315,true,0.0001 +qp,p32i16,path,687,0.000307,true,0.0001 +qp,p32i16,path,688,0.000288,true,0.0001 +qp,p32i16,path,689,0.000281,true,0.0001 +qp,p32i16,path,690,0.004285,false,0.0001 +qp,p32i16,path,691,0.006423,false,0.0001 +qp,p32i16,path,692,0.007357,false,0.0001 +qp,p32i16,path,693,0.000357,true,0.0001 +qp,p32i16,path,694,0.007409,false,0.0001 +qp,p32i16,path,695,0.000456,true,0.0001 +qp,p32i16,path,696,0.003335,false,0.0001 +qp,p32i16,path,697,0.016845,false,0.0001 +qp,p32i16,path,698,0.001025,true,0.0001 +qp,p32i16,path,699,0.003636,false,0.0001 +qp,p32i16,path,700,0.005474,false,0.0001 +qp,p32i16,path,701,0.014218,false,0.0001 +qp,p32i16,path,702,0.005494,false,0.0001 +qp,p32i16,path,703,0.000292,true,0.0001 +qp,p32i16,path,704,0.007519,false,0.0001 +qp,p32i16,path,705,0.000323,true,0.0001 +qp,p32i16,path,706,0.00029,true,0.0001 +qp,p32i16,path,707,0.00026,true,0.0001 +qp,p32i16,path,708,0.000277,true,0.0001 +qp,p32i16,path,709,0.000273,true,0.0001 +qp,p32i16,path,710,0.003354,false,0.0001 +qp,p32i16,path,711,0.000276,true,0.0001 +qp,p32i16,path,712,0.004504,false,0.0001 +qp,p32i16,path,713,0.000292,true,0.0001 +qp,p32i16,path,714,0.000278,true,0.0001 +qp,p32i16,path,715,0.005655,false,0.0001 +qp,p32i16,path,716,0.003802,false,0.0001 +qp,p32i16,path,717,0.000311,true,0.0001 +qp,p32i16,path,718,0.007322,false,0.0001 +qp,p32i16,path,719,0.006714,false,0.0001 +qp,p32i16,path,720,0.000309,true,0.0001 +qp,p32i16,path,721,0.004281,false,0.0001 +qp,p32i16,path,722,0.000563,true,0.0001 +qp,p32i16,path,723,0.00589,false,0.0001 +qp,p32i16,path,724,0.000337,true,0.0001 +qp,p32i16,path,725,0.007138,false,0.0001 +qp,p32i16,path,726,0.00327,false,0.0001 +qp,p32i16,path,727,0.005448,false,0.0001 +qp,p32i16,path,728,0.000311,true,0.0001 +qp,p32i16,path,729,0.005531,false,0.0001 +qp,p32i16,path,730,0.006391,false,0.0001 +qp,p32i16,path,731,0.000608,true,0.0001 +qp,p32i16,path,732,0.001929,true,0.0001 +qp,p32i16,path,733,0.000315,true,0.0001 +qp,p32i16,path,734,0.000286,true,0.0001 +qp,p32i16,path,735,0.000313,true,0.0001 +qp,p32i16,path,736,0.00436,false,0.0001 +qp,p32i16,path,737,0.00408,false,0.0001 +qp,p32i16,path,738,0.008728,false,0.0001 +qp,p32i16,path,739,0.007093,false,0.0001 +qp,p32i16,path,740,0.000289,true,0.0001 +qp,p32i16,path,741,0.00031,true,0.0001 +qp,p32i16,path,742,0.000297,true,0.0001 +qp,p32i16,path,743,0.008976,false,0.0001 +qp,p32i16,path,744,0.007134,false,0.0001 +qp,p32i16,path,745,0.00891,false,0.0001 +qp,p32i16,path,746,0.003772,false,0.0001 +qp,p32i16,path,747,0.009012,false,0.0001 +qp,p32i16,path,748,0.000331,true,0.0001 +qp,p32i16,path,749,0.000338,true,0.0001 +qp,p32i16,path,750,0.000299,true,0.0001 +qp,p32i16,path,751,0.00033,true,0.0001 +qp,p32i16,path,752,0.006753,false,0.0001 +qp,p32i16,path,753,0.005164,false,0.0001 +qp,p32i16,path,754,0.007632,false,0.0001 +qp,p32i16,path,755,0.000454,true,0.0001 +qp,p32i16,path,756,0.000301,true,0.0001 +qp,p32i16,path,757,0.008722,false,0.0001 +qp,p32i16,path,758,0.004534,false,0.0001 +qp,p32i16,path,759,0.003502,false,0.0001 +qp,p32i16,path,760,0.004611,false,0.0001 +qp,p32i16,path,761,0.011135,false,0.0001 +qp,p32i16,path,762,0.000324,true,0.0001 +qp,p32i16,path,763,0.009896,false,0.0001 +qp,p32i16,path,764,0.005235,false,0.0001 +qp,p32i16,path,765,0.000287,true,0.0001 +qp,p32i16,path,766,0.004861,false,0.0001 +qp,p32i16,path,767,0.003256,false,0.0001 +qp,p32i16,path,768,0.006846,false,0.0001 +qp,p32i16,path,769,0.009252,false,0.0001 +qp,p32i16,path,770,0.008007,false,0.0001 +qp,p32i16,path,771,0.000602,true,0.0001 +qp,p32i16,path,772,0.004707,false,0.0001 +qp,p32i16,path,773,0.006064,false,0.0001 +qp,p32i16,path,774,0.006798,false,0.0001 +qp,p32i16,path,775,0.007381,false,0.0001 +qp,p32i16,path,776,0.004767,false,0.0001 +qp,p32i16,path,777,0.015115,false,0.0001 +qp,p32i16,path,778,0.004671,false,0.0001 +qp,p32i16,path,779,0.008135,false,0.0001 +qp,p32i16,path,780,0.000288,true,0.0001 +qp,p32i16,path,781,0.000287,true,0.0001 +qp,p32i16,path,782,0.0003,true,0.0001 +qp,p32i16,path,783,0.009507,false,0.0001 +qp,p32i16,path,784,0.00381,false,0.0001 +qp,p32i16,path,785,0.000515,true,0.0001 +qp,p32i16,path,786,0.000325,true,0.0001 +qp,p32i16,path,787,0.000291,true,0.0001 +qp,p32i16,path,788,0.007457,false,0.0001 +qp,p32i16,path,789,0.003668,false,0.0001 +qp,p32i16,path,790,0.005283,false,0.0001 +qp,p32i16,path,791,0.006083,false,0.0001 +qp,p32i16,path,792,0.004182,false,0.0001 +qp,p32i16,path,793,0.013116,false,0.0001 +qp,p32i16,path,794,0.000325,true,0.0001 +qp,p32i16,path,795,0.005161,false,0.0001 +qp,p32i16,path,796,0.008846,false,0.0001 +qp,p32i16,path,797,0.000293,true,0.0001 +qp,p32i16,path,798,0.000315,true,0.0001 +qp,p32i16,path,799,0.007065,false,0.0001 +qp,p32i16,path,800,0.000307,true,0.0001 +qp,p32i16,path,801,0.011015,false,0.0001 +qp,p32i16,path,802,0.000303,true,0.0001 +qp,p32i16,path,803,0.000314,true,0.0001 +qp,p32i16,path,804,0.000268,true,0.0001 +qp,p32i16,path,805,0.000303,true,0.0001 +qp,p32i16,path,806,0.000276,true,0.0001 +qp,p32i16,path,807,0.011062,false,0.0001 +qp,p32i16,path,808,0.006496,false,0.0001 +qp,p32i16,path,809,0.000294,true,0.0001 +qp,p32i16,path,810,0.004636,false,0.0001 +qp,p32i16,path,811,0.000293,true,0.0001 +qp,p32i16,path,812,0.007139,false,0.0001 +qp,p32i16,path,813,0.000648,true,0.0001 +qp,p32i16,path,814,0.008804,false,0.0001 +qp,p32i16,path,815,0.000282,true,0.0001 +qp,p32i16,path,816,0.004406,false,0.0001 +qp,p32i16,path,817,0.000331,true,0.0001 +qp,p32i16,path,818,0.000273,true,0.0001 +qp,p32i16,path,819,0.005159,false,0.0001 +qp,p32i16,path,820,0.00031,true,0.0001 +qp,p32i16,path,821,0.005729,false,0.0001 +qp,p32i16,path,822,0.000318,true,0.0001 +qp,p32i16,path,823,0.00029,true,0.0001 +qp,p32i16,path,824,0.000272,true,0.0001 +qp,p32i16,path,825,0.000276,true,0.0001 +qp,p32i16,path,826,0.004427,false,0.0001 +qp,p32i16,path,827,0.000328,true,0.0001 +qp,p32i16,path,828,0.000284,true,0.0001 +qp,p32i16,path,829,0.009781,false,0.0001 +qp,p32i16,path,830,0.009382,false,0.0001 +qp,p32i16,path,831,0.0003,true,0.0001 +qp,p32i16,path,832,0.008968,false,0.0001 +qp,p32i16,path,833,0.0072,false,0.0001 +qp,p32i16,path,834,0.00587,false,0.0001 +qp,p32i16,path,835,0.008211,false,0.0001 +qp,p32i16,path,836,0.005032,false,0.0001 +qp,p32i16,path,837,0.003608,false,0.0001 +qp,p32i16,path,838,0.006827,false,0.0001 +qp,p32i16,path,839,0.005017,false,0.0001 +qp,p32i16,path,840,0.000306,true,0.0001 +qp,p32i16,path,841,0.006214,false,0.0001 +qp,p32i16,path,842,0.005516,false,0.0001 +qp,p32i16,path,843,0.00029,true,0.0001 +qp,p32i16,path,844,0.000307,true,0.0001 +qp,p32i16,path,845,0.000343,true,0.0001 +qp,p32i16,path,846,0.005061,false,0.0001 +qp,p32i16,path,847,0.004026,false,0.0001 +qp,p32i16,path,848,0.000307,true,0.0001 +qp,p32i16,path,849,0.004923,false,0.0001 +qp,p32i16,path,850,0.003999,false,0.0001 +qp,p32i16,path,851,0.000644,true,0.0001 +qp,p32i16,path,852,0.000323,true,0.0001 +qp,p32i16,path,853,0.000329,true,0.0001 +qp,p32i16,path,854,0.011543,false,0.0001 +qp,p32i16,path,855,0.010837,false,0.0001 +qp,p32i16,path,856,0.006866,false,0.0001 +qp,p32i16,path,857,0.000311,true,0.0001 +qp,p32i16,path,858,0.000529,true,0.0001 +qp,p32i16,path,859,0.000573,true,0.0001 +qp,p32i16,path,860,0.000282,true,0.0001 +qp,p32i16,path,861,0.007951,false,0.0001 +qp,p32i16,path,862,0.007122,false,0.0001 +qp,p32i16,path,863,0.000305,true,0.0001 +qp,p32i16,path,864,0.000514,true,0.0001 +qp,p32i16,path,865,0.007021,false,0.0001 +qp,p32i16,path,866,0.007078,false,0.0001 +qp,p32i16,path,867,0.004267,false,0.0001 +qp,p32i16,path,868,0.004119,false,0.0001 +qp,p32i16,path,869,0.000298,true,0.0001 +qp,p32i16,path,870,0.005015,false,0.0001 +qp,p32i16,path,871,0.000468,true,0.0001 +qp,p32i16,path,872,0.000313,true,0.0001 +qp,p32i16,path,873,0.003467,false,0.0001 +qp,p32i16,path,874,0.000332,true,0.0001 +qp,p32i16,path,875,0.005845,false,0.0001 +qp,p32i16,path,876,0.009204,false,0.0001 +qp,p32i16,path,877,0.000439,true,0.0001 +qp,p32i16,path,878,0.005735,false,0.0001 +qp,p32i16,path,879,0.000424,true,0.0001 +qp,p32i16,path,880,0.000583,true,0.0001 +qp,p32i16,path,881,0.00036,true,0.0001 +qp,p32i16,path,882,0.000319,true,0.0001 +qp,p32i16,path,883,0.000331,true,0.0001 +qp,p32i16,path,884,0.000814,true,0.0001 +qp,p32i16,path,885,0.000757,true,0.0001 +qp,p32i16,path,886,0.004924,false,0.0001 +qp,p32i16,path,887,0.000653,true,0.0001 +qp,p32i16,path,888,0.000299,true,0.0001 +qp,p32i16,path,889,0.005155,false,0.0001 +qp,p32i16,path,890,0.006616,false,0.0001 +qp,p32i16,path,891,0.009345,false,0.0001 +qp,p32i16,path,892,0.005392,false,0.0001 +qp,p32i16,path,893,0.003907,false,0.0001 +qp,p32i16,path,894,0.000301,true,0.0001 +qp,p32i16,path,895,0.012154,false,0.0001 +qp,p32i16,path,896,0.000428,true,0.0001 +qp,p32i16,path,897,0.004492,false,0.0001 +qp,p32i16,path,898,0.005027,false,0.0001 +qp,p32i16,path,899,0.004476,false,0.0001 +qp,p32i16,path,900,0.000317,true,0.0001 +qp,p32i16,path,901,0.000713,true,0.0001 +qp,p32i16,path,902,0.004791,false,0.0001 +qp,p32i16,path,903,0.000303,true,0.0001 +qp,p32i16,path,904,0.012151,false,0.0001 +qp,p32i16,path,905,0.003706,false,0.0001 +qp,p32i16,path,906,0.007168,false,0.0001 +qp,p32i16,path,907,0.000327,true,0.0001 +qp,p32i16,path,908,0.000321,true,0.0001 +qp,p32i16,path,909,0.000552,true,0.0001 +qp,p32i16,path,910,0.000293,true,0.0001 +qp,p32i16,path,911,0.005152,false,0.0001 +qp,p32i16,path,912,0.00494,false,0.0001 +qp,p32i16,path,913,0.000715,true,0.0001 +qp,p32i16,path,914,0.009881,false,0.0001 +qp,p32i16,path,915,0.00744,false,0.0001 +qp,p32i16,path,916,0.000364,true,0.0001 +qp,p32i16,path,917,0.009153,false,0.0001 +qp,p32i16,path,918,0.003478,false,0.0001 +qp,p32i16,path,919,0.000325,true,0.0001 +qp,p32i16,path,920,0.000285,true,0.0001 +qp,p32i16,path,921,0.009445,false,0.0001 +qp,p32i16,path,922,0.010739,false,0.0001 +qp,p32i16,path,923,0.00528,false,0.0001 +qp,p32i16,path,924,0.000325,true,0.0001 +qp,p32i16,path,925,0.008344,false,0.0001 +qp,p32i16,path,926,0.004649,false,0.0001 +qp,p32i16,path,927,0.000305,true,0.0001 +qp,p32i16,path,928,0.00407,false,0.0001 +qp,p32i16,path,929,0.004963,false,0.0001 +qp,p32i16,path,930,0.00054,true,0.0001 +qp,p32i16,path,931,0.004235,false,0.0001 +qp,p32i16,path,932,0.000301,true,0.0001 +qp,p32i16,path,933,0.004184,false,0.0001 +qp,p32i16,path,934,0.004185,false,0.0001 +qp,p32i16,path,935,0.000314,true,0.0001 +qp,p32i16,path,936,0.005182,false,0.0001 +qp,p32i16,path,937,0.000305,true,0.0001 +qp,p32i16,path,938,0.00468,false,0.0001 +qp,p32i16,path,939,0.000296,true,0.0001 +qp,p32i16,path,940,0.0003,true,0.0001 +qp,p32i16,path,941,0.000504,true,0.0001 +qp,p32i16,path,942,0.000306,true,0.0001 +qp,p32i16,path,943,0.005536,false,0.0001 +qp,p32i16,path,944,0.015277,false,0.0001 +qp,p32i16,path,945,0.009136,false,0.0001 +qp,p32i16,path,946,0.005632,false,0.0001 +qp,p32i16,path,947,0.000545,true,0.0001 +qp,p32i16,path,948,0.000428,true,0.0001 +qp,p32i16,path,949,0.000308,true,0.0001 +qp,p32i16,path,950,0.004076,false,0.0001 +qp,p32i16,path,951,0.005033,false,0.0001 +qp,p32i16,path,952,0.000566,true,0.0001 +qp,p32i16,path,953,0.00929,false,0.0001 +qp,p32i16,path,954,0.007184,false,0.0001 +qp,p32i16,path,955,0.006663,false,0.0001 +qp,p32i16,path,956,0.007106,false,0.0001 +qp,p32i16,path,957,0.000434,true,0.0001 +qp,p32i16,path,958,0.010794,false,0.0001 +qp,p32i16,path,959,0.008774,false,0.0001 +qp,p32i16,path,960,0.005244,false,0.0001 +qp,p32i16,path,961,0.006147,false,0.0001 +qp,p32i16,path,962,0.000745,true,0.0001 +qp,p32i16,path,963,0.010388,false,0.0001 +qp,p32i16,path,964,0.008798,false,0.0001 +qp,p32i16,path,965,0.00034,true,0.0001 +qp,p32i16,path,966,0.000285,true,0.0001 +qp,p32i16,path,967,0.006222,false,0.0001 +qp,p32i16,path,968,0.000321,true,0.0001 +qp,p32i16,path,969,0.004883,false,0.0001 +qp,p32i16,path,970,0.004315,false,0.0001 +qp,p32i16,path,971,0.00861,false,0.0001 +qp,p32i16,path,972,0.006093,false,0.0001 +qp,p32i16,path,973,0.006952,false,0.0001 +qp,p32i16,path,974,0.008226,false,0.0001 +qp,p32i16,path,975,0.000777,true,0.0001 +qp,p32i16,path,976,0.005159,false,0.0001 +qp,p32i16,path,977,0.00031,true,0.0001 +qp,p32i16,path,978,0.000331,true,0.0001 +qp,p32i16,path,979,0.00659,false,0.0001 +qp,p32i16,path,980,0.00343,false,0.0001 +qp,p32i16,path,981,0.009466,false,0.0001 +qp,p32i16,path,982,0.009621,false,0.0001 +qp,p32i16,path,983,0.007496,false,0.0001 +qp,p32i16,path,984,0.004855,false,0.0001 +qp,p32i16,path,985,0.000321,true,0.0001 +qp,p32i16,path,986,0.004334,false,0.0001 +qp,p32i16,path,987,0.000287,true,0.0001 +qp,p32i16,path,988,0.006773,false,0.0001 +qp,p32i16,path,989,0.000369,true,0.0001 +qp,p32i16,path,990,0.007436,false,0.0001 +qp,p32i16,path,991,0.006003,false,0.0001 +qp,p32i16,path,992,0.00411,false,0.0001 +qp,p32i16,path,993,0.000287,true,0.0001 +qp,p32i16,path,994,0.000853,true,0.0001 +qp,p32i16,path,995,0.000469,true,0.0001 +qp,p32i16,path,996,0.000316,true,0.0001 +qp,p32i16,path,997,0.00573,false,0.0001 +qp,p32i16,path,998,0.011791,false,0.0001 +qp,p32i16,path,999,0.000331,true,0.0001 +qp,p32i16,path,1000,0.003912,false,0.0001 +qp,p32i16,path,1001,0.006911,false,0.0001 +qp,p32i16,path,1002,0.004263,false,0.0001 +qp,p32i16,path,1003,0.000323,true,0.0001 +qp,p32i16,path,1004,0.009497,false,0.0001 +qp,p32i16,path,1005,0.000324,true,0.0001 +qp,p32i16,path,1006,0.000321,true,0.0001 +qp,p32i16,path,1007,0.006506,false,0.0001 +qp,p32i16,path,1008,0.006977,false,0.0001 +qp,p32i16,path,1009,0.005476,false,0.0001 +qp,p32i16,path,1010,0.000299,true,0.0001 +qp,p32i16,path,1011,0.00031,true,0.0001 +qp,p32i16,path,1012,0.000323,true,0.0001 +qp,p32i16,path,1013,0.004033,false,0.0001 +qp,p32i16,path,1014,0.009844,false,0.0001 +qp,p32i16,path,1015,0.000314,true,0.0001 +qp,p32i16,path,1016,0.000305,true,0.0001 +qp,p32i16,path,1017,0.000321,true,0.0001 +qp,p32i16,path,1018,0.000309,true,0.0001 +qp,p32i16,path,1019,0.000484,true,0.0001 +qp,p32i16,path,1020,0.000304,true,0.0001 +qp,p32i16,path,1021,0.000295,true,0.0001 +qp,p32i16,path,1022,0.005025,false,0.0001 +qp,p32i16,path,1023,0.004073,false,0.0001 +qp,p32i16,path,1024,0.004364,false,0.0001 diff --git a/benchmark/results/per_instance_table1.csv b/benchmark/results/per_instance_table1.csv new file mode 100644 index 0000000..d2aae63 --- /dev/null +++ b/benchmark/results/per_instance_table1.csv @@ -0,0 +1,6145 @@ +problem,size,solver,instance,time_s,solved,tol +qp,p32i16,ip_umfpack,1,0.072721,false,0.0001 +qp,p32i16,ip_klu,1,0.025733,false,0.0001 +qp,p32i16,ip_umfpack,2,0.002457,false,0.0001 +qp,p32i16,ip_klu,2,0.000676,false,0.0001 +qp,p32i16,ip_umfpack,3,0.034437,false,0.0001 +qp,p32i16,ip_klu,3,0.005444,false,0.0001 +qp,p32i16,ip_umfpack,4,0.00098,true,0.0001 +qp,p32i16,ip_klu,4,0.00023,true,0.0001 +qp,p32i16,ip_umfpack,5,0.00076,true,0.0001 +qp,p32i16,ip_klu,5,0.000176,true,0.0001 +qp,p32i16,ip_umfpack,6,0.044796,false,0.0001 +qp,p32i16,ip_klu,6,0.012161,false,0.0001 +qp,p32i16,ip_umfpack,7,0.031857,false,0.0001 +qp,p32i16,ip_klu,7,0.006732,false,0.0001 +qp,p32i16,ip_umfpack,8,0.004353,false,0.0001 +qp,p32i16,ip_klu,8,0.000544,false,0.0001 +qp,p32i16,ip_umfpack,9,0.029542,false,0.0001 +qp,p32i16,ip_klu,9,0.006713,false,0.0001 +qp,p32i16,ip_umfpack,10,0.022698,false,0.0001 +qp,p32i16,ip_klu,10,0.006372,false,0.0001 +qp,p32i16,ip_umfpack,11,0.002228,false,0.0001 +qp,p32i16,ip_klu,11,0.000615,false,0.0001 +qp,p32i16,ip_umfpack,12,0.000743,true,0.0001 +qp,p32i16,ip_klu,12,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,13,0.02557,false,0.0001 +qp,p32i16,ip_klu,13,0.005469,false,0.0001 +qp,p32i16,ip_umfpack,14,0.042446,false,0.0001 +qp,p32i16,ip_klu,14,0.009623,false,0.0001 +qp,p32i16,ip_umfpack,15,0.000812,true,0.0001 +qp,p32i16,ip_klu,15,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,16,0.054961,false,0.0001 +qp,p32i16,ip_klu,16,0.009718,false,0.0001 +qp,p32i16,ip_umfpack,17,0.000731,true,0.0001 +qp,p32i16,ip_klu,17,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,18,0.002592,false,0.0001 +qp,p32i16,ip_klu,18,0.000621,false,0.0001 +qp,p32i16,ip_umfpack,19,0.004356,false,0.0001 +qp,p32i16,ip_klu,19,0.000578,false,0.0001 +qp,p32i16,ip_umfpack,20,0.023055,false,0.0001 +qp,p32i16,ip_klu,20,0.006753,false,0.0001 +qp,p32i16,ip_umfpack,21,0.000912,true,0.0001 +qp,p32i16,ip_klu,21,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,22,0.025933,false,0.0001 +qp,p32i16,ip_klu,22,0.005233,false,0.0001 +qp,p32i16,ip_umfpack,23,0.043379,false,0.0001 +qp,p32i16,ip_klu,23,0.00979,false,0.0001 +qp,p32i16,ip_umfpack,24,0.03934,false,0.0001 +qp,p32i16,ip_klu,24,0.010028,false,0.0001 +qp,p32i16,ip_umfpack,25,0.052832,false,0.0001 +qp,p32i16,ip_klu,25,0.009295,false,0.0001 +qp,p32i16,ip_umfpack,26,0.011633,true,0.0001 +qp,p32i16,ip_klu,26,0.003738,true,0.0001 +qp,p32i16,ip_umfpack,27,0.036671,false,0.0001 +qp,p32i16,ip_klu,27,0.008105,false,0.0001 +qp,p32i16,ip_umfpack,28,0.00223,false,0.0001 +qp,p32i16,ip_klu,28,0.000521,false,0.0001 +qp,p32i16,ip_umfpack,29,0.040483,false,0.0001 +qp,p32i16,ip_klu,29,0.008589,false,0.0001 +qp,p32i16,ip_umfpack,30,0.02702,false,0.0001 +qp,p32i16,ip_klu,30,0.007574,false,0.0001 +qp,p32i16,ip_umfpack,31,0.000886,true,0.0001 +qp,p32i16,ip_klu,31,0.000194,true,0.0001 +qp,p32i16,ip_umfpack,32,0.041468,false,0.0001 +qp,p32i16,ip_klu,32,0.01162,false,0.0001 +qp,p32i16,ip_umfpack,33,0.000839,true,0.0001 +qp,p32i16,ip_klu,33,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,34,0.000851,true,0.0001 +qp,p32i16,ip_klu,34,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,35,0.022847,false,0.0001 +qp,p32i16,ip_klu,35,0.004372,false,0.0001 +qp,p32i16,ip_umfpack,36,0.002202,false,0.0001 +qp,p32i16,ip_klu,36,0.016734,false,0.0001 +qp,p32i16,ip_umfpack,37,0.002525,false,0.0001 +qp,p32i16,ip_klu,37,0.000623,false,0.0001 +qp,p32i16,ip_umfpack,38,0.040917,false,0.0001 +qp,p32i16,ip_klu,38,0.02364,false,0.0001 +qp,p32i16,ip_umfpack,39,0.040799,false,0.0001 +qp,p32i16,ip_klu,39,0.008637,false,0.0001 +qp,p32i16,ip_umfpack,40,0.000627,true,0.0001 +qp,p32i16,ip_klu,40,0.000158,true,0.0001 +qp,p32i16,ip_umfpack,41,0.017161,true,0.0001 +qp,p32i16,ip_klu,41,0.000212,true,0.0001 +qp,p32i16,ip_umfpack,42,0.039461,false,0.0001 +qp,p32i16,ip_klu,42,0.009751,false,0.0001 +qp,p32i16,ip_umfpack,43,0.001075,true,0.0001 +qp,p32i16,ip_klu,43,0.000229,true,0.0001 +qp,p32i16,ip_umfpack,44,0.02775,false,0.0001 +qp,p32i16,ip_klu,44,0.008254,false,0.0001 +qp,p32i16,ip_umfpack,45,0.024638,false,0.0001 +qp,p32i16,ip_klu,45,0.005152,false,0.0001 +qp,p32i16,ip_umfpack,46,0.041394,false,0.0001 +qp,p32i16,ip_klu,46,0.005717,false,0.0001 +qp,p32i16,ip_umfpack,47,0.042251,false,0.0001 +qp,p32i16,ip_klu,47,0.005891,false,0.0001 +qp,p32i16,ip_umfpack,48,0.000744,true,0.0001 +qp,p32i16,ip_klu,48,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,49,0.000734,true,0.0001 +qp,p32i16,ip_klu,49,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,50,0.000984,true,0.0001 +qp,p32i16,ip_klu,50,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,51,0.038586,false,0.0001 +qp,p32i16,ip_klu,51,0.010422,false,0.0001 +qp,p32i16,ip_umfpack,52,0.039306,false,0.0001 +qp,p32i16,ip_klu,52,0.009749,false,0.0001 +qp,p32i16,ip_umfpack,53,0.001027,true,0.0001 +qp,p32i16,ip_klu,53,0.000251,true,0.0001 +qp,p32i16,ip_umfpack,54,0.000793,true,0.0001 +qp,p32i16,ip_klu,54,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,55,0.001909,false,0.0001 +qp,p32i16,ip_klu,55,0.00051,false,0.0001 +qp,p32i16,ip_umfpack,56,0.000707,true,0.0001 +qp,p32i16,ip_klu,56,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,57,0.063005,false,0.0001 +qp,p32i16,ip_klu,57,0.008284,false,0.0001 +qp,p32i16,ip_umfpack,58,0.000838,true,0.0001 +qp,p32i16,ip_klu,58,0.00019,true,0.0001 +qp,p32i16,ip_umfpack,59,0.000753,true,0.0001 +qp,p32i16,ip_klu,59,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,60,0.000714,true,0.0001 +qp,p32i16,ip_klu,60,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,61,0.026055,false,0.0001 +qp,p32i16,ip_klu,61,0.007985,false,0.0001 +qp,p32i16,ip_umfpack,62,0.000985,true,0.0001 +qp,p32i16,ip_klu,62,0.000253,true,0.0001 +qp,p32i16,ip_umfpack,63,0.000934,true,0.0001 +qp,p32i16,ip_klu,63,0.000236,true,0.0001 +qp,p32i16,ip_umfpack,64,0.042776,false,0.0001 +qp,p32i16,ip_klu,64,0.009266,false,0.0001 +qp,p32i16,ip_umfpack,65,0.000991,true,0.0001 +qp,p32i16,ip_klu,65,0.000247,true,0.0001 +qp,p32i16,ip_umfpack,66,0.001051,true,0.0001 +qp,p32i16,ip_klu,66,0.00025,true,0.0001 +qp,p32i16,ip_umfpack,67,0.042161,false,0.0001 +qp,p32i16,ip_klu,67,0.01131,false,0.0001 +qp,p32i16,ip_umfpack,68,0.000772,true,0.0001 +qp,p32i16,ip_klu,68,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,69,0.053674,false,0.0001 +qp,p32i16,ip_klu,69,0.010959,false,0.0001 +qp,p32i16,ip_umfpack,70,0.054584,false,0.0001 +qp,p32i16,ip_klu,70,0.008511,false,0.0001 +qp,p32i16,ip_umfpack,71,0.027788,false,0.0001 +qp,p32i16,ip_klu,71,0.00548,false,0.0001 +qp,p32i16,ip_umfpack,72,0.000769,true,0.0001 +qp,p32i16,ip_klu,72,0.000193,true,0.0001 +qp,p32i16,ip_umfpack,73,0.002116,false,0.0001 +qp,p32i16,ip_klu,73,0.000554,false,0.0001 +qp,p32i16,ip_umfpack,74,0.000906,true,0.0001 +qp,p32i16,ip_klu,74,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,75,0.021386,false,0.0001 +qp,p32i16,ip_klu,75,0.006647,false,0.0001 +qp,p32i16,ip_umfpack,76,0.021125,false,0.0001 +qp,p32i16,ip_klu,76,0.004774,false,0.0001 +qp,p32i16,ip_umfpack,77,0.041668,false,0.0001 +qp,p32i16,ip_klu,77,0.021283,false,0.0001 +qp,p32i16,ip_umfpack,78,0.038952,false,0.0001 +qp,p32i16,ip_klu,78,0.01025,false,0.0001 +qp,p32i16,ip_umfpack,79,0.000794,true,0.0001 +qp,p32i16,ip_klu,79,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,80,0.002149,false,0.0001 +qp,p32i16,ip_klu,80,0.000599,false,0.0001 +qp,p32i16,ip_umfpack,81,0.037465,false,0.0001 +qp,p32i16,ip_klu,81,0.008119,false,0.0001 +qp,p32i16,ip_umfpack,82,0.004247,false,0.0001 +qp,p32i16,ip_klu,82,0.000532,false,0.0001 +qp,p32i16,ip_umfpack,83,0.000865,true,0.0001 +qp,p32i16,ip_klu,83,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,84,0.00077,true,0.0001 +qp,p32i16,ip_klu,84,0.000182,true,0.0001 +qp,p32i16,ip_umfpack,85,0.002221,false,0.0001 +qp,p32i16,ip_klu,85,0.000577,false,0.0001 +qp,p32i16,ip_umfpack,86,0.026832,false,0.0001 +qp,p32i16,ip_klu,86,0.006173,false,0.0001 +qp,p32i16,ip_umfpack,87,0.039294,false,0.0001 +qp,p32i16,ip_klu,87,0.005216,false,0.0001 +qp,p32i16,ip_umfpack,88,0.000701,true,0.0001 +qp,p32i16,ip_klu,88,0.000178,true,0.0001 +qp,p32i16,ip_umfpack,89,0.00079,true,0.0001 +qp,p32i16,ip_klu,89,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,90,0.018737,false,0.0001 +qp,p32i16,ip_klu,90,0.000576,false,0.0001 +qp,p32i16,ip_umfpack,91,0.041097,false,0.0001 +qp,p32i16,ip_klu,91,0.008478,false,0.0001 +qp,p32i16,ip_umfpack,92,0.056776,false,0.0001 +qp,p32i16,ip_klu,92,0.010309,false,0.0001 +qp,p32i16,ip_umfpack,93,0.000924,true,0.0001 +qp,p32i16,ip_klu,93,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,94,0.002077,false,0.0001 +qp,p32i16,ip_klu,94,0.000555,false,0.0001 +qp,p32i16,ip_umfpack,95,0.000868,true,0.0001 +qp,p32i16,ip_klu,95,0.000231,true,0.0001 +qp,p32i16,ip_umfpack,96,0.000815,true,0.0001 +qp,p32i16,ip_klu,96,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,97,0.000783,true,0.0001 +qp,p32i16,ip_klu,97,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,98,0.017406,true,0.0001 +qp,p32i16,ip_klu,98,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,99,0.000603,true,0.0001 +qp,p32i16,ip_klu,99,0.000154,true,0.0001 +qp,p32i16,ip_umfpack,100,0.046228,false,0.0001 +qp,p32i16,ip_klu,100,0.008647,false,0.0001 +qp,p32i16,ip_umfpack,101,0.053095,false,0.0001 +qp,p32i16,ip_klu,101,0.008109,false,0.0001 +qp,p32i16,ip_umfpack,102,0.019906,false,0.0001 +qp,p32i16,ip_klu,102,0.006483,false,0.0001 +qp,p32i16,ip_umfpack,103,0.001059,true,0.0001 +qp,p32i16,ip_klu,103,0.000243,true,0.0001 +qp,p32i16,ip_umfpack,104,0.000821,true,0.0001 +qp,p32i16,ip_klu,104,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,105,0.036458,false,0.0001 +qp,p32i16,ip_klu,105,0.009913,false,0.0001 +qp,p32i16,ip_umfpack,106,0.050762,false,0.0001 +qp,p32i16,ip_klu,106,0.009971,false,0.0001 +qp,p32i16,ip_umfpack,107,0.000773,true,0.0001 +qp,p32i16,ip_klu,107,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,108,0.025901,false,0.0001 +qp,p32i16,ip_klu,108,0.006256,false,0.0001 +qp,p32i16,ip_umfpack,109,0.002113,false,0.0001 +qp,p32i16,ip_klu,109,0.000568,false,0.0001 +qp,p32i16,ip_umfpack,110,0.004045,false,0.0001 +qp,p32i16,ip_klu,110,0.000532,false,0.0001 +qp,p32i16,ip_umfpack,111,0.0009,true,0.0001 +qp,p32i16,ip_klu,111,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,112,0.030787,true,0.0001 +qp,p32i16,ip_klu,112,0.005626,true,0.0001 +qp,p32i16,ip_umfpack,113,0.000922,true,0.0001 +qp,p32i16,ip_klu,113,0.000234,true,0.0001 +qp,p32i16,ip_umfpack,114,0.000879,true,0.0001 +qp,p32i16,ip_klu,114,0.000222,true,0.0001 +qp,p32i16,ip_umfpack,115,0.000707,true,0.0001 +qp,p32i16,ip_klu,115,0.000193,true,0.0001 +qp,p32i16,ip_umfpack,116,0.053913,false,0.0001 +qp,p32i16,ip_klu,116,0.023981,false,0.0001 +qp,p32i16,ip_umfpack,117,0.002158,false,0.0001 +qp,p32i16,ip_klu,117,0.000541,false,0.0001 +qp,p32i16,ip_umfpack,118,0.000615,true,0.0001 +qp,p32i16,ip_klu,118,0.000173,true,0.0001 +qp,p32i16,ip_umfpack,119,0.038503,false,0.0001 +qp,p32i16,ip_klu,119,0.007474,false,0.0001 +qp,p32i16,ip_umfpack,120,0.000867,true,0.0001 +qp,p32i16,ip_klu,120,0.000209,true,0.0001 +qp,p32i16,ip_umfpack,121,0.00101,true,0.0001 +qp,p32i16,ip_klu,121,0.000202,true,0.0001 +qp,p32i16,ip_umfpack,122,0.000959,true,0.0001 +qp,p32i16,ip_klu,122,0.000245,true,0.0001 +qp,p32i16,ip_umfpack,123,0.003177,true,0.0001 +qp,p32i16,ip_klu,123,0.000183,true,0.0001 +qp,p32i16,ip_umfpack,124,0.002255,false,0.0001 +qp,p32i16,ip_klu,124,0.000559,false,0.0001 +qp,p32i16,ip_umfpack,125,0.002108,false,0.0001 +qp,p32i16,ip_klu,125,0.000555,false,0.0001 +qp,p32i16,ip_umfpack,126,0.000792,true,0.0001 +qp,p32i16,ip_klu,126,0.000194,true,0.0001 +qp,p32i16,ip_umfpack,127,0.000867,true,0.0001 +qp,p32i16,ip_klu,127,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,128,0.039444,false,0.0001 +qp,p32i16,ip_klu,128,0.0079,false,0.0001 +qp,p32i16,ip_umfpack,129,0.042874,false,0.0001 +qp,p32i16,ip_klu,129,0.012443,false,0.0001 +qp,p32i16,ip_umfpack,130,0.054862,false,0.0001 +qp,p32i16,ip_klu,130,0.02471,false,0.0001 +qp,p32i16,ip_umfpack,131,0.000932,true,0.0001 +qp,p32i16,ip_klu,131,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,132,0.000928,true,0.0001 +qp,p32i16,ip_klu,132,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,133,0.044227,false,0.0001 +qp,p32i16,ip_klu,133,0.008504,false,0.0001 +qp,p32i16,ip_umfpack,134,0.053745,false,0.0001 +qp,p32i16,ip_klu,134,0.023988,false,0.0001 +qp,p32i16,ip_umfpack,135,0.003294,false,0.0001 +qp,p32i16,ip_klu,135,0.00091,false,0.0001 +qp,p32i16,ip_umfpack,136,0.040589,false,0.0001 +qp,p32i16,ip_klu,136,0.008138,false,0.0001 +qp,p32i16,ip_umfpack,137,0.04403,false,0.0001 +qp,p32i16,ip_klu,137,0.006014,false,0.0001 +qp,p32i16,ip_umfpack,138,0.043342,false,0.0001 +qp,p32i16,ip_klu,138,0.009056,false,0.0001 +qp,p32i16,ip_umfpack,139,0.05047,false,0.0001 +qp,p32i16,ip_klu,139,0.009949,false,0.0001 +qp,p32i16,ip_umfpack,140,0.000733,true,0.0001 +qp,p32i16,ip_klu,140,0.000172,true,0.0001 +qp,p32i16,ip_umfpack,141,0.042016,false,0.0001 +qp,p32i16,ip_klu,141,0.00894,false,0.0001 +qp,p32i16,ip_umfpack,142,0.016843,true,0.0001 +qp,p32i16,ip_klu,142,0.000248,true,0.0001 +qp,p32i16,ip_umfpack,143,0.002491,false,0.0001 +qp,p32i16,ip_klu,143,0.000641,false,0.0001 +qp,p32i16,ip_umfpack,144,0.000779,true,0.0001 +qp,p32i16,ip_klu,144,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,145,0.038204,false,0.0001 +qp,p32i16,ip_klu,145,0.008033,false,0.0001 +qp,p32i16,ip_umfpack,146,0.000762,true,0.0001 +qp,p32i16,ip_klu,146,0.000184,true,0.0001 +qp,p32i16,ip_umfpack,147,0.005759,false,0.0001 +qp,p32i16,ip_klu,147,0.000529,false,0.0001 +qp,p32i16,ip_umfpack,148,0.021895,false,0.0001 +qp,p32i16,ip_klu,148,0.005066,false,0.0001 +qp,p32i16,ip_umfpack,149,0.000756,true,0.0001 +qp,p32i16,ip_klu,149,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,150,0.027093,false,0.0001 +qp,p32i16,ip_klu,150,0.005726,false,0.0001 +qp,p32i16,ip_umfpack,151,0.000773,true,0.0001 +qp,p32i16,ip_klu,151,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,152,0.037008,false,0.0001 +qp,p32i16,ip_klu,152,0.010424,false,0.0001 +qp,p32i16,ip_umfpack,153,0.001153,true,0.0001 +qp,p32i16,ip_klu,153,0.000261,true,0.0001 +qp,p32i16,ip_umfpack,154,0.043538,false,0.0001 +qp,p32i16,ip_klu,154,0.006127,false,0.0001 +qp,p32i16,ip_umfpack,155,0.038811,false,0.0001 +qp,p32i16,ip_klu,155,0.005191,false,0.0001 +qp,p32i16,ip_umfpack,156,0.026094,false,0.0001 +qp,p32i16,ip_klu,156,0.021695,false,0.0001 +qp,p32i16,ip_umfpack,157,0.000899,true,0.0001 +qp,p32i16,ip_klu,157,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,158,0.039072,false,0.0001 +qp,p32i16,ip_klu,158,0.010429,false,0.0001 +qp,p32i16,ip_umfpack,159,0.000884,true,0.0001 +qp,p32i16,ip_klu,159,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,160,0.036955,false,0.0001 +qp,p32i16,ip_klu,160,0.008482,false,0.0001 +qp,p32i16,ip_umfpack,161,0.000715,true,0.0001 +qp,p32i16,ip_klu,161,0.000181,true,0.0001 +qp,p32i16,ip_umfpack,162,0.000881,true,0.0001 +qp,p32i16,ip_klu,162,0.000226,true,0.0001 +qp,p32i16,ip_umfpack,163,0.000793,true,0.0001 +qp,p32i16,ip_klu,163,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,164,0.000928,true,0.0001 +qp,p32i16,ip_klu,164,0.000212,true,0.0001 +qp,p32i16,ip_umfpack,165,0.001976,false,0.0001 +qp,p32i16,ip_klu,165,0.000533,false,0.0001 +qp,p32i16,ip_umfpack,166,0.000776,true,0.0001 +qp,p32i16,ip_klu,166,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,167,0.041677,false,0.0001 +qp,p32i16,ip_klu,167,0.007885,false,0.0001 +qp,p32i16,ip_umfpack,168,0.038594,false,0.0001 +qp,p32i16,ip_klu,168,0.008317,false,0.0001 +qp,p32i16,ip_umfpack,169,0.036903,false,0.0001 +qp,p32i16,ip_klu,169,0.010008,false,0.0001 +qp,p32i16,ip_umfpack,170,0.001964,true,0.0001 +qp,p32i16,ip_klu,170,0.000467,true,0.0001 +qp,p32i16,ip_umfpack,171,0.037381,false,0.0001 +qp,p32i16,ip_klu,171,0.010961,false,0.0001 +qp,p32i16,ip_umfpack,172,0.001086,true,0.0001 +qp,p32i16,ip_klu,172,0.000229,true,0.0001 +qp,p32i16,ip_umfpack,173,0.000889,true,0.0001 +qp,p32i16,ip_klu,173,0.000189,true,0.0001 +qp,p32i16,ip_umfpack,174,0.03359,false,0.0001 +qp,p32i16,ip_klu,174,0.009351,false,0.0001 +qp,p32i16,ip_umfpack,175,0.037855,false,0.0001 +qp,p32i16,ip_klu,175,0.024349,false,0.0001 +qp,p32i16,ip_umfpack,176,0.00102,true,0.0001 +qp,p32i16,ip_klu,176,0.000242,true,0.0001 +qp,p32i16,ip_umfpack,177,0.002044,false,0.0001 +qp,p32i16,ip_klu,177,0.000532,false,0.0001 +qp,p32i16,ip_umfpack,178,0.04389,false,0.0001 +qp,p32i16,ip_klu,178,0.008338,false,0.0001 +qp,p32i16,ip_umfpack,179,0.000975,true,0.0001 +qp,p32i16,ip_klu,179,0.000229,true,0.0001 +qp,p32i16,ip_umfpack,180,0.017907,false,0.0001 +qp,p32i16,ip_klu,180,0.000604,false,0.0001 +qp,p32i16,ip_umfpack,181,0.038303,false,0.0001 +qp,p32i16,ip_klu,181,0.010206,false,0.0001 +qp,p32i16,ip_umfpack,182,0.001981,false,0.0001 +qp,p32i16,ip_klu,182,0.000509,false,0.0001 +qp,p32i16,ip_umfpack,183,0.055426,false,0.0001 +qp,p32i16,ip_klu,183,0.010661,false,0.0001 +qp,p32i16,ip_umfpack,184,0.002389,false,0.0001 +qp,p32i16,ip_klu,184,0.000625,false,0.0001 +qp,p32i16,ip_umfpack,185,0.026284,false,0.0001 +qp,p32i16,ip_klu,185,0.005404,false,0.0001 +qp,p32i16,ip_umfpack,186,0.035465,false,0.0001 +qp,p32i16,ip_klu,186,0.008141,false,0.0001 +qp,p32i16,ip_umfpack,187,0.045381,false,0.0001 +qp,p32i16,ip_klu,187,0.006487,false,0.0001 +qp,p32i16,ip_umfpack,188,0.018189,true,0.0001 +qp,p32i16,ip_klu,188,0.000595,true,0.0001 +qp,p32i16,ip_umfpack,189,0.000942,true,0.0001 +qp,p32i16,ip_klu,189,0.00023,true,0.0001 +qp,p32i16,ip_umfpack,190,0.032317,false,0.0001 +qp,p32i16,ip_klu,190,0.005588,false,0.0001 +qp,p32i16,ip_umfpack,191,0.040676,false,0.0001 +qp,p32i16,ip_klu,191,0.008536,false,0.0001 +qp,p32i16,ip_umfpack,192,0.051272,false,0.0001 +qp,p32i16,ip_klu,192,0.023195,false,0.0001 +qp,p32i16,ip_umfpack,193,0.000784,true,0.0001 +qp,p32i16,ip_klu,193,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,194,0.041049,false,0.0001 +qp,p32i16,ip_klu,194,0.012657,false,0.0001 +qp,p32i16,ip_umfpack,195,0.00118,true,0.0001 +qp,p32i16,ip_klu,195,0.000242,true,0.0001 +qp,p32i16,ip_umfpack,196,0.047863,false,0.0001 +qp,p32i16,ip_klu,196,0.007136,false,0.0001 +qp,p32i16,ip_umfpack,197,0.040037,false,0.0001 +qp,p32i16,ip_klu,197,0.004774,false,0.0001 +qp,p32i16,ip_umfpack,198,0.049706,false,0.0001 +qp,p32i16,ip_klu,198,0.023165,false,0.0001 +qp,p32i16,ip_umfpack,199,0.001054,true,0.0001 +qp,p32i16,ip_klu,199,0.000255,true,0.0001 +qp,p32i16,ip_umfpack,200,0.001115,true,0.0001 +qp,p32i16,ip_klu,200,0.000269,true,0.0001 +qp,p32i16,ip_umfpack,201,0.041409,false,0.0001 +qp,p32i16,ip_klu,201,0.008055,false,0.0001 +qp,p32i16,ip_umfpack,202,0.052278,false,0.0001 +qp,p32i16,ip_klu,202,0.009844,false,0.0001 +qp,p32i16,ip_umfpack,203,0.024045,false,0.0001 +qp,p32i16,ip_klu,203,0.004853,false,0.0001 +qp,p32i16,ip_umfpack,204,0.002414,false,0.0001 +qp,p32i16,ip_klu,204,0.00061,false,0.0001 +qp,p32i16,ip_umfpack,205,0.03928,false,0.0001 +qp,p32i16,ip_klu,205,0.00823,false,0.0001 +qp,p32i16,ip_umfpack,206,0.055226,false,0.0001 +qp,p32i16,ip_klu,206,0.008394,false,0.0001 +qp,p32i16,ip_umfpack,207,0.004431,false,0.0001 +qp,p32i16,ip_klu,207,0.000611,false,0.0001 +qp,p32i16,ip_umfpack,208,0.038763,false,0.0001 +qp,p32i16,ip_klu,208,0.024089,false,0.0001 +qp,p32i16,ip_umfpack,209,0.00087,true,0.0001 +qp,p32i16,ip_klu,209,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,210,0.002198,false,0.0001 +qp,p32i16,ip_klu,210,0.000586,false,0.0001 +qp,p32i16,ip_umfpack,211,0.001995,false,0.0001 +qp,p32i16,ip_klu,211,0.000499,false,0.0001 +qp,p32i16,ip_umfpack,212,0.031146,false,0.0001 +qp,p32i16,ip_klu,212,0.005945,false,0.0001 +qp,p32i16,ip_umfpack,213,0.00088,true,0.0001 +qp,p32i16,ip_klu,213,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,214,0.003078,false,0.0001 +qp,p32i16,ip_klu,214,0.000767,false,0.0001 +qp,p32i16,ip_umfpack,215,0.044272,false,0.0001 +qp,p32i16,ip_klu,215,0.00863,false,0.0001 +qp,p32i16,ip_umfpack,216,0.000686,true,0.0001 +qp,p32i16,ip_klu,216,0.000158,true,0.0001 +qp,p32i16,ip_umfpack,217,0.02088,false,0.0001 +qp,p32i16,ip_klu,217,0.001126,false,0.0001 +qp,p32i16,ip_umfpack,218,0.00243,false,0.0001 +qp,p32i16,ip_klu,218,0.000517,false,0.0001 +qp,p32i16,ip_umfpack,219,0.000916,true,0.0001 +qp,p32i16,ip_klu,219,0.000219,true,0.0001 +qp,p32i16,ip_umfpack,220,0.029705,false,0.0001 +qp,p32i16,ip_klu,220,0.008262,false,0.0001 +qp,p32i16,ip_umfpack,221,0.02152,false,0.0001 +qp,p32i16,ip_klu,221,0.004761,false,0.0001 +qp,p32i16,ip_umfpack,222,0.001022,true,0.0001 +qp,p32i16,ip_klu,222,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,223,0.00249,false,0.0001 +qp,p32i16,ip_klu,223,0.000599,false,0.0001 +qp,p32i16,ip_umfpack,224,0.002024,false,0.0001 +qp,p32i16,ip_klu,224,0.000561,false,0.0001 +qp,p32i16,ip_umfpack,225,0.005704,false,0.0001 +qp,p32i16,ip_klu,225,0.000581,false,0.0001 +qp,p32i16,ip_umfpack,226,0.039232,false,0.0001 +qp,p32i16,ip_klu,226,0.008435,false,0.0001 +qp,p32i16,ip_umfpack,227,0.036176,false,0.0001 +qp,p32i16,ip_klu,227,0.008241,false,0.0001 +qp,p32i16,ip_umfpack,228,0.000806,true,0.0001 +qp,p32i16,ip_klu,228,0.016357,true,0.0001 +qp,p32i16,ip_umfpack,229,0.001067,true,0.0001 +qp,p32i16,ip_klu,229,0.000251,true,0.0001 +qp,p32i16,ip_umfpack,230,0.03889,false,0.0001 +qp,p32i16,ip_klu,230,0.008062,false,0.0001 +qp,p32i16,ip_umfpack,231,0.030449,false,0.0001 +qp,p32i16,ip_klu,231,0.005967,false,0.0001 +qp,p32i16,ip_umfpack,232,0.031079,false,0.0001 +qp,p32i16,ip_klu,232,0.008497,false,0.0001 +qp,p32i16,ip_umfpack,233,0.036679,false,0.0001 +qp,p32i16,ip_klu,233,0.023948,false,0.0001 +qp,p32i16,ip_umfpack,234,0.000796,true,0.0001 +qp,p32i16,ip_klu,234,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,235,0.028223,false,0.0001 +qp,p32i16,ip_klu,235,0.007113,false,0.0001 +qp,p32i16,ip_umfpack,236,0.001779,true,0.0001 +qp,p32i16,ip_klu,236,0.000419,true,0.0001 +qp,p32i16,ip_umfpack,237,0.040112,false,0.0001 +qp,p32i16,ip_klu,237,0.008237,false,0.0001 +qp,p32i16,ip_umfpack,238,0.000744,true,0.0001 +qp,p32i16,ip_klu,238,0.000193,true,0.0001 +qp,p32i16,ip_umfpack,239,0.053573,false,0.0001 +qp,p32i16,ip_klu,239,0.011141,false,0.0001 +qp,p32i16,ip_umfpack,240,0.000913,true,0.0001 +qp,p32i16,ip_klu,240,0.000194,true,0.0001 +qp,p32i16,ip_umfpack,241,0.049118,false,0.0001 +qp,p32i16,ip_klu,241,0.024269,false,0.0001 +qp,p32i16,ip_umfpack,242,0.036456,false,0.0001 +qp,p32i16,ip_klu,242,0.007918,false,0.0001 +qp,p32i16,ip_umfpack,243,0.003089,true,0.0001 +qp,p32i16,ip_klu,243,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,244,0.000879,true,0.0001 +qp,p32i16,ip_klu,244,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,245,0.00083,true,0.0001 +qp,p32i16,ip_klu,245,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,246,0.000703,true,0.0001 +qp,p32i16,ip_klu,246,0.000178,true,0.0001 +qp,p32i16,ip_umfpack,247,0.000875,true,0.0001 +qp,p32i16,ip_klu,247,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,248,0.002184,false,0.0001 +qp,p32i16,ip_klu,248,0.000568,false,0.0001 +qp,p32i16,ip_umfpack,249,0.037655,false,0.0001 +qp,p32i16,ip_klu,249,0.010218,false,0.0001 +qp,p32i16,ip_umfpack,250,0.024761,false,0.0001 +qp,p32i16,ip_klu,250,0.004834,false,0.0001 +qp,p32i16,ip_umfpack,251,0.000711,true,0.0001 +qp,p32i16,ip_klu,251,0.000183,true,0.0001 +qp,p32i16,ip_umfpack,252,0.027181,false,0.0001 +qp,p32i16,ip_klu,252,0.005457,false,0.0001 +qp,p32i16,ip_umfpack,253,0.027762,false,0.0001 +qp,p32i16,ip_klu,253,0.005655,false,0.0001 +qp,p32i16,ip_umfpack,254,0.03551,false,0.0001 +qp,p32i16,ip_klu,254,0.010147,false,0.0001 +qp,p32i16,ip_umfpack,255,0.000886,true,0.0001 +qp,p32i16,ip_klu,255,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,256,0.050193,false,0.0001 +qp,p32i16,ip_klu,256,0.010308,false,0.0001 +qp,p32i16,ip_umfpack,257,0.041798,false,0.0001 +qp,p32i16,ip_klu,257,0.006127,false,0.0001 +qp,p32i16,ip_umfpack,258,0.005074,false,0.0001 +qp,p32i16,ip_klu,258,0.001262,false,0.0001 +qp,p32i16,ip_umfpack,259,0.027616,false,0.0001 +qp,p32i16,ip_klu,259,0.00598,false,0.0001 +qp,p32i16,ip_umfpack,260,0.045801,false,0.0001 +qp,p32i16,ip_klu,260,0.021984,false,0.0001 +qp,p32i16,ip_umfpack,261,0.00107,true,0.0001 +qp,p32i16,ip_klu,261,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,262,0.02554,false,0.0001 +qp,p32i16,ip_klu,262,0.018027,false,0.0001 +qp,p32i16,ip_umfpack,263,0.002444,false,0.0001 +qp,p32i16,ip_klu,263,0.000634,false,0.0001 +qp,p32i16,ip_umfpack,264,0.000851,true,0.0001 +qp,p32i16,ip_klu,264,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,265,0.038179,false,0.0001 +qp,p32i16,ip_klu,265,0.010136,false,0.0001 +qp,p32i16,ip_umfpack,266,0.03821,false,0.0001 +qp,p32i16,ip_klu,266,0.005429,false,0.0001 +qp,p32i16,ip_umfpack,267,0.000824,true,0.0001 +qp,p32i16,ip_klu,267,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,268,0.000733,true,0.0001 +qp,p32i16,ip_klu,268,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,269,0.000675,true,0.0001 +qp,p32i16,ip_klu,269,0.000176,true,0.0001 +qp,p32i16,ip_umfpack,270,0.000712,true,0.0001 +qp,p32i16,ip_klu,270,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,271,0.052589,false,0.0001 +qp,p32i16,ip_klu,271,0.008553,false,0.0001 +qp,p32i16,ip_umfpack,272,0.028759,false,0.0001 +qp,p32i16,ip_klu,272,0.005865,false,0.0001 +qp,p32i16,ip_umfpack,273,0.002174,false,0.0001 +qp,p32i16,ip_klu,273,0.000557,false,0.0001 +qp,p32i16,ip_umfpack,274,0.047098,false,0.0001 +qp,p32i16,ip_klu,274,0.009813,false,0.0001 +qp,p32i16,ip_umfpack,275,0.056066,false,0.0001 +qp,p32i16,ip_klu,275,0.008126,false,0.0001 +qp,p32i16,ip_umfpack,276,0.002108,false,0.0001 +qp,p32i16,ip_klu,276,0.000534,false,0.0001 +qp,p32i16,ip_umfpack,277,0.002844,false,0.0001 +qp,p32i16,ip_klu,277,0.00075,false,0.0001 +qp,p32i16,ip_umfpack,278,0.026401,false,0.0001 +qp,p32i16,ip_klu,278,0.005618,false,0.0001 +qp,p32i16,ip_umfpack,279,0.034637,false,0.0001 +qp,p32i16,ip_klu,279,0.008302,false,0.0001 +qp,p32i16,ip_umfpack,280,0.045864,false,0.0001 +qp,p32i16,ip_klu,280,0.006941,false,0.0001 +qp,p32i16,ip_umfpack,281,0.019185,false,0.0001 +qp,p32i16,ip_klu,281,0.000599,false,0.0001 +qp,p32i16,ip_umfpack,282,0.027847,false,0.0001 +qp,p32i16,ip_klu,282,0.006116,false,0.0001 +qp,p32i16,ip_umfpack,283,0.03323,false,0.0001 +qp,p32i16,ip_klu,283,0.006576,false,0.0001 +qp,p32i16,ip_umfpack,284,0.031223,false,0.0001 +qp,p32i16,ip_klu,284,0.006726,false,0.0001 +qp,p32i16,ip_umfpack,285,0.027226,false,0.0001 +qp,p32i16,ip_klu,285,0.005829,false,0.0001 +qp,p32i16,ip_umfpack,286,0.000955,true,0.0001 +qp,p32i16,ip_klu,286,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,287,0.002371,false,0.0001 +qp,p32i16,ip_klu,287,0.000594,false,0.0001 +qp,p32i16,ip_umfpack,288,0.002017,false,0.0001 +qp,p32i16,ip_klu,288,0.000497,false,0.0001 +qp,p32i16,ip_umfpack,289,0.041903,false,0.0001 +qp,p32i16,ip_klu,289,0.010293,false,0.0001 +qp,p32i16,ip_umfpack,290,0.000867,true,0.0001 +qp,p32i16,ip_klu,290,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,291,0.000955,true,0.0001 +qp,p32i16,ip_klu,291,0.000234,true,0.0001 +qp,p32i16,ip_umfpack,292,0.000885,true,0.0001 +qp,p32i16,ip_klu,292,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,293,0.000905,true,0.0001 +qp,p32i16,ip_klu,293,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,294,0.02806,false,0.0001 +qp,p32i16,ip_klu,294,0.005981,false,0.0001 +qp,p32i16,ip_umfpack,295,0.000823,true,0.0001 +qp,p32i16,ip_klu,295,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,296,0.000899,true,0.0001 +qp,p32i16,ip_klu,296,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,297,0.000823,true,0.0001 +qp,p32i16,ip_klu,297,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,298,0.05741,false,0.0001 +qp,p32i16,ip_klu,298,0.010077,false,0.0001 +qp,p32i16,ip_umfpack,299,0.001031,true,0.0001 +qp,p32i16,ip_klu,299,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,300,0.038976,false,0.0001 +qp,p32i16,ip_klu,300,0.024631,false,0.0001 +qp,p32i16,ip_umfpack,301,0.001,true,0.0001 +qp,p32i16,ip_klu,301,0.000225,true,0.0001 +qp,p32i16,ip_umfpack,302,0.021552,false,0.0001 +qp,p32i16,ip_klu,302,0.020783,false,0.0001 +qp,p32i16,ip_umfpack,303,0.040142,false,0.0001 +qp,p32i16,ip_klu,303,0.008029,false,0.0001 +qp,p32i16,ip_umfpack,304,0.002068,false,0.0001 +qp,p32i16,ip_klu,304,0.000541,false,0.0001 +qp,p32i16,ip_umfpack,305,0.038762,false,0.0001 +qp,p32i16,ip_klu,305,0.009015,false,0.0001 +qp,p32i16,ip_umfpack,306,0.017223,true,0.0001 +qp,p32i16,ip_klu,306,0.000246,true,0.0001 +qp,p32i16,ip_umfpack,307,0.001017,true,0.0001 +qp,p32i16,ip_klu,307,0.000241,true,0.0001 +qp,p32i16,ip_umfpack,308,0.022878,false,0.0001 +qp,p32i16,ip_klu,308,0.004804,false,0.0001 +qp,p32i16,ip_umfpack,309,0.041874,false,0.0001 +qp,p32i16,ip_klu,309,0.005444,false,0.0001 +qp,p32i16,ip_umfpack,310,0.050996,false,0.0001 +qp,p32i16,ip_klu,310,0.00969,false,0.0001 +qp,p32i16,ip_umfpack,311,0.00225,false,0.0001 +qp,p32i16,ip_klu,311,0.000563,false,0.0001 +qp,p32i16,ip_umfpack,312,0.017799,false,0.0001 +qp,p32i16,ip_klu,312,0.000529,false,0.0001 +qp,p32i16,ip_umfpack,313,0.002612,false,0.0001 +qp,p32i16,ip_klu,313,0.000631,false,0.0001 +qp,p32i16,ip_umfpack,314,0.040789,false,0.0001 +qp,p32i16,ip_klu,314,0.010433,false,0.0001 +qp,p32i16,ip_umfpack,315,0.055945,false,0.0001 +qp,p32i16,ip_klu,315,0.008018,false,0.0001 +qp,p32i16,ip_umfpack,316,0.000863,true,0.0001 +qp,p32i16,ip_klu,316,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,317,0.000899,true,0.0001 +qp,p32i16,ip_klu,317,0.000235,true,0.0001 +qp,p32i16,ip_umfpack,318,0.000763,true,0.0001 +qp,p32i16,ip_klu,318,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,319,0.000793,true,0.0001 +qp,p32i16,ip_klu,319,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,320,0.001801,false,0.0001 +qp,p32i16,ip_klu,320,0.000472,false,0.0001 +qp,p32i16,ip_umfpack,321,0.001328,true,0.0001 +qp,p32i16,ip_klu,321,0.000247,true,0.0001 +qp,p32i16,ip_umfpack,322,0.000973,true,0.0001 +qp,p32i16,ip_klu,322,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,323,0.024332,false,0.0001 +qp,p32i16,ip_klu,323,0.007397,false,0.0001 +qp,p32i16,ip_umfpack,324,0.002902,true,0.0001 +qp,p32i16,ip_klu,324,0.000664,true,0.0001 +qp,p32i16,ip_umfpack,325,0.035603,false,0.0001 +qp,p32i16,ip_klu,325,0.008191,false,0.0001 +qp,p32i16,ip_umfpack,326,0.000947,true,0.0001 +qp,p32i16,ip_klu,326,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,327,0.002091,false,0.0001 +qp,p32i16,ip_klu,327,0.000547,false,0.0001 +qp,p32i16,ip_umfpack,328,0.000755,true,0.0001 +qp,p32i16,ip_klu,328,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,329,0.000693,true,0.0001 +qp,p32i16,ip_klu,329,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,330,0.000969,true,0.0001 +qp,p32i16,ip_klu,330,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,331,0.019265,false,0.0001 +qp,p32i16,ip_klu,331,0.000647,false,0.0001 +qp,p32i16,ip_umfpack,332,0.039488,false,0.0001 +qp,p32i16,ip_klu,332,0.009772,false,0.0001 +qp,p32i16,ip_umfpack,333,0.050236,false,0.0001 +qp,p32i16,ip_klu,333,0.024462,false,0.0001 +qp,p32i16,ip_umfpack,334,0.031264,false,0.0001 +qp,p32i16,ip_klu,334,0.005886,false,0.0001 +qp,p32i16,ip_umfpack,335,0.000916,true,0.0001 +qp,p32i16,ip_klu,335,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,336,0.000906,true,0.0001 +qp,p32i16,ip_klu,336,0.000238,true,0.0001 +qp,p32i16,ip_umfpack,337,0.005173,false,0.0001 +qp,p32i16,ip_klu,337,0.000584,false,0.0001 +qp,p32i16,ip_umfpack,338,0.000821,true,0.0001 +qp,p32i16,ip_klu,338,0.00021,true,0.0001 +qp,p32i16,ip_umfpack,339,0.000845,true,0.0001 +qp,p32i16,ip_klu,339,0.000215,true,0.0001 +qp,p32i16,ip_umfpack,340,0.000897,true,0.0001 +qp,p32i16,ip_klu,340,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,341,0.000788,true,0.0001 +qp,p32i16,ip_klu,341,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,342,0.023822,false,0.0001 +qp,p32i16,ip_klu,342,0.007731,false,0.0001 +qp,p32i16,ip_umfpack,343,0.036527,false,0.0001 +qp,p32i16,ip_klu,343,0.008904,false,0.0001 +qp,p32i16,ip_umfpack,344,0.000983,true,0.0001 +qp,p32i16,ip_klu,344,0.000209,true,0.0001 +qp,p32i16,ip_umfpack,345,0.000658,true,0.0001 +qp,p32i16,ip_klu,345,0.000159,true,0.0001 +qp,p32i16,ip_umfpack,346,0.038313,false,0.0001 +qp,p32i16,ip_klu,346,0.024025,false,0.0001 +qp,p32i16,ip_umfpack,347,0.023657,false,0.0001 +qp,p32i16,ip_klu,347,0.021283,false,0.0001 +qp,p32i16,ip_umfpack,348,0.005083,false,0.0001 +qp,p32i16,ip_klu,348,0.001242,false,0.0001 +qp,p32i16,ip_umfpack,349,0.000854,true,0.0001 +qp,p32i16,ip_klu,349,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,350,0.009466,false,0.0001 +qp,p32i16,ip_klu,350,0.001393,false,0.0001 +qp,p32i16,ip_umfpack,351,0.038147,false,0.0001 +qp,p32i16,ip_klu,351,0.023931,false,0.0001 +qp,p32i16,ip_umfpack,352,0.039966,false,0.0001 +qp,p32i16,ip_klu,352,0.009268,false,0.0001 +qp,p32i16,ip_umfpack,353,0.000775,true,0.0001 +qp,p32i16,ip_klu,353,0.000205,true,0.0001 +qp,p32i16,ip_umfpack,354,0.053431,false,0.0001 +qp,p32i16,ip_klu,354,0.010622,false,0.0001 +qp,p32i16,ip_umfpack,355,0.000924,true,0.0001 +qp,p32i16,ip_klu,355,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,356,0.001947,false,0.0001 +qp,p32i16,ip_klu,356,0.000502,false,0.0001 +qp,p32i16,ip_umfpack,357,0.055754,false,0.0001 +qp,p32i16,ip_klu,357,0.010364,false,0.0001 +qp,p32i16,ip_umfpack,358,0.037442,false,0.0001 +qp,p32i16,ip_klu,358,0.005685,false,0.0001 +qp,p32i16,ip_umfpack,359,0.033287,false,0.0001 +qp,p32i16,ip_klu,359,0.006986,false,0.0001 +qp,p32i16,ip_umfpack,360,0.023905,false,0.0001 +qp,p32i16,ip_klu,360,0.004979,false,0.0001 +qp,p32i16,ip_umfpack,361,0.000926,true,0.0001 +qp,p32i16,ip_klu,361,0.000207,true,0.0001 +qp,p32i16,ip_umfpack,362,0.000956,true,0.0001 +qp,p32i16,ip_klu,362,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,363,0.00236,false,0.0001 +qp,p32i16,ip_klu,363,0.000626,false,0.0001 +qp,p32i16,ip_umfpack,364,0.030193,false,0.0001 +qp,p32i16,ip_klu,364,0.006294,false,0.0001 +qp,p32i16,ip_umfpack,365,0.00219,false,0.0001 +qp,p32i16,ip_klu,365,0.000518,false,0.0001 +qp,p32i16,ip_umfpack,366,0.007253,false,0.0001 +qp,p32i16,ip_klu,366,0.000702,false,0.0001 +qp,p32i16,ip_umfpack,367,0.048094,false,0.0001 +qp,p32i16,ip_klu,367,0.008316,false,0.0001 +qp,p32i16,ip_umfpack,368,0.035926,false,0.0001 +qp,p32i16,ip_klu,368,0.010205,false,0.0001 +qp,p32i16,ip_umfpack,369,0.03265,false,0.0001 +qp,p32i16,ip_klu,369,0.004185,false,0.0001 +qp,p32i16,ip_umfpack,370,0.001405,true,0.0001 +qp,p32i16,ip_klu,370,0.000348,true,0.0001 +qp,p32i16,ip_umfpack,371,0.000726,true,0.0001 +qp,p32i16,ip_klu,371,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,372,0.02569,false,0.0001 +qp,p32i16,ip_klu,372,0.005303,false,0.0001 +qp,p32i16,ip_umfpack,373,0.000894,true,0.0001 +qp,p32i16,ip_klu,373,0.000235,true,0.0001 +qp,p32i16,ip_umfpack,374,0.000763,true,0.0001 +qp,p32i16,ip_klu,374,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,375,0.039238,false,0.0001 +qp,p32i16,ip_klu,375,0.007892,false,0.0001 +qp,p32i16,ip_umfpack,376,0.000903,true,0.0001 +qp,p32i16,ip_klu,376,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,377,0.055124,false,0.0001 +qp,p32i16,ip_klu,377,0.008069,false,0.0001 +qp,p32i16,ip_umfpack,378,0.02731,false,0.0001 +qp,p32i16,ip_klu,378,0.007366,false,0.0001 +qp,p32i16,ip_umfpack,379,0.001348,true,0.0001 +qp,p32i16,ip_klu,379,0.00025,true,0.0001 +qp,p32i16,ip_umfpack,380,0.002033,false,0.0001 +qp,p32i16,ip_klu,380,0.000503,false,0.0001 +qp,p32i16,ip_umfpack,381,0.000763,true,0.0001 +qp,p32i16,ip_klu,381,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,382,0.00092,true,0.0001 +qp,p32i16,ip_klu,382,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,383,0.000929,true,0.0001 +qp,p32i16,ip_klu,383,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,384,0.046695,false,0.0001 +qp,p32i16,ip_klu,384,0.010544,false,0.0001 +qp,p32i16,ip_umfpack,385,0.001,true,0.0001 +qp,p32i16,ip_klu,385,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,386,0.062672,false,0.0001 +qp,p32i16,ip_klu,386,0.010836,false,0.0001 +qp,p32i16,ip_umfpack,387,0.041687,false,0.0001 +qp,p32i16,ip_klu,387,0.025146,false,0.0001 +qp,p32i16,ip_umfpack,388,0.002279,false,0.0001 +qp,p32i16,ip_klu,388,0.000538,false,0.0001 +qp,p32i16,ip_umfpack,389,0.000777,true,0.0001 +qp,p32i16,ip_klu,389,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,390,0.000885,true,0.0001 +qp,p32i16,ip_klu,390,0.000215,true,0.0001 +qp,p32i16,ip_umfpack,391,0.0023,false,0.0001 +qp,p32i16,ip_klu,391,0.000598,false,0.0001 +qp,p32i16,ip_umfpack,392,0.036162,false,0.0001 +qp,p32i16,ip_klu,392,0.008105,false,0.0001 +qp,p32i16,ip_umfpack,393,0.000812,true,0.0001 +qp,p32i16,ip_klu,393,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,394,0.000797,true,0.0001 +qp,p32i16,ip_klu,394,0.000194,true,0.0001 +qp,p32i16,ip_umfpack,395,0.023759,false,0.0001 +qp,p32i16,ip_klu,395,0.021547,false,0.0001 +qp,p32i16,ip_umfpack,396,0.001042,true,0.0001 +qp,p32i16,ip_klu,396,0.000223,true,0.0001 +qp,p32i16,ip_umfpack,397,0.050711,false,0.0001 +qp,p32i16,ip_klu,397,0.024691,false,0.0001 +qp,p32i16,ip_umfpack,398,0.000791,true,0.0001 +qp,p32i16,ip_klu,398,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,399,0.03736,false,0.0001 +qp,p32i16,ip_klu,399,0.010361,false,0.0001 +qp,p32i16,ip_umfpack,400,0.035867,false,0.0001 +qp,p32i16,ip_klu,400,0.02375,false,0.0001 +qp,p32i16,ip_umfpack,401,0.023438,false,0.0001 +qp,p32i16,ip_klu,401,0.00506,false,0.0001 +qp,p32i16,ip_umfpack,402,0.000849,true,0.0001 +qp,p32i16,ip_klu,402,0.000211,true,0.0001 +qp,p32i16,ip_umfpack,403,0.002098,false,0.0001 +qp,p32i16,ip_klu,403,0.000545,false,0.0001 +qp,p32i16,ip_umfpack,404,0.000822,true,0.0001 +qp,p32i16,ip_klu,404,0.00021,true,0.0001 +qp,p32i16,ip_umfpack,405,0.03017,false,0.0001 +qp,p32i16,ip_klu,405,0.007167,false,0.0001 +qp,p32i16,ip_umfpack,406,0.002598,false,0.0001 +qp,p32i16,ip_klu,406,0.000639,false,0.0001 +qp,p32i16,ip_umfpack,407,0.019673,false,0.0001 +qp,p32i16,ip_klu,407,0.020745,false,0.0001 +qp,p32i16,ip_umfpack,408,0.03736,false,0.0001 +qp,p32i16,ip_klu,408,0.010494,false,0.0001 +qp,p32i16,ip_umfpack,409,0.057582,false,0.0001 +qp,p32i16,ip_klu,409,0.010969,false,0.0001 +qp,p32i16,ip_umfpack,410,0.002387,false,0.0001 +qp,p32i16,ip_klu,410,0.000704,false,0.0001 +qp,p32i16,ip_umfpack,411,0.000945,true,0.0001 +qp,p32i16,ip_klu,411,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,412,0.025341,false,0.0001 +qp,p32i16,ip_klu,412,0.005933,false,0.0001 +qp,p32i16,ip_umfpack,413,0.037906,false,0.0001 +qp,p32i16,ip_klu,413,0.007781,false,0.0001 +qp,p32i16,ip_umfpack,414,0.023364,false,0.0001 +qp,p32i16,ip_klu,414,0.004826,false,0.0001 +qp,p32i16,ip_umfpack,415,0.002066,false,0.0001 +qp,p32i16,ip_klu,415,0.000539,false,0.0001 +qp,p32i16,ip_umfpack,416,0.000841,true,0.0001 +qp,p32i16,ip_klu,416,0.000231,true,0.0001 +qp,p32i16,ip_umfpack,417,0.002096,false,0.0001 +qp,p32i16,ip_klu,417,0.000543,false,0.0001 +qp,p32i16,ip_umfpack,418,0.034236,false,0.0001 +qp,p32i16,ip_klu,418,0.023663,false,0.0001 +qp,p32i16,ip_umfpack,419,0.025597,false,0.0001 +qp,p32i16,ip_klu,419,0.021551,false,0.0001 +qp,p32i16,ip_umfpack,420,0.000859,true,0.0001 +qp,p32i16,ip_klu,420,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,421,0.038653,false,0.0001 +qp,p32i16,ip_klu,421,0.008387,false,0.0001 +qp,p32i16,ip_umfpack,422,0.024033,false,0.0001 +qp,p32i16,ip_klu,422,0.005179,false,0.0001 +qp,p32i16,ip_umfpack,423,0.03992,false,0.0001 +qp,p32i16,ip_klu,423,0.008388,false,0.0001 +qp,p32i16,ip_umfpack,424,0.000952,true,0.0001 +qp,p32i16,ip_klu,424,0.000236,true,0.0001 +qp,p32i16,ip_umfpack,425,0.000727,true,0.0001 +qp,p32i16,ip_klu,425,0.000178,true,0.0001 +qp,p32i16,ip_umfpack,426,0.05649,false,0.0001 +qp,p32i16,ip_klu,426,0.008412,false,0.0001 +qp,p32i16,ip_umfpack,427,0.000727,true,0.0001 +qp,p32i16,ip_klu,427,0.000177,true,0.0001 +qp,p32i16,ip_umfpack,428,0.000729,true,0.0001 +qp,p32i16,ip_klu,428,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,429,0.002109,false,0.0001 +qp,p32i16,ip_klu,429,0.000552,false,0.0001 +qp,p32i16,ip_umfpack,430,0.003188,true,0.0001 +qp,p32i16,ip_klu,430,0.000166,true,0.0001 +qp,p32i16,ip_umfpack,431,0.000828,true,0.0001 +qp,p32i16,ip_klu,431,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,432,0.03564,false,0.0001 +qp,p32i16,ip_klu,432,0.008244,false,0.0001 +qp,p32i16,ip_umfpack,433,0.017087,true,0.0001 +qp,p32i16,ip_klu,433,0.000243,true,0.0001 +qp,p32i16,ip_umfpack,434,0.00089,true,0.0001 +qp,p32i16,ip_klu,434,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,435,0.000835,true,0.0001 +qp,p32i16,ip_klu,435,0.000195,true,0.0001 +qp,p32i16,ip_umfpack,436,0.002327,false,0.0001 +qp,p32i16,ip_klu,436,0.000579,false,0.0001 +qp,p32i16,ip_umfpack,437,0.001942,false,0.0001 +qp,p32i16,ip_klu,437,0.000506,false,0.0001 +qp,p32i16,ip_umfpack,438,0.000867,true,0.0001 +qp,p32i16,ip_klu,438,0.000221,true,0.0001 +qp,p32i16,ip_umfpack,439,0.000984,true,0.0001 +qp,p32i16,ip_klu,439,0.000219,true,0.0001 +qp,p32i16,ip_umfpack,440,0.000697,true,0.0001 +qp,p32i16,ip_klu,440,0.000168,true,0.0001 +qp,p32i16,ip_umfpack,441,0.044596,false,0.0001 +qp,p32i16,ip_klu,441,0.011048,false,0.0001 +qp,p32i16,ip_umfpack,442,0.000878,true,0.0001 +qp,p32i16,ip_klu,442,0.000234,true,0.0001 +qp,p32i16,ip_umfpack,443,0.000886,true,0.0001 +qp,p32i16,ip_klu,443,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,444,0.048408,false,0.0001 +qp,p32i16,ip_klu,444,0.023343,false,0.0001 +qp,p32i16,ip_umfpack,445,0.042711,false,0.0001 +qp,p32i16,ip_klu,445,0.008666,false,0.0001 +qp,p32i16,ip_umfpack,446,0.054153,false,0.0001 +qp,p32i16,ip_klu,446,0.023831,false,0.0001 +qp,p32i16,ip_umfpack,447,0.043268,false,0.0001 +qp,p32i16,ip_klu,447,0.008642,false,0.0001 +qp,p32i16,ip_umfpack,448,0.00084,true,0.0001 +qp,p32i16,ip_klu,448,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,449,0.000857,true,0.0001 +qp,p32i16,ip_klu,449,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,450,0.000692,true,0.0001 +qp,p32i16,ip_klu,450,0.000175,true,0.0001 +qp,p32i16,ip_umfpack,451,0.000745,true,0.0001 +qp,p32i16,ip_klu,451,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,452,0.052219,true,0.0001 +qp,p32i16,ip_klu,452,0.006496,true,0.0001 +qp,p32i16,ip_umfpack,453,0.036424,false,0.0001 +qp,p32i16,ip_klu,453,0.009839,false,0.0001 +qp,p32i16,ip_umfpack,454,0.00081,true,0.0001 +qp,p32i16,ip_klu,454,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,455,0.000631,true,0.0001 +qp,p32i16,ip_klu,455,0.000174,true,0.0001 +qp,p32i16,ip_umfpack,456,0.000974,true,0.0001 +qp,p32i16,ip_klu,456,0.000266,true,0.0001 +qp,p32i16,ip_umfpack,457,0.053921,false,0.0001 +qp,p32i16,ip_klu,457,0.00781,false,0.0001 +qp,p32i16,ip_umfpack,458,0.000646,true,0.0001 +qp,p32i16,ip_klu,458,0.000161,true,0.0001 +qp,p32i16,ip_umfpack,459,0.000791,true,0.0001 +qp,p32i16,ip_klu,459,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,460,0.02926,false,0.0001 +qp,p32i16,ip_klu,460,0.009011,false,0.0001 +qp,p32i16,ip_umfpack,461,0.002575,false,0.0001 +qp,p32i16,ip_klu,461,0.000551,false,0.0001 +qp,p32i16,ip_umfpack,462,0.001068,true,0.0001 +qp,p32i16,ip_klu,462,0.00023,true,0.0001 +qp,p32i16,ip_umfpack,463,0.000797,true,0.0001 +qp,p32i16,ip_klu,463,0.000173,true,0.0001 +qp,p32i16,ip_umfpack,464,0.000615,true,0.0001 +qp,p32i16,ip_klu,464,0.000167,true,0.0001 +qp,p32i16,ip_umfpack,465,0.041104,false,0.0001 +qp,p32i16,ip_klu,465,0.005476,false,0.0001 +qp,p32i16,ip_umfpack,466,0.00229,false,0.0001 +qp,p32i16,ip_klu,466,0.000594,false,0.0001 +qp,p32i16,ip_umfpack,467,0.016993,true,0.0001 +qp,p32i16,ip_klu,467,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,468,0.000765,true,0.0001 +qp,p32i16,ip_klu,468,0.000181,true,0.0001 +qp,p32i16,ip_umfpack,469,0.000749,true,0.0001 +qp,p32i16,ip_klu,469,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,470,0.037577,false,0.0001 +qp,p32i16,ip_klu,470,0.010226,false,0.0001 +qp,p32i16,ip_umfpack,471,0.043817,false,0.0001 +qp,p32i16,ip_klu,471,0.008801,false,0.0001 +qp,p32i16,ip_umfpack,472,0.000789,true,0.0001 +qp,p32i16,ip_klu,472,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,473,0.036155,false,0.0001 +qp,p32i16,ip_klu,473,0.008469,false,0.0001 +qp,p32i16,ip_umfpack,474,0.000881,true,0.0001 +qp,p32i16,ip_klu,474,0.000253,true,0.0001 +qp,p32i16,ip_umfpack,475,0.026978,false,0.0001 +qp,p32i16,ip_klu,475,0.021747,false,0.0001 +qp,p32i16,ip_umfpack,476,0.002199,false,0.0001 +qp,p32i16,ip_klu,476,0.000573,false,0.0001 +qp,p32i16,ip_umfpack,477,0.002109,false,0.0001 +qp,p32i16,ip_klu,477,0.000566,false,0.0001 +qp,p32i16,ip_umfpack,478,0.000749,true,0.0001 +qp,p32i16,ip_klu,478,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,479,0.004246,true,0.0001 +qp,p32i16,ip_klu,479,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,480,0.002411,false,0.0001 +qp,p32i16,ip_klu,480,0.000608,false,0.0001 +qp,p32i16,ip_umfpack,481,0.000976,true,0.0001 +qp,p32i16,ip_klu,481,0.000234,true,0.0001 +qp,p32i16,ip_umfpack,482,0.038985,false,0.0001 +qp,p32i16,ip_klu,482,0.008408,false,0.0001 +qp,p32i16,ip_umfpack,483,0.038749,false,0.0001 +qp,p32i16,ip_klu,483,0.024929,false,0.0001 +qp,p32i16,ip_umfpack,484,0.00191,false,0.0001 +qp,p32i16,ip_klu,484,0.000519,false,0.0001 +qp,p32i16,ip_umfpack,485,0.000633,true,0.0001 +qp,p32i16,ip_klu,485,0.000164,true,0.0001 +qp,p32i16,ip_umfpack,486,0.043137,false,0.0001 +qp,p32i16,ip_klu,486,0.024253,false,0.0001 +qp,p32i16,ip_umfpack,487,0.000944,true,0.0001 +qp,p32i16,ip_klu,487,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,488,0.002243,false,0.0001 +qp,p32i16,ip_klu,488,0.000576,false,0.0001 +qp,p32i16,ip_umfpack,489,0.000789,true,0.0001 +qp,p32i16,ip_klu,489,0.000212,true,0.0001 +qp,p32i16,ip_umfpack,490,0.041589,false,0.0001 +qp,p32i16,ip_klu,490,0.007815,false,0.0001 +qp,p32i16,ip_umfpack,491,0.000839,true,0.0001 +qp,p32i16,ip_klu,491,0.000195,true,0.0001 +qp,p32i16,ip_umfpack,492,0.002263,false,0.0001 +qp,p32i16,ip_klu,492,0.000558,false,0.0001 +qp,p32i16,ip_umfpack,493,0.000887,true,0.0001 +qp,p32i16,ip_klu,493,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,494,0.029641,false,0.0001 +qp,p32i16,ip_klu,494,0.005862,false,0.0001 +qp,p32i16,ip_umfpack,495,0.000835,true,0.0001 +qp,p32i16,ip_klu,495,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,496,0.002106,false,0.0001 +qp,p32i16,ip_klu,496,0.000536,false,0.0001 +qp,p32i16,ip_umfpack,497,0.023798,false,0.0001 +qp,p32i16,ip_klu,497,0.00641,false,0.0001 +qp,p32i16,ip_umfpack,498,0.056579,false,0.0001 +qp,p32i16,ip_klu,498,0.008014,false,0.0001 +qp,p32i16,ip_umfpack,499,0.023929,false,0.0001 +qp,p32i16,ip_klu,499,0.007534,false,0.0001 +qp,p32i16,ip_umfpack,500,0.000929,true,0.0001 +qp,p32i16,ip_klu,500,0.00022,true,0.0001 +qp,p32i16,ip_umfpack,501,0.000777,true,0.0001 +qp,p32i16,ip_klu,501,0.00021,true,0.0001 +qp,p32i16,ip_umfpack,502,0.029434,false,0.0001 +qp,p32i16,ip_klu,502,0.005956,false,0.0001 +qp,p32i16,ip_umfpack,503,0.000807,true,0.0001 +qp,p32i16,ip_klu,503,0.000225,true,0.0001 +qp,p32i16,ip_umfpack,504,0.036197,false,0.0001 +qp,p32i16,ip_klu,504,0.007353,false,0.0001 +qp,p32i16,ip_umfpack,505,0.040906,false,0.0001 +qp,p32i16,ip_klu,505,0.013755,false,0.0001 +qp,p32i16,ip_umfpack,506,0.038177,false,0.0001 +qp,p32i16,ip_klu,506,0.009277,false,0.0001 +qp,p32i16,ip_umfpack,507,0.002244,false,0.0001 +qp,p32i16,ip_klu,507,0.00051,false,0.0001 +qp,p32i16,ip_umfpack,508,0.000807,true,0.0001 +qp,p32i16,ip_klu,508,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,509,0.053953,false,0.0001 +qp,p32i16,ip_klu,509,0.008739,false,0.0001 +qp,p32i16,ip_umfpack,510,0.000779,true,0.0001 +qp,p32i16,ip_klu,510,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,511,0.001997,false,0.0001 +qp,p32i16,ip_klu,511,0.000486,false,0.0001 +qp,p32i16,ip_umfpack,512,0.000845,true,0.0001 +qp,p32i16,ip_klu,512,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,513,0.027012,false,0.0001 +qp,p32i16,ip_klu,513,0.004984,false,0.0001 +qp,p32i16,ip_umfpack,514,0.000796,true,0.0001 +qp,p32i16,ip_klu,514,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,515,0.000975,true,0.0001 +qp,p32i16,ip_klu,515,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,516,0.00104,true,0.0001 +qp,p32i16,ip_klu,516,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,517,0.001231,true,0.0001 +qp,p32i16,ip_klu,517,0.000255,true,0.0001 +qp,p32i16,ip_umfpack,518,0.003006,true,0.0001 +qp,p32i16,ip_klu,518,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,519,0.000973,true,0.0001 +qp,p32i16,ip_klu,519,0.00022,true,0.0001 +qp,p32i16,ip_umfpack,520,0.039785,false,0.0001 +qp,p32i16,ip_klu,520,0.02477,false,0.0001 +qp,p32i16,ip_umfpack,521,0.000999,true,0.0001 +qp,p32i16,ip_klu,521,0.000233,true,0.0001 +qp,p32i16,ip_umfpack,522,0.035317,false,0.0001 +qp,p32i16,ip_klu,522,0.007398,false,0.0001 +qp,p32i16,ip_umfpack,523,0.00082,true,0.0001 +qp,p32i16,ip_klu,523,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,524,0.035321,false,0.0001 +qp,p32i16,ip_klu,524,0.008828,false,0.0001 +qp,p32i16,ip_umfpack,525,0.052477,false,0.0001 +qp,p32i16,ip_klu,525,0.010456,false,0.0001 +qp,p32i16,ip_umfpack,526,0.000781,true,0.0001 +qp,p32i16,ip_klu,526,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,527,0.023383,false,0.0001 +qp,p32i16,ip_klu,527,0.007327,false,0.0001 +qp,p32i16,ip_umfpack,528,0.001038,true,0.0001 +qp,p32i16,ip_klu,528,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,529,0.000848,true,0.0001 +qp,p32i16,ip_klu,529,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,530,0.000876,true,0.0001 +qp,p32i16,ip_klu,530,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,531,0.002361,false,0.0001 +qp,p32i16,ip_klu,531,0.000618,false,0.0001 +qp,p32i16,ip_umfpack,532,0.057299,false,0.0001 +qp,p32i16,ip_klu,532,0.00995,false,0.0001 +qp,p32i16,ip_umfpack,533,0.050382,false,0.0001 +qp,p32i16,ip_klu,533,0.024745,false,0.0001 +qp,p32i16,ip_umfpack,534,0.043778,false,0.0001 +qp,p32i16,ip_klu,534,0.010364,false,0.0001 +qp,p32i16,ip_umfpack,535,0.002146,false,0.0001 +qp,p32i16,ip_klu,535,0.000558,false,0.0001 +qp,p32i16,ip_umfpack,536,0.023045,false,0.0001 +qp,p32i16,ip_klu,536,0.007351,false,0.0001 +qp,p32i16,ip_umfpack,537,0.043396,false,0.0001 +qp,p32i16,ip_klu,537,0.010955,false,0.0001 +qp,p32i16,ip_umfpack,538,0.002407,false,0.0001 +qp,p32i16,ip_klu,538,0.000599,false,0.0001 +qp,p32i16,ip_umfpack,539,0.041917,false,0.0001 +qp,p32i16,ip_klu,539,0.010334,false,0.0001 +qp,p32i16,ip_umfpack,540,0.002124,true,0.0001 +qp,p32i16,ip_klu,540,0.00045,true,0.0001 +qp,p32i16,ip_umfpack,541,0.000846,true,0.0001 +qp,p32i16,ip_klu,541,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,542,0.000808,true,0.0001 +qp,p32i16,ip_klu,542,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,543,0.001941,false,0.0001 +qp,p32i16,ip_klu,543,0.000528,false,0.0001 +qp,p32i16,ip_umfpack,544,0.002023,true,0.0001 +qp,p32i16,ip_klu,544,0.000512,true,0.0001 +qp,p32i16,ip_umfpack,545,0.001946,false,0.0001 +qp,p32i16,ip_klu,545,0.000524,false,0.0001 +qp,p32i16,ip_umfpack,546,0.000868,true,0.0001 +qp,p32i16,ip_klu,546,0.000205,true,0.0001 +qp,p32i16,ip_umfpack,547,0.025533,false,0.0001 +qp,p32i16,ip_klu,547,0.007918,false,0.0001 +qp,p32i16,ip_umfpack,548,0.000897,true,0.0001 +qp,p32i16,ip_klu,548,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,549,0.000915,true,0.0001 +qp,p32i16,ip_klu,549,0.000203,true,0.0001 +qp,p32i16,ip_umfpack,550,0.000909,true,0.0001 +qp,p32i16,ip_klu,550,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,551,0.037308,false,0.0001 +qp,p32i16,ip_klu,551,0.005861,false,0.0001 +qp,p32i16,ip_umfpack,552,0.014389,false,0.0001 +qp,p32i16,ip_klu,552,0.000636,false,0.0001 +qp,p32i16,ip_umfpack,553,0.000801,true,0.0001 +qp,p32i16,ip_klu,553,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,554,0.001234,true,0.0001 +qp,p32i16,ip_klu,554,0.00029,true,0.0001 +qp,p32i16,ip_umfpack,555,0.046449,false,0.0001 +qp,p32i16,ip_klu,555,0.008186,false,0.0001 +qp,p32i16,ip_umfpack,556,0.002184,false,0.0001 +qp,p32i16,ip_klu,556,0.000577,false,0.0001 +qp,p32i16,ip_umfpack,557,0.032266,false,0.0001 +qp,p32i16,ip_klu,557,0.006655,false,0.0001 +qp,p32i16,ip_umfpack,558,0.030007,false,0.0001 +qp,p32i16,ip_klu,558,0.005462,false,0.0001 +qp,p32i16,ip_umfpack,559,0.042651,false,0.0001 +qp,p32i16,ip_klu,559,0.007903,false,0.0001 +qp,p32i16,ip_umfpack,560,0.000803,true,0.0001 +qp,p32i16,ip_klu,560,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,561,0.000784,true,0.0001 +qp,p32i16,ip_klu,561,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,562,0.002606,false,0.0001 +qp,p32i16,ip_klu,562,0.000629,false,0.0001 +qp,p32i16,ip_umfpack,563,0.002092,false,0.0001 +qp,p32i16,ip_klu,563,0.000533,false,0.0001 +qp,p32i16,ip_umfpack,564,0.000729,true,0.0001 +qp,p32i16,ip_klu,564,0.000167,true,0.0001 +qp,p32i16,ip_umfpack,565,0.002211,false,0.0001 +qp,p32i16,ip_klu,565,0.000594,false,0.0001 +qp,p32i16,ip_umfpack,566,0.042034,false,0.0001 +qp,p32i16,ip_klu,566,0.009109,false,0.0001 +qp,p32i16,ip_umfpack,567,0.000793,true,0.0001 +qp,p32i16,ip_klu,567,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,568,0.0567,false,0.0001 +qp,p32i16,ip_klu,568,0.014169,false,0.0001 +qp,p32i16,ip_umfpack,569,0.043583,false,0.0001 +qp,p32i16,ip_klu,569,0.00879,false,0.0001 +qp,p32i16,ip_umfpack,570,0.030288,false,0.0001 +qp,p32i16,ip_klu,570,0.005518,false,0.0001 +qp,p32i16,ip_umfpack,571,0.04212,false,0.0001 +qp,p32i16,ip_klu,571,0.008027,false,0.0001 +qp,p32i16,ip_umfpack,572,0.054005,false,0.0001 +qp,p32i16,ip_klu,572,0.008888,false,0.0001 +qp,p32i16,ip_umfpack,573,0.002178,false,0.0001 +qp,p32i16,ip_klu,573,0.000554,false,0.0001 +qp,p32i16,ip_umfpack,574,0.001005,true,0.0001 +qp,p32i16,ip_klu,574,0.000231,true,0.0001 +qp,p32i16,ip_umfpack,575,0.038068,false,0.0001 +qp,p32i16,ip_klu,575,0.020406,false,0.0001 +qp,p32i16,ip_umfpack,576,0.04005,false,0.0001 +qp,p32i16,ip_klu,576,0.007603,false,0.0001 +qp,p32i16,ip_umfpack,577,0.008892,false,0.0001 +qp,p32i16,ip_klu,577,0.000569,false,0.0001 +qp,p32i16,ip_umfpack,578,0.000889,true,0.0001 +qp,p32i16,ip_klu,578,0.000233,true,0.0001 +qp,p32i16,ip_umfpack,579,0.01724,false,0.0001 +qp,p32i16,ip_klu,579,0.003649,false,0.0001 +qp,p32i16,ip_umfpack,580,0.000787,true,0.0001 +qp,p32i16,ip_klu,580,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,581,0.047821,false,0.0001 +qp,p32i16,ip_klu,581,0.010467,false,0.0001 +qp,p32i16,ip_umfpack,582,0.002082,false,0.0001 +qp,p32i16,ip_klu,582,0.000544,false,0.0001 +qp,p32i16,ip_umfpack,583,0.001272,true,0.0001 +qp,p32i16,ip_klu,583,0.000285,true,0.0001 +qp,p32i16,ip_umfpack,584,0.000921,true,0.0001 +qp,p32i16,ip_klu,584,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,585,0.001,true,0.0001 +qp,p32i16,ip_klu,585,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,586,0.039464,false,0.0001 +qp,p32i16,ip_klu,586,0.010576,false,0.0001 +qp,p32i16,ip_umfpack,587,0.025311,false,0.0001 +qp,p32i16,ip_klu,587,0.005682,false,0.0001 +qp,p32i16,ip_umfpack,588,0.003396,true,0.0001 +qp,p32i16,ip_klu,588,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,589,0.001151,true,0.0001 +qp,p32i16,ip_klu,589,0.000255,true,0.0001 +qp,p32i16,ip_umfpack,590,0.000934,true,0.0001 +qp,p32i16,ip_klu,590,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,591,0.000796,true,0.0001 +qp,p32i16,ip_klu,591,0.000184,true,0.0001 +qp,p32i16,ip_umfpack,592,0.001266,true,0.0001 +qp,p32i16,ip_klu,592,0.000315,true,0.0001 +qp,p32i16,ip_umfpack,593,0.042341,false,0.0001 +qp,p32i16,ip_klu,593,0.007852,false,0.0001 +qp,p32i16,ip_umfpack,594,0.000811,true,0.0001 +qp,p32i16,ip_klu,594,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,595,0.000625,true,0.0001 +qp,p32i16,ip_klu,595,0.000161,true,0.0001 +qp,p32i16,ip_umfpack,596,0.019188,false,0.0001 +qp,p32i16,ip_klu,596,0.000716,false,0.0001 +qp,p32i16,ip_umfpack,597,0.000953,true,0.0001 +qp,p32i16,ip_klu,597,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,598,0.000965,true,0.0001 +qp,p32i16,ip_klu,598,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,599,0.000938,true,0.0001 +qp,p32i16,ip_klu,599,0.000219,true,0.0001 +qp,p32i16,ip_umfpack,600,0.000848,true,0.0001 +qp,p32i16,ip_klu,600,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,601,0.025406,false,0.0001 +qp,p32i16,ip_klu,601,0.022202,false,0.0001 +qp,p32i16,ip_umfpack,602,0.000883,true,0.0001 +qp,p32i16,ip_klu,602,0.000215,true,0.0001 +qp,p32i16,ip_umfpack,603,0.002286,false,0.0001 +qp,p32i16,ip_klu,603,0.000576,false,0.0001 +qp,p32i16,ip_umfpack,604,0.002364,false,0.0001 +qp,p32i16,ip_klu,604,0.000607,false,0.0001 +qp,p32i16,ip_umfpack,605,0.000727,true,0.0001 +qp,p32i16,ip_klu,605,0.004257,true,0.0001 +qp,p32i16,ip_umfpack,606,0.037749,false,0.0001 +qp,p32i16,ip_klu,606,0.008034,false,0.0001 +qp,p32i16,ip_umfpack,607,0.02769,false,0.0001 +qp,p32i16,ip_klu,607,0.00897,false,0.0001 +qp,p32i16,ip_umfpack,608,0.057148,false,0.0001 +qp,p32i16,ip_klu,608,0.009173,false,0.0001 +qp,p32i16,ip_umfpack,609,0.048519,false,0.0001 +qp,p32i16,ip_klu,609,0.010369,false,0.0001 +qp,p32i16,ip_umfpack,610,0.043696,false,0.0001 +qp,p32i16,ip_klu,610,0.023697,false,0.0001 +qp,p32i16,ip_umfpack,611,0.000923,true,0.0001 +qp,p32i16,ip_klu,611,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,612,0.042663,false,0.0001 +qp,p32i16,ip_klu,612,0.012027,false,0.0001 +qp,p32i16,ip_umfpack,613,0.036568,false,0.0001 +qp,p32i16,ip_klu,613,0.010471,false,0.0001 +qp,p32i16,ip_umfpack,614,0.001005,true,0.0001 +qp,p32i16,ip_klu,614,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,615,0.018604,true,0.0001 +qp,p32i16,ip_klu,615,0.003679,true,0.0001 +qp,p32i16,ip_umfpack,616,0.052941,false,0.0001 +qp,p32i16,ip_klu,616,0.008023,false,0.0001 +qp,p32i16,ip_umfpack,617,0.0007,true,0.0001 +qp,p32i16,ip_klu,617,0.000177,true,0.0001 +qp,p32i16,ip_umfpack,618,0.000767,true,0.0001 +qp,p32i16,ip_klu,618,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,619,0.043335,false,0.0001 +qp,p32i16,ip_klu,619,0.005949,false,0.0001 +qp,p32i16,ip_umfpack,620,0.000687,true,0.0001 +qp,p32i16,ip_klu,620,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,621,0.000876,true,0.0001 +qp,p32i16,ip_klu,621,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,622,0.002284,false,0.0001 +qp,p32i16,ip_klu,622,0.000677,false,0.0001 +qp,p32i16,ip_umfpack,623,0.00072,true,0.0001 +qp,p32i16,ip_klu,623,0.016591,true,0.0001 +qp,p32i16,ip_umfpack,624,0.040196,false,0.0001 +qp,p32i16,ip_klu,624,0.008805,false,0.0001 +qp,p32i16,ip_umfpack,625,0.000859,true,0.0001 +qp,p32i16,ip_klu,625,0.000199,true,0.0001 +qp,p32i16,ip_umfpack,626,0.024091,false,0.0001 +qp,p32i16,ip_klu,626,0.004952,false,0.0001 +qp,p32i16,ip_umfpack,627,0.026977,false,0.0001 +qp,p32i16,ip_klu,627,0.005654,false,0.0001 +qp,p32i16,ip_umfpack,628,0.041091,false,0.0001 +qp,p32i16,ip_klu,628,0.026188,false,0.0001 +qp,p32i16,ip_umfpack,629,0.000883,true,0.0001 +qp,p32i16,ip_klu,629,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,630,0.001037,true,0.0001 +qp,p32i16,ip_klu,630,0.000235,true,0.0001 +qp,p32i16,ip_umfpack,631,0.024175,false,0.0001 +qp,p32i16,ip_klu,631,0.008745,false,0.0001 +qp,p32i16,ip_umfpack,632,0.001067,true,0.0001 +qp,p32i16,ip_klu,632,0.000229,true,0.0001 +qp,p32i16,ip_umfpack,633,0.001813,false,0.0001 +qp,p32i16,ip_klu,633,0.000468,false,0.0001 +qp,p32i16,ip_umfpack,634,0.053813,false,0.0001 +qp,p32i16,ip_klu,634,0.025112,false,0.0001 +qp,p32i16,ip_umfpack,635,0.029185,false,0.0001 +qp,p32i16,ip_klu,635,0.022206,false,0.0001 +qp,p32i16,ip_umfpack,636,0.001021,true,0.0001 +qp,p32i16,ip_klu,636,0.000229,true,0.0001 +qp,p32i16,ip_umfpack,637,0.025739,false,0.0001 +qp,p32i16,ip_klu,637,0.021731,false,0.0001 +qp,p32i16,ip_umfpack,638,0.000681,true,0.0001 +qp,p32i16,ip_klu,638,0.000165,true,0.0001 +qp,p32i16,ip_umfpack,639,0.044423,false,0.0001 +qp,p32i16,ip_klu,639,0.009452,false,0.0001 +qp,p32i16,ip_umfpack,640,0.001048,true,0.0001 +qp,p32i16,ip_klu,640,0.000235,true,0.0001 +qp,p32i16,ip_umfpack,641,0.038687,false,0.0001 +qp,p32i16,ip_klu,641,0.010891,false,0.0001 +qp,p32i16,ip_umfpack,642,0.000881,true,0.0001 +qp,p32i16,ip_klu,642,0.000218,true,0.0001 +qp,p32i16,ip_umfpack,643,0.002629,false,0.0001 +qp,p32i16,ip_klu,643,0.000643,false,0.0001 +qp,p32i16,ip_umfpack,644,0.040231,false,0.0001 +qp,p32i16,ip_klu,644,0.00544,false,0.0001 +qp,p32i16,ip_umfpack,645,0.055368,false,0.0001 +qp,p32i16,ip_klu,645,0.008295,false,0.0001 +qp,p32i16,ip_umfpack,646,0.002346,false,0.0001 +qp,p32i16,ip_klu,646,0.000586,false,0.0001 +qp,p32i16,ip_umfpack,647,0.037095,false,0.0001 +qp,p32i16,ip_klu,647,0.023856,false,0.0001 +qp,p32i16,ip_umfpack,648,0.039157,false,0.0001 +qp,p32i16,ip_klu,648,0.008176,false,0.0001 +qp,p32i16,ip_umfpack,649,0.053517,false,0.0001 +qp,p32i16,ip_klu,649,0.008271,false,0.0001 +qp,p32i16,ip_umfpack,650,0.002758,false,0.0001 +qp,p32i16,ip_klu,650,0.000645,false,0.0001 +qp,p32i16,ip_umfpack,651,0.002413,false,0.0001 +qp,p32i16,ip_klu,651,0.000572,false,0.0001 +qp,p32i16,ip_umfpack,652,0.002706,false,0.0001 +qp,p32i16,ip_klu,652,0.000721,false,0.0001 +qp,p32i16,ip_umfpack,653,0.004595,false,0.0001 +qp,p32i16,ip_klu,653,0.00052,false,0.0001 +qp,p32i16,ip_umfpack,654,0.022274,false,0.0001 +qp,p32i16,ip_klu,654,0.0048,false,0.0001 +qp,p32i16,ip_umfpack,655,0.044351,false,0.0001 +qp,p32i16,ip_klu,655,0.011407,false,0.0001 +qp,p32i16,ip_umfpack,656,0.040419,false,0.0001 +qp,p32i16,ip_klu,656,0.008528,false,0.0001 +qp,p32i16,ip_umfpack,657,0.001239,true,0.0001 +qp,p32i16,ip_klu,657,0.000205,true,0.0001 +qp,p32i16,ip_umfpack,658,0.044669,false,0.0001 +qp,p32i16,ip_klu,658,0.006387,false,0.0001 +qp,p32i16,ip_umfpack,659,0.000816,true,0.0001 +qp,p32i16,ip_klu,659,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,660,0.01831,false,0.0001 +qp,p32i16,ip_klu,660,0.000599,false,0.0001 +qp,p32i16,ip_umfpack,661,0.042299,false,0.0001 +qp,p32i16,ip_klu,661,0.009267,false,0.0001 +qp,p32i16,ip_umfpack,662,0.003131,true,0.0001 +qp,p32i16,ip_klu,662,0.000223,true,0.0001 +qp,p32i16,ip_umfpack,663,0.039147,false,0.0001 +qp,p32i16,ip_klu,663,0.025016,false,0.0001 +qp,p32i16,ip_umfpack,664,0.039767,false,0.0001 +qp,p32i16,ip_klu,664,0.010685,false,0.0001 +qp,p32i16,ip_umfpack,665,0.000833,true,0.0001 +qp,p32i16,ip_klu,665,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,666,0.000995,true,0.0001 +qp,p32i16,ip_klu,666,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,667,0.0011,true,0.0001 +qp,p32i16,ip_klu,667,0.000242,true,0.0001 +qp,p32i16,ip_umfpack,668,0.0515,false,0.0001 +qp,p32i16,ip_klu,668,0.024122,false,0.0001 +qp,p32i16,ip_umfpack,669,0.03918,false,0.0001 +qp,p32i16,ip_klu,669,0.010171,false,0.0001 +qp,p32i16,ip_umfpack,670,0.002046,false,0.0001 +qp,p32i16,ip_klu,670,0.000541,false,0.0001 +qp,p32i16,ip_umfpack,671,0.054898,false,0.0001 +qp,p32i16,ip_klu,671,0.008109,false,0.0001 +qp,p32i16,ip_umfpack,672,0.000802,true,0.0001 +qp,p32i16,ip_klu,672,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,673,0.002765,true,0.0001 +qp,p32i16,ip_klu,673,0.002549,true,0.0001 +qp,p32i16,ip_umfpack,674,0.024488,false,0.0001 +qp,p32i16,ip_klu,674,0.007617,false,0.0001 +qp,p32i16,ip_umfpack,675,0.002118,false,0.0001 +qp,p32i16,ip_klu,675,0.000533,false,0.0001 +qp,p32i16,ip_umfpack,676,0.002108,false,0.0001 +qp,p32i16,ip_klu,676,0.000563,false,0.0001 +qp,p32i16,ip_umfpack,677,0.056291,false,0.0001 +qp,p32i16,ip_klu,677,0.011394,false,0.0001 +qp,p32i16,ip_umfpack,678,0.000974,true,0.0001 +qp,p32i16,ip_klu,678,0.000269,true,0.0001 +qp,p32i16,ip_umfpack,679,0.059686,false,0.0001 +qp,p32i16,ip_klu,679,0.007819,false,0.0001 +qp,p32i16,ip_umfpack,680,0.037781,false,0.0001 +qp,p32i16,ip_klu,680,0.009452,false,0.0001 +qp,p32i16,ip_umfpack,681,0.05094,false,0.0001 +qp,p32i16,ip_klu,681,0.024066,false,0.0001 +qp,p32i16,ip_umfpack,682,0.000843,true,0.0001 +qp,p32i16,ip_klu,682,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,683,0.040446,false,0.0001 +qp,p32i16,ip_klu,683,0.010434,false,0.0001 +qp,p32i16,ip_umfpack,684,0.000716,true,0.0001 +qp,p32i16,ip_klu,684,0.000177,true,0.0001 +qp,p32i16,ip_umfpack,685,0.056383,false,0.0001 +qp,p32i16,ip_klu,685,0.008414,false,0.0001 +qp,p32i16,ip_umfpack,686,0.000735,true,0.0001 +qp,p32i16,ip_klu,686,0.000189,true,0.0001 +qp,p32i16,ip_umfpack,687,0.000796,true,0.0001 +qp,p32i16,ip_klu,687,0.000178,true,0.0001 +qp,p32i16,ip_umfpack,688,0.000877,true,0.0001 +qp,p32i16,ip_klu,688,0.000199,true,0.0001 +qp,p32i16,ip_umfpack,689,0.000772,true,0.0001 +qp,p32i16,ip_klu,689,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,690,0.043707,false,0.0001 +qp,p32i16,ip_klu,690,0.01008,false,0.0001 +qp,p32i16,ip_umfpack,691,0.028631,false,0.0001 +qp,p32i16,ip_klu,691,0.006257,false,0.0001 +qp,p32i16,ip_umfpack,692,0.025524,false,0.0001 +qp,p32i16,ip_klu,692,0.007809,false,0.0001 +qp,p32i16,ip_umfpack,693,0.000869,true,0.0001 +qp,p32i16,ip_klu,693,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,694,0.001878,false,0.0001 +qp,p32i16,ip_klu,694,0.000529,false,0.0001 +qp,p32i16,ip_umfpack,695,0.00067,true,0.0001 +qp,p32i16,ip_klu,695,0.000164,true,0.0001 +qp,p32i16,ip_umfpack,696,0.054507,false,0.0001 +qp,p32i16,ip_klu,696,0.009274,false,0.0001 +qp,p32i16,ip_umfpack,697,0.037775,false,0.0001 +qp,p32i16,ip_klu,697,0.008294,false,0.0001 +qp,p32i16,ip_umfpack,698,0.019514,true,0.0001 +qp,p32i16,ip_klu,698,0.003786,true,0.0001 +qp,p32i16,ip_umfpack,699,0.054361,false,0.0001 +qp,p32i16,ip_klu,699,0.007377,false,0.0001 +qp,p32i16,ip_umfpack,700,0.004289,false,0.0001 +qp,p32i16,ip_klu,700,0.00061,false,0.0001 +qp,p32i16,ip_umfpack,701,0.044101,false,0.0001 +qp,p32i16,ip_klu,701,0.007993,false,0.0001 +qp,p32i16,ip_umfpack,702,0.042897,false,0.0001 +qp,p32i16,ip_klu,702,0.011026,false,0.0001 +qp,p32i16,ip_umfpack,703,0.00057,true,0.0001 +qp,p32i16,ip_klu,703,0.000157,true,0.0001 +qp,p32i16,ip_umfpack,704,0.026032,false,0.0001 +qp,p32i16,ip_klu,704,0.005433,false,0.0001 +qp,p32i16,ip_umfpack,705,0.000753,true,0.0001 +qp,p32i16,ip_klu,705,0.000184,true,0.0001 +qp,p32i16,ip_umfpack,706,0.000854,true,0.0001 +qp,p32i16,ip_klu,706,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,707,0.000814,true,0.0001 +qp,p32i16,ip_klu,707,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,708,0.000975,true,0.0001 +qp,p32i16,ip_klu,708,0.00022,true,0.0001 +qp,p32i16,ip_umfpack,709,0.000878,true,0.0001 +qp,p32i16,ip_klu,709,0.000228,true,0.0001 +qp,p32i16,ip_umfpack,710,0.022718,false,0.0001 +qp,p32i16,ip_klu,710,0.005712,false,0.0001 +qp,p32i16,ip_umfpack,711,0.000607,true,0.0001 +qp,p32i16,ip_klu,711,0.00016,true,0.0001 +qp,p32i16,ip_umfpack,712,0.036705,false,0.0001 +qp,p32i16,ip_klu,712,0.007916,false,0.0001 +qp,p32i16,ip_umfpack,713,0.000962,true,0.0001 +qp,p32i16,ip_klu,713,0.000223,true,0.0001 +qp,p32i16,ip_umfpack,714,0.000868,true,0.0001 +qp,p32i16,ip_klu,714,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,715,0.002093,false,0.0001 +qp,p32i16,ip_klu,715,0.000513,false,0.0001 +qp,p32i16,ip_umfpack,716,0.002023,false,0.0001 +qp,p32i16,ip_klu,716,0.000503,false,0.0001 +qp,p32i16,ip_umfpack,717,0.000906,true,0.0001 +qp,p32i16,ip_klu,717,0.00019,true,0.0001 +qp,p32i16,ip_umfpack,718,0.002341,false,0.0001 +qp,p32i16,ip_klu,718,0.000584,false,0.0001 +qp,p32i16,ip_umfpack,719,0.038393,false,0.0001 +qp,p32i16,ip_klu,719,0.024681,false,0.0001 +qp,p32i16,ip_umfpack,720,0.000979,true,0.0001 +qp,p32i16,ip_klu,720,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,721,0.043088,false,0.0001 +qp,p32i16,ip_klu,721,0.008703,false,0.0001 +qp,p32i16,ip_umfpack,722,0.000932,true,0.0001 +qp,p32i16,ip_klu,722,0.000237,true,0.0001 +qp,p32i16,ip_umfpack,723,0.043114,false,0.0001 +qp,p32i16,ip_klu,723,0.021808,false,0.0001 +qp,p32i16,ip_umfpack,724,0.000864,true,0.0001 +qp,p32i16,ip_klu,724,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,725,0.024368,false,0.0001 +qp,p32i16,ip_klu,725,0.00751,false,0.0001 +qp,p32i16,ip_umfpack,726,0.001963,false,0.0001 +qp,p32i16,ip_klu,726,0.000538,false,0.0001 +qp,p32i16,ip_umfpack,727,0.040653,false,0.0001 +qp,p32i16,ip_klu,727,0.008447,false,0.0001 +qp,p32i16,ip_umfpack,728,0.000866,true,0.0001 +qp,p32i16,ip_klu,728,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,729,0.045934,false,0.0001 +qp,p32i16,ip_klu,729,0.022996,false,0.0001 +qp,p32i16,ip_umfpack,730,0.038379,false,0.0001 +qp,p32i16,ip_klu,730,0.010385,false,0.0001 +qp,p32i16,ip_umfpack,731,0.001006,true,0.0001 +qp,p32i16,ip_klu,731,0.000217,true,0.0001 +qp,p32i16,ip_umfpack,732,0.000976,true,0.0001 +qp,p32i16,ip_klu,732,0.000233,true,0.0001 +qp,p32i16,ip_umfpack,733,0.000801,true,0.0001 +qp,p32i16,ip_klu,733,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,734,0.000853,true,0.0001 +qp,p32i16,ip_klu,734,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,735,0.003332,true,0.0001 +qp,p32i16,ip_klu,735,0.000659,true,0.0001 +qp,p32i16,ip_umfpack,736,0.040142,false,0.0001 +qp,p32i16,ip_klu,736,0.008035,false,0.0001 +qp,p32i16,ip_umfpack,737,0.032331,false,0.0001 +qp,p32i16,ip_klu,737,0.005042,false,0.0001 +qp,p32i16,ip_umfpack,738,0.002192,false,0.0001 +qp,p32i16,ip_klu,738,0.000562,false,0.0001 +qp,p32i16,ip_umfpack,739,0.027258,false,0.0001 +qp,p32i16,ip_klu,739,0.007709,false,0.0001 +qp,p32i16,ip_umfpack,740,0.00084,true,0.0001 +qp,p32i16,ip_klu,740,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,741,0.000831,true,0.0001 +qp,p32i16,ip_klu,741,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,742,0.000703,true,0.0001 +qp,p32i16,ip_klu,742,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,743,0.032294,false,0.0001 +qp,p32i16,ip_klu,743,0.005327,false,0.0001 +qp,p32i16,ip_umfpack,744,0.044552,false,0.0001 +qp,p32i16,ip_klu,744,0.017968,false,0.0001 +qp,p32i16,ip_umfpack,745,0.047967,false,0.0001 +qp,p32i16,ip_klu,745,0.008323,false,0.0001 +qp,p32i16,ip_umfpack,746,0.04615,false,0.0001 +qp,p32i16,ip_klu,746,0.008128,false,0.0001 +qp,p32i16,ip_umfpack,747,0.010854,false,0.0001 +qp,p32i16,ip_klu,747,0.00055,false,0.0001 +qp,p32i16,ip_umfpack,748,0.000799,true,0.0001 +qp,p32i16,ip_klu,748,0.000195,true,0.0001 +qp,p32i16,ip_umfpack,749,0.000994,true,0.0001 +qp,p32i16,ip_klu,749,0.000226,true,0.0001 +qp,p32i16,ip_umfpack,750,0.00091,true,0.0001 +qp,p32i16,ip_klu,750,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,751,0.000985,true,0.0001 +qp,p32i16,ip_klu,751,0.000236,true,0.0001 +qp,p32i16,ip_umfpack,752,0.028131,false,0.0001 +qp,p32i16,ip_klu,752,0.005831,false,0.0001 +qp,p32i16,ip_umfpack,753,0.011909,false,0.0001 +qp,p32i16,ip_klu,753,0.000579,false,0.0001 +qp,p32i16,ip_umfpack,754,0.025437,false,0.0001 +qp,p32i16,ip_klu,754,0.014748,false,0.0001 +qp,p32i16,ip_umfpack,755,0.000837,true,0.0001 +qp,p32i16,ip_klu,755,0.000197,true,0.0001 +qp,p32i16,ip_umfpack,756,0.000991,true,0.0001 +qp,p32i16,ip_klu,756,0.000225,true,0.0001 +qp,p32i16,ip_umfpack,757,0.002285,false,0.0001 +qp,p32i16,ip_klu,757,0.000586,false,0.0001 +qp,p32i16,ip_umfpack,758,0.04924,false,0.0001 +qp,p32i16,ip_klu,758,0.008216,false,0.0001 +qp,p32i16,ip_umfpack,759,0.002117,false,0.0001 +qp,p32i16,ip_klu,759,0.000549,false,0.0001 +qp,p32i16,ip_umfpack,760,0.002347,false,0.0001 +qp,p32i16,ip_klu,760,0.000535,false,0.0001 +qp,p32i16,ip_umfpack,761,0.027641,false,0.0001 +qp,p32i16,ip_klu,761,0.00576,false,0.0001 +qp,p32i16,ip_umfpack,762,0.000929,true,0.0001 +qp,p32i16,ip_klu,762,0.000218,true,0.0001 +qp,p32i16,ip_umfpack,763,0.002391,false,0.0001 +qp,p32i16,ip_klu,763,0.000591,false,0.0001 +qp,p32i16,ip_umfpack,764,0.042938,false,0.0001 +qp,p32i16,ip_klu,764,0.008073,false,0.0001 +qp,p32i16,ip_umfpack,765,0.000866,true,0.0001 +qp,p32i16,ip_klu,765,0.000216,true,0.0001 +qp,p32i16,ip_umfpack,766,0.052466,false,0.0001 +qp,p32i16,ip_klu,766,0.010164,false,0.0001 +qp,p32i16,ip_umfpack,767,0.048092,false,0.0001 +qp,p32i16,ip_klu,767,0.007641,false,0.0001 +qp,p32i16,ip_umfpack,768,0.048342,false,0.0001 +qp,p32i16,ip_klu,768,0.00819,false,0.0001 +qp,p32i16,ip_umfpack,769,0.002365,false,0.0001 +qp,p32i16,ip_klu,769,0.000597,false,0.0001 +qp,p32i16,ip_umfpack,770,0.002323,false,0.0001 +qp,p32i16,ip_klu,770,0.000562,false,0.0001 +qp,p32i16,ip_umfpack,771,0.000813,true,0.0001 +qp,p32i16,ip_klu,771,0.00019,true,0.0001 +qp,p32i16,ip_umfpack,772,0.040244,false,0.0001 +qp,p32i16,ip_klu,772,0.00891,false,0.0001 +qp,p32i16,ip_umfpack,773,0.049102,false,0.0001 +qp,p32i16,ip_klu,773,0.017448,false,0.0001 +qp,p32i16,ip_umfpack,774,0.002437,false,0.0001 +qp,p32i16,ip_klu,774,0.000602,false,0.0001 +qp,p32i16,ip_umfpack,775,0.035639,false,0.0001 +qp,p32i16,ip_klu,775,0.005747,false,0.0001 +qp,p32i16,ip_umfpack,776,0.031632,false,0.0001 +qp,p32i16,ip_klu,776,0.004603,false,0.0001 +qp,p32i16,ip_umfpack,777,0.033622,false,0.0001 +qp,p32i16,ip_klu,777,0.005199,false,0.0001 +qp,p32i16,ip_umfpack,778,0.002133,false,0.0001 +qp,p32i16,ip_klu,778,0.000504,false,0.0001 +qp,p32i16,ip_umfpack,779,0.037989,false,0.0001 +qp,p32i16,ip_klu,779,0.017062,false,0.0001 +qp,p32i16,ip_umfpack,780,0.000999,true,0.0001 +qp,p32i16,ip_klu,780,0.000224,true,0.0001 +qp,p32i16,ip_umfpack,781,0.000719,true,0.0001 +qp,p32i16,ip_klu,781,0.000163,true,0.0001 +qp,p32i16,ip_umfpack,782,0.002536,true,0.0001 +qp,p32i16,ip_klu,782,0.000555,true,0.0001 +qp,p32i16,ip_umfpack,783,0.045606,false,0.0001 +qp,p32i16,ip_klu,783,0.007978,false,0.0001 +qp,p32i16,ip_umfpack,784,0.047585,false,0.0001 +qp,p32i16,ip_klu,784,0.018479,false,0.0001 +qp,p32i16,ip_umfpack,785,0.000944,true,0.0001 +qp,p32i16,ip_klu,785,0.000202,true,0.0001 +qp,p32i16,ip_umfpack,786,0.004894,true,0.0001 +qp,p32i16,ip_klu,786,0.001001,true,0.0001 +qp,p32i16,ip_umfpack,787,0.000806,true,0.0001 +qp,p32i16,ip_klu,787,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,788,0.0018,false,0.0001 +qp,p32i16,ip_klu,788,0.000497,false,0.0001 +qp,p32i16,ip_umfpack,789,0.037188,false,0.0001 +qp,p32i16,ip_klu,789,0.007973,false,0.0001 +qp,p32i16,ip_umfpack,790,0.041775,false,0.0001 +qp,p32i16,ip_klu,790,0.008803,false,0.0001 +qp,p32i16,ip_umfpack,791,0.034096,false,0.0001 +qp,p32i16,ip_klu,791,0.005844,false,0.0001 +qp,p32i16,ip_umfpack,792,0.044867,false,0.0001 +qp,p32i16,ip_klu,792,0.010312,false,0.0001 +qp,p32i16,ip_umfpack,793,0.045804,false,0.0001 +qp,p32i16,ip_klu,793,0.009098,false,0.0001 +qp,p32i16,ip_umfpack,794,0.001025,true,0.0001 +qp,p32i16,ip_klu,794,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,795,0.035469,false,0.0001 +qp,p32i16,ip_klu,795,0.008329,false,0.0001 +qp,p32i16,ip_umfpack,796,0.002133,false,0.0001 +qp,p32i16,ip_klu,796,0.000577,false,0.0001 +qp,p32i16,ip_umfpack,797,0.001005,true,0.0001 +qp,p32i16,ip_klu,797,0.000236,true,0.0001 +qp,p32i16,ip_umfpack,798,0.000743,true,0.0001 +qp,p32i16,ip_klu,798,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,799,0.044058,false,0.0001 +qp,p32i16,ip_klu,799,0.010435,false,0.0001 +qp,p32i16,ip_umfpack,800,0.000904,true,0.0001 +qp,p32i16,ip_klu,800,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,801,0.041517,false,0.0001 +qp,p32i16,ip_klu,801,0.005961,false,0.0001 +qp,p32i16,ip_umfpack,802,0.00089,true,0.0001 +qp,p32i16,ip_klu,802,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,803,0.000884,true,0.0001 +qp,p32i16,ip_klu,803,0.000218,true,0.0001 +qp,p32i16,ip_umfpack,804,0.000652,true,0.0001 +qp,p32i16,ip_klu,804,0.000167,true,0.0001 +qp,p32i16,ip_umfpack,805,0.000795,true,0.0001 +qp,p32i16,ip_klu,805,0.000195,true,0.0001 +qp,p32i16,ip_umfpack,806,0.000839,true,0.0001 +qp,p32i16,ip_klu,806,0.000222,true,0.0001 +qp,p32i16,ip_umfpack,807,0.022188,false,0.0001 +qp,p32i16,ip_klu,807,0.004796,false,0.0001 +qp,p32i16,ip_umfpack,808,0.053897,false,0.0001 +qp,p32i16,ip_klu,808,0.010324,false,0.0001 +qp,p32i16,ip_umfpack,809,0.000842,true,0.0001 +qp,p32i16,ip_klu,809,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,810,0.043032,false,0.0001 +qp,p32i16,ip_klu,810,0.008465,false,0.0001 +qp,p32i16,ip_umfpack,811,0.001063,true,0.0001 +qp,p32i16,ip_klu,811,0.000246,true,0.0001 +qp,p32i16,ip_umfpack,812,0.001764,false,0.0001 +qp,p32i16,ip_klu,812,0.000471,false,0.0001 +qp,p32i16,ip_umfpack,813,0.003411,true,0.0001 +qp,p32i16,ip_klu,813,0.000215,true,0.0001 +qp,p32i16,ip_umfpack,814,0.022329,false,0.0001 +qp,p32i16,ip_klu,814,0.004921,false,0.0001 +qp,p32i16,ip_umfpack,815,0.000749,true,0.0001 +qp,p32i16,ip_klu,815,0.000189,true,0.0001 +qp,p32i16,ip_umfpack,816,0.036838,false,0.0001 +qp,p32i16,ip_klu,816,0.024268,false,0.0001 +qp,p32i16,ip_umfpack,817,0.000845,true,0.0001 +qp,p32i16,ip_klu,817,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,818,0.000666,true,0.0001 +qp,p32i16,ip_klu,818,0.000162,true,0.0001 +qp,p32i16,ip_umfpack,819,0.040641,false,0.0001 +qp,p32i16,ip_klu,819,0.009216,false,0.0001 +qp,p32i16,ip_umfpack,820,0.001126,true,0.0001 +qp,p32i16,ip_klu,820,0.000294,true,0.0001 +qp,p32i16,ip_umfpack,821,0.021434,false,0.0001 +qp,p32i16,ip_klu,821,0.004522,false,0.0001 +qp,p32i16,ip_umfpack,822,0.001161,true,0.0001 +qp,p32i16,ip_klu,822,0.000278,true,0.0001 +qp,p32i16,ip_umfpack,823,0.000903,true,0.0001 +qp,p32i16,ip_klu,823,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,824,0.00092,true,0.0001 +qp,p32i16,ip_klu,824,0.000258,true,0.0001 +qp,p32i16,ip_umfpack,825,0.000851,true,0.0001 +qp,p32i16,ip_klu,825,0.000222,true,0.0001 +qp,p32i16,ip_umfpack,826,0.018309,false,0.0001 +qp,p32i16,ip_klu,826,0.000584,false,0.0001 +qp,p32i16,ip_umfpack,827,0.000911,true,0.0001 +qp,p32i16,ip_klu,827,0.000215,true,0.0001 +qp,p32i16,ip_umfpack,828,0.000757,true,0.0001 +qp,p32i16,ip_klu,828,0.000198,true,0.0001 +qp,p32i16,ip_umfpack,829,0.002985,false,0.0001 +qp,p32i16,ip_klu,829,0.000724,false,0.0001 +qp,p32i16,ip_umfpack,830,0.005113,false,0.0001 +qp,p32i16,ip_klu,830,0.00053,false,0.0001 +qp,p32i16,ip_umfpack,831,0.000856,true,0.0001 +qp,p32i16,ip_klu,831,0.000209,true,0.0001 +qp,p32i16,ip_umfpack,832,0.040993,false,0.0001 +qp,p32i16,ip_klu,832,0.009875,false,0.0001 +qp,p32i16,ip_umfpack,833,0.037736,false,0.0001 +qp,p32i16,ip_klu,833,0.02447,false,0.0001 +qp,p32i16,ip_umfpack,834,0.00422,false,0.0001 +qp,p32i16,ip_klu,834,0.000973,false,0.0001 +qp,p32i16,ip_umfpack,835,0.023825,false,0.0001 +qp,p32i16,ip_klu,835,0.004698,false,0.0001 +qp,p32i16,ip_umfpack,836,0.037409,false,0.0001 +qp,p32i16,ip_klu,836,0.008337,false,0.0001 +qp,p32i16,ip_umfpack,837,0.052558,false,0.0001 +qp,p32i16,ip_klu,837,0.010125,false,0.0001 +qp,p32i16,ip_umfpack,838,0.039316,false,0.0001 +qp,p32i16,ip_klu,838,0.005301,false,0.0001 +qp,p32i16,ip_umfpack,839,0.003242,false,0.0001 +qp,p32i16,ip_klu,839,0.000896,false,0.0001 +qp,p32i16,ip_umfpack,840,0.001116,true,0.0001 +qp,p32i16,ip_klu,840,0.000242,true,0.0001 +qp,p32i16,ip_umfpack,841,0.018176,false,0.0001 +qp,p32i16,ip_klu,841,0.00055,false,0.0001 +qp,p32i16,ip_umfpack,842,0.04186,false,0.0001 +qp,p32i16,ip_klu,842,0.008461,false,0.0001 +qp,p32i16,ip_umfpack,843,0.000842,true,0.0001 +qp,p32i16,ip_klu,843,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,844,0.003514,true,0.0001 +qp,p32i16,ip_klu,844,0.00021,true,0.0001 +qp,p32i16,ip_umfpack,845,0.000726,true,0.0001 +qp,p32i16,ip_klu,845,0.000168,true,0.0001 +qp,p32i16,ip_umfpack,846,0.027672,false,0.0001 +qp,p32i16,ip_klu,846,0.008561,false,0.0001 +qp,p32i16,ip_umfpack,847,0.022653,false,0.0001 +qp,p32i16,ip_klu,847,0.007969,false,0.0001 +qp,p32i16,ip_umfpack,848,0.000785,true,0.0001 +qp,p32i16,ip_klu,848,0.000192,true,0.0001 +qp,p32i16,ip_umfpack,849,0.038767,false,0.0001 +qp,p32i16,ip_klu,849,0.024242,false,0.0001 +qp,p32i16,ip_umfpack,850,0.001953,false,0.0001 +qp,p32i16,ip_klu,850,0.000483,false,0.0001 +qp,p32i16,ip_umfpack,851,0.000849,true,0.0001 +qp,p32i16,ip_klu,851,0.000213,true,0.0001 +qp,p32i16,ip_umfpack,852,0.000768,true,0.0001 +qp,p32i16,ip_klu,852,0.000181,true,0.0001 +qp,p32i16,ip_umfpack,853,0.001064,true,0.0001 +qp,p32i16,ip_klu,853,0.000245,true,0.0001 +qp,p32i16,ip_umfpack,854,0.038627,false,0.0001 +qp,p32i16,ip_klu,854,0.007911,false,0.0001 +qp,p32i16,ip_umfpack,855,0.026626,false,0.0001 +qp,p32i16,ip_klu,855,0.021442,false,0.0001 +qp,p32i16,ip_umfpack,856,0.030263,false,0.0001 +qp,p32i16,ip_klu,856,0.006444,false,0.0001 +qp,p32i16,ip_umfpack,857,0.000871,true,0.0001 +qp,p32i16,ip_klu,857,0.000182,true,0.0001 +qp,p32i16,ip_umfpack,858,0.000829,true,0.0001 +qp,p32i16,ip_klu,858,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,859,0.000755,true,0.0001 +qp,p32i16,ip_klu,859,0.000174,true,0.0001 +qp,p32i16,ip_umfpack,860,0.000819,true,0.0001 +qp,p32i16,ip_klu,860,0.000201,true,0.0001 +qp,p32i16,ip_umfpack,861,0.004735,false,0.0001 +qp,p32i16,ip_klu,861,0.000598,false,0.0001 +qp,p32i16,ip_umfpack,862,0.028611,false,0.0001 +qp,p32i16,ip_klu,862,0.005844,false,0.0001 +qp,p32i16,ip_umfpack,863,0.000736,true,0.0001 +qp,p32i16,ip_klu,863,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,864,0.000749,true,0.0001 +qp,p32i16,ip_klu,864,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,865,0.053948,false,0.0001 +qp,p32i16,ip_klu,865,0.024588,false,0.0001 +qp,p32i16,ip_umfpack,866,0.028356,false,0.0001 +qp,p32i16,ip_klu,866,0.008363,false,0.0001 +qp,p32i16,ip_umfpack,867,0.023219,false,0.0001 +qp,p32i16,ip_klu,867,0.020967,false,0.0001 +qp,p32i16,ip_umfpack,868,0.002097,false,0.0001 +qp,p32i16,ip_klu,868,0.000523,false,0.0001 +qp,p32i16,ip_umfpack,869,0.000624,true,0.0001 +qp,p32i16,ip_klu,869,0.000152,true,0.0001 +qp,p32i16,ip_umfpack,870,0.044871,false,0.0001 +qp,p32i16,ip_klu,870,0.008601,false,0.0001 +qp,p32i16,ip_umfpack,871,0.000851,true,0.0001 +qp,p32i16,ip_klu,871,0.000214,true,0.0001 +qp,p32i16,ip_umfpack,872,0.000943,true,0.0001 +qp,p32i16,ip_klu,872,0.000267,true,0.0001 +qp,p32i16,ip_umfpack,873,0.059863,false,0.0001 +qp,p32i16,ip_klu,873,0.008879,false,0.0001 +qp,p32i16,ip_umfpack,874,0.000888,true,0.0001 +qp,p32i16,ip_klu,874,0.000218,true,0.0001 +qp,p32i16,ip_umfpack,875,0.044892,false,0.0001 +qp,p32i16,ip_klu,875,0.021907,false,0.0001 +qp,p32i16,ip_umfpack,876,0.040575,false,0.0001 +qp,p32i16,ip_klu,876,0.010919,false,0.0001 +qp,p32i16,ip_umfpack,877,0.00109,true,0.0001 +qp,p32i16,ip_klu,877,0.000246,true,0.0001 +qp,p32i16,ip_umfpack,878,0.055688,false,0.0001 +qp,p32i16,ip_klu,878,0.008756,false,0.0001 +qp,p32i16,ip_umfpack,879,0.000848,true,0.0001 +qp,p32i16,ip_klu,879,0.000238,true,0.0001 +qp,p32i16,ip_umfpack,880,0.000923,true,0.0001 +qp,p32i16,ip_klu,880,0.000225,true,0.0001 +qp,p32i16,ip_umfpack,881,0.000941,true,0.0001 +qp,p32i16,ip_klu,881,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,882,0.000853,true,0.0001 +qp,p32i16,ip_klu,882,0.002735,true,0.0001 +qp,p32i16,ip_umfpack,883,0.00095,true,0.0001 +qp,p32i16,ip_klu,883,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,884,0.000872,true,0.0001 +qp,p32i16,ip_klu,884,0.0002,true,0.0001 +qp,p32i16,ip_umfpack,885,0.001025,true,0.0001 +qp,p32i16,ip_klu,885,0.000226,true,0.0001 +qp,p32i16,ip_umfpack,886,0.036763,false,0.0001 +qp,p32i16,ip_klu,886,0.023979,false,0.0001 +qp,p32i16,ip_umfpack,887,0.001266,true,0.0001 +qp,p32i16,ip_klu,887,0.000283,true,0.0001 +qp,p32i16,ip_umfpack,888,0.000775,true,0.0001 +qp,p32i16,ip_klu,888,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,889,0.042958,false,0.0001 +qp,p32i16,ip_klu,889,0.008941,false,0.0001 +qp,p32i16,ip_umfpack,890,0.001988,false,0.0001 +qp,p32i16,ip_klu,890,0.000509,false,0.0001 +qp,p32i16,ip_umfpack,891,0.037747,false,0.0001 +qp,p32i16,ip_klu,891,0.007377,false,0.0001 +qp,p32i16,ip_umfpack,892,0.03961,false,0.0001 +qp,p32i16,ip_klu,892,0.024586,false,0.0001 +qp,p32i16,ip_umfpack,893,0.002216,false,0.0001 +qp,p32i16,ip_klu,893,0.000563,false,0.0001 +qp,p32i16,ip_umfpack,894,0.000965,true,0.0001 +qp,p32i16,ip_klu,894,0.00023,true,0.0001 +qp,p32i16,ip_umfpack,895,0.038857,false,0.0001 +qp,p32i16,ip_klu,895,0.007909,false,0.0001 +qp,p32i16,ip_umfpack,896,0.00089,true,0.0001 +qp,p32i16,ip_klu,896,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,897,0.054098,false,0.0001 +qp,p32i16,ip_klu,897,0.007874,false,0.0001 +qp,p32i16,ip_umfpack,898,0.004607,false,0.0001 +qp,p32i16,ip_klu,898,0.000509,false,0.0001 +qp,p32i16,ip_umfpack,899,0.037285,false,0.0001 +qp,p32i16,ip_klu,899,0.024257,false,0.0001 +qp,p32i16,ip_umfpack,900,0.001002,true,0.0001 +qp,p32i16,ip_klu,900,0.000231,true,0.0001 +qp,p32i16,ip_umfpack,901,0.000957,true,0.0001 +qp,p32i16,ip_klu,901,0.000209,true,0.0001 +qp,p32i16,ip_umfpack,902,0.041704,false,0.0001 +qp,p32i16,ip_klu,902,0.008181,false,0.0001 +qp,p32i16,ip_umfpack,903,0.0008,true,0.0001 +qp,p32i16,ip_klu,903,0.000206,true,0.0001 +qp,p32i16,ip_umfpack,904,0.025008,false,0.0001 +qp,p32i16,ip_klu,904,0.005628,false,0.0001 +qp,p32i16,ip_umfpack,905,0.052906,false,0.0001 +qp,p32i16,ip_klu,905,0.007636,false,0.0001 +qp,p32i16,ip_umfpack,906,0.036499,false,0.0001 +qp,p32i16,ip_klu,906,0.008068,false,0.0001 +qp,p32i16,ip_umfpack,907,0.000744,true,0.0001 +qp,p32i16,ip_klu,907,0.000199,true,0.0001 +qp,p32i16,ip_umfpack,908,0.016866,true,0.0001 +qp,p32i16,ip_klu,908,0.000284,true,0.0001 +qp,p32i16,ip_umfpack,909,0.000899,true,0.0001 +qp,p32i16,ip_klu,909,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,910,0.001014,true,0.0001 +qp,p32i16,ip_klu,910,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,911,0.00228,false,0.0001 +qp,p32i16,ip_klu,911,0.000575,false,0.0001 +qp,p32i16,ip_umfpack,912,0.0397,false,0.0001 +qp,p32i16,ip_klu,912,0.008374,false,0.0001 +qp,p32i16,ip_umfpack,913,0.000838,true,0.0001 +qp,p32i16,ip_klu,913,0.000205,true,0.0001 +qp,p32i16,ip_umfpack,914,0.055979,false,0.0001 +qp,p32i16,ip_klu,914,0.010212,false,0.0001 +qp,p32i16,ip_umfpack,915,0.002267,false,0.0001 +qp,p32i16,ip_klu,915,0.000559,false,0.0001 +qp,p32i16,ip_umfpack,916,0.002012,false,0.0001 +qp,p32i16,ip_klu,916,0.000533,false,0.0001 +qp,p32i16,ip_umfpack,917,0.058456,false,0.0001 +qp,p32i16,ip_klu,917,0.00806,false,0.0001 +qp,p32i16,ip_umfpack,918,0.055543,false,0.0001 +qp,p32i16,ip_klu,918,0.008244,false,0.0001 +qp,p32i16,ip_umfpack,919,0.000652,true,0.0001 +qp,p32i16,ip_klu,919,0.00017,true,0.0001 +qp,p32i16,ip_umfpack,920,0.000853,true,0.0001 +qp,p32i16,ip_klu,920,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,921,0.029523,false,0.0001 +qp,p32i16,ip_klu,921,0.006589,false,0.0001 +qp,p32i16,ip_umfpack,922,0.064978,false,0.0001 +qp,p32i16,ip_klu,922,0.007974,false,0.0001 +qp,p32i16,ip_umfpack,923,0.002014,false,0.0001 +qp,p32i16,ip_klu,923,0.000491,false,0.0001 +qp,p32i16,ip_umfpack,924,0.001043,true,0.0001 +qp,p32i16,ip_klu,924,0.000218,true,0.0001 +qp,p32i16,ip_umfpack,925,0.028165,false,0.0001 +qp,p32i16,ip_klu,925,0.005589,false,0.0001 +qp,p32i16,ip_umfpack,926,0.054149,false,0.0001 +qp,p32i16,ip_klu,926,0.00807,false,0.0001 +qp,p32i16,ip_umfpack,927,0.000708,true,0.0001 +qp,p32i16,ip_klu,927,0.000172,true,0.0001 +qp,p32i16,ip_umfpack,928,0.023032,false,0.0001 +qp,p32i16,ip_klu,928,0.004888,false,0.0001 +qp,p32i16,ip_umfpack,929,0.038877,false,0.0001 +qp,p32i16,ip_klu,929,0.007916,false,0.0001 +qp,p32i16,ip_umfpack,930,0.000879,true,0.0001 +qp,p32i16,ip_klu,930,0.000227,true,0.0001 +qp,p32i16,ip_umfpack,931,0.054354,false,0.0001 +qp,p32i16,ip_klu,931,0.008227,false,0.0001 +qp,p32i16,ip_umfpack,932,0.001866,true,0.0001 +qp,p32i16,ip_klu,932,0.000449,true,0.0001 +qp,p32i16,ip_umfpack,933,0.022547,false,0.0001 +qp,p32i16,ip_klu,933,0.00774,false,0.0001 +qp,p32i16,ip_umfpack,934,0.044196,false,0.0001 +qp,p32i16,ip_klu,934,0.007808,false,0.0001 +qp,p32i16,ip_umfpack,935,0.004993,false,0.0001 +qp,p32i16,ip_klu,935,0.000579,false,0.0001 +qp,p32i16,ip_umfpack,936,0.036166,false,0.0001 +qp,p32i16,ip_klu,936,0.023862,false,0.0001 +qp,p32i16,ip_umfpack,937,0.001165,true,0.0001 +qp,p32i16,ip_klu,937,0.000255,true,0.0001 +qp,p32i16,ip_umfpack,938,0.025387,false,0.0001 +qp,p32i16,ip_klu,938,0.007906,false,0.0001 +qp,p32i16,ip_umfpack,939,0.000766,true,0.0001 +qp,p32i16,ip_klu,939,0.000182,true,0.0001 +qp,p32i16,ip_umfpack,940,0.000956,true,0.0001 +qp,p32i16,ip_klu,940,0.000208,true,0.0001 +qp,p32i16,ip_umfpack,941,0.00066,true,0.0001 +qp,p32i16,ip_klu,941,0.000196,true,0.0001 +qp,p32i16,ip_umfpack,942,0.000891,true,0.0001 +qp,p32i16,ip_klu,942,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,943,0.002379,false,0.0001 +qp,p32i16,ip_klu,943,0.00062,false,0.0001 +qp,p32i16,ip_umfpack,944,0.00238,false,0.0001 +qp,p32i16,ip_klu,944,0.00058,false,0.0001 +qp,p32i16,ip_umfpack,945,0.043118,false,0.0001 +qp,p32i16,ip_klu,945,0.023641,false,0.0001 +qp,p32i16,ip_umfpack,946,0.044516,false,0.0001 +qp,p32i16,ip_klu,946,0.008816,false,0.0001 +qp,p32i16,ip_umfpack,947,0.000729,true,0.0001 +qp,p32i16,ip_klu,947,0.00018,true,0.0001 +qp,p32i16,ip_umfpack,948,0.0008,true,0.0001 +qp,p32i16,ip_klu,948,0.000186,true,0.0001 +qp,p32i16,ip_umfpack,949,0.017228,true,0.0001 +qp,p32i16,ip_klu,949,0.000232,true,0.0001 +qp,p32i16,ip_umfpack,950,0.002544,false,0.0001 +qp,p32i16,ip_klu,950,0.000617,false,0.0001 +qp,p32i16,ip_umfpack,951,0.021299,false,0.0001 +qp,p32i16,ip_klu,951,0.004684,false,0.0001 +qp,p32i16,ip_umfpack,952,0.000822,true,0.0001 +qp,p32i16,ip_klu,952,0.000195,true,0.0001 +qp,p32i16,ip_umfpack,953,0.002156,false,0.0001 +qp,p32i16,ip_klu,953,0.000511,false,0.0001 +qp,p32i16,ip_umfpack,954,0.001971,false,0.0001 +qp,p32i16,ip_klu,954,0.000525,false,0.0001 +qp,p32i16,ip_umfpack,955,0.028325,false,0.0001 +qp,p32i16,ip_klu,955,0.005655,false,0.0001 +qp,p32i16,ip_umfpack,956,0.023618,false,0.0001 +qp,p32i16,ip_klu,956,0.005063,false,0.0001 +qp,p32i16,ip_umfpack,957,0.000724,true,0.0001 +qp,p32i16,ip_klu,957,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,958,0.039161,false,0.0001 +qp,p32i16,ip_klu,958,0.00774,false,0.0001 +qp,p32i16,ip_umfpack,959,0.002412,false,0.0001 +qp,p32i16,ip_klu,959,0.00063,false,0.0001 +qp,p32i16,ip_umfpack,960,0.039609,false,0.0001 +qp,p32i16,ip_klu,960,0.01101,false,0.0001 +qp,p32i16,ip_umfpack,961,0.054502,false,0.0001 +qp,p32i16,ip_klu,961,0.024415,false,0.0001 +qp,p32i16,ip_umfpack,962,0.001155,true,0.0001 +qp,p32i16,ip_klu,962,0.000245,true,0.0001 +qp,p32i16,ip_umfpack,963,0.021562,false,0.0001 +qp,p32i16,ip_klu,963,0.006563,false,0.0001 +qp,p32i16,ip_umfpack,964,0.002595,false,0.0001 +qp,p32i16,ip_klu,964,0.000636,false,0.0001 +qp,p32i16,ip_umfpack,965,0.000785,true,0.0001 +qp,p32i16,ip_klu,965,0.000191,true,0.0001 +qp,p32i16,ip_umfpack,966,0.000703,true,0.0001 +qp,p32i16,ip_klu,966,0.000179,true,0.0001 +qp,p32i16,ip_umfpack,967,0.052691,false,0.0001 +qp,p32i16,ip_klu,967,0.007689,false,0.0001 +qp,p32i16,ip_umfpack,968,0.00062,true,0.0001 +qp,p32i16,ip_klu,968,0.000169,true,0.0001 +qp,p32i16,ip_umfpack,969,0.056393,false,0.0001 +qp,p32i16,ip_klu,969,0.009967,false,0.0001 +qp,p32i16,ip_umfpack,970,0.052103,false,0.0001 +qp,p32i16,ip_klu,970,0.023782,false,0.0001 +qp,p32i16,ip_umfpack,971,0.037006,false,0.0001 +qp,p32i16,ip_klu,971,0.009872,false,0.0001 +qp,p32i16,ip_umfpack,972,0.002229,false,0.0001 +qp,p32i16,ip_klu,972,0.000551,false,0.0001 +qp,p32i16,ip_umfpack,973,0.055366,false,0.0001 +qp,p32i16,ip_klu,973,0.007636,false,0.0001 +qp,p32i16,ip_umfpack,974,0.023811,false,0.0001 +qp,p32i16,ip_klu,974,0.004528,false,0.0001 +qp,p32i16,ip_umfpack,975,0.001216,true,0.0001 +qp,p32i16,ip_klu,975,0.000258,true,0.0001 +qp,p32i16,ip_umfpack,976,0.024592,false,0.0001 +qp,p32i16,ip_klu,976,0.005063,false,0.0001 +qp,p32i16,ip_umfpack,977,0.000869,true,0.0001 +qp,p32i16,ip_klu,977,0.000243,true,0.0001 +qp,p32i16,ip_umfpack,978,0.001025,true,0.0001 +qp,p32i16,ip_klu,978,0.000246,true,0.0001 +qp,p32i16,ip_umfpack,979,0.00439,false,0.0001 +qp,p32i16,ip_klu,979,0.000556,false,0.0001 +qp,p32i16,ip_umfpack,980,0.022887,false,0.0001 +qp,p32i16,ip_klu,980,0.005243,false,0.0001 +qp,p32i16,ip_umfpack,981,0.039277,false,0.0001 +qp,p32i16,ip_klu,981,0.023883,false,0.0001 +qp,p32i16,ip_umfpack,982,0.038398,false,0.0001 +qp,p32i16,ip_klu,982,0.010324,false,0.0001 +qp,p32i16,ip_umfpack,983,0.035884,false,0.0001 +qp,p32i16,ip_klu,983,0.008458,false,0.0001 +qp,p32i16,ip_umfpack,984,0.051421,false,0.0001 +qp,p32i16,ip_klu,984,0.010229,false,0.0001 +qp,p32i16,ip_umfpack,985,0.000859,true,0.0001 +qp,p32i16,ip_klu,985,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,986,0.041602,false,0.0001 +qp,p32i16,ip_klu,986,0.005751,false,0.0001 +qp,p32i16,ip_umfpack,987,0.000874,true,0.0001 +qp,p32i16,ip_klu,987,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,988,0.056416,false,0.0001 +qp,p32i16,ip_klu,988,0.008194,false,0.0001 +qp,p32i16,ip_umfpack,989,0.001151,true,0.0001 +qp,p32i16,ip_klu,989,0.000257,true,0.0001 +qp,p32i16,ip_umfpack,990,0.024765,false,0.0001 +qp,p32i16,ip_klu,990,0.004976,false,0.0001 +qp,p32i16,ip_umfpack,991,0.038558,false,0.0001 +qp,p32i16,ip_klu,991,0.010409,false,0.0001 +qp,p32i16,ip_umfpack,992,0.050081,false,0.0001 +qp,p32i16,ip_klu,992,0.023388,false,0.0001 +qp,p32i16,ip_umfpack,993,0.000778,true,0.0001 +qp,p32i16,ip_klu,993,0.000188,true,0.0001 +qp,p32i16,ip_umfpack,994,0.010098,true,0.0001 +qp,p32i16,ip_klu,994,0.006134,true,0.0001 +qp,p32i16,ip_umfpack,995,0.000692,true,0.0001 +qp,p32i16,ip_klu,995,0.000185,true,0.0001 +qp,p32i16,ip_umfpack,996,0.001038,true,0.0001 +qp,p32i16,ip_klu,996,0.000231,true,0.0001 +qp,p32i16,ip_umfpack,997,0.00223,false,0.0001 +qp,p32i16,ip_klu,997,0.000575,false,0.0001 +qp,p32i16,ip_umfpack,998,0.043665,false,0.0001 +qp,p32i16,ip_klu,998,0.010475,false,0.0001 +qp,p32i16,ip_umfpack,999,0.000884,true,0.0001 +qp,p32i16,ip_klu,999,0.000204,true,0.0001 +qp,p32i16,ip_umfpack,1000,0.048887,false,0.0001 +qp,p32i16,ip_klu,1000,0.023181,false,0.0001 +qp,p32i16,ip_umfpack,1001,0.002686,false,0.0001 +qp,p32i16,ip_klu,1001,0.000676,false,0.0001 +qp,p32i16,ip_umfpack,1002,0.026227,false,0.0001 +qp,p32i16,ip_klu,1002,0.005369,false,0.0001 +qp,p32i16,ip_umfpack,1003,0.000968,true,0.0001 +qp,p32i16,ip_klu,1003,0.00024,true,0.0001 +qp,p32i16,ip_umfpack,1004,0.002103,false,0.0001 +qp,p32i16,ip_klu,1004,0.000524,false,0.0001 +qp,p32i16,ip_umfpack,1005,0.000954,true,0.0001 +qp,p32i16,ip_klu,1005,0.000228,true,0.0001 +qp,p32i16,ip_umfpack,1006,0.000805,true,0.0001 +qp,p32i16,ip_klu,1006,0.000187,true,0.0001 +qp,p32i16,ip_umfpack,1007,0.024134,false,0.0001 +qp,p32i16,ip_klu,1007,0.00796,false,0.0001 +qp,p32i16,ip_umfpack,1008,0.027723,false,0.0001 +qp,p32i16,ip_klu,1008,0.00538,false,0.0001 +qp,p32i16,ip_umfpack,1009,0.054633,false,0.0001 +qp,p32i16,ip_klu,1009,0.008812,false,0.0001 +qp,p32i16,ip_umfpack,1010,0.00065,true,0.0001 +qp,p32i16,ip_klu,1010,0.000177,true,0.0001 +qp,p32i16,ip_umfpack,1011,0.000748,true,0.0001 +qp,p32i16,ip_klu,1011,0.000202,true,0.0001 +qp,p32i16,ip_umfpack,1012,0.000966,true,0.0001 +qp,p32i16,ip_klu,1012,0.000241,true,0.0001 +qp,p32i16,ip_umfpack,1013,0.036394,false,0.0001 +qp,p32i16,ip_klu,1013,0.009825,false,0.0001 +qp,p32i16,ip_umfpack,1014,0.040533,false,0.0001 +qp,p32i16,ip_klu,1014,0.005296,false,0.0001 +qp,p32i16,ip_umfpack,1015,0.000904,true,0.0001 +qp,p32i16,ip_klu,1015,0.000226,true,0.0001 +qp,p32i16,ip_umfpack,1016,0.000914,true,0.0001 +qp,p32i16,ip_klu,1016,0.000241,true,0.0001 +qp,p32i16,ip_umfpack,1017,0.000857,true,0.0001 +qp,p32i16,ip_klu,1017,0.000202,true,0.0001 +qp,p32i16,ip_umfpack,1018,0.000831,true,0.0001 +qp,p32i16,ip_klu,1018,0.000212,true,0.0001 +qp,p32i16,ip_umfpack,1019,0.000777,true,0.0001 +qp,p32i16,ip_klu,1019,0.000199,true,0.0001 +qp,p32i16,ip_umfpack,1020,0.001208,true,0.0001 +qp,p32i16,ip_klu,1020,0.000279,true,0.0001 +qp,p32i16,ip_umfpack,1021,0.000921,true,0.0001 +qp,p32i16,ip_klu,1021,0.000219,true,0.0001 +qp,p32i16,ip_umfpack,1022,0.002107,false,0.0001 +qp,p32i16,ip_klu,1022,0.000539,false,0.0001 +qp,p32i16,ip_umfpack,1023,0.002327,false,0.0001 +qp,p32i16,ip_klu,1023,0.00058,false,0.0001 +qp,p32i16,ip_umfpack,1024,0.045333,false,0.0001 +qp,p32i16,ip_klu,1024,0.008801,false,0.0001 +game,T10,ip_umfpack,1,0.004274,true,0.0001 +game,T10,ip_klu,1,0.000762,true,0.0001 +game,T10,ip_umfpack,2,0.004935,true,0.0001 +game,T10,ip_klu,2,0.000858,true,0.0001 +game,T10,ip_umfpack,3,0.003315,true,0.0001 +game,T10,ip_klu,3,0.000647,true,0.0001 +game,T10,ip_umfpack,4,0.004209,true,0.0001 +game,T10,ip_klu,4,0.000776,true,0.0001 +game,T10,ip_umfpack,5,0.004644,true,0.0001 +game,T10,ip_klu,5,0.000818,true,0.0001 +game,T10,ip_umfpack,6,0.004219,true,0.0001 +game,T10,ip_klu,6,0.000758,true,0.0001 +game,T10,ip_umfpack,7,0.004372,true,0.0001 +game,T10,ip_klu,7,0.000794,true,0.0001 +game,T10,ip_umfpack,8,0.003934,true,0.0001 +game,T10,ip_klu,8,0.00071,true,0.0001 +game,T10,ip_umfpack,9,0.003947,true,0.0001 +game,T10,ip_klu,9,0.000713,true,0.0001 +game,T10,ip_umfpack,10,0.003934,true,0.0001 +game,T10,ip_klu,10,0.000724,true,0.0001 +game,T10,ip_umfpack,11,0.003919,true,0.0001 +game,T10,ip_klu,11,0.000699,true,0.0001 +game,T10,ip_umfpack,12,0.005408,true,0.0001 +game,T10,ip_klu,12,0.000926,true,0.0001 +game,T10,ip_umfpack,13,0.006913,true,0.0001 +game,T10,ip_klu,13,0.001118,true,0.0001 +game,T10,ip_umfpack,14,0.029362,true,0.0001 +game,T10,ip_klu,14,0.000779,true,0.0001 +game,T10,ip_umfpack,15,0.004252,true,0.0001 +game,T10,ip_klu,15,0.000754,true,0.0001 +game,T10,ip_umfpack,16,0.004221,true,0.0001 +game,T10,ip_klu,16,0.000806,true,0.0001 +game,T10,ip_umfpack,17,0.005551,true,0.0001 +game,T10,ip_klu,17,0.00096,true,0.0001 +game,T10,ip_umfpack,18,0.004232,true,0.0001 +game,T10,ip_klu,18,0.000777,true,0.0001 +game,T10,ip_umfpack,19,0.005784,true,0.0001 +game,T10,ip_klu,19,0.001006,true,0.0001 +game,T10,ip_umfpack,20,0.003815,true,0.0001 +game,T10,ip_klu,20,0.000697,true,0.0001 +game,T10,ip_umfpack,21,0.004436,true,0.0001 +game,T10,ip_klu,21,0.000814,true,0.0001 +game,T10,ip_umfpack,22,0.016888,true,0.0001 +game,T10,ip_klu,22,0.0009,true,0.0001 +game,T10,ip_umfpack,23,0.004269,true,0.0001 +game,T10,ip_klu,23,0.000787,true,0.0001 +game,T10,ip_umfpack,24,0.004041,true,0.0001 +game,T10,ip_klu,24,0.000761,true,0.0001 +game,T10,ip_umfpack,25,0.004006,true,0.0001 +game,T10,ip_klu,25,0.000745,true,0.0001 +game,T10,ip_umfpack,26,0.005386,true,0.0001 +game,T10,ip_klu,26,0.000958,true,0.0001 +game,T10,ip_umfpack,27,0.003981,true,0.0001 +game,T10,ip_klu,27,0.000733,true,0.0001 +game,T10,ip_umfpack,28,0.004456,true,0.0001 +game,T10,ip_klu,28,0.000806,true,0.0001 +game,T10,ip_umfpack,29,0.004,true,0.0001 +game,T10,ip_klu,29,0.000713,true,0.0001 +game,T10,ip_umfpack,30,0.004182,true,0.0001 +game,T10,ip_klu,30,0.000761,true,0.0001 +game,T10,ip_umfpack,31,0.009263,true,0.0001 +game,T10,ip_klu,31,0.000966,true,0.0001 +game,T10,ip_umfpack,32,0.003991,true,0.0001 +game,T10,ip_klu,32,0.000741,true,0.0001 +game,T10,ip_umfpack,33,0.006006,true,0.0001 +game,T10,ip_klu,33,0.001012,true,0.0001 +game,T10,ip_umfpack,34,0.0042,true,0.0001 +game,T10,ip_klu,34,0.000764,true,0.0001 +game,T10,ip_umfpack,35,0.004467,true,0.0001 +game,T10,ip_klu,35,0.000805,true,0.0001 +game,T10,ip_umfpack,36,0.008672,true,0.0001 +game,T10,ip_klu,36,0.00092,true,0.0001 +game,T10,ip_umfpack,37,0.004229,true,0.0001 +game,T10,ip_klu,37,0.000782,true,0.0001 +game,T10,ip_umfpack,38,0.004654,true,0.0001 +game,T10,ip_klu,38,0.00084,true,0.0001 +game,T10,ip_umfpack,39,0.004739,true,0.0001 +game,T10,ip_klu,39,0.000826,true,0.0001 +game,T10,ip_umfpack,40,0.007128,true,0.0001 +game,T10,ip_klu,40,0.00073,true,0.0001 +game,T10,ip_umfpack,41,0.004236,true,0.0001 +game,T10,ip_klu,41,0.00075,true,0.0001 +game,T10,ip_umfpack,42,0.006703,true,0.0001 +game,T10,ip_klu,42,0.001075,true,0.0001 +game,T10,ip_umfpack,43,0.007822,true,0.0001 +game,T10,ip_klu,43,0.000913,true,0.0001 +game,T10,ip_umfpack,44,0.005372,true,0.0001 +game,T10,ip_klu,44,0.000905,true,0.0001 +game,T10,ip_umfpack,45,0.004649,true,0.0001 +game,T10,ip_klu,45,0.000834,true,0.0001 +game,T10,ip_umfpack,46,0.006967,true,0.0001 +game,T10,ip_klu,46,0.000777,true,0.0001 +game,T10,ip_umfpack,47,0.005896,true,0.0001 +game,T10,ip_klu,47,0.000992,true,0.0001 +game,T10,ip_umfpack,48,0.005964,true,0.0001 +game,T10,ip_klu,48,0.000731,true,0.0001 +game,T10,ip_umfpack,49,0.004149,true,0.0001 +game,T10,ip_klu,49,0.000733,true,0.0001 +game,T10,ip_umfpack,50,0.008778,true,0.0001 +game,T10,ip_klu,50,0.001092,true,0.0001 +game,T10,ip_umfpack,51,0.004191,true,0.0001 +game,T10,ip_klu,51,0.00074,true,0.0001 +game,T10,ip_umfpack,52,0.003941,true,0.0001 +game,T10,ip_klu,52,0.000725,true,0.0001 +game,T10,ip_umfpack,53,0.007041,true,0.0001 +game,T10,ip_klu,53,0.000836,true,0.0001 +game,T10,ip_umfpack,54,0.004623,true,0.0001 +game,T10,ip_klu,54,0.000793,true,0.0001 +game,T10,ip_umfpack,55,0.006937,true,0.0001 +game,T10,ip_klu,55,0.00087,true,0.0001 +game,T10,ip_umfpack,56,0.004,true,0.0001 +game,T10,ip_klu,56,0.000713,true,0.0001 +game,T10,ip_umfpack,57,0.004651,true,0.0001 +game,T10,ip_klu,57,0.000833,true,0.0001 +game,T10,ip_umfpack,58,0.006425,true,0.0001 +game,T10,ip_klu,58,0.000721,true,0.0001 +game,T10,ip_umfpack,59,0.004153,true,0.0001 +game,T10,ip_klu,59,0.00073,true,0.0001 +game,T10,ip_umfpack,60,0.005685,true,0.0001 +game,T10,ip_klu,60,0.000987,true,0.0001 +game,T10,ip_umfpack,61,0.004183,true,0.0001 +game,T10,ip_klu,61,0.000733,true,0.0001 +game,T10,ip_umfpack,62,0.004169,true,0.0001 +game,T10,ip_klu,62,0.000741,true,0.0001 +game,T10,ip_umfpack,63,0.006307,true,0.0001 +game,T10,ip_klu,63,0.000754,true,0.0001 +game,T10,ip_umfpack,64,0.003954,true,0.0001 +game,T10,ip_klu,64,0.000707,true,0.0001 +game,T10,ip_umfpack,65,0.004173,true,0.0001 +game,T10,ip_klu,65,0.00076,true,0.0001 +game,T10,ip_umfpack,66,0.007175,true,0.0001 +game,T10,ip_klu,66,0.000769,true,0.0001 +game,T10,ip_umfpack,67,0.004957,true,0.0001 +game,T10,ip_klu,67,0.000859,true,0.0001 +game,T10,ip_umfpack,68,0.004266,true,0.0001 +game,T10,ip_klu,68,0.000786,true,0.0001 +game,T10,ip_umfpack,69,0.008418,true,0.0001 +game,T10,ip_klu,69,0.000946,true,0.0001 +game,T10,ip_umfpack,70,0.004177,true,0.0001 +game,T10,ip_klu,70,0.000745,true,0.0001 +game,T10,ip_umfpack,71,0.006608,true,0.0001 +game,T10,ip_klu,71,0.000786,true,0.0001 +game,T10,ip_umfpack,72,0.003724,true,0.0001 +game,T10,ip_klu,72,0.000673,true,0.0001 +game,T10,ip_umfpack,73,0.004433,true,0.0001 +game,T10,ip_klu,73,0.000782,true,0.0001 +game,T10,ip_umfpack,74,0.006223,true,0.0001 +game,T10,ip_klu,74,0.000751,true,0.0001 +game,T10,ip_umfpack,75,0.005324,true,0.0001 +game,T10,ip_klu,75,0.000894,true,0.0001 +game,T10,ip_umfpack,76,0.004174,true,0.0001 +game,T10,ip_klu,76,0.002641,true,0.0001 +game,T10,ip_umfpack,77,0.004028,true,0.0001 +game,T10,ip_klu,77,0.000718,true,0.0001 +game,T10,ip_umfpack,78,0.003986,true,0.0001 +game,T10,ip_klu,78,0.000736,true,0.0001 +game,T10,ip_umfpack,79,0.006611,true,0.0001 +game,T10,ip_klu,79,0.000741,true,0.0001 +game,T10,ip_umfpack,80,0.00391,true,0.0001 +game,T10,ip_klu,80,0.000705,true,0.0001 +game,T10,ip_umfpack,81,0.003951,true,0.0001 +game,T10,ip_klu,81,0.000732,true,0.0001 +game,T10,ip_umfpack,82,0.008572,true,0.0001 +game,T10,ip_klu,82,0.00107,true,0.0001 +game,T10,ip_umfpack,83,0.003685,true,0.0001 +game,T10,ip_klu,83,0.000671,true,0.0001 +game,T10,ip_umfpack,84,0.003952,true,0.0001 +game,T10,ip_klu,84,0.002598,true,0.0001 +game,T10,ip_umfpack,85,0.004815,true,0.0001 +game,T10,ip_klu,85,0.000827,true,0.0001 +game,T10,ip_umfpack,86,0.005061,true,0.0001 +game,T10,ip_klu,86,0.00086,true,0.0001 +game,T10,ip_umfpack,87,0.007412,true,0.0001 +game,T10,ip_klu,87,0.000924,true,0.0001 +game,T10,ip_umfpack,88,0.003951,true,0.0001 +game,T10,ip_klu,88,0.000703,true,0.0001 +game,T10,ip_umfpack,89,0.007545,true,0.0001 +game,T10,ip_klu,89,0.000957,true,0.0001 +game,T10,ip_umfpack,90,0.006097,true,0.0001 +game,T10,ip_klu,90,0.001014,true,0.0001 +game,T10,ip_umfpack,91,0.003929,true,0.0001 +game,T10,ip_klu,91,0.00072,true,0.0001 +game,T10,ip_umfpack,92,0.008138,true,0.0001 +game,T10,ip_klu,92,0.001033,true,0.0001 +game,T10,ip_umfpack,93,0.004796,true,0.0001 +game,T10,ip_klu,93,0.000826,true,0.0001 +game,T10,ip_umfpack,94,0.005901,true,0.0001 +game,T10,ip_klu,94,0.000731,true,0.0001 +game,T10,ip_umfpack,95,0.003932,true,0.0001 +game,T10,ip_klu,95,0.000695,true,0.0001 +game,T10,ip_umfpack,96,0.003949,true,0.0001 +game,T10,ip_klu,96,0.000727,true,0.0001 +game,T10,ip_umfpack,97,0.006117,true,0.0001 +game,T10,ip_klu,97,0.000737,true,0.0001 +game,T10,ip_umfpack,98,0.003965,true,0.0001 +game,T10,ip_klu,98,0.000707,true,0.0001 +game,T10,ip_umfpack,99,0.003948,true,0.0001 +game,T10,ip_klu,99,0.002445,true,0.0001 +game,T10,ip_umfpack,100,0.004032,true,0.0001 +game,T10,ip_klu,100,0.00074,true,0.0001 +game,T10,ip_umfpack,101,0.004226,true,0.0001 +game,T10,ip_klu,101,0.00075,true,0.0001 +game,T10,ip_umfpack,102,0.006628,true,0.0001 +game,T10,ip_klu,102,0.000735,true,0.0001 +game,T10,ip_umfpack,103,0.006335,true,0.0001 +game,T10,ip_klu,103,0.001045,true,0.0001 +game,T10,ip_umfpack,104,0.004459,true,0.0001 +game,T10,ip_klu,104,0.000792,true,0.0001 +game,T10,ip_umfpack,105,0.005495,true,0.0001 +game,T10,ip_klu,105,0.000923,true,0.0001 +game,T10,ip_umfpack,106,0.005904,true,0.0001 +game,T10,ip_klu,106,0.000988,true,0.0001 +game,T10,ip_umfpack,107,0.005929,true,0.0001 +game,T10,ip_klu,107,0.000739,true,0.0001 +game,T10,ip_umfpack,108,0.006493,true,0.0001 +game,T10,ip_klu,108,0.001065,true,0.0001 +game,T10,ip_umfpack,109,0.005877,true,0.0001 +game,T10,ip_klu,109,0.000751,true,0.0001 +game,T10,ip_umfpack,110,0.003956,true,0.0001 +game,T10,ip_klu,110,0.000695,true,0.0001 +game,T10,ip_umfpack,111,0.004183,true,0.0001 +game,T10,ip_klu,111,0.000742,true,0.0001 +game,T10,ip_umfpack,112,0.062151,true,0.0001 +game,T10,ip_klu,112,0.00083,true,0.0001 +game,T10,ip_umfpack,113,0.004317,true,0.0001 +game,T10,ip_klu,113,0.000816,true,0.0001 +game,T10,ip_umfpack,114,0.086109,true,0.0001 +game,T10,ip_klu,114,0.000969,true,0.0001 +game,T10,ip_umfpack,115,0.004623,true,0.0001 +game,T10,ip_klu,115,0.000809,true,0.0001 +game,T10,ip_umfpack,116,0.00436,true,0.0001 +game,T10,ip_klu,116,0.000786,true,0.0001 +game,T10,ip_umfpack,117,0.003871,true,0.0001 +game,T10,ip_klu,117,0.000722,true,0.0001 +game,T10,ip_umfpack,118,0.004299,true,0.0001 +game,T10,ip_klu,118,0.000777,true,0.0001 +game,T10,ip_umfpack,119,0.004548,true,0.0001 +game,T10,ip_klu,119,0.000807,true,0.0001 +game,T10,ip_umfpack,120,0.00494,true,0.0001 +game,T10,ip_klu,120,0.000854,true,0.0001 +game,T10,ip_umfpack,121,0.004656,true,0.0001 +game,T10,ip_klu,121,0.000839,true,0.0001 +game,T10,ip_umfpack,122,0.004203,true,0.0001 +game,T10,ip_klu,122,0.000758,true,0.0001 +game,T10,ip_umfpack,123,0.004201,true,0.0001 +game,T10,ip_klu,123,0.000753,true,0.0001 +game,T10,ip_umfpack,124,0.004394,true,0.0001 +game,T10,ip_klu,124,0.000784,true,0.0001 +game,T10,ip_umfpack,125,0.005906,true,0.0001 +game,T10,ip_klu,125,0.000986,true,0.0001 +game,T10,ip_umfpack,126,0.004136,true,0.0001 +game,T10,ip_klu,126,0.000738,true,0.0001 +game,T10,ip_umfpack,127,0.003895,true,0.0001 +game,T10,ip_klu,127,0.000697,true,0.0001 +game,T10,ip_umfpack,128,0.004379,true,0.0001 +game,T10,ip_klu,128,0.000761,true,0.0001 +game,T10,ip_umfpack,129,0.004531,true,0.0001 +game,T10,ip_klu,129,0.000791,true,0.0001 +game,T10,ip_umfpack,130,0.004458,true,0.0001 +game,T10,ip_klu,130,0.000791,true,0.0001 +game,T10,ip_umfpack,131,0.004081,true,0.0001 +game,T10,ip_klu,131,0.00072,true,0.0001 +game,T10,ip_umfpack,132,0.004257,true,0.0001 +game,T10,ip_klu,132,0.000761,true,0.0001 +game,T10,ip_umfpack,133,0.00388,true,0.0001 +game,T10,ip_klu,133,0.006391,true,0.0001 +game,T10,ip_umfpack,134,0.004309,true,0.0001 +game,T10,ip_klu,134,0.000782,true,0.0001 +game,T10,ip_umfpack,135,0.00428,true,0.0001 +game,T10,ip_klu,135,0.000772,true,0.0001 +game,T10,ip_umfpack,136,0.004962,true,0.0001 +game,T10,ip_klu,136,0.000857,true,0.0001 +game,T10,ip_umfpack,137,0.004014,true,0.0001 +game,T10,ip_klu,137,0.000738,true,0.0001 +game,T10,ip_umfpack,138,0.004265,true,0.0001 +game,T10,ip_klu,138,0.000775,true,0.0001 +game,T10,ip_umfpack,139,0.003819,true,0.0001 +game,T10,ip_klu,139,0.000708,true,0.0001 +game,T10,ip_umfpack,140,0.004221,true,0.0001 +game,T10,ip_klu,140,0.000765,true,0.0001 +game,T10,ip_umfpack,141,0.004211,true,0.0001 +game,T10,ip_klu,141,0.004503,true,0.0001 +game,T10,ip_umfpack,142,0.004328,true,0.0001 +game,T10,ip_klu,142,0.000768,true,0.0001 +game,T10,ip_umfpack,143,0.004481,true,0.0001 +game,T10,ip_klu,143,0.000786,true,0.0001 +game,T10,ip_umfpack,144,0.004318,true,0.0001 +game,T10,ip_klu,144,0.000775,true,0.0001 +game,T10,ip_umfpack,145,0.004048,true,0.0001 +game,T10,ip_klu,145,0.000735,true,0.0001 +game,T10,ip_umfpack,146,0.004486,true,0.0001 +game,T10,ip_klu,146,0.000805,true,0.0001 +game,T10,ip_umfpack,147,0.009439,true,0.0001 +game,T10,ip_klu,147,0.000937,true,0.0001 +game,T10,ip_umfpack,148,0.00491,true,0.0001 +game,T10,ip_klu,148,0.000873,true,0.0001 +game,T10,ip_umfpack,149,0.004978,true,0.0001 +game,T10,ip_klu,149,0.000914,true,0.0001 +game,T10,ip_umfpack,150,0.010855,true,0.0001 +game,T10,ip_klu,150,0.001296,true,0.0001 +game,T10,ip_umfpack,151,0.004896,true,0.0001 +game,T10,ip_klu,151,0.000789,true,0.0001 +game,T10,ip_umfpack,152,0.004421,true,0.0001 +game,T10,ip_klu,152,0.000746,true,0.0001 +game,T10,ip_umfpack,153,0.004968,true,0.0001 +game,T10,ip_klu,153,0.003327,true,0.0001 +game,T10,ip_umfpack,154,0.004257,true,0.0001 +game,T10,ip_klu,154,0.000762,true,0.0001 +game,T10,ip_umfpack,155,0.004041,true,0.0001 +game,T10,ip_klu,155,0.000721,true,0.0001 +game,T10,ip_umfpack,156,0.004027,true,0.0001 +game,T10,ip_klu,156,0.000828,true,0.0001 +game,T10,ip_umfpack,157,0.007462,true,0.0001 +game,T10,ip_klu,157,0.000847,true,0.0001 +game,T10,ip_umfpack,158,0.003982,true,0.0001 +game,T10,ip_klu,158,0.00071,true,0.0001 +game,T10,ip_umfpack,159,0.00614,true,0.0001 +game,T10,ip_klu,159,0.000746,true,0.0001 +game,T10,ip_umfpack,160,0.00421,true,0.0001 +game,T10,ip_klu,160,0.000735,true,0.0001 +game,T10,ip_umfpack,161,0.004019,true,0.0001 +game,T10,ip_klu,161,0.000722,true,0.0001 +game,T10,ip_umfpack,162,0.006871,true,0.0001 +game,T10,ip_klu,162,0.000773,true,0.0001 +game,T10,ip_umfpack,163,0.004028,true,0.0001 +game,T10,ip_klu,163,0.000712,true,0.0001 +game,T10,ip_umfpack,164,0.008645,true,0.0001 +game,T10,ip_klu,164,0.00106,true,0.0001 +game,T10,ip_umfpack,165,0.003965,true,0.0001 +game,T10,ip_klu,165,0.000716,true,0.0001 +game,T10,ip_umfpack,166,0.005132,true,0.0001 +game,T10,ip_klu,166,0.000883,true,0.0001 +game,T10,ip_umfpack,167,0.008342,true,0.0001 +game,T10,ip_klu,167,0.000966,true,0.0001 +game,T10,ip_umfpack,168,0.003989,true,0.0001 +game,T10,ip_klu,168,0.000695,true,0.0001 +game,T10,ip_umfpack,169,0.006346,true,0.0001 +game,T10,ip_klu,169,0.00074,true,0.0001 +game,T10,ip_umfpack,170,0.003746,true,0.0001 +game,T10,ip_klu,170,0.000675,true,0.0001 +game,T10,ip_umfpack,171,0.004418,true,0.0001 +game,T10,ip_klu,171,0.000763,true,0.0001 +game,T10,ip_umfpack,172,0.008682,true,0.0001 +game,T10,ip_klu,172,0.001081,true,0.0001 +game,T10,ip_umfpack,173,0.004192,true,0.0001 +game,T10,ip_klu,173,0.000732,true,0.0001 +game,T10,ip_umfpack,174,0.008706,true,0.0001 +game,T10,ip_klu,174,0.00113,true,0.0001 +game,T10,ip_umfpack,175,0.003968,true,0.0001 +game,T10,ip_klu,175,0.000698,true,0.0001 +game,T10,ip_umfpack,176,0.006095,true,0.0001 +game,T10,ip_klu,176,0.000735,true,0.0001 +game,T10,ip_umfpack,177,0.004273,true,0.0001 +game,T10,ip_klu,177,0.000746,true,0.0001 +game,T10,ip_umfpack,178,0.004026,true,0.0001 +game,T10,ip_klu,178,0.00072,true,0.0001 +game,T10,ip_umfpack,179,0.007801,true,0.0001 +game,T10,ip_klu,179,0.000871,true,0.0001 +game,T10,ip_umfpack,180,0.004854,true,0.0001 +game,T10,ip_klu,180,0.000828,true,0.0001 +game,T10,ip_umfpack,181,0.008031,true,0.0001 +game,T10,ip_klu,181,0.000966,true,0.0001 +game,T10,ip_umfpack,182,0.004438,true,0.0001 +game,T10,ip_klu,182,0.000757,true,0.0001 +game,T10,ip_umfpack,183,0.006234,true,0.0001 +game,T10,ip_klu,183,0.000745,true,0.0001 +game,T10,ip_umfpack,184,0.004443,true,0.0001 +game,T10,ip_klu,184,0.000762,true,0.0001 +game,T10,ip_umfpack,185,0.005088,true,0.0001 +game,T10,ip_klu,185,0.000869,true,0.0001 +game,T10,ip_umfpack,186,0.006353,true,0.0001 +game,T10,ip_klu,186,0.000742,true,0.0001 +game,T10,ip_umfpack,187,0.003966,true,0.0001 +game,T10,ip_klu,187,0.000705,true,0.0001 +game,T10,ip_umfpack,188,0.004006,true,0.0001 +game,T10,ip_klu,188,0.002672,true,0.0001 +game,T10,ip_umfpack,189,0.004787,true,0.0001 +game,T10,ip_klu,189,0.000832,true,0.0001 +game,T10,ip_umfpack,190,0.004295,true,0.0001 +game,T10,ip_klu,190,0.000753,true,0.0001 +game,T10,ip_umfpack,191,0.007353,true,0.0001 +game,T10,ip_klu,191,0.000754,true,0.0001 +game,T10,ip_umfpack,192,0.004473,true,0.0001 +game,T10,ip_klu,192,0.000786,true,0.0001 +game,T10,ip_umfpack,193,0.003981,true,0.0001 +game,T10,ip_klu,193,0.000727,true,0.0001 +game,T10,ip_umfpack,194,0.006771,true,0.0001 +game,T10,ip_klu,194,0.000723,true,0.0001 +game,T10,ip_umfpack,195,0.004249,true,0.0001 +game,T10,ip_klu,195,0.000757,true,0.0001 +game,T10,ip_umfpack,196,0.004475,true,0.0001 +game,T10,ip_klu,196,0.003083,true,0.0001 +game,T10,ip_umfpack,197,0.006287,true,0.0001 +game,T10,ip_klu,197,0.001014,true,0.0001 +game,T10,ip_umfpack,198,0.007762,true,0.0001 +game,T10,ip_klu,198,0.000996,true,0.0001 +game,T10,ip_umfpack,199,0.004213,true,0.0001 +game,T10,ip_klu,199,0.000728,true,0.0001 +game,T10,ip_umfpack,200,0.006243,true,0.0001 +game,T10,ip_klu,200,0.001055,true,0.0001 +game,T10,ip_umfpack,201,0.004005,true,0.0001 +game,T10,ip_klu,201,0.000705,true,0.0001 +game,T10,ip_umfpack,202,0.003991,true,0.0001 +game,T10,ip_klu,202,0.000707,true,0.0001 +game,T10,ip_umfpack,203,0.006102,true,0.0001 +game,T10,ip_klu,203,0.000742,true,0.0001 +game,T10,ip_umfpack,204,0.00536,true,0.0001 +game,T10,ip_klu,204,0.000879,true,0.0001 +game,T10,ip_umfpack,205,0.004191,true,0.0001 +game,T10,ip_klu,205,0.000756,true,0.0001 +game,T10,ip_umfpack,206,0.006264,true,0.0001 +game,T10,ip_klu,206,0.000733,true,0.0001 +game,T10,ip_umfpack,207,0.004653,true,0.0001 +game,T10,ip_klu,207,0.000791,true,0.0001 +game,T10,ip_umfpack,208,0.006181,true,0.0001 +game,T10,ip_klu,208,0.000735,true,0.0001 +game,T10,ip_umfpack,209,0.004948,true,0.0001 +game,T10,ip_klu,209,0.00082,true,0.0001 +game,T10,ip_umfpack,210,0.004228,true,0.0001 +game,T10,ip_klu,210,0.000725,true,0.0001 +game,T10,ip_umfpack,211,0.011532,true,0.0001 +game,T10,ip_klu,211,0.001472,true,0.0001 +game,T10,ip_umfpack,212,0.006085,true,0.0001 +game,T10,ip_klu,212,0.000737,true,0.0001 +game,T10,ip_umfpack,213,0.003975,true,0.0001 +game,T10,ip_klu,213,0.000702,true,0.0001 +game,T10,ip_umfpack,214,0.004205,true,0.0001 +game,T10,ip_klu,214,0.000732,true,0.0001 +game,T10,ip_umfpack,215,0.009906,true,0.0001 +game,T10,ip_klu,215,0.001269,true,0.0001 +game,T10,ip_umfpack,216,0.004405,true,0.0001 +game,T10,ip_klu,216,0.000822,true,0.0001 +game,T10,ip_umfpack,217,0.008463,true,0.0001 +game,T10,ip_klu,217,0.000947,true,0.0001 +game,T10,ip_umfpack,218,0.006386,true,0.0001 +game,T10,ip_klu,218,0.000947,true,0.0001 +game,T10,ip_umfpack,219,0.003633,true,0.0001 +game,T10,ip_klu,219,0.000724,true,0.0001 +game,T10,ip_umfpack,220,0.006817,true,0.0001 +game,T10,ip_klu,220,0.000762,true,0.0001 +game,T10,ip_umfpack,221,0.006156,true,0.0001 +game,T10,ip_klu,221,0.00099,true,0.0001 +game,T10,ip_umfpack,222,0.006151,true,0.0001 +game,T10,ip_klu,222,0.000721,true,0.0001 +game,T10,ip_umfpack,223,0.004201,true,0.0001 +game,T10,ip_klu,223,0.000732,true,0.0001 +game,T10,ip_umfpack,224,0.004447,true,0.0001 +game,T10,ip_klu,224,0.000766,true,0.0001 +game,T10,ip_umfpack,225,0.006288,true,0.0001 +game,T10,ip_klu,225,0.000719,true,0.0001 +game,T10,ip_umfpack,226,0.005079,true,0.0001 +game,T10,ip_klu,226,0.000875,true,0.0001 +game,T10,ip_umfpack,227,0.006501,true,0.0001 +game,T10,ip_klu,227,0.000733,true,0.0001 +game,T10,ip_umfpack,228,0.004208,true,0.0001 +game,T10,ip_klu,228,0.000733,true,0.0001 +game,T10,ip_umfpack,229,0.00504,true,0.0001 +game,T10,ip_klu,229,0.000966,true,0.0001 +game,T10,ip_umfpack,230,0.007223,true,0.0001 +game,T10,ip_klu,230,0.000737,true,0.0001 +game,T10,ip_umfpack,231,0.004036,true,0.0001 +game,T10,ip_klu,231,0.000728,true,0.0001 +game,T10,ip_umfpack,232,0.004049,true,0.0001 +game,T10,ip_klu,232,0.002718,true,0.0001 +game,T10,ip_umfpack,233,0.004252,true,0.0001 +game,T10,ip_klu,233,0.000752,true,0.0001 +game,T10,ip_umfpack,234,0.006461,true,0.0001 +game,T10,ip_klu,234,0.00104,true,0.0001 +game,T10,ip_umfpack,235,0.006878,true,0.0001 +game,T10,ip_klu,235,0.000747,true,0.0001 +game,T10,ip_umfpack,236,0.004185,true,0.0001 +game,T10,ip_klu,236,0.000741,true,0.0001 +game,T10,ip_umfpack,237,0.003991,true,0.0001 +game,T10,ip_klu,237,0.003348,true,0.0001 +game,T10,ip_umfpack,238,0.003554,true,0.0001 +game,T10,ip_klu,238,0.000671,true,0.0001 +game,T10,ip_umfpack,239,0.005362,true,0.0001 +game,T10,ip_klu,239,0.000897,true,0.0001 +game,T10,ip_umfpack,240,0.007937,true,0.0001 +game,T10,ip_klu,240,0.000913,true,0.0001 +game,T10,ip_umfpack,241,0.004214,true,0.0001 +game,T10,ip_klu,241,0.000738,true,0.0001 +game,T10,ip_umfpack,242,0.006275,true,0.0001 +game,T10,ip_klu,242,0.00074,true,0.0001 +game,T10,ip_umfpack,243,0.004018,true,0.0001 +game,T10,ip_klu,243,0.0007,true,0.0001 +game,T10,ip_umfpack,244,0.004432,true,0.0001 +game,T10,ip_klu,244,0.000754,true,0.0001 +game,T10,ip_umfpack,245,0.006076,true,0.0001 +game,T10,ip_klu,245,0.000708,true,0.0001 +game,T10,ip_umfpack,246,0.004635,true,0.0001 +game,T10,ip_klu,246,0.000787,true,0.0001 +game,T10,ip_umfpack,247,0.004188,true,0.0001 +game,T10,ip_klu,247,0.000765,true,0.0001 +game,T10,ip_umfpack,248,0.007674,true,0.0001 +game,T10,ip_klu,248,0.000923,true,0.0001 +game,T10,ip_umfpack,249,0.003922,true,0.0001 +game,T10,ip_klu,249,0.000694,true,0.0001 +game,T10,ip_umfpack,250,0.006291,true,0.0001 +game,T10,ip_klu,250,0.000741,true,0.0001 +game,T10,ip_umfpack,251,0.004197,true,0.0001 +game,T10,ip_klu,251,0.000732,true,0.0001 +game,T10,ip_umfpack,252,0.003987,true,0.0001 +game,T10,ip_klu,252,0.000715,true,0.0001 +game,T10,ip_umfpack,253,0.006281,true,0.0001 +game,T10,ip_klu,253,0.00073,true,0.0001 +game,T10,ip_umfpack,254,0.00541,true,0.0001 +game,T10,ip_klu,254,0.000892,true,0.0001 +game,T10,ip_umfpack,255,0.006206,true,0.0001 +game,T10,ip_klu,255,0.000686,true,0.0001 +game,T10,ip_umfpack,256,0.00423,true,0.0001 +game,T10,ip_klu,256,0.000732,true,0.0001 +game,T10,ip_umfpack,257,0.003963,true,0.0001 +game,T10,ip_klu,257,0.000708,true,0.0001 +game,T10,ip_umfpack,258,0.006557,true,0.0001 +game,T10,ip_klu,258,0.000768,true,0.0001 +game,T10,ip_umfpack,259,0.004174,true,0.0001 +game,T10,ip_klu,259,0.000733,true,0.0001 +game,T10,ip_umfpack,260,0.004243,true,0.0001 +game,T10,ip_klu,260,0.001024,true,0.0001 +game,T10,ip_umfpack,261,0.004199,true,0.0001 +game,T10,ip_klu,261,0.000741,true,0.0001 +game,T10,ip_umfpack,262,0.004226,true,0.0001 +game,T10,ip_klu,262,0.000727,true,0.0001 +game,T10,ip_umfpack,263,0.007215,true,0.0001 +game,T10,ip_klu,263,0.000868,true,0.0001 +game,T10,ip_umfpack,264,0.003969,true,0.0001 +game,T10,ip_klu,264,0.000702,true,0.0001 +game,T10,ip_umfpack,265,0.003979,true,0.0001 +game,T10,ip_klu,265,0.000716,true,0.0001 +game,T10,ip_umfpack,266,0.005482,true,0.0001 +game,T10,ip_klu,266,0.000616,true,0.0001 +game,T10,ip_umfpack,267,0.005055,true,0.0001 +game,T10,ip_klu,267,0.000856,true,0.0001 +game,T10,ip_umfpack,268,0.004186,true,0.0001 +game,T10,ip_klu,268,0.002625,true,0.0001 +game,T10,ip_umfpack,269,0.004027,true,0.0001 +game,T10,ip_klu,269,0.000712,true,0.0001 +game,T10,ip_umfpack,270,0.004382,true,0.0001 +game,T10,ip_klu,270,0.000773,true,0.0001 +game,T10,ip_umfpack,271,0.007869,true,0.0001 +game,T10,ip_klu,271,0.000736,true,0.0001 +game,T10,ip_umfpack,272,0.00435,true,0.0001 +game,T10,ip_klu,272,0.000752,true,0.0001 +game,T10,ip_umfpack,273,0.004258,true,0.0001 +game,T10,ip_klu,273,0.000764,true,0.0001 +game,T10,ip_umfpack,274,0.007063,true,0.0001 +game,T10,ip_klu,274,0.000768,true,0.0001 +game,T10,ip_umfpack,275,0.003987,true,0.0001 +game,T10,ip_klu,275,0.00071,true,0.0001 +game,T10,ip_umfpack,276,0.004196,true,0.0001 +game,T10,ip_klu,276,0.000745,true,0.0001 +game,T10,ip_umfpack,277,0.008777,true,0.0001 +game,T10,ip_klu,277,0.001061,true,0.0001 +game,T10,ip_umfpack,278,0.005355,true,0.0001 +game,T10,ip_klu,278,0.00091,true,0.0001 +game,T10,ip_umfpack,279,0.006574,true,0.0001 +game,T10,ip_klu,279,0.000753,true,0.0001 +game,T10,ip_umfpack,280,0.005746,true,0.0001 +game,T10,ip_klu,280,0.000945,true,0.0001 +game,T10,ip_umfpack,281,0.006382,true,0.0001 +game,T10,ip_klu,281,0.000743,true,0.0001 +game,T10,ip_umfpack,282,0.003962,true,0.0001 +game,T10,ip_klu,282,0.000701,true,0.0001 +game,T10,ip_umfpack,283,0.004188,true,0.0001 +game,T10,ip_klu,283,0.000749,true,0.0001 +game,T10,ip_umfpack,284,0.006373,true,0.0001 +game,T10,ip_klu,284,0.000727,true,0.0001 +game,T10,ip_umfpack,285,0.004228,true,0.0001 +game,T10,ip_klu,285,0.000736,true,0.0001 +game,T10,ip_umfpack,286,0.003549,true,0.0001 +game,T10,ip_klu,286,0.000653,true,0.0001 +game,T10,ip_umfpack,287,0.004013,true,0.0001 +game,T10,ip_klu,287,0.000704,true,0.0001 +game,T10,ip_umfpack,288,0.004178,true,0.0001 +game,T10,ip_klu,288,0.000734,true,0.0001 +game,T10,ip_umfpack,289,0.006372,true,0.0001 +game,T10,ip_klu,289,0.000769,true,0.0001 +game,T10,ip_umfpack,290,0.005519,true,0.0001 +game,T10,ip_klu,290,0.000907,true,0.0001 +game,T10,ip_umfpack,291,0.004903,true,0.0001 +game,T10,ip_klu,291,0.002738,true,0.0001 +game,T10,ip_umfpack,292,0.003989,true,0.0001 +game,T10,ip_klu,292,0.000703,true,0.0001 +game,T10,ip_umfpack,293,0.004205,true,0.0001 +game,T10,ip_klu,293,0.000721,true,0.0001 +game,T10,ip_umfpack,294,0.006914,true,0.0001 +game,T10,ip_klu,294,0.000717,true,0.0001 +game,T10,ip_umfpack,295,0.004517,true,0.0001 +game,T10,ip_klu,295,0.000781,true,0.0001 +game,T10,ip_umfpack,296,0.004,true,0.0001 +game,T10,ip_klu,296,0.00071,true,0.0001 +game,T10,ip_umfpack,297,0.006443,true,0.0001 +game,T10,ip_klu,297,0.000755,true,0.0001 +game,T10,ip_umfpack,298,0.004224,true,0.0001 +game,T10,ip_klu,298,0.000741,true,0.0001 +game,T10,ip_umfpack,299,0.003987,true,0.0001 +game,T10,ip_klu,299,0.000729,true,0.0001 +game,T10,ip_umfpack,300,0.006375,true,0.0001 +game,T10,ip_klu,300,0.000734,true,0.0001 +game,T10,ip_umfpack,301,0.00422,true,0.0001 +game,T10,ip_klu,301,0.000735,true,0.0001 +game,T10,ip_umfpack,302,0.005827,true,0.0001 +game,T10,ip_klu,302,0.000706,true,0.0001 +game,T10,ip_umfpack,303,0.005372,true,0.0001 +game,T10,ip_klu,303,0.0009,true,0.0001 +game,T10,ip_umfpack,304,0.003946,true,0.0001 +game,T10,ip_klu,304,0.000714,true,0.0001 +game,T10,ip_umfpack,305,0.007405,true,0.0001 +game,T10,ip_klu,305,0.000888,true,0.0001 +game,T10,ip_umfpack,306,0.004227,true,0.0001 +game,T10,ip_klu,306,0.000727,true,0.0001 +game,T10,ip_umfpack,307,0.00641,true,0.0001 +game,T10,ip_klu,307,0.000768,true,0.0001 +game,T10,ip_umfpack,308,0.005943,true,0.0001 +game,T10,ip_klu,308,0.00096,true,0.0001 +game,T10,ip_umfpack,309,0.0042,true,0.0001 +game,T10,ip_klu,309,0.002547,true,0.0001 +game,T10,ip_umfpack,310,0.004,true,0.0001 +game,T10,ip_klu,310,0.000709,true,0.0001 +game,T10,ip_umfpack,311,0.004177,true,0.0001 +game,T10,ip_klu,311,0.00074,true,0.0001 +game,T10,ip_umfpack,312,0.008641,true,0.0001 +game,T10,ip_klu,312,0.000952,true,0.0001 +game,T10,ip_umfpack,313,0.004383,true,0.0001 +game,T10,ip_klu,313,0.000778,true,0.0001 +game,T10,ip_umfpack,314,0.004092,true,0.0001 +game,T10,ip_klu,314,0.000764,true,0.0001 +game,T10,ip_umfpack,315,0.008566,true,0.0001 +game,T10,ip_klu,315,0.000856,true,0.0001 +game,T10,ip_umfpack,316,0.00424,true,0.0001 +game,T10,ip_klu,316,0.00075,true,0.0001 +game,T10,ip_umfpack,317,0.006552,true,0.0001 +game,T10,ip_klu,317,0.000721,true,0.0001 +game,T10,ip_umfpack,318,0.006656,true,0.0001 +game,T10,ip_klu,318,0.001088,true,0.0001 +game,T10,ip_umfpack,319,0.006314,true,0.0001 +game,T10,ip_klu,319,0.000744,true,0.0001 +game,T10,ip_umfpack,320,0.004241,true,0.0001 +game,T10,ip_klu,320,0.000738,true,0.0001 +game,T10,ip_umfpack,321,0.004181,true,0.0001 +game,T10,ip_klu,321,0.000733,true,0.0001 +game,T10,ip_umfpack,322,0.006349,true,0.0001 +game,T10,ip_klu,322,0.000749,true,0.0001 +game,T10,ip_umfpack,323,0.003962,true,0.0001 +game,T10,ip_klu,323,0.000697,true,0.0001 +game,T10,ip_umfpack,324,0.004,true,0.0001 +game,T10,ip_klu,324,0.000707,true,0.0001 +game,T10,ip_umfpack,325,0.006655,true,0.0001 +game,T10,ip_klu,325,0.000774,true,0.0001 +game,T10,ip_umfpack,326,0.004195,true,0.0001 +game,T10,ip_klu,326,0.000727,true,0.0001 +game,T10,ip_umfpack,327,0.006256,true,0.0001 +game,T10,ip_klu,327,0.000745,true,0.0001 +game,T10,ip_umfpack,328,0.00424,true,0.0001 +game,T10,ip_klu,328,0.000738,true,0.0001 +game,T10,ip_umfpack,329,0.003983,true,0.0001 +game,T10,ip_klu,329,0.000704,true,0.0001 +game,T10,ip_umfpack,330,0.006113,true,0.0001 +game,T10,ip_klu,330,0.000707,true,0.0001 +game,T10,ip_umfpack,331,0.004198,true,0.0001 +game,T10,ip_klu,331,0.000726,true,0.0001 +game,T10,ip_umfpack,332,0.005821,true,0.0001 +game,T10,ip_klu,332,0.00291,true,0.0001 +game,T10,ip_umfpack,333,0.004024,true,0.0001 +game,T10,ip_klu,333,0.00071,true,0.0001 +game,T10,ip_umfpack,334,0.004188,true,0.0001 +game,T10,ip_klu,334,0.000734,true,0.0001 +game,T10,ip_umfpack,335,0.007787,true,0.0001 +game,T10,ip_klu,335,0.000852,true,0.0001 +game,T10,ip_umfpack,336,0.004232,true,0.0001 +game,T10,ip_klu,336,0.000742,true,0.0001 +game,T10,ip_umfpack,337,0.004007,true,0.0001 +game,T10,ip_klu,337,0.000716,true,0.0001 +game,T10,ip_umfpack,338,0.006375,true,0.0001 +game,T10,ip_klu,338,0.000751,true,0.0001 +game,T10,ip_umfpack,339,0.003993,true,0.0001 +game,T10,ip_klu,339,0.000708,true,0.0001 +game,T10,ip_umfpack,340,0.007146,true,0.0001 +game,T10,ip_klu,340,0.000848,true,0.0001 +game,T10,ip_umfpack,341,0.003993,true,0.0001 +game,T10,ip_klu,341,0.000706,true,0.0001 +game,T10,ip_umfpack,342,0.004191,true,0.0001 +game,T10,ip_klu,342,0.000746,true,0.0001 +game,T10,ip_umfpack,343,0.005802,true,0.0001 +game,T10,ip_klu,343,0.000681,true,0.0001 +game,T10,ip_umfpack,344,0.005753,true,0.0001 +game,T10,ip_klu,344,0.00095,true,0.0001 +game,T10,ip_umfpack,345,0.006722,true,0.0001 +game,T10,ip_klu,345,0.000773,true,0.0001 +game,T10,ip_umfpack,346,0.003996,true,0.0001 +game,T10,ip_klu,346,0.0007,true,0.0001 +game,T10,ip_umfpack,347,0.003954,true,0.0001 +game,T10,ip_klu,347,0.000723,true,0.0001 +game,T10,ip_umfpack,348,0.006177,true,0.0001 +game,T10,ip_klu,348,0.000741,true,0.0001 +game,T10,ip_umfpack,349,0.004628,true,0.0001 +game,T10,ip_klu,349,0.000786,true,0.0001 +game,T10,ip_umfpack,350,0.008044,true,0.0001 +game,T10,ip_klu,350,0.000783,true,0.0001 +game,T10,ip_umfpack,351,0.004392,true,0.0001 +game,T10,ip_klu,351,0.000771,true,0.0001 +game,T10,ip_umfpack,352,0.004086,true,0.0001 +game,T10,ip_klu,352,0.000746,true,0.0001 +game,T10,ip_umfpack,353,0.007328,true,0.0001 +game,T10,ip_klu,353,0.000763,true,0.0001 +game,T10,ip_umfpack,354,0.005158,true,0.0001 +game,T10,ip_klu,354,0.000868,true,0.0001 +game,T10,ip_umfpack,355,0.004319,true,0.0001 +game,T10,ip_klu,355,0.003559,true,0.0001 +game,T10,ip_umfpack,356,0.004299,true,0.0001 +game,T10,ip_klu,356,0.000762,true,0.0001 +game,T10,ip_umfpack,357,0.004273,true,0.0001 +game,T10,ip_klu,357,0.000908,true,0.0001 +game,T10,ip_umfpack,358,0.006586,true,0.0001 +game,T10,ip_klu,358,0.000753,true,0.0001 +game,T10,ip_umfpack,359,0.00399,true,0.0001 +game,T10,ip_klu,359,0.000708,true,0.0001 +game,T10,ip_umfpack,360,0.004213,true,0.0001 +game,T10,ip_klu,360,0.000731,true,0.0001 +game,T10,ip_umfpack,361,0.005952,true,0.0001 +game,T10,ip_klu,361,0.000688,true,0.0001 +game,T10,ip_umfpack,362,0.005522,true,0.0001 +game,T10,ip_klu,362,0.000909,true,0.0001 +game,T10,ip_umfpack,363,0.003986,true,0.0001 +game,T10,ip_klu,363,0.002765,true,0.0001 +game,T10,ip_umfpack,364,0.004971,true,0.0001 +game,T10,ip_klu,364,0.000822,true,0.0001 +game,T10,ip_umfpack,365,0.003957,true,0.0001 +game,T10,ip_klu,365,0.000703,true,0.0001 +game,T10,ip_umfpack,366,0.006211,true,0.0001 +game,T10,ip_klu,366,0.000746,true,0.0001 +game,T10,ip_umfpack,367,0.003971,true,0.0001 +game,T10,ip_klu,367,0.000702,true,0.0001 +game,T10,ip_umfpack,368,0.003521,true,0.0001 +game,T10,ip_klu,368,0.000644,true,0.0001 +game,T10,ip_umfpack,369,0.008831,true,0.0001 +game,T10,ip_klu,369,0.001082,true,0.0001 +game,T10,ip_umfpack,370,0.004264,true,0.0001 +game,T10,ip_klu,370,0.000746,true,0.0001 +game,T10,ip_umfpack,371,0.006362,true,0.0001 +game,T10,ip_klu,371,0.00072,true,0.0001 +game,T10,ip_umfpack,372,0.004208,true,0.0001 +game,T10,ip_klu,372,0.000734,true,0.0001 +game,T10,ip_umfpack,373,0.004232,true,0.0001 +game,T10,ip_klu,373,0.002701,true,0.0001 +game,T10,ip_umfpack,374,0.004286,true,0.0001 +game,T10,ip_klu,374,0.000744,true,0.0001 +game,T10,ip_umfpack,375,0.004175,true,0.0001 +game,T10,ip_klu,375,0.00074,true,0.0001 +game,T10,ip_umfpack,376,0.007707,true,0.0001 +game,T10,ip_klu,376,0.0009,true,0.0001 +game,T10,ip_umfpack,377,0.004444,true,0.0001 +game,T10,ip_klu,377,0.000757,true,0.0001 +game,T10,ip_umfpack,378,0.007421,true,0.0001 +game,T10,ip_klu,378,0.000768,true,0.0001 +game,T10,ip_umfpack,379,0.005081,true,0.0001 +game,T10,ip_klu,379,0.000857,true,0.0001 +game,T10,ip_umfpack,380,0.006255,true,0.0001 +game,T10,ip_klu,380,0.003304,true,0.0001 +game,T10,ip_umfpack,381,0.00427,true,0.0001 +game,T10,ip_klu,381,0.000757,true,0.0001 +game,T10,ip_umfpack,382,0.004188,true,0.0001 +game,T10,ip_klu,382,0.000728,true,0.0001 +game,T10,ip_umfpack,383,0.006307,true,0.0001 +game,T10,ip_klu,383,0.00075,true,0.0001 +game,T10,ip_umfpack,384,0.004231,true,0.0001 +game,T10,ip_klu,384,0.000734,true,0.0001 +game,T10,ip_umfpack,385,0.003993,true,0.0001 +game,T10,ip_klu,385,0.0007,true,0.0001 +game,T10,ip_umfpack,386,0.006227,true,0.0001 +game,T10,ip_klu,386,0.000752,true,0.0001 +game,T10,ip_umfpack,387,0.004903,true,0.0001 +game,T10,ip_klu,387,0.00082,true,0.0001 +game,T10,ip_umfpack,388,0.007686,true,0.0001 +game,T10,ip_klu,388,0.000808,true,0.0001 +game,T10,ip_umfpack,389,0.004347,true,0.0001 +game,T10,ip_klu,389,0.000763,true,0.0001 +game,T10,ip_umfpack,390,0.00521,true,0.0001 +game,T10,ip_klu,390,0.000897,true,0.0001 +game,T10,ip_umfpack,391,0.007333,true,0.0001 +game,T10,ip_klu,391,0.000751,true,0.0001 +game,T10,ip_umfpack,392,0.004247,true,0.0001 +game,T10,ip_klu,392,0.000775,true,0.0001 +game,T10,ip_umfpack,393,0.004258,true,0.0001 +game,T10,ip_klu,393,0.003084,true,0.0001 +game,T10,ip_umfpack,394,0.004265,true,0.0001 +game,T10,ip_klu,394,0.000746,true,0.0001 +game,T10,ip_umfpack,395,0.003979,true,0.0001 +game,T10,ip_klu,395,0.000707,true,0.0001 +game,T10,ip_umfpack,396,0.00639,true,0.0001 +game,T10,ip_klu,396,0.000744,true,0.0001 +game,T10,ip_umfpack,397,0.004206,true,0.0001 +game,T10,ip_klu,397,0.000745,true,0.0001 +game,T10,ip_umfpack,398,0.005327,true,0.0001 +game,T10,ip_klu,398,0.000903,true,0.0001 +game,T10,ip_umfpack,399,0.00643,true,0.0001 +game,T10,ip_klu,399,0.000742,true,0.0001 +game,T10,ip_umfpack,400,0.004199,true,0.0001 +game,T10,ip_klu,400,0.000732,true,0.0001 +game,T10,ip_umfpack,401,0.006042,true,0.0001 +game,T10,ip_klu,401,0.000734,true,0.0001 +game,T10,ip_umfpack,402,0.004204,true,0.0001 +game,T10,ip_klu,402,0.000729,true,0.0001 +game,T10,ip_umfpack,403,0.003729,true,0.0001 +game,T10,ip_klu,403,0.000675,true,0.0001 +game,T10,ip_umfpack,404,0.00621,true,0.0001 +game,T10,ip_klu,404,0.000712,true,0.0001 +game,T10,ip_umfpack,405,0.007278,true,0.0001 +game,T10,ip_klu,405,0.001171,true,0.0001 +game,T10,ip_umfpack,406,0.005927,true,0.0001 +game,T10,ip_klu,406,0.000714,true,0.0001 +game,T10,ip_umfpack,407,0.007818,true,0.0001 +game,T10,ip_klu,407,0.001221,true,0.0001 +game,T10,ip_umfpack,408,0.007573,true,0.0001 +game,T10,ip_klu,408,0.000773,true,0.0001 +game,T10,ip_umfpack,409,0.004519,true,0.0001 +game,T10,ip_klu,409,0.000787,true,0.0001 +game,T10,ip_umfpack,410,0.004276,true,0.0001 +game,T10,ip_klu,410,0.000758,true,0.0001 +game,T10,ip_umfpack,411,0.006973,true,0.0001 +game,T10,ip_klu,411,0.000807,true,0.0001 +game,T10,ip_umfpack,412,0.004233,true,0.0001 +game,T10,ip_klu,412,0.00074,true,0.0001 +game,T10,ip_umfpack,413,0.009937,true,0.0001 +game,T10,ip_klu,413,0.00115,true,0.0001 +game,T10,ip_umfpack,414,0.004362,true,0.0001 +game,T10,ip_klu,414,0.000803,true,0.0001 +game,T10,ip_umfpack,415,0.00422,true,0.0001 +game,T10,ip_klu,415,0.000788,true,0.0001 +game,T10,ip_umfpack,416,0.008628,true,0.0001 +game,T10,ip_klu,416,0.000927,true,0.0001 +game,T10,ip_umfpack,417,0.004196,true,0.0001 +game,T10,ip_klu,417,0.000724,true,0.0001 +game,T10,ip_umfpack,418,0.004045,true,0.0001 +game,T10,ip_klu,418,0.003216,true,0.0001 +game,T10,ip_umfpack,419,0.004317,true,0.0001 +game,T10,ip_klu,419,0.000748,true,0.0001 +game,T10,ip_umfpack,420,0.003786,true,0.0001 +game,T10,ip_klu,420,0.00067,true,0.0001 +game,T10,ip_umfpack,421,0.007686,true,0.0001 +game,T10,ip_klu,421,0.000908,true,0.0001 +game,T10,ip_umfpack,422,0.0042,true,0.0001 +game,T10,ip_klu,422,0.000726,true,0.0001 +game,T10,ip_umfpack,423,0.004877,true,0.0001 +game,T10,ip_klu,423,0.002743,true,0.0001 +game,T10,ip_umfpack,424,0.003758,true,0.0001 +game,T10,ip_klu,424,0.000683,true,0.0001 +game,T10,ip_umfpack,425,0.005719,true,0.0001 +game,T10,ip_klu,425,0.000927,true,0.0001 +game,T10,ip_umfpack,426,0.007509,true,0.0001 +game,T10,ip_klu,426,0.000879,true,0.0001 +game,T10,ip_umfpack,427,0.006226,true,0.0001 +game,T10,ip_klu,427,0.001014,true,0.0001 +game,T10,ip_umfpack,428,0.006154,true,0.0001 +game,T10,ip_klu,428,0.00072,true,0.0001 +game,T10,ip_umfpack,429,0.004669,true,0.0001 +game,T10,ip_klu,429,0.000794,true,0.0001 +game,T10,ip_umfpack,430,0.004307,true,0.0001 +game,T10,ip_klu,430,0.000778,true,0.0001 +game,T10,ip_umfpack,431,0.004309,true,0.0001 +game,T10,ip_klu,431,0.000754,true,0.0001 +game,T10,ip_umfpack,432,0.005164,true,0.0001 +game,T10,ip_klu,432,0.000866,true,0.0001 +game,T10,ip_umfpack,433,0.00746,true,0.0001 +game,T10,ip_klu,433,0.000898,true,0.0001 +game,T10,ip_umfpack,434,0.004636,true,0.0001 +game,T10,ip_klu,434,0.000843,true,0.0001 +game,T10,ip_umfpack,435,0.00617,true,0.0001 +game,T10,ip_klu,435,0.000748,true,0.0001 +game,T10,ip_umfpack,436,0.004236,true,0.0001 +game,T10,ip_klu,436,0.000738,true,0.0001 +game,T10,ip_umfpack,437,0.00425,true,0.0001 +game,T10,ip_klu,437,0.000741,true,0.0001 +game,T10,ip_umfpack,438,0.006364,true,0.0001 +game,T10,ip_klu,438,0.000719,true,0.0001 +game,T10,ip_umfpack,439,0.003959,true,0.0001 +game,T10,ip_klu,439,0.000701,true,0.0001 +game,T10,ip_umfpack,440,0.004234,true,0.0001 +game,T10,ip_klu,440,0.000741,true,0.0001 +game,T10,ip_umfpack,441,0.006475,true,0.0001 +game,T10,ip_klu,441,0.000772,true,0.0001 +game,T10,ip_umfpack,442,0.004176,true,0.0001 +game,T10,ip_klu,442,0.000745,true,0.0001 +game,T10,ip_umfpack,443,0.006319,true,0.0001 +game,T10,ip_klu,443,0.000746,true,0.0001 +game,T10,ip_umfpack,444,0.004266,true,0.0001 +game,T10,ip_klu,444,0.000749,true,0.0001 +game,T10,ip_umfpack,445,0.004017,true,0.0001 +game,T10,ip_klu,445,0.000736,true,0.0001 +game,T10,ip_umfpack,446,0.007734,true,0.0001 +game,T10,ip_klu,446,0.000864,true,0.0001 +game,T10,ip_umfpack,447,0.003539,true,0.0001 +game,T10,ip_klu,447,0.000651,true,0.0001 +game,T10,ip_umfpack,448,0.006235,true,0.0001 +game,T10,ip_klu,448,0.000736,true,0.0001 +game,T10,ip_umfpack,449,0.004242,true,0.0001 +game,T10,ip_klu,449,0.000736,true,0.0001 +game,T10,ip_umfpack,450,0.004158,true,0.0001 +game,T10,ip_klu,450,0.000728,true,0.0001 +game,T10,ip_umfpack,451,0.006091,true,0.0001 +game,T10,ip_klu,451,0.000827,true,0.0001 +game,T10,ip_umfpack,452,0.004002,true,0.0001 +game,T10,ip_klu,452,0.000705,true,0.0001 +game,T10,ip_umfpack,453,0.005374,true,0.0001 +game,T10,ip_klu,453,0.0009,true,0.0001 +game,T10,ip_umfpack,454,0.006385,true,0.0001 +game,T10,ip_klu,454,0.000742,true,0.0001 +game,T10,ip_umfpack,455,0.003945,true,0.0001 +game,T10,ip_klu,455,0.000705,true,0.0001 +game,T10,ip_umfpack,456,0.006247,true,0.0001 +game,T10,ip_klu,456,0.000741,true,0.0001 +game,T10,ip_umfpack,457,0.005138,true,0.0001 +game,T10,ip_klu,457,0.000852,true,0.0001 +game,T10,ip_umfpack,458,0.004188,true,0.0001 +game,T10,ip_klu,458,0.000752,true,0.0001 +game,T10,ip_umfpack,459,0.005957,true,0.0001 +game,T10,ip_klu,459,0.000715,true,0.0001 +game,T10,ip_umfpack,460,0.003986,true,0.0001 +game,T10,ip_klu,460,0.000698,true,0.0001 +game,T10,ip_umfpack,461,0.004921,true,0.0001 +game,T10,ip_klu,461,0.002767,true,0.0001 +game,T10,ip_umfpack,462,0.004218,true,0.0001 +game,T10,ip_klu,462,0.000731,true,0.0001 +game,T10,ip_umfpack,463,0.004426,true,0.0001 +game,T10,ip_klu,463,0.000777,true,0.0001 +game,T10,ip_umfpack,464,0.007639,true,0.0001 +game,T10,ip_klu,464,0.000757,true,0.0001 +game,T10,ip_umfpack,465,0.004746,true,0.0001 +game,T10,ip_klu,465,0.000802,true,0.0001 +game,T10,ip_umfpack,466,0.004246,true,0.0001 +game,T10,ip_klu,466,0.000763,true,0.0001 +game,T10,ip_umfpack,467,0.006956,true,0.0001 +game,T10,ip_klu,467,0.000758,true,0.0001 +game,T10,ip_umfpack,468,0.004022,true,0.0001 +game,T10,ip_klu,468,0.000738,true,0.0001 +game,T10,ip_umfpack,469,0.007091,true,0.0001 +game,T10,ip_klu,469,0.000757,true,0.0001 +game,T10,ip_umfpack,470,0.00425,true,0.0001 +game,T10,ip_klu,470,0.000744,true,0.0001 +game,T10,ip_umfpack,471,0.004001,true,0.0001 +game,T10,ip_klu,471,0.000704,true,0.0001 +game,T10,ip_umfpack,472,0.006898,true,0.0001 +game,T10,ip_klu,472,0.000827,true,0.0001 +game,T10,ip_umfpack,473,0.003967,true,0.0001 +game,T10,ip_klu,473,0.000698,true,0.0001 +game,T10,ip_umfpack,474,0.004177,true,0.0001 +game,T10,ip_klu,474,0.00075,true,0.0001 +game,T10,ip_umfpack,475,0.004253,true,0.0001 +game,T10,ip_klu,475,0.000737,true,0.0001 +game,T10,ip_umfpack,476,0.003959,true,0.0001 +game,T10,ip_klu,476,0.000703,true,0.0001 +game,T10,ip_umfpack,477,0.003763,true,0.0001 +game,T10,ip_klu,477,0.002449,true,0.0001 +game,T10,ip_umfpack,478,0.004182,true,0.0001 +game,T10,ip_klu,478,0.000731,true,0.0001 +game,T10,ip_umfpack,479,0.003934,true,0.0001 +game,T10,ip_klu,479,0.000699,true,0.0001 +game,T10,ip_umfpack,480,0.007669,true,0.0001 +game,T10,ip_klu,480,0.000924,true,0.0001 +game,T10,ip_umfpack,481,0.003997,true,0.0001 +game,T10,ip_klu,481,0.000694,true,0.0001 +game,T10,ip_umfpack,482,0.003966,true,0.0001 +game,T10,ip_klu,482,0.000716,true,0.0001 +game,T10,ip_umfpack,483,0.005801,true,0.0001 +game,T10,ip_klu,483,0.000713,true,0.0001 +game,T10,ip_umfpack,484,0.004226,true,0.0001 +game,T10,ip_klu,484,0.000739,true,0.0001 +game,T10,ip_umfpack,485,0.006497,true,0.0001 +game,T10,ip_klu,485,0.000745,true,0.0001 +game,T10,ip_umfpack,486,0.004488,true,0.0001 +game,T10,ip_klu,486,0.000769,true,0.0001 +game,T10,ip_umfpack,487,0.003738,true,0.0001 +game,T10,ip_klu,487,0.000675,true,0.0001 +game,T10,ip_umfpack,488,0.006665,true,0.0001 +game,T10,ip_klu,488,0.000769,true,0.0001 +game,T10,ip_umfpack,489,0.003948,true,0.0001 +game,T10,ip_klu,489,0.000696,true,0.0001 +game,T10,ip_umfpack,490,0.003952,true,0.0001 +game,T10,ip_klu,490,0.000699,true,0.0001 +game,T10,ip_umfpack,491,0.008236,true,0.0001 +game,T10,ip_klu,491,0.001012,true,0.0001 +game,T10,ip_umfpack,492,0.004161,true,0.0001 +game,T10,ip_klu,492,0.000732,true,0.0001 +game,T10,ip_umfpack,493,0.005929,true,0.0001 +game,T10,ip_klu,493,0.000712,true,0.0001 +game,T10,ip_umfpack,494,0.00397,true,0.0001 +game,T10,ip_klu,494,0.000719,true,0.0001 +game,T10,ip_umfpack,495,0.004194,true,0.0001 +game,T10,ip_klu,495,0.000751,true,0.0001 +game,T10,ip_umfpack,496,0.005969,true,0.0001 +game,T10,ip_klu,496,0.000704,true,0.0001 +game,T10,ip_umfpack,497,0.004881,true,0.0001 +game,T10,ip_klu,497,0.00081,true,0.0001 +game,T10,ip_umfpack,498,0.00643,true,0.0001 +game,T10,ip_klu,498,0.000775,true,0.0001 +game,T10,ip_umfpack,499,0.004393,true,0.0001 +game,T10,ip_klu,499,0.000764,true,0.0001 +game,T10,ip_umfpack,500,0.005988,true,0.0001 +game,T10,ip_klu,500,0.002807,true,0.0001 +game,T10,ip_umfpack,501,0.00425,true,0.0001 +game,T10,ip_klu,501,0.000734,true,0.0001 +game,T10,ip_umfpack,502,0.003985,true,0.0001 +game,T10,ip_klu,502,0.000707,true,0.0001 +game,T10,ip_umfpack,503,0.00601,true,0.0001 +game,T10,ip_klu,503,0.000684,true,0.0001 +game,T10,ip_umfpack,504,0.003995,true,0.0001 +game,T10,ip_klu,504,0.000701,true,0.0001 +game,T10,ip_umfpack,505,0.005811,true,0.0001 +game,T10,ip_klu,505,0.000988,true,0.0001 +game,T10,ip_umfpack,506,0.006919,true,0.0001 +game,T10,ip_klu,506,0.00078,true,0.0001 +game,T10,ip_umfpack,507,0.004424,true,0.0001 +game,T10,ip_klu,507,0.000758,true,0.0001 +game,T10,ip_umfpack,508,0.008982,true,0.0001 +game,T10,ip_klu,508,0.001111,true,0.0001 +game,T10,ip_umfpack,509,0.004189,true,0.0001 +game,T10,ip_klu,509,0.000733,true,0.0001 +game,T10,ip_umfpack,510,0.007347,true,0.0001 +game,T10,ip_klu,510,0.00078,true,0.0001 +game,T10,ip_umfpack,511,0.00428,true,0.0001 +game,T10,ip_klu,511,0.000768,true,0.0001 +game,T10,ip_umfpack,512,0.004225,true,0.0001 +game,T10,ip_klu,512,0.000752,true,0.0001 +game,T10,ip_umfpack,513,0.007872,true,0.0001 +game,T10,ip_klu,513,0.000931,true,0.0001 +game,T10,ip_umfpack,514,0.003928,true,0.0001 +game,T10,ip_klu,514,0.0007,true,0.0001 +game,T10,ip_umfpack,515,0.004196,true,0.0001 +game,T10,ip_klu,515,0.00267,true,0.0001 +game,T10,ip_umfpack,516,0.004225,true,0.0001 +game,T10,ip_klu,516,0.000752,true,0.0001 +game,T10,ip_umfpack,517,0.004218,true,0.0001 +game,T10,ip_klu,517,0.000754,true,0.0001 +game,T10,ip_umfpack,518,0.006186,true,0.0001 +game,T10,ip_klu,518,0.00071,true,0.0001 +game,T10,ip_umfpack,519,0.004398,true,0.0001 +game,T10,ip_klu,519,0.000765,true,0.0001 +game,T10,ip_umfpack,520,0.003961,true,0.0001 +game,T10,ip_klu,520,0.000714,true,0.0001 +game,T10,ip_umfpack,521,0.00579,true,0.0001 +game,T10,ip_klu,521,0.000719,true,0.0001 +game,T10,ip_umfpack,522,0.004437,true,0.0001 +game,T10,ip_klu,522,0.000759,true,0.0001 +game,T10,ip_umfpack,523,0.00418,true,0.0001 +game,T10,ip_klu,523,0.000737,true,0.0001 +game,T10,ip_umfpack,524,0.004025,true,0.0001 +game,T10,ip_klu,524,0.000707,true,0.0001 +game,T10,ip_umfpack,525,0.004683,true,0.0001 +game,T10,ip_klu,525,0.000792,true,0.0001 +game,T10,ip_umfpack,526,0.006888,true,0.0001 +game,T10,ip_klu,526,0.000782,true,0.0001 +game,T10,ip_umfpack,527,0.004009,true,0.0001 +game,T10,ip_klu,527,0.000711,true,0.0001 +game,T10,ip_umfpack,528,0.005319,true,0.0001 +game,T10,ip_klu,528,0.000925,true,0.0001 +game,T10,ip_umfpack,529,0.004003,true,0.0001 +game,T10,ip_klu,529,0.000705,true,0.0001 +game,T10,ip_umfpack,530,0.003953,true,0.0001 +game,T10,ip_klu,530,0.000706,true,0.0001 +game,T10,ip_umfpack,531,0.006312,true,0.0001 +game,T10,ip_klu,531,0.000747,true,0.0001 +game,T10,ip_umfpack,532,0.00401,true,0.0001 +game,T10,ip_klu,532,0.000692,true,0.0001 +game,T10,ip_umfpack,533,0.004231,true,0.0001 +game,T10,ip_klu,533,0.000733,true,0.0001 +game,T10,ip_umfpack,534,0.006459,true,0.0001 +game,T10,ip_klu,534,0.000732,true,0.0001 +game,T10,ip_umfpack,535,0.00423,true,0.0001 +game,T10,ip_klu,535,0.000736,true,0.0001 +game,T10,ip_umfpack,536,0.003829,true,0.0001 +game,T10,ip_klu,536,0.000682,true,0.0001 +game,T10,ip_umfpack,537,0.006388,true,0.0001 +game,T10,ip_klu,537,0.000745,true,0.0001 +game,T10,ip_umfpack,538,0.004393,true,0.0001 +game,T10,ip_klu,538,0.000756,true,0.0001 +game,T10,ip_umfpack,539,0.006769,true,0.0001 +game,T10,ip_klu,539,0.000769,true,0.0001 +game,T10,ip_umfpack,540,0.003977,true,0.0001 +game,T10,ip_klu,540,0.000703,true,0.0001 +game,T10,ip_umfpack,541,0.004675,true,0.0001 +game,T10,ip_klu,541,0.000814,true,0.0001 +game,T10,ip_umfpack,542,0.005993,true,0.0001 +game,T10,ip_klu,542,0.00071,true,0.0001 +game,T10,ip_umfpack,543,0.003752,true,0.0001 +game,T10,ip_klu,543,0.000671,true,0.0001 +game,T10,ip_umfpack,544,0.00397,true,0.0001 +game,T10,ip_klu,544,0.000708,true,0.0001 +game,T10,ip_umfpack,545,0.006714,true,0.0001 +game,T10,ip_klu,545,0.00072,true,0.0001 +game,T10,ip_umfpack,546,0.004256,true,0.0001 +game,T10,ip_klu,546,0.000746,true,0.0001 +game,T10,ip_umfpack,547,0.004018,true,0.0001 +game,T10,ip_klu,547,0.00269,true,0.0001 +game,T10,ip_umfpack,548,0.004226,true,0.0001 +game,T10,ip_klu,548,0.000743,true,0.0001 +game,T10,ip_umfpack,549,0.004184,true,0.0001 +game,T10,ip_klu,549,0.000739,true,0.0001 +game,T10,ip_umfpack,550,0.006009,true,0.0001 +game,T10,ip_klu,550,0.000706,true,0.0001 +game,T10,ip_umfpack,551,0.004407,true,0.0001 +game,T10,ip_klu,551,0.000765,true,0.0001 +game,T10,ip_umfpack,552,0.004561,true,0.0001 +game,T10,ip_klu,552,0.000824,true,0.0001 +game,T10,ip_umfpack,553,0.007831,true,0.0001 +game,T10,ip_klu,553,0.000754,true,0.0001 +game,T10,ip_umfpack,554,0.004292,true,0.0001 +game,T10,ip_klu,554,0.000972,true,0.0001 +game,T10,ip_umfpack,555,0.005003,true,0.0001 +game,T10,ip_klu,555,0.003353,true,0.0001 +game,T10,ip_umfpack,556,0.00429,true,0.0001 +game,T10,ip_klu,556,0.000745,true,0.0001 +game,T10,ip_umfpack,557,0.003997,true,0.0001 +game,T10,ip_klu,557,0.00071,true,0.0001 +game,T10,ip_umfpack,558,0.007063,true,0.0001 +game,T10,ip_klu,558,0.000815,true,0.0001 +game,T10,ip_umfpack,559,0.00421,true,0.0001 +game,T10,ip_klu,559,0.000738,true,0.0001 +game,T10,ip_umfpack,560,0.004185,true,0.0001 +game,T10,ip_klu,560,0.000749,true,0.0001 +game,T10,ip_umfpack,561,0.006433,true,0.0001 +game,T10,ip_klu,561,0.000736,true,0.0001 +game,T10,ip_umfpack,562,0.00398,true,0.0001 +game,T10,ip_klu,562,0.000709,true,0.0001 +game,T10,ip_umfpack,563,0.003974,true,0.0001 +game,T10,ip_klu,563,0.002574,true,0.0001 +game,T10,ip_umfpack,564,0.004197,true,0.0001 +game,T10,ip_klu,564,0.000737,true,0.0001 +game,T10,ip_umfpack,565,0.004242,true,0.0001 +game,T10,ip_klu,565,0.000744,true,0.0001 +game,T10,ip_umfpack,566,0.006923,true,0.0001 +game,T10,ip_klu,566,0.000743,true,0.0001 +game,T10,ip_umfpack,567,0.006852,true,0.0001 +game,T10,ip_klu,567,0.001102,true,0.0001 +game,T10,ip_umfpack,568,0.006341,true,0.0001 +game,T10,ip_klu,568,0.000745,true,0.0001 +game,T10,ip_umfpack,569,0.004232,true,0.0001 +game,T10,ip_klu,569,0.000735,true,0.0001 +game,T10,ip_umfpack,570,0.004428,true,0.0001 +game,T10,ip_klu,570,0.000768,true,0.0001 +game,T10,ip_umfpack,571,0.00847,true,0.0001 +game,T10,ip_klu,571,0.001061,true,0.0001 +game,T10,ip_umfpack,572,0.004186,true,0.0001 +game,T10,ip_klu,572,0.000731,true,0.0001 +game,T10,ip_umfpack,573,0.006334,true,0.0001 +game,T10,ip_klu,573,0.000749,true,0.0001 +game,T10,ip_umfpack,574,0.003755,true,0.0001 +game,T10,ip_klu,574,0.000667,true,0.0001 +game,T10,ip_umfpack,575,0.004203,true,0.0001 +game,T10,ip_klu,575,0.000731,true,0.0001 +game,T10,ip_umfpack,576,0.004128,true,0.0001 +game,T10,ip_klu,576,0.000747,true,0.0001 +game,T10,ip_umfpack,577,0.003378,true,0.0001 +game,T10,ip_klu,577,0.000625,true,0.0001 +game,T10,ip_umfpack,578,0.004309,true,0.0001 +game,T10,ip_klu,578,0.003009,true,0.0001 +game,T10,ip_umfpack,579,0.005387,true,0.0001 +game,T10,ip_klu,579,0.000898,true,0.0001 +game,T10,ip_umfpack,580,0.005769,true,0.0001 +game,T10,ip_klu,580,0.000989,true,0.0001 +game,T10,ip_umfpack,581,0.004231,true,0.0001 +game,T10,ip_klu,581,0.000746,true,0.0001 +game,T10,ip_umfpack,582,0.004448,true,0.0001 +game,T10,ip_klu,582,0.000756,true,0.0001 +game,T10,ip_umfpack,583,0.00838,true,0.0001 +game,T10,ip_klu,583,0.001044,true,0.0001 +game,T10,ip_umfpack,584,0.004205,true,0.0001 +game,T10,ip_klu,584,0.00073,true,0.0001 +game,T10,ip_umfpack,585,0.006818,true,0.0001 +game,T10,ip_klu,585,0.000751,true,0.0001 +game,T10,ip_umfpack,586,0.003871,true,0.0001 +game,T10,ip_klu,586,0.000689,true,0.0001 +game,T10,ip_umfpack,587,0.00538,true,0.0001 +game,T10,ip_klu,587,0.000891,true,0.0001 +game,T10,ip_umfpack,588,0.006524,true,0.0001 +game,T10,ip_klu,588,0.000755,true,0.0001 +game,T10,ip_umfpack,589,0.004211,true,0.0001 +game,T10,ip_klu,589,0.000734,true,0.0001 +game,T10,ip_umfpack,590,0.007792,true,0.0001 +game,T10,ip_klu,590,0.000962,true,0.0001 +game,T10,ip_umfpack,591,0.00401,true,0.0001 +game,T10,ip_klu,591,0.000697,true,0.0001 +game,T10,ip_umfpack,592,0.005312,true,0.0001 +game,T10,ip_klu,592,0.000937,true,0.0001 +game,T10,ip_umfpack,593,0.008349,true,0.0001 +game,T10,ip_klu,593,0.00081,true,0.0001 +game,T10,ip_umfpack,594,0.00432,true,0.0001 +game,T10,ip_klu,594,0.000762,true,0.0001 +game,T10,ip_umfpack,595,0.007348,true,0.0001 +game,T10,ip_klu,595,0.000813,true,0.0001 +game,T10,ip_umfpack,596,0.004269,true,0.0001 +game,T10,ip_klu,596,0.000753,true,0.0001 +game,T10,ip_umfpack,597,0.00537,true,0.0001 +game,T10,ip_klu,597,0.000925,true,0.0001 +game,T10,ip_umfpack,598,0.007737,true,0.0001 +game,T10,ip_klu,598,0.000898,true,0.0001 +game,T10,ip_umfpack,599,0.00445,true,0.0001 +game,T10,ip_klu,599,0.000756,true,0.0001 +game,T10,ip_umfpack,600,0.006802,true,0.0001 +game,T10,ip_klu,600,0.000806,true,0.0001 +game,T10,ip_umfpack,601,0.004619,true,0.0001 +game,T10,ip_klu,601,0.000796,true,0.0001 +game,T10,ip_umfpack,602,0.004321,true,0.0001 +game,T10,ip_klu,602,0.003369,true,0.0001 +game,T10,ip_umfpack,603,0.00478,true,0.0001 +game,T10,ip_klu,603,0.000812,true,0.0001 +game,T10,ip_umfpack,604,0.004248,true,0.0001 +game,T10,ip_klu,604,0.000729,true,0.0001 +game,T10,ip_umfpack,605,0.00762,true,0.0001 +game,T10,ip_klu,605,0.000898,true,0.0001 +game,T10,ip_umfpack,606,0.004222,true,0.0001 +game,T10,ip_klu,606,0.000729,true,0.0001 +game,T10,ip_umfpack,607,0.004238,true,0.0001 +game,T10,ip_klu,607,0.002679,true,0.0001 +game,T10,ip_umfpack,608,0.00422,true,0.0001 +game,T10,ip_klu,608,0.000728,true,0.0001 +game,T10,ip_umfpack,609,0.004199,true,0.0001 +game,T10,ip_klu,609,0.000728,true,0.0001 +game,T10,ip_umfpack,610,0.006313,true,0.0001 +game,T10,ip_klu,610,0.000742,true,0.0001 +game,T10,ip_umfpack,611,0.003985,true,0.0001 +game,T10,ip_klu,611,0.000698,true,0.0001 +game,T10,ip_umfpack,612,0.004435,true,0.0001 +game,T10,ip_klu,612,0.000764,true,0.0001 +game,T10,ip_umfpack,613,0.006594,true,0.0001 +game,T10,ip_klu,613,0.000773,true,0.0001 +game,T10,ip_umfpack,614,0.004421,true,0.0001 +game,T10,ip_klu,614,0.000764,true,0.0001 +game,T10,ip_umfpack,615,0.004018,true,0.0001 +game,T10,ip_klu,615,0.002571,true,0.0001 +game,T10,ip_umfpack,616,0.004259,true,0.0001 +game,T10,ip_klu,616,0.000734,true,0.0001 +game,T10,ip_umfpack,617,0.004187,true,0.0001 +game,T10,ip_klu,617,0.000728,true,0.0001 +game,T10,ip_umfpack,618,0.006418,true,0.0001 +game,T10,ip_klu,618,0.000744,true,0.0001 +game,T10,ip_umfpack,619,0.0042,true,0.0001 +game,T10,ip_klu,619,0.000731,true,0.0001 +game,T10,ip_umfpack,620,0.004664,true,0.0001 +game,T10,ip_klu,620,0.000817,true,0.0001 +game,T10,ip_umfpack,621,0.003811,true,0.0001 +game,T10,ip_klu,621,0.00069,true,0.0001 +game,T10,ip_umfpack,622,0.004237,true,0.0001 +game,T10,ip_klu,622,0.000744,true,0.0001 +game,T10,ip_umfpack,623,0.004247,true,0.0001 +game,T10,ip_klu,623,0.002732,true,0.0001 +game,T10,ip_umfpack,624,0.005453,true,0.0001 +game,T10,ip_klu,624,0.000884,true,0.0001 +game,T10,ip_umfpack,625,0.004222,true,0.0001 +game,T10,ip_klu,625,0.000759,true,0.0001 +game,T10,ip_umfpack,626,0.006788,true,0.0001 +game,T10,ip_klu,626,0.000748,true,0.0001 +game,T10,ip_umfpack,627,0.004176,true,0.0001 +game,T10,ip_klu,627,0.00074,true,0.0001 +game,T10,ip_umfpack,628,0.004008,true,0.0001 +game,T10,ip_klu,628,0.00288,true,0.0001 +game,T10,ip_umfpack,629,0.004912,true,0.0001 +game,T10,ip_klu,629,0.000857,true,0.0001 +game,T10,ip_umfpack,630,0.005269,true,0.0001 +game,T10,ip_klu,630,0.000909,true,0.0001 +game,T10,ip_umfpack,631,0.007901,true,0.0001 +game,T10,ip_klu,631,0.000762,true,0.0001 +game,T10,ip_umfpack,632,0.004234,true,0.0001 +game,T10,ip_klu,632,0.000753,true,0.0001 +game,T10,ip_umfpack,633,0.007664,true,0.0001 +game,T10,ip_klu,633,0.000872,true,0.0001 +game,T10,ip_umfpack,634,0.00422,true,0.0001 +game,T10,ip_klu,634,0.000742,true,0.0001 +game,T10,ip_umfpack,635,0.004448,true,0.0001 +game,T10,ip_klu,635,0.000791,true,0.0001 +game,T10,ip_umfpack,636,0.00652,true,0.0001 +game,T10,ip_klu,636,0.000746,true,0.0001 +game,T10,ip_umfpack,637,0.004036,true,0.0001 +game,T10,ip_klu,637,0.000717,true,0.0001 +game,T10,ip_umfpack,638,0.004253,true,0.0001 +game,T10,ip_klu,638,0.000778,true,0.0001 +game,T10,ip_umfpack,639,0.004268,true,0.0001 +game,T10,ip_klu,639,0.000748,true,0.0001 +game,T10,ip_umfpack,640,0.004182,true,0.0001 +game,T10,ip_klu,640,0.00074,true,0.0001 +game,T10,ip_umfpack,641,0.006311,true,0.0001 +game,T10,ip_klu,641,0.000743,true,0.0001 +game,T10,ip_umfpack,642,0.004211,true,0.0001 +game,T10,ip_klu,642,0.000738,true,0.0001 +game,T10,ip_umfpack,643,0.003961,true,0.0001 +game,T10,ip_klu,643,0.000702,true,0.0001 +game,T10,ip_umfpack,644,0.00639,true,0.0001 +game,T10,ip_klu,644,0.000749,true,0.0001 +game,T10,ip_umfpack,645,0.004198,true,0.0001 +game,T10,ip_klu,645,0.000727,true,0.0001 +game,T10,ip_umfpack,646,0.008472,true,0.0001 +game,T10,ip_klu,646,0.001273,true,0.0001 +game,T10,ip_umfpack,647,0.004218,true,0.0001 +game,T10,ip_klu,647,0.000747,true,0.0001 +game,T10,ip_umfpack,648,0.004182,true,0.0001 +game,T10,ip_klu,648,0.000752,true,0.0001 +game,T10,ip_umfpack,649,0.007902,true,0.0001 +game,T10,ip_klu,649,0.000946,true,0.0001 +game,T10,ip_umfpack,650,0.003955,true,0.0001 +game,T10,ip_klu,650,0.000698,true,0.0001 +game,T10,ip_umfpack,651,0.006095,true,0.0001 +game,T10,ip_klu,651,0.000737,true,0.0001 +game,T10,ip_umfpack,652,0.005352,true,0.0001 +game,T10,ip_klu,652,0.000877,true,0.0001 +game,T10,ip_umfpack,653,0.004436,true,0.0001 +game,T10,ip_klu,653,0.000773,true,0.0001 +game,T10,ip_umfpack,654,0.00641,true,0.0001 +game,T10,ip_klu,654,0.000763,true,0.0001 +game,T10,ip_umfpack,655,0.004198,true,0.0001 +game,T10,ip_klu,655,0.000736,true,0.0001 +game,T10,ip_umfpack,656,0.006218,true,0.0001 +game,T10,ip_klu,656,0.000748,true,0.0001 +game,T10,ip_umfpack,657,0.00515,true,0.0001 +game,T10,ip_klu,657,0.00085,true,0.0001 +game,T10,ip_umfpack,658,0.004229,true,0.0001 +game,T10,ip_klu,658,0.00074,true,0.0001 +game,T10,ip_umfpack,659,0.006018,true,0.0001 +game,T10,ip_klu,659,0.000718,true,0.0001 +game,T10,ip_umfpack,660,0.004312,true,0.0001 +game,T10,ip_klu,660,0.000742,true,0.0001 +game,T10,ip_umfpack,661,0.007361,true,0.0001 +game,T10,ip_klu,661,0.000844,true,0.0001 +game,T10,ip_umfpack,662,0.004229,true,0.0001 +game,T10,ip_klu,662,0.000741,true,0.0001 +game,T10,ip_umfpack,663,0.004197,true,0.0001 +game,T10,ip_klu,663,0.000748,true,0.0001 +game,T10,ip_umfpack,664,0.007534,true,0.0001 +game,T10,ip_klu,664,0.000893,true,0.0001 +game,T10,ip_umfpack,665,0.004214,true,0.0001 +game,T10,ip_klu,665,0.000736,true,0.0001 +game,T10,ip_umfpack,666,0.003774,true,0.0001 +game,T10,ip_klu,666,0.000688,true,0.0001 +game,T10,ip_umfpack,667,0.006121,true,0.0001 +game,T10,ip_klu,667,0.000736,true,0.0001 +game,T10,ip_umfpack,668,0.004188,true,0.0001 +game,T10,ip_klu,668,0.000744,true,0.0001 +game,T10,ip_umfpack,669,0.006664,true,0.0001 +game,T10,ip_klu,669,0.000731,true,0.0001 +game,T10,ip_umfpack,670,0.004086,true,0.0001 +game,T10,ip_klu,670,0.000744,true,0.0001 +game,T10,ip_umfpack,671,0.004249,true,0.0001 +game,T10,ip_klu,671,0.000741,true,0.0001 +game,T10,ip_umfpack,672,0.006696,true,0.0001 +game,T10,ip_klu,672,0.000755,true,0.0001 +game,T10,ip_umfpack,673,0.004222,true,0.0001 +game,T10,ip_klu,673,0.000731,true,0.0001 +game,T10,ip_umfpack,674,0.004227,true,0.0001 +game,T10,ip_klu,674,0.000746,true,0.0001 +game,T10,ip_umfpack,675,0.006427,true,0.0001 +game,T10,ip_klu,675,0.000768,true,0.0001 +game,T10,ip_umfpack,676,0.004427,true,0.0001 +game,T10,ip_klu,676,0.000818,true,0.0001 +game,T10,ip_umfpack,677,0.006179,true,0.0001 +game,T10,ip_klu,677,0.000734,true,0.0001 +game,T10,ip_umfpack,678,0.004001,true,0.0001 +game,T10,ip_klu,678,0.000695,true,0.0001 +game,T10,ip_umfpack,679,0.005179,true,0.0001 +game,T10,ip_klu,679,0.000887,true,0.0001 +game,T10,ip_umfpack,680,0.006581,true,0.0001 +game,T10,ip_klu,680,0.000718,true,0.0001 +game,T10,ip_umfpack,681,0.003983,true,0.0001 +game,T10,ip_klu,681,0.000701,true,0.0001 +game,T10,ip_umfpack,682,0.004454,true,0.0001 +game,T10,ip_klu,682,0.000786,true,0.0001 +game,T10,ip_umfpack,683,0.00401,true,0.0001 +game,T10,ip_klu,683,0.000709,true,0.0001 +game,T10,ip_umfpack,684,0.005326,true,0.0001 +game,T10,ip_klu,684,0.000889,true,0.0001 +game,T10,ip_umfpack,685,0.007262,true,0.0001 +game,T10,ip_klu,685,0.00087,true,0.0001 +game,T10,ip_umfpack,686,0.004223,true,0.0001 +game,T10,ip_klu,686,0.00072,true,0.0001 +game,T10,ip_umfpack,687,0.007506,true,0.0001 +game,T10,ip_klu,687,0.000907,true,0.0001 +game,T10,ip_umfpack,688,0.003981,true,0.0001 +game,T10,ip_klu,688,0.000705,true,0.0001 +game,T10,ip_umfpack,689,0.005798,true,0.0001 +game,T10,ip_klu,689,0.002928,true,0.0001 +game,T10,ip_umfpack,690,0.004242,true,0.0001 +game,T10,ip_klu,690,0.000754,true,0.0001 +game,T10,ip_umfpack,691,0.004177,true,0.0001 +game,T10,ip_klu,691,0.000735,true,0.0001 +game,T10,ip_umfpack,692,0.008404,true,0.0001 +game,T10,ip_klu,692,0.001044,true,0.0001 +game,T10,ip_umfpack,693,0.004182,true,0.0001 +game,T10,ip_klu,693,0.000729,true,0.0001 +game,T10,ip_umfpack,694,0.006127,true,0.0001 +game,T10,ip_klu,694,0.00075,true,0.0001 +game,T10,ip_umfpack,695,0.004048,true,0.0001 +game,T10,ip_klu,695,0.000706,true,0.0001 +game,T10,ip_umfpack,696,0.004893,true,0.0001 +game,T10,ip_klu,696,0.000849,true,0.0001 +game,T10,ip_umfpack,697,0.00747,true,0.0001 +game,T10,ip_klu,697,0.00076,true,0.0001 +game,T10,ip_umfpack,698,0.004029,true,0.0001 +game,T10,ip_klu,698,0.000716,true,0.0001 +game,T10,ip_umfpack,699,0.004491,true,0.0001 +game,T10,ip_klu,699,0.000796,true,0.0001 +game,T10,ip_umfpack,700,0.004028,true,0.0001 +game,T10,ip_klu,700,0.000711,true,0.0001 +game,T10,ip_umfpack,701,0.004212,true,0.0001 +game,T10,ip_klu,701,0.000732,true,0.0001 +game,T10,ip_umfpack,702,0.006269,true,0.0001 +game,T10,ip_klu,702,0.000741,true,0.0001 +game,T10,ip_umfpack,703,0.004006,true,0.0001 +game,T10,ip_klu,703,0.000702,true,0.0001 +game,T10,ip_umfpack,704,0.004221,true,0.0001 +game,T10,ip_klu,704,0.000729,true,0.0001 +game,T10,ip_umfpack,705,0.005928,true,0.0001 +game,T10,ip_klu,705,0.000678,true,0.0001 +game,T10,ip_umfpack,706,0.003983,true,0.0001 +game,T10,ip_klu,706,0.000699,true,0.0001 +game,T10,ip_umfpack,707,0.003947,true,0.0001 +game,T10,ip_klu,707,0.000708,true,0.0001 +game,T10,ip_umfpack,708,0.006696,true,0.0001 +game,T10,ip_klu,708,0.000807,true,0.0001 +game,T10,ip_umfpack,709,0.003757,true,0.0001 +game,T10,ip_klu,709,0.000669,true,0.0001 +game,T10,ip_umfpack,710,0.00409,true,0.0001 +game,T10,ip_klu,710,0.000749,true,0.0001 +game,T10,ip_umfpack,711,0.007938,true,0.0001 +game,T10,ip_klu,711,0.000765,true,0.0001 +game,T10,ip_umfpack,712,0.004262,true,0.0001 +game,T10,ip_klu,712,0.000755,true,0.0001 +game,T10,ip_umfpack,713,0.006491,true,0.0001 +game,T10,ip_klu,713,0.000716,true,0.0001 +game,T10,ip_umfpack,714,0.004283,true,0.0001 +game,T10,ip_klu,714,0.00074,true,0.0001 +game,T10,ip_umfpack,715,0.004214,true,0.0001 +game,T10,ip_klu,715,0.000742,true,0.0001 +game,T10,ip_umfpack,716,0.006511,true,0.0001 +game,T10,ip_klu,716,0.00075,true,0.0001 +game,T10,ip_umfpack,717,0.006712,true,0.0001 +game,T10,ip_klu,717,0.001059,true,0.0001 +game,T10,ip_umfpack,718,0.00626,true,0.0001 +game,T10,ip_klu,718,0.000745,true,0.0001 +game,T10,ip_umfpack,719,0.004248,true,0.0001 +game,T10,ip_klu,719,0.000765,true,0.0001 +game,T10,ip_umfpack,720,0.003822,true,0.0001 +game,T10,ip_klu,720,0.000695,true,0.0001 +game,T10,ip_umfpack,721,0.007441,true,0.0001 +game,T10,ip_klu,721,0.000757,true,0.0001 +game,T10,ip_umfpack,722,0.004261,true,0.0001 +game,T10,ip_klu,722,0.000739,true,0.0001 +game,T10,ip_umfpack,723,0.004197,true,0.0001 +game,T10,ip_klu,723,0.000748,true,0.0001 +game,T10,ip_umfpack,724,0.006537,true,0.0001 +game,T10,ip_klu,724,0.000745,true,0.0001 +game,T10,ip_umfpack,725,0.003751,true,0.0001 +game,T10,ip_klu,725,0.000671,true,0.0001 +game,T10,ip_umfpack,726,0.0077,true,0.0001 +game,T10,ip_klu,726,0.000921,true,0.0001 +game,T10,ip_umfpack,727,0.004212,true,0.0001 +game,T10,ip_klu,727,0.000733,true,0.0001 +game,T10,ip_umfpack,728,0.004194,true,0.0001 +game,T10,ip_klu,728,0.000744,true,0.0001 +game,T10,ip_umfpack,729,0.006238,true,0.0001 +game,T10,ip_klu,729,0.000703,true,0.0001 +game,T10,ip_umfpack,730,0.00418,true,0.0001 +game,T10,ip_klu,730,0.000745,true,0.0001 +game,T10,ip_umfpack,731,0.004412,true,0.0001 +game,T10,ip_klu,731,0.000789,true,0.0001 +game,T10,ip_umfpack,732,0.004484,true,0.0001 +game,T10,ip_klu,732,0.000781,true,0.0001 +game,T10,ip_umfpack,733,0.003972,true,0.0001 +game,T10,ip_klu,733,0.000709,true,0.0001 +game,T10,ip_umfpack,734,0.008907,true,0.0001 +game,T10,ip_klu,734,0.000958,true,0.0001 +game,T10,ip_umfpack,735,0.00379,true,0.0001 +game,T10,ip_klu,735,0.000676,true,0.0001 +game,T10,ip_umfpack,736,0.004237,true,0.0001 +game,T10,ip_klu,736,0.000757,true,0.0001 +game,T10,ip_umfpack,737,0.005912,true,0.0001 +game,T10,ip_klu,737,0.000662,true,0.0001 +game,T10,ip_umfpack,738,0.005611,true,0.0001 +game,T10,ip_klu,738,0.000909,true,0.0001 +game,T10,ip_umfpack,739,0.006087,true,0.0001 +game,T10,ip_klu,739,0.000736,true,0.0001 +game,T10,ip_umfpack,740,0.004201,true,0.0001 +game,T10,ip_klu,740,0.000726,true,0.0001 +game,T10,ip_umfpack,741,0.004888,true,0.0001 +game,T10,ip_klu,741,0.000861,true,0.0001 +game,T10,ip_umfpack,742,0.006691,true,0.0001 +game,T10,ip_klu,742,0.000729,true,0.0001 +game,T10,ip_umfpack,743,0.004265,true,0.0001 +game,T10,ip_klu,743,0.000741,true,0.0001 +game,T10,ip_umfpack,744,0.004003,true,0.0001 +game,T10,ip_klu,744,0.000732,true,0.0001 +game,T10,ip_umfpack,745,0.004219,true,0.0001 +game,T10,ip_klu,745,0.000739,true,0.0001 +game,T10,ip_umfpack,746,0.00397,true,0.0001 +game,T10,ip_klu,746,0.000707,true,0.0001 +game,T10,ip_umfpack,747,0.006097,true,0.0001 +game,T10,ip_klu,747,0.000707,true,0.0001 +game,T10,ip_umfpack,748,0.004244,true,0.0001 +game,T10,ip_klu,748,0.000756,true,0.0001 +game,T10,ip_umfpack,749,0.004395,true,0.0001 +game,T10,ip_klu,749,0.000766,true,0.0001 +game,T10,ip_umfpack,750,0.006373,true,0.0001 +game,T10,ip_klu,750,0.000741,true,0.0001 +game,T10,ip_umfpack,751,0.00642,true,0.0001 +game,T10,ip_klu,751,0.001017,true,0.0001 +game,T10,ip_umfpack,752,0.006096,true,0.0001 +game,T10,ip_klu,752,0.000733,true,0.0001 +game,T10,ip_umfpack,753,0.005583,true,0.0001 +game,T10,ip_klu,753,0.000947,true,0.0001 +game,T10,ip_umfpack,754,0.00432,true,0.0001 +game,T10,ip_klu,754,0.004291,true,0.0001 +game,T10,ip_umfpack,755,0.004081,true,0.0001 +game,T10,ip_klu,755,0.000735,true,0.0001 +game,T10,ip_umfpack,756,0.005197,true,0.0001 +game,T10,ip_klu,756,0.000869,true,0.0001 +game,T10,ip_umfpack,757,0.006753,true,0.0001 +game,T10,ip_klu,757,0.00075,true,0.0001 +game,T10,ip_umfpack,758,0.00449,true,0.0001 +game,T10,ip_klu,758,0.000769,true,0.0001 +game,T10,ip_umfpack,759,0.003968,true,0.0001 +game,T10,ip_klu,759,0.000734,true,0.0001 +game,T10,ip_umfpack,760,0.006166,true,0.0001 +game,T10,ip_klu,760,0.000741,true,0.0001 +game,T10,ip_umfpack,761,0.004283,true,0.0001 +game,T10,ip_klu,761,0.000746,true,0.0001 +game,T10,ip_umfpack,762,0.007095,true,0.0001 +game,T10,ip_klu,762,0.00078,true,0.0001 +game,T10,ip_umfpack,763,0.005596,true,0.0001 +game,T10,ip_klu,763,0.000922,true,0.0001 +game,T10,ip_umfpack,764,0.004248,true,0.0001 +game,T10,ip_klu,764,0.000776,true,0.0001 +game,T10,ip_umfpack,765,0.006221,true,0.0001 +game,T10,ip_klu,765,0.000722,true,0.0001 +game,T10,ip_umfpack,766,0.003749,true,0.0001 +game,T10,ip_klu,766,0.000682,true,0.0001 +game,T10,ip_umfpack,767,0.009867,true,0.0001 +game,T10,ip_klu,767,0.001094,true,0.0001 +game,T10,ip_umfpack,768,0.004184,true,0.0001 +game,T10,ip_klu,768,0.000744,true,0.0001 +game,T10,ip_umfpack,769,0.003747,true,0.0001 +game,T10,ip_klu,769,0.000704,true,0.0001 +game,T10,ip_umfpack,770,0.004891,true,0.0001 +game,T10,ip_klu,770,0.000836,true,0.0001 +game,T10,ip_umfpack,771,0.005419,true,0.0001 +game,T10,ip_klu,771,0.000893,true,0.0001 +game,T10,ip_umfpack,772,0.005842,true,0.0001 +game,T10,ip_klu,772,0.000696,true,0.0001 +game,T10,ip_umfpack,773,0.004137,true,0.0001 +game,T10,ip_klu,773,0.000725,true,0.0001 +game,T10,ip_umfpack,774,0.003725,true,0.0001 +game,T10,ip_klu,774,0.000676,true,0.0001 +game,T10,ip_umfpack,775,0.005781,true,0.0001 +game,T10,ip_klu,775,0.000702,true,0.0001 +game,T10,ip_umfpack,776,0.004182,true,0.0001 +game,T10,ip_klu,776,0.00073,true,0.0001 +game,T10,ip_umfpack,777,0.003985,true,0.0001 +game,T10,ip_klu,777,0.002493,true,0.0001 +game,T10,ip_umfpack,778,0.00541,true,0.0001 +game,T10,ip_klu,778,0.000884,true,0.0001 +game,T10,ip_umfpack,779,0.004415,true,0.0001 +game,T10,ip_klu,779,0.000772,true,0.0001 +game,T10,ip_umfpack,780,0.006811,true,0.0001 +game,T10,ip_klu,780,0.000724,true,0.0001 +game,T10,ip_umfpack,781,0.004234,true,0.0001 +game,T10,ip_klu,781,0.000734,true,0.0001 +game,T10,ip_umfpack,782,0.004215,true,0.0001 +game,T10,ip_klu,782,0.002691,true,0.0001 +game,T10,ip_umfpack,783,0.004041,true,0.0001 +game,T10,ip_klu,783,0.000714,true,0.0001 +game,T10,ip_umfpack,784,0.004211,true,0.0001 +game,T10,ip_klu,784,0.000728,true,0.0001 +game,T10,ip_umfpack,785,0.007773,true,0.0001 +game,T10,ip_klu,785,0.000967,true,0.0001 +game,T10,ip_umfpack,786,0.004144,true,0.0001 +game,T10,ip_klu,786,0.000726,true,0.0001 +game,T10,ip_umfpack,787,0.004216,true,0.0001 +game,T10,ip_klu,787,0.002728,true,0.0001 +game,T10,ip_umfpack,788,0.004221,true,0.0001 +game,T10,ip_klu,788,0.000736,true,0.0001 +game,T10,ip_umfpack,789,0.004415,true,0.0001 +game,T10,ip_klu,789,0.000758,true,0.0001 +game,T10,ip_umfpack,790,0.007693,true,0.0001 +game,T10,ip_klu,790,0.00092,true,0.0001 +game,T10,ip_umfpack,791,0.003965,true,0.0001 +game,T10,ip_klu,791,0.000693,true,0.0001 +game,T10,ip_umfpack,792,0.007326,true,0.0001 +game,T10,ip_klu,792,0.000861,true,0.0001 +game,T10,ip_umfpack,793,0.004882,true,0.0001 +game,T10,ip_klu,793,0.000849,true,0.0001 +game,T10,ip_umfpack,794,0.004305,true,0.0001 +game,T10,ip_klu,794,0.000788,true,0.0001 +game,T10,ip_umfpack,795,0.008024,true,0.0001 +game,T10,ip_klu,795,0.000784,true,0.0001 +game,T10,ip_umfpack,796,0.006618,true,0.0001 +game,T10,ip_klu,796,0.001062,true,0.0001 +game,T10,ip_umfpack,797,0.006858,true,0.0001 +game,T10,ip_klu,797,0.000766,true,0.0001 +game,T10,ip_umfpack,798,0.004214,true,0.0001 +game,T10,ip_klu,798,0.000736,true,0.0001 +game,T10,ip_umfpack,799,0.004277,true,0.0001 +game,T10,ip_klu,799,0.000766,true,0.0001 +game,T10,ip_umfpack,800,0.006544,true,0.0001 +game,T10,ip_klu,800,0.000721,true,0.0001 +game,T10,ip_umfpack,801,0.004866,true,0.0001 +game,T10,ip_klu,801,0.000825,true,0.0001 +game,T10,ip_umfpack,802,0.006435,true,0.0001 +game,T10,ip_klu,802,0.00075,true,0.0001 +game,T10,ip_umfpack,803,0.004623,true,0.0001 +game,T10,ip_klu,803,0.000808,true,0.0001 +game,T10,ip_umfpack,804,0.005741,true,0.0001 +game,T10,ip_klu,804,0.002932,true,0.0001 +game,T10,ip_umfpack,805,0.005326,true,0.0001 +game,T10,ip_klu,805,0.00091,true,0.0001 +game,T10,ip_umfpack,806,0.00415,true,0.0001 +game,T10,ip_klu,806,0.000743,true,0.0001 +game,T10,ip_umfpack,807,0.006084,true,0.0001 +game,T10,ip_klu,807,0.000717,true,0.0001 +game,T10,ip_umfpack,808,0.003973,true,0.0001 +game,T10,ip_klu,808,0.000705,true,0.0001 +game,T10,ip_umfpack,809,0.00418,true,0.0001 +game,T10,ip_klu,809,0.000739,true,0.0001 +game,T10,ip_umfpack,810,0.006352,true,0.0001 +game,T10,ip_klu,810,0.000736,true,0.0001 +game,T10,ip_umfpack,811,0.00418,true,0.0001 +game,T10,ip_klu,811,0.000736,true,0.0001 +game,T10,ip_umfpack,812,0.013451,true,0.0001 +game,T10,ip_klu,812,0.001728,true,0.0001 +game,T10,ip_umfpack,813,0.006985,true,0.0001 +game,T10,ip_klu,813,0.000857,true,0.0001 +game,T10,ip_umfpack,814,0.004446,true,0.0001 +game,T10,ip_klu,814,0.000771,true,0.0001 +game,T10,ip_umfpack,815,0.004183,true,0.0001 +game,T10,ip_klu,815,0.000731,true,0.0001 +game,T10,ip_umfpack,816,0.006186,true,0.0001 +game,T10,ip_klu,816,0.000708,true,0.0001 +game,T10,ip_umfpack,817,0.004274,true,0.0001 +game,T10,ip_klu,817,0.000738,true,0.0001 +game,T10,ip_umfpack,818,0.004041,true,0.0001 +game,T10,ip_klu,818,0.000721,true,0.0001 +game,T10,ip_umfpack,819,0.006832,true,0.0001 +game,T10,ip_klu,819,0.000768,true,0.0001 +game,T10,ip_umfpack,820,0.00442,true,0.0001 +game,T10,ip_klu,820,0.000765,true,0.0001 +game,T10,ip_umfpack,821,0.006594,true,0.0001 +game,T10,ip_klu,821,0.000739,true,0.0001 +game,T10,ip_umfpack,822,0.005129,true,0.0001 +game,T10,ip_klu,822,0.000865,true,0.0001 +game,T10,ip_umfpack,823,0.004263,true,0.0001 +game,T10,ip_klu,823,0.000762,true,0.0001 +game,T10,ip_umfpack,824,0.006573,true,0.0001 +game,T10,ip_klu,824,0.000749,true,0.0001 +game,T10,ip_umfpack,825,0.005294,true,0.0001 +game,T10,ip_klu,825,0.000876,true,0.0001 +game,T10,ip_umfpack,826,0.00597,true,0.0001 +game,T10,ip_klu,826,0.000738,true,0.0001 +game,T10,ip_umfpack,827,0.00417,true,0.0001 +game,T10,ip_klu,827,0.000733,true,0.0001 +game,T10,ip_umfpack,828,0.00511,true,0.0001 +game,T10,ip_klu,828,0.000874,true,0.0001 +game,T10,ip_umfpack,829,0.004241,true,0.0001 +game,T10,ip_klu,829,0.000748,true,0.0001 +game,T10,ip_umfpack,830,0.004011,true,0.0001 +game,T10,ip_klu,830,0.00073,true,0.0001 +game,T10,ip_umfpack,831,0.006358,true,0.0001 +game,T10,ip_klu,831,0.000744,true,0.0001 +game,T10,ip_umfpack,832,0.004216,true,0.0001 +game,T10,ip_klu,832,0.000758,true,0.0001 +game,T10,ip_umfpack,833,0.003977,true,0.0001 +game,T10,ip_klu,833,0.000715,true,0.0001 +game,T10,ip_umfpack,834,0.006565,true,0.0001 +game,T10,ip_klu,834,0.000722,true,0.0001 +game,T10,ip_umfpack,835,0.004256,true,0.0001 +game,T10,ip_klu,835,0.000741,true,0.0001 +game,T10,ip_umfpack,836,0.006157,true,0.0001 +game,T10,ip_klu,836,0.003231,true,0.0001 +game,T10,ip_umfpack,837,0.005187,true,0.0001 +game,T10,ip_klu,837,0.000872,true,0.0001 +game,T10,ip_umfpack,838,0.004412,true,0.0001 +game,T10,ip_klu,838,0.000795,true,0.0001 +game,T10,ip_umfpack,839,0.006627,true,0.0001 +game,T10,ip_klu,839,0.000753,true,0.0001 +game,T10,ip_umfpack,840,0.004219,true,0.0001 +game,T10,ip_klu,840,0.000736,true,0.0001 +game,T10,ip_umfpack,841,0.004021,true,0.0001 +game,T10,ip_klu,841,0.000718,true,0.0001 +game,T10,ip_umfpack,842,0.00624,true,0.0001 +game,T10,ip_klu,842,0.001014,true,0.0001 +game,T10,ip_umfpack,843,0.004172,true,0.0001 +game,T10,ip_klu,843,0.00073,true,0.0001 +game,T10,ip_umfpack,844,0.006147,true,0.0001 +game,T10,ip_klu,844,0.00075,true,0.0001 +game,T10,ip_umfpack,845,0.003954,true,0.0001 +game,T10,ip_klu,845,0.000702,true,0.0001 +game,T10,ip_umfpack,846,0.00398,true,0.0001 +game,T10,ip_klu,846,0.000717,true,0.0001 +game,T10,ip_umfpack,847,0.00565,true,0.0001 +game,T10,ip_klu,847,0.000928,true,0.0001 +game,T10,ip_umfpack,848,0.004643,true,0.0001 +game,T10,ip_klu,848,0.000799,true,0.0001 +game,T10,ip_umfpack,849,0.007673,true,0.0001 +game,T10,ip_klu,849,0.000919,true,0.0001 +game,T10,ip_umfpack,850,0.003947,true,0.0001 +game,T10,ip_klu,850,0.000702,true,0.0001 +game,T10,ip_umfpack,851,0.005988,true,0.0001 +game,T10,ip_klu,851,0.000712,true,0.0001 +game,T10,ip_umfpack,852,0.004229,true,0.0001 +game,T10,ip_klu,852,0.000727,true,0.0001 +game,T10,ip_umfpack,853,0.00601,true,0.0001 +game,T10,ip_klu,853,0.002758,true,0.0001 +game,T10,ip_umfpack,854,0.004461,true,0.0001 +game,T10,ip_klu,854,0.000775,true,0.0001 +game,T10,ip_umfpack,855,0.005551,true,0.0001 +game,T10,ip_klu,855,0.000915,true,0.0001 +game,T10,ip_umfpack,856,0.006245,true,0.0001 +game,T10,ip_klu,856,0.000739,true,0.0001 +game,T10,ip_umfpack,857,0.004488,true,0.0001 +game,T10,ip_klu,857,0.000778,true,0.0001 +game,T10,ip_umfpack,858,0.006799,true,0.0001 +game,T10,ip_klu,858,0.000746,true,0.0001 +game,T10,ip_umfpack,859,0.004246,true,0.0001 +game,T10,ip_klu,859,0.000755,true,0.0001 +game,T10,ip_umfpack,860,0.004851,true,0.0001 +game,T10,ip_klu,860,0.000841,true,0.0001 +game,T10,ip_umfpack,861,0.006115,true,0.0001 +game,T10,ip_klu,861,0.000713,true,0.0001 +game,T10,ip_umfpack,862,0.004234,true,0.0001 +game,T10,ip_klu,862,0.000742,true,0.0001 +game,T10,ip_umfpack,863,0.004254,true,0.0001 +game,T10,ip_klu,863,0.000763,true,0.0001 +game,T10,ip_umfpack,864,0.004235,true,0.0001 +game,T10,ip_klu,864,0.000743,true,0.0001 +game,T10,ip_umfpack,865,0.005073,true,0.0001 +game,T10,ip_klu,865,0.000852,true,0.0001 +game,T10,ip_umfpack,866,0.005965,true,0.0001 +game,T10,ip_klu,866,0.000713,true,0.0001 +game,T10,ip_umfpack,867,0.003744,true,0.0001 +game,T10,ip_klu,867,0.000672,true,0.0001 +game,T10,ip_umfpack,868,0.004155,true,0.0001 +game,T10,ip_klu,868,0.000734,true,0.0001 +game,T10,ip_umfpack,869,0.006334,true,0.0001 +game,T10,ip_klu,869,0.000744,true,0.0001 +game,T10,ip_umfpack,870,0.004195,true,0.0001 +game,T10,ip_klu,870,0.000736,true,0.0001 +game,T10,ip_umfpack,871,0.004447,true,0.0001 +game,T10,ip_klu,871,0.002684,true,0.0001 +game,T10,ip_umfpack,872,0.004482,true,0.0001 +game,T10,ip_klu,872,0.000769,true,0.0001 +game,T10,ip_umfpack,873,0.004181,true,0.0001 +game,T10,ip_klu,873,0.000731,true,0.0001 +game,T10,ip_umfpack,874,0.007506,true,0.0001 +game,T10,ip_klu,874,0.000916,true,0.0001 +game,T10,ip_umfpack,875,0.004513,true,0.0001 +game,T10,ip_klu,875,0.000773,true,0.0001 +game,T10,ip_umfpack,876,0.008664,true,0.0001 +game,T10,ip_klu,876,0.000866,true,0.0001 +game,T10,ip_umfpack,877,0.005931,true,0.0001 +game,T10,ip_klu,877,0.000989,true,0.0001 +game,T10,ip_umfpack,878,0.004546,true,0.0001 +game,T10,ip_klu,878,0.000826,true,0.0001 +game,T10,ip_umfpack,879,0.004303,true,0.0001 +game,T10,ip_klu,879,0.000754,true,0.0001 +game,T10,ip_umfpack,880,0.004243,true,0.0001 +game,T10,ip_klu,880,0.000755,true,0.0001 +game,T10,ip_umfpack,881,0.006454,true,0.0001 +game,T10,ip_klu,881,0.00072,true,0.0001 +game,T10,ip_umfpack,882,0.004218,true,0.0001 +game,T10,ip_klu,882,0.00074,true,0.0001 +game,T10,ip_umfpack,883,0.00396,true,0.0001 +game,T10,ip_klu,883,0.000702,true,0.0001 +game,T10,ip_umfpack,884,0.006657,true,0.0001 +game,T10,ip_klu,884,0.000784,true,0.0001 +game,T10,ip_umfpack,885,0.006347,true,0.0001 +game,T10,ip_klu,885,0.001034,true,0.0001 +game,T10,ip_umfpack,886,0.006825,true,0.0001 +game,T10,ip_klu,886,0.000812,true,0.0001 +game,T10,ip_umfpack,887,0.004405,true,0.0001 +game,T10,ip_klu,887,0.000764,true,0.0001 +game,T10,ip_umfpack,888,0.005579,true,0.0001 +game,T10,ip_klu,888,0.002753,true,0.0001 +game,T10,ip_umfpack,889,0.004233,true,0.0001 +game,T10,ip_klu,889,0.000737,true,0.0001 +game,T10,ip_umfpack,890,0.005717,true,0.0001 +game,T10,ip_klu,890,0.000956,true,0.0001 +game,T10,ip_umfpack,891,0.006915,true,0.0001 +game,T10,ip_klu,891,0.000826,true,0.0001 +game,T10,ip_umfpack,892,0.004192,true,0.0001 +game,T10,ip_klu,892,0.000729,true,0.0001 +game,T10,ip_umfpack,893,0.061129,true,0.0001 +game,T10,ip_klu,893,0.000759,true,0.0001 +game,T10,ip_umfpack,894,0.004556,true,0.0001 +game,T10,ip_klu,894,0.000798,true,0.0001 +game,T10,ip_umfpack,895,0.004285,true,0.0001 +game,T10,ip_klu,895,0.000783,true,0.0001 +game,T10,ip_umfpack,896,0.072355,true,0.0001 +game,T10,ip_klu,896,0.000842,true,0.0001 +game,T10,ip_umfpack,897,0.00427,true,0.0001 +game,T10,ip_klu,897,0.00077,true,0.0001 +game,T10,ip_umfpack,898,0.004246,true,0.0001 +game,T10,ip_klu,898,0.000779,true,0.0001 +game,T10,ip_umfpack,899,0.004504,true,0.0001 +game,T10,ip_klu,899,0.00082,true,0.0001 +game,T10,ip_umfpack,900,0.004267,true,0.0001 +game,T10,ip_klu,900,0.000757,true,0.0001 +game,T10,ip_umfpack,901,0.004256,true,0.0001 +game,T10,ip_klu,901,0.000804,true,0.0001 +game,T10,ip_umfpack,902,0.004226,true,0.0001 +game,T10,ip_klu,902,0.000761,true,0.0001 +game,T10,ip_umfpack,903,0.004162,true,0.0001 +game,T10,ip_klu,903,0.000759,true,0.0001 +game,T10,ip_umfpack,904,0.004665,true,0.0001 +game,T10,ip_klu,904,0.000815,true,0.0001 +game,T10,ip_umfpack,905,0.003919,true,0.0001 +game,T10,ip_klu,905,0.000707,true,0.0001 +game,T10,ip_umfpack,906,0.005948,true,0.0001 +game,T10,ip_klu,906,0.000957,true,0.0001 +game,T10,ip_umfpack,907,0.003875,true,0.0001 +game,T10,ip_klu,907,0.000717,true,0.0001 +game,T10,ip_umfpack,908,0.00457,true,0.0001 +game,T10,ip_klu,908,0.000779,true,0.0001 +game,T10,ip_umfpack,909,0.00412,true,0.0001 +game,T10,ip_klu,909,0.000742,true,0.0001 +game,T10,ip_umfpack,910,0.006063,true,0.0001 +game,T10,ip_klu,910,0.001013,true,0.0001 +game,T10,ip_umfpack,911,0.004903,true,0.0001 +game,T10,ip_klu,911,0.000848,true,0.0001 +game,T10,ip_umfpack,912,0.004949,true,0.0001 +game,T10,ip_klu,912,0.000849,true,0.0001 +game,T10,ip_umfpack,913,0.00362,true,0.0001 +game,T10,ip_klu,913,0.000662,true,0.0001 +game,T10,ip_umfpack,914,0.004322,true,0.0001 +game,T10,ip_klu,914,0.000777,true,0.0001 +game,T10,ip_umfpack,915,0.004277,true,0.0001 +game,T10,ip_klu,915,0.000771,true,0.0001 +game,T10,ip_umfpack,916,0.004747,true,0.0001 +game,T10,ip_klu,916,0.000833,true,0.0001 +game,T10,ip_umfpack,917,0.004289,true,0.0001 +game,T10,ip_klu,917,0.000766,true,0.0001 +game,T10,ip_umfpack,918,0.005423,true,0.0001 +game,T10,ip_klu,918,0.000929,true,0.0001 +game,T10,ip_umfpack,919,0.004233,true,0.0001 +game,T10,ip_klu,919,0.00079,true,0.0001 +game,T10,ip_umfpack,920,0.00446,true,0.0001 +game,T10,ip_klu,920,0.004327,true,0.0001 +game,T10,ip_umfpack,921,0.004079,true,0.0001 +game,T10,ip_klu,921,0.000727,true,0.0001 +game,T10,ip_umfpack,922,0.004501,true,0.0001 +game,T10,ip_klu,922,0.00078,true,0.0001 +game,T10,ip_umfpack,923,0.006938,true,0.0001 +game,T10,ip_klu,923,0.001147,true,0.0001 +game,T10,ip_umfpack,924,0.00429,true,0.0001 +game,T10,ip_klu,924,0.000763,true,0.0001 +game,T10,ip_umfpack,925,0.007857,true,0.0001 +game,T10,ip_klu,925,0.000812,true,0.0001 +game,T10,ip_umfpack,926,0.004478,true,0.0001 +game,T10,ip_klu,926,0.00081,true,0.0001 +game,T10,ip_umfpack,927,0.00424,true,0.0001 +game,T10,ip_klu,927,0.000772,true,0.0001 +game,T10,ip_umfpack,928,0.004073,true,0.0001 +game,T10,ip_klu,928,0.000782,true,0.0001 +game,T10,ip_umfpack,929,0.007442,true,0.0001 +game,T10,ip_klu,929,0.000765,true,0.0001 +game,T10,ip_umfpack,930,0.004053,true,0.0001 +game,T10,ip_klu,930,0.000933,true,0.0001 +game,T10,ip_umfpack,931,0.005421,true,0.0001 +game,T10,ip_klu,931,0.000912,true,0.0001 +game,T10,ip_umfpack,932,0.006788,true,0.0001 +game,T10,ip_klu,932,0.00075,true,0.0001 +game,T10,ip_umfpack,933,0.005348,true,0.0001 +game,T10,ip_klu,933,0.000882,true,0.0001 +game,T10,ip_umfpack,934,0.00421,true,0.0001 +game,T10,ip_klu,934,0.000738,true,0.0001 +game,T10,ip_umfpack,935,0.006431,true,0.0001 +game,T10,ip_klu,935,0.000738,true,0.0001 +game,T10,ip_umfpack,936,0.005109,true,0.0001 +game,T10,ip_klu,936,0.000847,true,0.0001 +game,T10,ip_umfpack,937,0.006222,true,0.0001 +game,T10,ip_klu,937,0.000745,true,0.0001 +game,T10,ip_umfpack,938,0.004208,true,0.0001 +game,T10,ip_klu,938,0.000733,true,0.0001 +game,T10,ip_umfpack,939,0.005365,true,0.0001 +game,T10,ip_klu,939,0.002789,true,0.0001 +game,T10,ip_umfpack,940,0.004234,true,0.0001 +game,T10,ip_klu,940,0.000743,true,0.0001 +game,T10,ip_umfpack,941,0.004394,true,0.0001 +game,T10,ip_klu,941,0.000773,true,0.0001 +game,T10,ip_umfpack,942,0.006229,true,0.0001 +game,T10,ip_klu,942,0.000745,true,0.0001 +game,T10,ip_umfpack,943,0.004221,true,0.0001 +game,T10,ip_klu,943,0.000734,true,0.0001 +game,T10,ip_umfpack,944,0.004203,true,0.0001 +game,T10,ip_klu,944,0.000733,true,0.0001 +game,T10,ip_umfpack,945,0.006068,true,0.0001 +game,T10,ip_klu,945,0.000705,true,0.0001 +game,T10,ip_umfpack,946,0.004409,true,0.0001 +game,T10,ip_klu,946,0.000787,true,0.0001 +game,T10,ip_umfpack,947,0.009698,true,0.0001 +game,T10,ip_klu,947,0.001005,true,0.0001 +game,T10,ip_umfpack,948,0.004064,true,0.0001 +game,T10,ip_klu,948,0.000734,true,0.0001 +game,T10,ip_umfpack,949,0.005607,true,0.0001 +game,T10,ip_klu,949,0.000973,true,0.0001 +game,T10,ip_umfpack,950,0.007105,true,0.0001 +game,T10,ip_klu,950,0.000783,true,0.0001 +game,T10,ip_umfpack,951,0.004645,true,0.0001 +game,T10,ip_klu,951,0.000805,true,0.0001 +game,T10,ip_umfpack,952,0.007819,true,0.0001 +game,T10,ip_klu,952,0.000907,true,0.0001 +game,T10,ip_umfpack,953,0.003966,true,0.0001 +game,T10,ip_klu,953,0.000706,true,0.0001 +game,T10,ip_umfpack,954,0.004421,true,0.0001 +game,T10,ip_klu,954,0.000803,true,0.0001 +game,T10,ip_umfpack,955,0.006268,true,0.0001 +game,T10,ip_klu,955,0.000745,true,0.0001 +game,T10,ip_umfpack,956,0.011889,true,0.0001 +game,T10,ip_klu,956,0.001534,true,0.0001 +game,T10,ip_umfpack,957,0.003968,true,0.0001 +game,T10,ip_klu,957,0.000697,true,0.0001 +game,T10,ip_umfpack,958,0.005359,true,0.0001 +game,T10,ip_klu,958,0.003102,true,0.0001 +game,T10,ip_umfpack,959,0.004283,true,0.0001 +game,T10,ip_klu,959,0.00074,true,0.0001 +game,T10,ip_umfpack,960,0.00417,true,0.0001 +game,T10,ip_klu,960,0.000729,true,0.0001 +game,T10,ip_umfpack,961,0.008666,true,0.0001 +game,T10,ip_klu,961,0.001078,true,0.0001 +game,T10,ip_umfpack,962,0.004139,true,0.0001 +game,T10,ip_klu,962,0.000722,true,0.0001 +game,T10,ip_umfpack,963,0.006306,true,0.0001 +game,T10,ip_klu,963,0.000764,true,0.0001 +game,T10,ip_umfpack,964,0.004019,true,0.0001 +game,T10,ip_klu,964,0.000701,true,0.0001 +game,T10,ip_umfpack,965,0.00421,true,0.0001 +game,T10,ip_klu,965,0.000728,true,0.0001 +game,T10,ip_umfpack,966,0.006116,true,0.0001 +game,T10,ip_klu,966,0.000716,true,0.0001 +game,T10,ip_umfpack,967,0.004228,true,0.0001 +game,T10,ip_klu,967,0.000757,true,0.0001 +game,T10,ip_umfpack,968,0.005141,true,0.0001 +game,T10,ip_klu,968,0.000881,true,0.0001 +game,T10,ip_umfpack,969,0.004248,true,0.0001 +game,T10,ip_klu,969,0.00075,true,0.0001 +game,T10,ip_umfpack,970,0.00514,true,0.0001 +game,T10,ip_klu,970,0.000862,true,0.0001 +game,T10,ip_umfpack,971,0.006807,true,0.0001 +game,T10,ip_klu,971,0.000745,true,0.0001 +game,T10,ip_umfpack,972,0.004277,true,0.0001 +game,T10,ip_klu,972,0.000739,true,0.0001 +game,T10,ip_umfpack,973,0.004252,true,0.0001 +game,T10,ip_klu,973,0.00076,true,0.0001 +game,T10,ip_umfpack,974,0.006949,true,0.0001 +game,T10,ip_klu,974,0.000776,true,0.0001 +game,T10,ip_umfpack,975,0.004211,true,0.0001 +game,T10,ip_klu,975,0.000742,true,0.0001 +game,T10,ip_umfpack,976,0.006612,true,0.0001 +game,T10,ip_klu,976,0.00078,true,0.0001 +game,T10,ip_umfpack,977,0.004207,true,0.0001 +game,T10,ip_klu,977,0.000741,true,0.0001 +game,T10,ip_umfpack,978,0.004191,true,0.0001 +game,T10,ip_klu,978,0.00075,true,0.0001 +game,T10,ip_umfpack,979,0.006452,true,0.0001 +game,T10,ip_klu,979,0.000744,true,0.0001 +game,T10,ip_umfpack,980,0.004155,true,0.0001 +game,T10,ip_klu,980,0.000729,true,0.0001 +game,T10,ip_umfpack,981,0.007596,true,0.0001 +game,T10,ip_klu,981,0.000919,true,0.0001 +game,T10,ip_umfpack,982,0.004237,true,0.0001 +game,T10,ip_klu,982,0.000729,true,0.0001 +game,T10,ip_umfpack,983,0.004216,true,0.0001 +game,T10,ip_klu,983,0.000774,true,0.0001 +game,T10,ip_umfpack,984,0.006535,true,0.0001 +game,T10,ip_klu,984,0.000751,true,0.0001 +game,T10,ip_umfpack,985,0.003996,true,0.0001 +game,T10,ip_klu,985,0.000705,true,0.0001 +game,T10,ip_umfpack,986,0.004271,true,0.0001 +game,T10,ip_klu,986,0.002963,true,0.0001 +game,T10,ip_umfpack,987,0.00453,true,0.0001 +game,T10,ip_klu,987,0.000787,true,0.0001 +game,T10,ip_umfpack,988,0.00558,true,0.0001 +game,T10,ip_klu,988,0.000943,true,0.0001 +game,T10,ip_umfpack,989,0.008019,true,0.0001 +game,T10,ip_klu,989,0.000879,true,0.0001 +game,T10,ip_umfpack,990,0.004475,true,0.0001 +game,T10,ip_klu,990,0.000788,true,0.0001 +game,T10,ip_umfpack,991,0.006068,true,0.0001 +game,T10,ip_klu,991,0.000735,true,0.0001 +game,T10,ip_umfpack,992,0.004015,true,0.0001 +game,T10,ip_klu,992,0.000706,true,0.0001 +game,T10,ip_umfpack,993,0.004883,true,0.0001 +game,T10,ip_klu,993,0.000834,true,0.0001 +game,T10,ip_umfpack,994,0.00761,true,0.0001 +game,T10,ip_klu,994,0.000929,true,0.0001 +game,T10,ip_umfpack,995,0.005379,true,0.0001 +game,T10,ip_klu,995,0.000882,true,0.0001 +game,T10,ip_umfpack,996,0.007,true,0.0001 +game,T10,ip_klu,996,0.00084,true,0.0001 +game,T10,ip_umfpack,997,0.004677,true,0.0001 +game,T10,ip_klu,997,0.000787,true,0.0001 +game,T10,ip_umfpack,998,0.006474,true,0.0001 +game,T10,ip_klu,998,0.00073,true,0.0001 +game,T10,ip_umfpack,999,0.004193,true,0.0001 +game,T10,ip_klu,999,0.000731,true,0.0001 +game,T10,ip_umfpack,1000,0.003961,true,0.0001 +game,T10,ip_klu,1000,0.000724,true,0.0001 +game,T10,ip_umfpack,1001,0.005931,true,0.0001 +game,T10,ip_klu,1001,0.000713,true,0.0001 +game,T10,ip_umfpack,1002,0.004301,true,0.0001 +game,T10,ip_klu,1002,0.000752,true,0.0001 +game,T10,ip_umfpack,1003,0.007837,true,0.0001 +game,T10,ip_klu,1003,0.000927,true,0.0001 +game,T10,ip_umfpack,1004,0.004249,true,0.0001 +game,T10,ip_klu,1004,0.00073,true,0.0001 +game,T10,ip_umfpack,1005,0.004214,true,0.0001 +game,T10,ip_klu,1005,0.000752,true,0.0001 +game,T10,ip_umfpack,1006,0.005941,true,0.0001 +game,T10,ip_klu,1006,0.000679,true,0.0001 +game,T10,ip_umfpack,1007,0.00415,true,0.0001 +game,T10,ip_klu,1007,0.000733,true,0.0001 +game,T10,ip_umfpack,1008,0.004181,true,0.0001 +game,T10,ip_klu,1008,0.000746,true,0.0001 +game,T10,ip_umfpack,1009,0.00618,true,0.0001 +game,T10,ip_klu,1009,0.000738,true,0.0001 +game,T10,ip_umfpack,1010,0.005542,true,0.0001 +game,T10,ip_klu,1010,0.000908,true,0.0001 +game,T10,ip_umfpack,1011,0.005867,true,0.0001 +game,T10,ip_klu,1011,0.000706,true,0.0001 +game,T10,ip_umfpack,1012,0.003984,true,0.0001 +game,T10,ip_klu,1012,0.000704,true,0.0001 +game,T10,ip_umfpack,1013,0.004884,true,0.0001 +game,T10,ip_klu,1013,0.00083,true,0.0001 +game,T10,ip_umfpack,1014,0.006164,true,0.0001 +game,T10,ip_klu,1014,0.000684,true,0.0001 +game,T10,ip_umfpack,1015,0.003988,true,0.0001 +game,T10,ip_klu,1015,0.0007,true,0.0001 +game,T10,ip_umfpack,1016,0.004267,true,0.0001 +game,T10,ip_klu,1016,0.002701,true,0.0001 +game,T10,ip_umfpack,1017,0.003801,true,0.0001 +game,T10,ip_klu,1017,0.000682,true,0.0001 +game,T10,ip_umfpack,1018,0.005339,true,0.0001 +game,T10,ip_klu,1018,0.000901,true,0.0001 +game,T10,ip_umfpack,1019,0.006577,true,0.0001 +game,T10,ip_klu,1019,0.000775,true,0.0001 +game,T10,ip_umfpack,1020,0.004215,true,0.0001 +game,T10,ip_klu,1020,0.000729,true,0.0001 +game,T10,ip_umfpack,1021,0.004261,true,0.0001 +game,T10,ip_klu,1021,0.003158,true,0.0001 +game,T10,ip_umfpack,1022,0.004254,true,0.0001 +game,T10,ip_klu,1022,0.00075,true,0.0001 +game,T10,ip_umfpack,1023,0.004235,true,0.0001 +game,T10,ip_klu,1023,0.000743,true,0.0001 +game,T10,ip_umfpack,1024,0.008099,true,0.0001 +game,T10,ip_klu,1024,0.000822,true,0.0001 +game,T10,path,1,0.059047,true,0.0001 +game,T10,path,2,0.041431,true,0.0001 +game,T10,path,3,0.029015,true,0.0001 +game,T10,path,4,0.048331,true,0.0001 +game,T10,path,5,0.058194,true,0.0001 +game,T10,path,6,0.042952,true,0.0001 +game,T10,path,7,0.028199,true,0.0001 +game,T10,path,8,0.023337,true,0.0001 +game,T10,path,9,0.031856,true,0.0001 +game,T10,path,10,0.061212,true,0.0001 +game,T10,path,11,0.026706,true,0.0001 +game,T10,path,12,0.028541,true,0.0001 +game,T10,path,13,0.022396,true,0.0001 +game,T10,path,14,0.03193,true,0.0001 +game,T10,path,15,0.056334,true,0.0001 +game,T10,path,16,0.040631,true,0.0001 +game,T10,path,17,0.064279,true,0.0001 +game,T10,path,18,0.03422,true,0.0001 +game,T10,path,19,0.022416,true,0.0001 +game,T10,path,20,0.043982,true,0.0001 +game,T10,path,21,0.031904,true,0.0001 +game,T10,path,22,0.060629,true,0.0001 +game,T10,path,23,0.040808,true,0.0001 +game,T10,path,24,0.023811,true,0.0001 +game,T10,path,25,0.048819,true,0.0001 +game,T10,path,26,0.065637,true,0.0001 +game,T10,path,27,0.036384,true,0.0001 +game,T10,path,28,0.031122,true,0.0001 +game,T10,path,29,0.033276,true,0.0001 +game,T10,path,30,0.032443,true,0.0001 +game,T10,path,31,0.021816,true,0.0001 +game,T10,path,32,0.016555,true,0.0001 +game,T10,path,33,0.027393,true,0.0001 +game,T10,path,34,0.039009,true,0.0001 +game,T10,path,35,0.021349,true,0.0001 +game,T10,path,36,0.023897,true,0.0001 +game,T10,path,37,0.021195,true,0.0001 +game,T10,path,38,0.040232,true,0.0001 +game,T10,path,39,0.045699,true,0.0001 +game,T10,path,40,0.038672,true,0.0001 +game,T10,path,41,0.03355,true,0.0001 +game,T10,path,42,0.014477,true,0.0001 +game,T10,path,43,0.051755,true,0.0001 +game,T10,path,44,0.133682,false,0.0001 +game,T10,path,45,0.069961,true,0.0001 +game,T10,path,46,0.046311,true,0.0001 +game,T10,path,47,0.012788,true,0.0001 +game,T10,path,48,0.030076,true,0.0001 +game,T10,path,49,0.033923,true,0.0001 +game,T10,path,50,0.070793,true,0.0001 +game,T10,path,51,0.046606,true,0.0001 +game,T10,path,52,0.04056,true,0.0001 +game,T10,path,53,0.056292,true,0.0001 +game,T10,path,54,0.089312,true,0.0001 +game,T10,path,55,0.060301,true,0.0001 +game,T10,path,56,0.03454,true,0.0001 +game,T10,path,57,0.03315,true,0.0001 +game,T10,path,58,0.03021,true,0.0001 +game,T10,path,59,0.046223,true,0.0001 +game,T10,path,60,0.024117,true,0.0001 +game,T10,path,61,0.041187,true,0.0001 +game,T10,path,62,0.057106,true,0.0001 +game,T10,path,63,0.037605,true,0.0001 +game,T10,path,64,0.037056,true,0.0001 +game,T10,path,65,0.042639,true,0.0001 +game,T10,path,66,0.083667,true,0.0001 +game,T10,path,67,0.068012,true,0.0001 +game,T10,path,68,0.04736,true,0.0001 +game,T10,path,69,0.052033,true,0.0001 +game,T10,path,70,0.044437,true,0.0001 +game,T10,path,71,0.059546,true,0.0001 +game,T10,path,72,0.024886,true,0.0001 +game,T10,path,73,0.039409,true,0.0001 +game,T10,path,74,0.034438,true,0.0001 +game,T10,path,75,0.052557,true,0.0001 +game,T10,path,76,0.036876,true,0.0001 +game,T10,path,77,0.076643,true,0.0001 +game,T10,path,78,0.029315,true,0.0001 +game,T10,path,79,0.097236,true,0.0001 +game,T10,path,80,0.053386,true,0.0001 +game,T10,path,81,0.027304,true,0.0001 +game,T10,path,82,0.010744,true,0.0001 +game,T10,path,83,0.043748,true,0.0001 +game,T10,path,84,0.055762,true,0.0001 +game,T10,path,85,0.029837,true,0.0001 +game,T10,path,86,0.017697,true,0.0001 +game,T10,path,87,0.014258,true,0.0001 +game,T10,path,88,0.03931,true,0.0001 +game,T10,path,89,0.019293,true,0.0001 +game,T10,path,90,0.014485,true,0.0001 +game,T10,path,91,0.025322,true,0.0001 +game,T10,path,92,0.014042,true,0.0001 +game,T10,path,93,0.064196,true,0.0001 +game,T10,path,94,0.017628,true,0.0001 +game,T10,path,95,0.044405,true,0.0001 +game,T10,path,96,0.026771,true,0.0001 +game,T10,path,97,0.044671,true,0.0001 +game,T10,path,98,0.052125,true,0.0001 +game,T10,path,99,0.029849,true,0.0001 +game,T10,path,100,0.031026,true,0.0001 +game,T10,path,101,0.03533,true,0.0001 +game,T10,path,102,0.044199,true,0.0001 +game,T10,path,103,0.015364,true,0.0001 +game,T10,path,104,0.064104,true,0.0001 +game,T10,path,105,0.037147,true,0.0001 +game,T10,path,106,0.024284,true,0.0001 +game,T10,path,107,0.029934,true,0.0001 +game,T10,path,108,0.021838,true,0.0001 +game,T10,path,109,0.040416,true,0.0001 +game,T10,path,110,0.028442,true,0.0001 +game,T10,path,111,0.045204,true,0.0001 +game,T10,path,112,0.051844,true,0.0001 +game,T10,path,113,0.062487,true,0.0001 +game,T10,path,114,0.063863,true,0.0001 +game,T10,path,115,0.026768,true,0.0001 +game,T10,path,116,0.040245,true,0.0001 +game,T10,path,117,0.027885,true,0.0001 +game,T10,path,118,0.036468,true,0.0001 +game,T10,path,119,0.059213,true,0.0001 +game,T10,path,120,0.072426,true,0.0001 +game,T10,path,121,0.047608,true,0.0001 +game,T10,path,122,0.059167,true,0.0001 +game,T10,path,123,0.051396,true,0.0001 +game,T10,path,124,0.05264,true,0.0001 +game,T10,path,125,0.045372,true,0.0001 +game,T10,path,126,0.042801,true,0.0001 +game,T10,path,127,0.041859,true,0.0001 +game,T10,path,128,0.047237,true,0.0001 +game,T10,path,129,0.043407,true,0.0001 +game,T10,path,130,0.028341,true,0.0001 +game,T10,path,131,0.058127,true,0.0001 +game,T10,path,132,0.064473,true,0.0001 +game,T10,path,133,0.038874,true,0.0001 +game,T10,path,134,0.018512,true,0.0001 +game,T10,path,135,0.028113,true,0.0001 +game,T10,path,136,0.05445,true,0.0001 +game,T10,path,137,0.024614,true,0.0001 +game,T10,path,138,0.053914,true,0.0001 +game,T10,path,139,0.037193,true,0.0001 +game,T10,path,140,0.033229,true,0.0001 +game,T10,path,141,0.049082,true,0.0001 +game,T10,path,142,0.060504,true,0.0001 +game,T10,path,143,0.068805,true,0.0001 +game,T10,path,144,0.042189,true,0.0001 +game,T10,path,145,0.019698,true,0.0001 +game,T10,path,146,0.128132,false,0.0001 +game,T10,path,147,0.134961,false,0.0001 +game,T10,path,148,0.066958,true,0.0001 +game,T10,path,149,0.060483,true,0.0001 +game,T10,path,150,0.009076,true,0.0001 +game,T10,path,151,0.043142,true,0.0001 +game,T10,path,152,0.039183,true,0.0001 +game,T10,path,153,0.078535,true,0.0001 +game,T10,path,154,0.035564,true,0.0001 +game,T10,path,155,0.037982,true,0.0001 +game,T10,path,156,0.028471,true,0.0001 +game,T10,path,157,0.030603,true,0.0001 +game,T10,path,158,0.02328,true,0.0001 +game,T10,path,159,0.05634,true,0.0001 +game,T10,path,160,0.027354,true,0.0001 +game,T10,path,161,0.048547,true,0.0001 +game,T10,path,162,0.047062,true,0.0001 +game,T10,path,163,0.035739,true,0.0001 +game,T10,path,164,0.014188,true,0.0001 +game,T10,path,165,0.037166,true,0.0001 +game,T10,path,166,0.035555,true,0.0001 +game,T10,path,167,0.096412,true,0.0001 +game,T10,path,168,0.03388,true,0.0001 +game,T10,path,169,0.049572,true,0.0001 +game,T10,path,170,0.043878,true,0.0001 +game,T10,path,171,0.069887,true,0.0001 +game,T10,path,172,0.032007,true,0.0001 +game,T10,path,173,0.047224,true,0.0001 +game,T10,path,174,0.012958,true,0.0001 +game,T10,path,175,0.028524,true,0.0001 +game,T10,path,176,0.048738,true,0.0001 +game,T10,path,177,0.058888,true,0.0001 +game,T10,path,178,0.018778,true,0.0001 +game,T10,path,179,0.065237,true,0.0001 +game,T10,path,180,0.044771,true,0.0001 +game,T10,path,181,0.051146,true,0.0001 +game,T10,path,182,0.058036,true,0.0001 +game,T10,path,183,0.041736,true,0.0001 +game,T10,path,184,0.035688,true,0.0001 +game,T10,path,185,0.07958,true,0.0001 +game,T10,path,186,0.041533,true,0.0001 +game,T10,path,187,0.044183,true,0.0001 +game,T10,path,188,0.04853,true,0.0001 +game,T10,path,189,0.082099,true,0.0001 +game,T10,path,190,0.031297,true,0.0001 +game,T10,path,191,0.065608,true,0.0001 +game,T10,path,192,0.06736,true,0.0001 +game,T10,path,193,0.037194,true,0.0001 +game,T10,path,194,0.028724,true,0.0001 +game,T10,path,195,0.039806,true,0.0001 +game,T10,path,196,0.050587,true,0.0001 +game,T10,path,197,0.021422,true,0.0001 +game,T10,path,198,0.017175,true,0.0001 +game,T10,path,199,0.042674,true,0.0001 +game,T10,path,200,0.024449,true,0.0001 +game,T10,path,201,0.048291,true,0.0001 +game,T10,path,202,0.02579,true,0.0001 +game,T10,path,203,0.036151,true,0.0001 +game,T10,path,204,0.040715,true,0.0001 +game,T10,path,205,0.050645,true,0.0001 +game,T10,path,206,0.053985,true,0.0001 +game,T10,path,207,0.046323,true,0.0001 +game,T10,path,208,0.036742,true,0.0001 +game,T10,path,209,0.05262,true,0.0001 +game,T10,path,210,0.062723,true,0.0001 +game,T10,path,211,0.068515,true,0.0001 +game,T10,path,212,0.052027,true,0.0001 +game,T10,path,213,0.031152,true,0.0001 +game,T10,path,214,0.048902,true,0.0001 +game,T10,path,215,0.04378,true,0.0001 +game,T10,path,216,0.111874,true,0.0001 +game,T10,path,217,0.040098,true,0.0001 +game,T10,path,218,0.018487,true,0.0001 +game,T10,path,219,0.044314,true,0.0001 +game,T10,path,220,0.044706,true,0.0001 +game,T10,path,221,0.012727,true,0.0001 +game,T10,path,222,0.027422,true,0.0001 +game,T10,path,223,0.112732,true,0.0001 +game,T10,path,224,0.055775,true,0.0001 +game,T10,path,225,0.027746,true,0.0001 +game,T10,path,226,0.053469,true,0.0001 +game,T10,path,227,0.027206,true,0.0001 +game,T10,path,228,0.027906,true,0.0001 +game,T10,path,229,0.08683,true,0.0001 +game,T10,path,230,0.042799,true,0.0001 +game,T10,path,231,0.030111,true,0.0001 +game,T10,path,232,0.030688,true,0.0001 +game,T10,path,233,0.044112,true,0.0001 +game,T10,path,234,0.011968,true,0.0001 +game,T10,path,235,0.045144,true,0.0001 +game,T10,path,236,0.06104,true,0.0001 +game,T10,path,237,0.027882,true,0.0001 +game,T10,path,238,0.054498,true,0.0001 +game,T10,path,239,0.038122,true,0.0001 +game,T10,path,240,0.07746,true,0.0001 +game,T10,path,241,0.051402,true,0.0001 +game,T10,path,242,0.040722,true,0.0001 +game,T10,path,243,0.039287,true,0.0001 +game,T10,path,244,0.022046,true,0.0001 +game,T10,path,245,0.04453,true,0.0001 +game,T10,path,246,0.020714,true,0.0001 +game,T10,path,247,0.027073,true,0.0001 +game,T10,path,248,0.051155,true,0.0001 +game,T10,path,249,0.037402,true,0.0001 +game,T10,path,250,0.126983,false,0.0001 +game,T10,path,251,0.044198,true,0.0001 +game,T10,path,252,0.032762,true,0.0001 +game,T10,path,253,0.039626,true,0.0001 +game,T10,path,254,0.063202,true,0.0001 +game,T10,path,255,0.037506,true,0.0001 +game,T10,path,256,0.076216,true,0.0001 +game,T10,path,257,0.06928,true,0.0001 +game,T10,path,258,0.02918,true,0.0001 +game,T10,path,259,0.049125,true,0.0001 +game,T10,path,260,0.029988,true,0.0001 +game,T10,path,261,0.032553,true,0.0001 +game,T10,path,262,0.040053,true,0.0001 +game,T10,path,263,0.063655,true,0.0001 +game,T10,path,264,0.041909,true,0.0001 +game,T10,path,265,0.047551,true,0.0001 +game,T10,path,266,0.051938,true,0.0001 +game,T10,path,267,0.052724,true,0.0001 +game,T10,path,268,0.034911,true,0.0001 +game,T10,path,269,0.028406,true,0.0001 +game,T10,path,270,0.064853,true,0.0001 +game,T10,path,271,0.046478,true,0.0001 +game,T10,path,272,0.042484,true,0.0001 +game,T10,path,273,0.033637,true,0.0001 +game,T10,path,274,0.043619,true,0.0001 +game,T10,path,275,0.03591,true,0.0001 +game,T10,path,276,0.059474,true,0.0001 +game,T10,path,277,0.021042,true,0.0001 +game,T10,path,278,0.067146,true,0.0001 +game,T10,path,279,0.022078,true,0.0001 +game,T10,path,280,0.074922,true,0.0001 +game,T10,path,281,0.061834,true,0.0001 +game,T10,path,282,0.021696,true,0.0001 +game,T10,path,283,0.059738,true,0.0001 +game,T10,path,284,0.03009,true,0.0001 +game,T10,path,285,0.024938,true,0.0001 +game,T10,path,286,0.025835,true,0.0001 +game,T10,path,287,0.04739,true,0.0001 +game,T10,path,288,0.045557,true,0.0001 +game,T10,path,289,0.052707,true,0.0001 +game,T10,path,290,0.022164,true,0.0001 +game,T10,path,291,0.063421,true,0.0001 +game,T10,path,292,0.022548,true,0.0001 +game,T10,path,293,0.033699,true,0.0001 +game,T10,path,294,0.113067,true,0.0001 +game,T10,path,295,0.020766,true,0.0001 +game,T10,path,296,0.02353,true,0.0001 +game,T10,path,297,0.020897,true,0.0001 +game,T10,path,298,0.047869,true,0.0001 +game,T10,path,299,0.032551,true,0.0001 +game,T10,path,300,0.056477,true,0.0001 +game,T10,path,301,0.034463,true,0.0001 +game,T10,path,302,0.038728,true,0.0001 +game,T10,path,303,0.061378,true,0.0001 +game,T10,path,304,0.02261,true,0.0001 +game,T10,path,305,0.060813,true,0.0001 +game,T10,path,306,0.034799,true,0.0001 +game,T10,path,307,0.026743,true,0.0001 +game,T10,path,308,0.019632,true,0.0001 +game,T10,path,309,0.037416,true,0.0001 +game,T10,path,310,0.036991,true,0.0001 +game,T10,path,311,0.042736,true,0.0001 +game,T10,path,312,0.086969,true,0.0001 +game,T10,path,313,0.056881,true,0.0001 +game,T10,path,314,0.026917,true,0.0001 +game,T10,path,315,0.050621,true,0.0001 +game,T10,path,316,0.045648,true,0.0001 +game,T10,path,317,0.028414,true,0.0001 +game,T10,path,318,0.023626,true,0.0001 +game,T10,path,319,0.031872,true,0.0001 +game,T10,path,320,0.041209,true,0.0001 +game,T10,path,321,0.030288,true,0.0001 +game,T10,path,322,0.042718,true,0.0001 +game,T10,path,323,0.026473,true,0.0001 +game,T10,path,324,0.137047,false,0.0001 +game,T10,path,325,0.042348,true,0.0001 +game,T10,path,326,0.044067,true,0.0001 +game,T10,path,327,0.040833,true,0.0001 +game,T10,path,328,0.035196,true,0.0001 +game,T10,path,329,0.037035,true,0.0001 +game,T10,path,330,0.030706,true,0.0001 +game,T10,path,331,0.039371,true,0.0001 +game,T10,path,332,0.061525,true,0.0001 +game,T10,path,333,0.024189,true,0.0001 +game,T10,path,334,0.031609,true,0.0001 +game,T10,path,335,0.03635,true,0.0001 +game,T10,path,336,0.036853,true,0.0001 +game,T10,path,337,0.043955,true,0.0001 +game,T10,path,338,0.046207,true,0.0001 +game,T10,path,339,0.137197,false,0.0001 +game,T10,path,340,0.063126,true,0.0001 +game,T10,path,341,0.021098,true,0.0001 +game,T10,path,342,0.036604,true,0.0001 +game,T10,path,343,0.02964,true,0.0001 +game,T10,path,344,0.136845,false,0.0001 +game,T10,path,345,0.050013,true,0.0001 +game,T10,path,346,0.045288,true,0.0001 +game,T10,path,347,0.023919,true,0.0001 +game,T10,path,348,0.023617,true,0.0001 +game,T10,path,349,0.130053,false,0.0001 +game,T10,path,350,0.045288,true,0.0001 +game,T10,path,351,0.055205,true,0.0001 +game,T10,path,352,0.038285,true,0.0001 +game,T10,path,353,0.078151,true,0.0001 +game,T10,path,354,0.064809,true,0.0001 +game,T10,path,355,0.055364,true,0.0001 +game,T10,path,356,0.024285,true,0.0001 +game,T10,path,357,0.054648,true,0.0001 +game,T10,path,358,0.02158,true,0.0001 +game,T10,path,359,0.040248,true,0.0001 +game,T10,path,360,0.027754,true,0.0001 +game,T10,path,361,0.047788,true,0.0001 +game,T10,path,362,0.017583,true,0.0001 +game,T10,path,363,0.035926,true,0.0001 +game,T10,path,364,0.074294,true,0.0001 +game,T10,path,365,0.05109,true,0.0001 +game,T10,path,366,0.028895,true,0.0001 +game,T10,path,367,0.035135,true,0.0001 +game,T10,path,368,0.0445,true,0.0001 +game,T10,path,369,0.02124,true,0.0001 +game,T10,path,370,0.135782,false,0.0001 +game,T10,path,371,0.029895,true,0.0001 +game,T10,path,372,0.095838,true,0.0001 +game,T10,path,373,0.029829,true,0.0001 +game,T10,path,374,0.062306,true,0.0001 +game,T10,path,375,0.03471,true,0.0001 +game,T10,path,376,0.06628,true,0.0001 +game,T10,path,377,0.069925,true,0.0001 +game,T10,path,378,0.083662,true,0.0001 +game,T10,path,379,0.081007,true,0.0001 +game,T10,path,380,0.021404,true,0.0001 +game,T10,path,381,0.040444,true,0.0001 +game,T10,path,382,0.023793,true,0.0001 +game,T10,path,383,0.038605,true,0.0001 +game,T10,path,384,0.023586,true,0.0001 +game,T10,path,385,0.027306,true,0.0001 +game,T10,path,386,0.023735,true,0.0001 +game,T10,path,387,0.095852,true,0.0001 +game,T10,path,388,0.078412,true,0.0001 +game,T10,path,389,0.059933,true,0.0001 +game,T10,path,390,0.054718,true,0.0001 +game,T10,path,391,0.049084,true,0.0001 +game,T10,path,392,0.037699,true,0.0001 +game,T10,path,393,0.06807,true,0.0001 +game,T10,path,394,0.027826,true,0.0001 +game,T10,path,395,0.031588,true,0.0001 +game,T10,path,396,0.036273,true,0.0001 +game,T10,path,397,0.020886,true,0.0001 +game,T10,path,398,0.058377,true,0.0001 +game,T10,path,399,0.040481,true,0.0001 +game,T10,path,400,0.037311,true,0.0001 +game,T10,path,401,0.04047,true,0.0001 +game,T10,path,402,0.047126,true,0.0001 +game,T10,path,403,0.065448,true,0.0001 +game,T10,path,404,0.018708,true,0.0001 +game,T10,path,405,0.03469,true,0.0001 +game,T10,path,406,0.031482,true,0.0001 +game,T10,path,407,0.012527,true,0.0001 +game,T10,path,408,0.059603,true,0.0001 +game,T10,path,409,0.041312,true,0.0001 +game,T10,path,410,0.040806,true,0.0001 +game,T10,path,411,0.082609,true,0.0001 +game,T10,path,412,0.061147,true,0.0001 +game,T10,path,413,0.018602,true,0.0001 +game,T10,path,414,0.045083,true,0.0001 +game,T10,path,415,0.02896,true,0.0001 +game,T10,path,416,0.04083,true,0.0001 +game,T10,path,417,0.041558,true,0.0001 +game,T10,path,418,0.024105,true,0.0001 +game,T10,path,419,0.048697,true,0.0001 +game,T10,path,420,0.041837,true,0.0001 +game,T10,path,421,0.048687,true,0.0001 +game,T10,path,422,0.030914,true,0.0001 +game,T10,path,423,0.06555,true,0.0001 +game,T10,path,424,0.129967,false,0.0001 +game,T10,path,425,0.018372,true,0.0001 +game,T10,path,426,0.062196,true,0.0001 +game,T10,path,427,0.016914,true,0.0001 +game,T10,path,428,0.042015,true,0.0001 +game,T10,path,429,0.037016,true,0.0001 +game,T10,path,430,0.030898,true,0.0001 +game,T10,path,431,0.053983,true,0.0001 +game,T10,path,432,0.057279,true,0.0001 +game,T10,path,433,0.061679,true,0.0001 +game,T10,path,434,0.046744,true,0.0001 +game,T10,path,435,0.036,true,0.0001 +game,T10,path,436,0.116932,true,0.0001 +game,T10,path,437,0.027334,true,0.0001 +game,T10,path,438,0.032748,true,0.0001 +game,T10,path,439,0.036262,true,0.0001 +game,T10,path,440,0.035898,true,0.0001 +game,T10,path,441,0.041353,true,0.0001 +game,T10,path,442,0.066523,true,0.0001 +game,T10,path,443,0.119941,false,0.0001 +game,T10,path,444,0.113913,true,0.0001 +game,T10,path,445,0.022682,true,0.0001 +game,T10,path,446,0.071092,true,0.0001 +game,T10,path,447,0.03977,true,0.0001 +game,T10,path,448,0.028358,true,0.0001 +game,T10,path,449,0.025651,true,0.0001 +game,T10,path,450,0.037047,true,0.0001 +game,T10,path,451,0.045461,true,0.0001 +game,T10,path,452,0.024509,true,0.0001 +game,T10,path,453,0.066857,true,0.0001 +game,T10,path,454,0.056193,true,0.0001 +game,T10,path,455,0.051303,true,0.0001 +game,T10,path,456,0.048758,true,0.0001 +game,T10,path,457,0.02211,true,0.0001 +game,T10,path,458,0.035023,true,0.0001 +game,T10,path,459,0.030203,true,0.0001 +game,T10,path,460,0.030906,true,0.0001 +game,T10,path,461,0.041216,true,0.0001 +game,T10,path,462,0.022966,true,0.0001 +game,T10,path,463,0.040379,true,0.0001 +game,T10,path,464,0.073621,true,0.0001 +game,T10,path,465,0.06654,true,0.0001 +game,T10,path,466,0.024713,true,0.0001 +game,T10,path,467,0.052774,true,0.0001 +game,T10,path,468,0.028778,true,0.0001 +game,T10,path,469,0.041881,true,0.0001 +game,T10,path,470,0.037591,true,0.0001 +game,T10,path,471,0.038032,true,0.0001 +game,T10,path,472,0.055692,true,0.0001 +game,T10,path,473,0.123124,false,0.0001 +game,T10,path,474,0.040302,true,0.0001 +game,T10,path,475,0.046726,true,0.0001 +game,T10,path,476,0.049846,true,0.0001 +game,T10,path,477,0.03471,true,0.0001 +game,T10,path,478,0.032372,true,0.0001 +game,T10,path,479,0.033948,true,0.0001 +game,T10,path,480,0.071883,true,0.0001 +game,T10,path,481,0.037601,true,0.0001 +game,T10,path,482,0.027333,true,0.0001 +game,T10,path,483,0.029174,true,0.0001 +game,T10,path,484,0.045429,true,0.0001 +game,T10,path,485,0.056184,true,0.0001 +game,T10,path,486,0.053321,true,0.0001 +game,T10,path,487,0.043934,true,0.0001 +game,T10,path,488,0.072278,true,0.0001 +game,T10,path,489,0.033793,true,0.0001 +game,T10,path,490,0.028921,true,0.0001 +game,T10,path,491,0.0166,true,0.0001 +game,T10,path,492,0.024857,true,0.0001 +game,T10,path,493,0.050589,true,0.0001 +game,T10,path,494,0.034987,true,0.0001 +game,T10,path,495,0.030677,true,0.0001 +game,T10,path,496,0.030453,true,0.0001 +game,T10,path,497,0.052707,true,0.0001 +game,T10,path,498,0.060797,true,0.0001 +game,T10,path,499,0.026861,true,0.0001 +game,T10,path,500,0.070058,true,0.0001 +game,T10,path,501,0.06338,true,0.0001 +game,T10,path,502,0.03,true,0.0001 +game,T10,path,503,0.039016,true,0.0001 +game,T10,path,504,0.025061,true,0.0001 +game,T10,path,505,0.022609,true,0.0001 +game,T10,path,506,0.043722,true,0.0001 +game,T10,path,507,0.052896,true,0.0001 +game,T10,path,508,0.01447,true,0.0001 +game,T10,path,509,0.046465,true,0.0001 +game,T10,path,510,0.051165,true,0.0001 +game,T10,path,511,0.059479,true,0.0001 +game,T10,path,512,0.039149,true,0.0001 +game,T10,path,513,0.015008,true,0.0001 +game,T10,path,514,0.025668,true,0.0001 +game,T10,path,515,0.07628,true,0.0001 +game,T10,path,516,0.066958,true,0.0001 +game,T10,path,517,0.054851,true,0.0001 +game,T10,path,518,0.054319,true,0.0001 +game,T10,path,519,0.030124,true,0.0001 +game,T10,path,520,0.029369,true,0.0001 +game,T10,path,521,0.0443,true,0.0001 +game,T10,path,522,0.045573,true,0.0001 +game,T10,path,523,0.06553,true,0.0001 +game,T10,path,524,0.022247,true,0.0001 +game,T10,path,525,0.059757,true,0.0001 +game,T10,path,526,0.050204,true,0.0001 +game,T10,path,527,0.037564,true,0.0001 +game,T10,path,528,0.04207,true,0.0001 +game,T10,path,529,0.044312,true,0.0001 +game,T10,path,530,0.024418,true,0.0001 +game,T10,path,531,0.060743,true,0.0001 +game,T10,path,532,0.019825,true,0.0001 +game,T10,path,533,0.081837,true,0.0001 +game,T10,path,534,0.031405,true,0.0001 +game,T10,path,535,0.049752,true,0.0001 +game,T10,path,536,0.038399,true,0.0001 +game,T10,path,537,0.035103,true,0.0001 +game,T10,path,538,0.02128,true,0.0001 +game,T10,path,539,0.127786,false,0.0001 +game,T10,path,540,0.029624,true,0.0001 +game,T10,path,541,0.035233,true,0.0001 +game,T10,path,542,0.043206,true,0.0001 +game,T10,path,543,0.027462,true,0.0001 +game,T10,path,544,0.028472,true,0.0001 +game,T10,path,545,0.03939,true,0.0001 +game,T10,path,546,0.042114,true,0.0001 +game,T10,path,547,0.027009,true,0.0001 +game,T10,path,548,0.027798,true,0.0001 +game,T10,path,549,0.042805,true,0.0001 +game,T10,path,550,0.037392,true,0.0001 +game,T10,path,551,0.033969,true,0.0001 +game,T10,path,552,0.073879,true,0.0001 +game,T10,path,553,0.030036,true,0.0001 +game,T10,path,554,0.045322,true,0.0001 +game,T10,path,555,0.061977,true,0.0001 +game,T10,path,556,0.061847,true,0.0001 +game,T10,path,557,0.05854,true,0.0001 +game,T10,path,558,0.02418,true,0.0001 +game,T10,path,559,0.05727,true,0.0001 +game,T10,path,560,0.062397,true,0.0001 +game,T10,path,561,0.074263,true,0.0001 +game,T10,path,562,0.031549,true,0.0001 +game,T10,path,563,0.02772,true,0.0001 +game,T10,path,564,0.033411,true,0.0001 +game,T10,path,565,0.047554,true,0.0001 +game,T10,path,566,0.059644,true,0.0001 +game,T10,path,567,0.015757,true,0.0001 +game,T10,path,568,0.043594,true,0.0001 +game,T10,path,569,0.045214,true,0.0001 +game,T10,path,570,0.050229,true,0.0001 +game,T10,path,571,0.013757,true,0.0001 +game,T10,path,572,0.049754,true,0.0001 +game,T10,path,573,0.047355,true,0.0001 +game,T10,path,574,0.02794,true,0.0001 +game,T10,path,575,0.035346,true,0.0001 +game,T10,path,576,0.134593,true,0.0001 +game,T10,path,577,0.037136,true,0.0001 +game,T10,path,578,0.03732,true,0.0001 +game,T10,path,579,0.047854,true,0.0001 +game,T10,path,580,0.017535,true,0.0001 +game,T10,path,581,0.044069,true,0.0001 +game,T10,path,582,0.051226,true,0.0001 +game,T10,path,583,0.021411,true,0.0001 +game,T10,path,584,0.041824,true,0.0001 +game,T10,path,585,0.054048,true,0.0001 +game,T10,path,586,0.034621,true,0.0001 +game,T10,path,587,0.080709,true,0.0001 +game,T10,path,588,0.043544,true,0.0001 +game,T10,path,589,0.054066,true,0.0001 +game,T10,path,590,0.012469,true,0.0001 +game,T10,path,591,0.046304,true,0.0001 +game,T10,path,592,0.056209,true,0.0001 +game,T10,path,593,0.05225,true,0.0001 +game,T10,path,594,0.062811,true,0.0001 +game,T10,path,595,0.051272,true,0.0001 +game,T10,path,596,0.044798,true,0.0001 +game,T10,path,597,0.072666,true,0.0001 +game,T10,path,598,0.079409,true,0.0001 +game,T10,path,599,0.042458,true,0.0001 +game,T10,path,600,0.035939,true,0.0001 +game,T10,path,601,0.072996,true,0.0001 +game,T10,path,602,0.045049,true,0.0001 +game,T10,path,603,0.038074,true,0.0001 +game,T10,path,604,0.041478,true,0.0001 +game,T10,path,605,0.065164,true,0.0001 +game,T10,path,606,0.059584,true,0.0001 +game,T10,path,607,0.051185,true,0.0001 +game,T10,path,608,0.045947,true,0.0001 +game,T10,path,609,0.042733,true,0.0001 +game,T10,path,610,0.046106,true,0.0001 +game,T10,path,611,0.050327,true,0.0001 +game,T10,path,612,0.050817,true,0.0001 +game,T10,path,613,0.034331,true,0.0001 +game,T10,path,614,0.051801,true,0.0001 +game,T10,path,615,0.024734,true,0.0001 +game,T10,path,616,0.058747,true,0.0001 +game,T10,path,617,0.045978,true,0.0001 +game,T10,path,618,0.066615,true,0.0001 +game,T10,path,619,0.051562,true,0.0001 +game,T10,path,620,0.051113,true,0.0001 +game,T10,path,621,0.065732,true,0.0001 +game,T10,path,622,0.029252,true,0.0001 +game,T10,path,623,0.028593,true,0.0001 +game,T10,path,624,0.128051,false,0.0001 +game,T10,path,625,0.026801,true,0.0001 +game,T10,path,626,0.041485,true,0.0001 +game,T10,path,627,0.036236,true,0.0001 +game,T10,path,628,0.030951,true,0.0001 +game,T10,path,629,0.11997,false,0.0001 +game,T10,path,630,0.061711,true,0.0001 +game,T10,path,631,0.066317,true,0.0001 +game,T10,path,632,0.035464,true,0.0001 +game,T10,path,633,0.059064,true,0.0001 +game,T10,path,634,0.046921,true,0.0001 +game,T10,path,635,0.06422,true,0.0001 +game,T10,path,636,0.039102,true,0.0001 +game,T10,path,637,0.060839,true,0.0001 +game,T10,path,638,0.039617,true,0.0001 +game,T10,path,639,0.073273,true,0.0001 +game,T10,path,640,0.027252,true,0.0001 +game,T10,path,641,0.038158,true,0.0001 +game,T10,path,642,0.047121,true,0.0001 +game,T10,path,643,0.033702,true,0.0001 +game,T10,path,644,0.038325,true,0.0001 +game,T10,path,645,0.049432,true,0.0001 +game,T10,path,646,0.011049,true,0.0001 +game,T10,path,647,0.042482,true,0.0001 +game,T10,path,648,0.03344,true,0.0001 +game,T10,path,649,0.015252,true,0.0001 +game,T10,path,650,0.034164,true,0.0001 +game,T10,path,651,0.02682,true,0.0001 +game,T10,path,652,0.017652,true,0.0001 +game,T10,path,653,0.037248,true,0.0001 +game,T10,path,654,0.055803,true,0.0001 +game,T10,path,655,0.045606,true,0.0001 +game,T10,path,656,0.060724,true,0.0001 +game,T10,path,657,0.037412,true,0.0001 +game,T10,path,658,0.02659,true,0.0001 +game,T10,path,659,0.044258,true,0.0001 +game,T10,path,660,0.10734,true,0.0001 +game,T10,path,661,0.05709,true,0.0001 +game,T10,path,662,0.038195,true,0.0001 +game,T10,path,663,0.040812,true,0.0001 +game,T10,path,664,0.050324,true,0.0001 +game,T10,path,665,0.046645,true,0.0001 +game,T10,path,666,0.028443,true,0.0001 +game,T10,path,667,0.030589,true,0.0001 +game,T10,path,668,0.062894,true,0.0001 +game,T10,path,669,0.036422,true,0.0001 +game,T10,path,670,0.068795,true,0.0001 +game,T10,path,671,0.039276,true,0.0001 +game,T10,path,672,0.04203,true,0.0001 +game,T10,path,673,0.034149,true,0.0001 +game,T10,path,674,0.049155,true,0.0001 +game,T10,path,675,0.024868,true,0.0001 +game,T10,path,676,0.039834,true,0.0001 +game,T10,path,677,0.024383,true,0.0001 +game,T10,path,678,0.030948,true,0.0001 +game,T10,path,679,0.052095,true,0.0001 +game,T10,path,680,0.028159,true,0.0001 +game,T10,path,681,0.037286,true,0.0001 +game,T10,path,682,0.051663,true,0.0001 +game,T10,path,683,0.019202,true,0.0001 +game,T10,path,684,0.074106,true,0.0001 +game,T10,path,685,0.059045,true,0.0001 +game,T10,path,686,0.049094,true,0.0001 +game,T10,path,687,0.129875,false,0.0001 +game,T10,path,688,0.047459,true,0.0001 +game,T10,path,689,0.01652,true,0.0001 +game,T10,path,690,0.070668,true,0.0001 +game,T10,path,691,0.022495,true,0.0001 +game,T10,path,692,0.017946,true,0.0001 +game,T10,path,693,0.06392,true,0.0001 +game,T10,path,694,0.056123,true,0.0001 +game,T10,path,695,0.054001,true,0.0001 +game,T10,path,696,0.050942,true,0.0001 +game,T10,path,697,0.05761,true,0.0001 +game,T10,path,698,0.038436,true,0.0001 +game,T10,path,699,0.058319,true,0.0001 +game,T10,path,700,0.034781,true,0.0001 +game,T10,path,701,0.031566,true,0.0001 +game,T10,path,702,0.045267,true,0.0001 +game,T10,path,703,0.046476,true,0.0001 +game,T10,path,704,0.042212,true,0.0001 +game,T10,path,705,0.044332,true,0.0001 +game,T10,path,706,0.033609,true,0.0001 +game,T10,path,707,0.022723,true,0.0001 +game,T10,path,708,0.03247,true,0.0001 +game,T10,path,709,0.052799,true,0.0001 +game,T10,path,710,0.026022,true,0.0001 +game,T10,path,711,0.042652,true,0.0001 +game,T10,path,712,0.0539,true,0.0001 +game,T10,path,713,0.039975,true,0.0001 +game,T10,path,714,0.064931,true,0.0001 +game,T10,path,715,0.029951,true,0.0001 +game,T10,path,716,0.024886,true,0.0001 +game,T10,path,717,0.014673,true,0.0001 +game,T10,path,718,0.051582,true,0.0001 +game,T10,path,719,0.046357,true,0.0001 +game,T10,path,720,0.045319,true,0.0001 +game,T10,path,721,0.033892,true,0.0001 +game,T10,path,722,0.037016,true,0.0001 +game,T10,path,723,0.031963,true,0.0001 +game,T10,path,724,0.041085,true,0.0001 +game,T10,path,725,0.031114,true,0.0001 +game,T10,path,726,0.047815,true,0.0001 +game,T10,path,727,0.036764,true,0.0001 +game,T10,path,728,0.040609,true,0.0001 +game,T10,path,729,0.039374,true,0.0001 +game,T10,path,730,0.02929,true,0.0001 +game,T10,path,731,0.025333,true,0.0001 +game,T10,path,732,0.051592,true,0.0001 +game,T10,path,733,0.045727,true,0.0001 +game,T10,path,734,0.01145,true,0.0001 +game,T10,path,735,0.05132,true,0.0001 +game,T10,path,736,0.033636,true,0.0001 +game,T10,path,737,0.05203,true,0.0001 +game,T10,path,738,0.014686,true,0.0001 +game,T10,path,739,0.062423,true,0.0001 +game,T10,path,740,0.041638,true,0.0001 +game,T10,path,741,0.064542,true,0.0001 +game,T10,path,742,0.042594,true,0.0001 +game,T10,path,743,0.055675,true,0.0001 +game,T10,path,744,0.024865,true,0.0001 +game,T10,path,745,0.037754,true,0.0001 +game,T10,path,746,0.025424,true,0.0001 +game,T10,path,747,0.064534,true,0.0001 +game,T10,path,748,0.05873,true,0.0001 +game,T10,path,749,0.069104,true,0.0001 +game,T10,path,750,0.02965,true,0.0001 +game,T10,path,751,0.014603,true,0.0001 +game,T10,path,752,0.039065,true,0.0001 +game,T10,path,753,0.132751,false,0.0001 +game,T10,path,754,0.035959,true,0.0001 +game,T10,path,755,0.035607,true,0.0001 +game,T10,path,756,0.049096,true,0.0001 +game,T10,path,757,0.044042,true,0.0001 +game,T10,path,758,0.031807,true,0.0001 +game,T10,path,759,0.032309,true,0.0001 +game,T10,path,760,0.033307,true,0.0001 +game,T10,path,761,0.052054,true,0.0001 +game,T10,path,762,0.079089,true,0.0001 +game,T10,path,763,0.069371,true,0.0001 +game,T10,path,764,0.034081,true,0.0001 +game,T10,path,765,0.033997,true,0.0001 +game,T10,path,766,0.031837,true,0.0001 +game,T10,path,767,0.013255,true,0.0001 +game,T10,path,768,0.02848,true,0.0001 +game,T10,path,769,0.030551,true,0.0001 +game,T10,path,770,0.144869,false,0.0001 +game,T10,path,771,0.058044,true,0.0001 +game,T10,path,772,0.032815,true,0.0001 +game,T10,path,773,0.029507,true,0.0001 +game,T10,path,774,0.027561,true,0.0001 +game,T10,path,775,0.024538,true,0.0001 +game,T10,path,776,0.045235,true,0.0001 +game,T10,path,777,0.029591,true,0.0001 +game,T10,path,778,0.052765,true,0.0001 +game,T10,path,779,0.054891,true,0.0001 +game,T10,path,780,0.024575,true,0.0001 +game,T10,path,781,0.072153,true,0.0001 +game,T10,path,782,0.041632,true,0.0001 +game,T10,path,783,0.039919,true,0.0001 +game,T10,path,784,0.050311,true,0.0001 +game,T10,path,785,0.013619,true,0.0001 +game,T10,path,786,0.049839,true,0.0001 +game,T10,path,787,0.123803,false,0.0001 +game,T10,path,788,0.041029,true,0.0001 +game,T10,path,789,0.040233,true,0.0001 +game,T10,path,790,0.027474,true,0.0001 +game,T10,path,791,0.02667,true,0.0001 +game,T10,path,792,0.047722,true,0.0001 +game,T10,path,793,0.026812,true,0.0001 +game,T10,path,794,0.046815,true,0.0001 +game,T10,path,795,0.039576,true,0.0001 +game,T10,path,796,0.055419,true,0.0001 +game,T10,path,797,0.041429,true,0.0001 +game,T10,path,798,0.065223,true,0.0001 +game,T10,path,799,0.035681,true,0.0001 +game,T10,path,800,0.041819,true,0.0001 +game,T10,path,801,0.084356,true,0.0001 +game,T10,path,802,0.056035,true,0.0001 +game,T10,path,803,0.081938,true,0.0001 +game,T10,path,804,0.085143,true,0.0001 +game,T10,path,805,0.034234,true,0.0001 +game,T10,path,806,0.040643,true,0.0001 +game,T10,path,807,0.028261,true,0.0001 +game,T10,path,808,0.037124,true,0.0001 +game,T10,path,809,0.0556,true,0.0001 +game,T10,path,810,0.04898,true,0.0001 +game,T10,path,811,0.05358,true,0.0001 +game,T10,path,812,0.019414,true,0.0001 +game,T10,path,813,0.046475,true,0.0001 +game,T10,path,814,0.060567,true,0.0001 +game,T10,path,815,0.039515,true,0.0001 +game,T10,path,816,0.063955,true,0.0001 +game,T10,path,817,0.037937,true,0.0001 +game,T10,path,818,0.03411,true,0.0001 +game,T10,path,819,0.030833,true,0.0001 +game,T10,path,820,0.037495,true,0.0001 +game,T10,path,821,0.048091,true,0.0001 +game,T10,path,822,0.064286,true,0.0001 +game,T10,path,823,0.047854,true,0.0001 +game,T10,path,824,0.031707,true,0.0001 +game,T10,path,825,0.015174,true,0.0001 +game,T10,path,826,0.03844,true,0.0001 +game,T10,path,827,0.028972,true,0.0001 +game,T10,path,828,0.079199,true,0.0001 +game,T10,path,829,0.04892,true,0.0001 +game,T10,path,830,0.038968,true,0.0001 +game,T10,path,831,0.039137,true,0.0001 +game,T10,path,832,0.021958,true,0.0001 +game,T10,path,833,0.03937,true,0.0001 +game,T10,path,834,0.037714,true,0.0001 +game,T10,path,835,0.033792,true,0.0001 +game,T10,path,836,0.043439,true,0.0001 +game,T10,path,837,0.080812,true,0.0001 +game,T10,path,838,0.045802,true,0.0001 +game,T10,path,839,0.026066,true,0.0001 +game,T10,path,840,0.042887,true,0.0001 +game,T10,path,841,0.028368,true,0.0001 +game,T10,path,842,0.014353,true,0.0001 +game,T10,path,843,0.03518,true,0.0001 +game,T10,path,844,0.069096,true,0.0001 +game,T10,path,845,0.028991,true,0.0001 +game,T10,path,846,0.029718,true,0.0001 +game,T10,path,847,0.134018,false,0.0001 +game,T10,path,848,0.033724,true,0.0001 +game,T10,path,849,0.045331,true,0.0001 +game,T10,path,850,0.034428,true,0.0001 +game,T10,path,851,0.036372,true,0.0001 +game,T10,path,852,0.037053,true,0.0001 +game,T10,path,853,0.016302,true,0.0001 +game,T10,path,854,0.13258,false,0.0001 +game,T10,path,855,0.047463,true,0.0001 +game,T10,path,856,0.035048,true,0.0001 +game,T10,path,857,0.075423,true,0.0001 +game,T10,path,858,0.047938,true,0.0001 +game,T10,path,859,0.043557,true,0.0001 +game,T10,path,860,0.037924,true,0.0001 +game,T10,path,861,0.024193,true,0.0001 +game,T10,path,862,0.04271,true,0.0001 +game,T10,path,863,0.037366,true,0.0001 +game,T10,path,864,0.02132,true,0.0001 +game,T10,path,865,0.036469,true,0.0001 +game,T10,path,866,0.0261,true,0.0001 +game,T10,path,867,0.024468,true,0.0001 +game,T10,path,868,0.053612,true,0.0001 +game,T10,path,869,0.061614,true,0.0001 +game,T10,path,870,0.036241,true,0.0001 +game,T10,path,871,0.054229,true,0.0001 +game,T10,path,872,0.058994,true,0.0001 +game,T10,path,873,0.026659,true,0.0001 +game,T10,path,874,0.019545,true,0.0001 +game,T10,path,875,0.047559,true,0.0001 +game,T10,path,876,0.055953,true,0.0001 +game,T10,path,877,0.124099,false,0.0001 +game,T10,path,878,0.046008,true,0.0001 +game,T10,path,879,0.045365,true,0.0001 +game,T10,path,880,0.114195,true,0.0001 +game,T10,path,881,0.056875,true,0.0001 +game,T10,path,882,0.029961,true,0.0001 +game,T10,path,883,0.067868,true,0.0001 +game,T10,path,884,0.047061,true,0.0001 +game,T10,path,885,0.014721,true,0.0001 +game,T10,path,886,0.054093,true,0.0001 +game,T10,path,887,0.024843,true,0.0001 +game,T10,path,888,0.020065,true,0.0001 +game,T10,path,889,0.057532,true,0.0001 +game,T10,path,890,0.01294,true,0.0001 +game,T10,path,891,0.056088,true,0.0001 +game,T10,path,892,0.040901,true,0.0001 +game,T10,path,893,0.074585,true,0.0001 +game,T10,path,894,0.05731,true,0.0001 +game,T10,path,895,0.043493,true,0.0001 +game,T10,path,896,0.068563,true,0.0001 +game,T10,path,897,0.044071,true,0.0001 +game,T10,path,898,0.12087,false,0.0001 +game,T10,path,899,0.020228,true,0.0001 +game,T10,path,900,0.042308,true,0.0001 +game,T10,path,901,0.054892,true,0.0001 +game,T10,path,902,0.065257,true,0.0001 +game,T10,path,903,0.021801,true,0.0001 +game,T10,path,904,0.037198,true,0.0001 +game,T10,path,905,0.057959,true,0.0001 +game,T10,path,906,0.044384,true,0.0001 +game,T10,path,907,0.041422,true,0.0001 +game,T10,path,908,0.04497,true,0.0001 +game,T10,path,909,0.058181,true,0.0001 +game,T10,path,910,0.024614,true,0.0001 +game,T10,path,911,0.063741,true,0.0001 +game,T10,path,912,0.094783,true,0.0001 +game,T10,path,913,0.024818,true,0.0001 +game,T10,path,914,0.112633,true,0.0001 +game,T10,path,915,0.048833,true,0.0001 +game,T10,path,916,0.048253,true,0.0001 +game,T10,path,917,0.041198,true,0.0001 +game,T10,path,918,0.037239,true,0.0001 +game,T10,path,919,0.036791,true,0.0001 +game,T10,path,920,0.047473,true,0.0001 +game,T10,path,921,0.021746,true,0.0001 +game,T10,path,922,0.05414,true,0.0001 +game,T10,path,923,0.128918,false,0.0001 +game,T10,path,924,0.026133,true,0.0001 +game,T10,path,925,0.04674,true,0.0001 +game,T10,path,926,0.063728,true,0.0001 +game,T10,path,927,0.047349,true,0.0001 +game,T10,path,928,0.025463,true,0.0001 +game,T10,path,929,0.043552,true,0.0001 +game,T10,path,930,0.057767,true,0.0001 +game,T10,path,931,0.047955,true,0.0001 +game,T10,path,932,0.064798,true,0.0001 +game,T10,path,933,0.044009,true,0.0001 +game,T10,path,934,0.048194,true,0.0001 +game,T10,path,935,0.053676,true,0.0001 +game,T10,path,936,0.056125,true,0.0001 +game,T10,path,937,0.045457,true,0.0001 +game,T10,path,938,0.045011,true,0.0001 +game,T10,path,939,0.074448,true,0.0001 +game,T10,path,940,0.042357,true,0.0001 +game,T10,path,941,0.029567,true,0.0001 +game,T10,path,942,0.04332,true,0.0001 +game,T10,path,943,0.066289,true,0.0001 +game,T10,path,944,0.038892,true,0.0001 +game,T10,path,945,0.029834,true,0.0001 +game,T10,path,946,0.047346,true,0.0001 +game,T10,path,947,0.015087,true,0.0001 +game,T10,path,948,0.028032,true,0.0001 +game,T10,path,949,0.033005,true,0.0001 +game,T10,path,950,0.064613,true,0.0001 +game,T10,path,951,0.094342,true,0.0001 +game,T10,path,952,0.048216,true,0.0001 +game,T10,path,953,0.038477,true,0.0001 +game,T10,path,954,0.026189,true,0.0001 +game,T10,path,955,0.039223,true,0.0001 +game,T10,path,956,0.021573,true,0.0001 +game,T10,path,957,0.044167,true,0.0001 +game,T10,path,958,0.074169,true,0.0001 +game,T10,path,959,0.038813,true,0.0001 +game,T10,path,960,0.03838,true,0.0001 +game,T10,path,961,0.027056,true,0.0001 +game,T10,path,962,0.038373,true,0.0001 +game,T10,path,963,0.034372,true,0.0001 +game,T10,path,964,0.029756,true,0.0001 +game,T10,path,965,0.041813,true,0.0001 +game,T10,path,966,0.05573,true,0.0001 +game,T10,path,967,0.042243,true,0.0001 +game,T10,path,968,0.052351,true,0.0001 +game,T10,path,969,0.043988,true,0.0001 +game,T10,path,970,0.045737,true,0.0001 +game,T10,path,971,0.045204,true,0.0001 +game,T10,path,972,0.0483,true,0.0001 +game,T10,path,973,0.04782,true,0.0001 +game,T10,path,974,0.050042,true,0.0001 +game,T10,path,975,0.023349,true,0.0001 +game,T10,path,976,0.133743,false,0.0001 +game,T10,path,977,0.0344,true,0.0001 +game,T10,path,978,0.047272,true,0.0001 +game,T10,path,979,0.047972,true,0.0001 +game,T10,path,980,0.043786,true,0.0001 +game,T10,path,981,0.0129,true,0.0001 +game,T10,path,982,0.056278,true,0.0001 +game,T10,path,983,0.129826,false,0.0001 +game,T10,path,984,0.035238,true,0.0001 +game,T10,path,985,0.024711,true,0.0001 +game,T10,path,986,0.037903,true,0.0001 +game,T10,path,987,0.046218,true,0.0001 +game,T10,path,988,0.014274,true,0.0001 +game,T10,path,989,0.052865,true,0.0001 +game,T10,path,990,0.040774,true,0.0001 +game,T10,path,991,0.055231,true,0.0001 +game,T10,path,992,0.028162,true,0.0001 +game,T10,path,993,0.058927,true,0.0001 +game,T10,path,994,0.078618,true,0.0001 +game,T10,path,995,0.119926,false,0.0001 +game,T10,path,996,0.053814,true,0.0001 +game,T10,path,997,0.063387,true,0.0001 +game,T10,path,998,0.057586,true,0.0001 +game,T10,path,999,0.048905,true,0.0001 +game,T10,path,1000,0.049535,true,0.0001 +game,T10,path,1001,0.034539,true,0.0001 +game,T10,path,1002,0.055744,true,0.0001 +game,T10,path,1003,0.015512,true,0.0001 +game,T10,path,1004,0.029054,true,0.0001 +game,T10,path,1005,0.054799,true,0.0001 +game,T10,path,1006,0.029774,true,0.0001 +game,T10,path,1007,0.020752,true,0.0001 +game,T10,path,1008,0.048763,true,0.0001 +game,T10,path,1009,0.050188,true,0.0001 +game,T10,path,1010,0.015932,true,0.0001 +game,T10,path,1011,0.0185,true,0.0001 +game,T10,path,1012,0.041663,true,0.0001 +game,T10,path,1013,0.133923,false,0.0001 +game,T10,path,1014,0.078546,true,0.0001 +game,T10,path,1015,0.024005,true,0.0001 +game,T10,path,1016,0.04257,true,0.0001 +game,T10,path,1017,0.032378,true,0.0001 +game,T10,path,1018,0.052755,true,0.0001 +game,T10,path,1019,0.062188,true,0.0001 +game,T10,path,1020,0.041355,true,0.0001 +game,T10,path,1021,0.091967,true,0.0001 +game,T10,path,1022,0.039452,true,0.0001 +game,T10,path,1023,0.028235,true,0.0001 +game,T10,path,1024,0.04769,true,0.0001 +qp,p32i16,path,1,0.005042,false,0.0001 +qp,p32i16,path,2,0.006857,false,0.0001 +qp,p32i16,path,3,0.004777,false,0.0001 +qp,p32i16,path,4,0.000282,true,0.0001 +qp,p32i16,path,5,0.000279,true,0.0001 +qp,p32i16,path,6,0.005782,false,0.0001 +qp,p32i16,path,7,0.005355,false,0.0001 +qp,p32i16,path,8,0.025464,false,0.0001 +qp,p32i16,path,9,0.006482,false,0.0001 +qp,p32i16,path,10,0.00902,false,0.0001 +qp,p32i16,path,11,0.000366,true,0.0001 +qp,p32i16,path,12,0.000293,true,0.0001 +qp,p32i16,path,13,0.005998,false,0.0001 +qp,p32i16,path,14,0.006106,false,0.0001 +qp,p32i16,path,15,0.000384,true,0.0001 +qp,p32i16,path,16,0.005547,false,0.0001 +qp,p32i16,path,17,0.000387,true,0.0001 +qp,p32i16,path,18,0.019847,false,0.0001 +qp,p32i16,path,19,0.005098,false,0.0001 +qp,p32i16,path,20,0.004678,false,0.0001 +qp,p32i16,path,21,0.000303,true,0.0001 +qp,p32i16,path,22,0.004514,false,0.0001 +qp,p32i16,path,23,0.005896,false,0.0001 +qp,p32i16,path,24,0.009108,false,0.0001 +qp,p32i16,path,25,0.00373,false,0.0001 +qp,p32i16,path,26,0.000302,true,0.0001 +qp,p32i16,path,27,0.003377,false,0.0001 +qp,p32i16,path,28,0.006615,false,0.0001 +qp,p32i16,path,29,0.005148,false,0.0001 +qp,p32i16,path,30,0.010475,false,0.0001 +qp,p32i16,path,31,0.000317,true,0.0001 +qp,p32i16,path,32,0.011981,false,0.0001 +qp,p32i16,path,33,0.000313,true,0.0001 +qp,p32i16,path,34,0.000307,true,0.0001 +qp,p32i16,path,35,0.006932,false,0.0001 +qp,p32i16,path,36,0.008687,false,0.0001 +qp,p32i16,path,37,0.004832,false,0.0001 +qp,p32i16,path,38,0.003508,false,0.0001 +qp,p32i16,path,39,0.011097,false,0.0001 +qp,p32i16,path,40,0.00036,true,0.0001 +qp,p32i16,path,41,0.000355,true,0.0001 +qp,p32i16,path,42,0.004888,false,0.0001 +qp,p32i16,path,43,0.000334,true,0.0001 +qp,p32i16,path,44,0.003645,false,0.0001 +qp,p32i16,path,45,0.008207,false,0.0001 +qp,p32i16,path,46,0.005096,false,0.0001 +qp,p32i16,path,47,0.005121,false,0.0001 +qp,p32i16,path,48,0.000291,true,0.0001 +qp,p32i16,path,49,0.000284,true,0.0001 +qp,p32i16,path,50,0.000282,true,0.0001 +qp,p32i16,path,51,0.009674,false,0.0001 +qp,p32i16,path,52,0.004178,false,0.0001 +qp,p32i16,path,53,0.000294,true,0.0001 +qp,p32i16,path,54,0.000313,true,0.0001 +qp,p32i16,path,55,0.004452,false,0.0001 +qp,p32i16,path,56,0.000412,true,0.0001 +qp,p32i16,path,57,0.004347,false,0.0001 +qp,p32i16,path,58,0.000304,true,0.0001 +qp,p32i16,path,59,0.0003,true,0.0001 +qp,p32i16,path,60,0.000284,true,0.0001 +qp,p32i16,path,61,0.009919,false,0.0001 +qp,p32i16,path,62,0.000317,true,0.0001 +qp,p32i16,path,63,0.000286,true,0.0001 +qp,p32i16,path,64,0.007275,false,0.0001 +qp,p32i16,path,65,0.000314,true,0.0001 +qp,p32i16,path,66,0.000517,true,0.0001 +qp,p32i16,path,67,0.010148,false,0.0001 +qp,p32i16,path,68,0.000311,true,0.0001 +qp,p32i16,path,69,0.005172,false,0.0001 +qp,p32i16,path,70,0.005488,false,0.0001 +qp,p32i16,path,71,0.004129,false,0.0001 +qp,p32i16,path,72,0.000289,true,0.0001 +qp,p32i16,path,73,0.006621,false,0.0001 +qp,p32i16,path,74,0.000311,true,0.0001 +qp,p32i16,path,75,0.004209,false,0.0001 +qp,p32i16,path,76,0.008244,false,0.0001 +qp,p32i16,path,77,0.007298,false,0.0001 +qp,p32i16,path,78,0.004555,false,0.0001 +qp,p32i16,path,79,0.000293,true,0.0001 +qp,p32i16,path,80,0.009543,false,0.0001 +qp,p32i16,path,81,0.004651,false,0.0001 +qp,p32i16,path,82,0.008932,false,0.0001 +qp,p32i16,path,83,0.000293,true,0.0001 +qp,p32i16,path,84,0.000292,true,0.0001 +qp,p32i16,path,85,0.006615,false,0.0001 +qp,p32i16,path,86,0.006823,false,0.0001 +qp,p32i16,path,87,0.005728,false,0.0001 +qp,p32i16,path,88,0.000284,true,0.0001 +qp,p32i16,path,89,0.000307,true,0.0001 +qp,p32i16,path,90,0.008748,false,0.0001 +qp,p32i16,path,91,0.00506,false,0.0001 +qp,p32i16,path,92,0.005519,false,0.0001 +qp,p32i16,path,93,0.000312,true,0.0001 +qp,p32i16,path,94,0.007476,false,0.0001 +qp,p32i16,path,95,0.00031,true,0.0001 +qp,p32i16,path,96,0.000308,true,0.0001 +qp,p32i16,path,97,0.000304,true,0.0001 +qp,p32i16,path,98,0.000652,true,0.0001 +qp,p32i16,path,99,0.000288,true,0.0001 +qp,p32i16,path,100,0.003911,false,0.0001 +qp,p32i16,path,101,0.009107,false,0.0001 +qp,p32i16,path,102,0.005387,false,0.0001 +qp,p32i16,path,103,0.000299,true,0.0001 +qp,p32i16,path,104,0.000298,true,0.0001 +qp,p32i16,path,105,0.004763,false,0.0001 +qp,p32i16,path,106,0.006338,false,0.0001 +qp,p32i16,path,107,0.000324,true,0.0001 +qp,p32i16,path,108,0.0066,false,0.0001 +qp,p32i16,path,109,0.00397,false,0.0001 +qp,p32i16,path,110,0.004502,false,0.0001 +qp,p32i16,path,111,0.000288,true,0.0001 +qp,p32i16,path,112,0.000292,true,0.0001 +qp,p32i16,path,113,0.000305,true,0.0001 +qp,p32i16,path,114,0.000276,true,0.0001 +qp,p32i16,path,115,0.000276,true,0.0001 +qp,p32i16,path,116,0.005718,false,0.0001 +qp,p32i16,path,117,0.003837,false,0.0001 +qp,p32i16,path,118,0.000299,true,0.0001 +qp,p32i16,path,119,0.006604,false,0.0001 +qp,p32i16,path,120,0.000327,true,0.0001 +qp,p32i16,path,121,0.0003,true,0.0001 +qp,p32i16,path,122,0.000298,true,0.0001 +qp,p32i16,path,123,0.000271,true,0.0001 +qp,p32i16,path,124,0.005599,false,0.0001 +qp,p32i16,path,125,0.00656,false,0.0001 +qp,p32i16,path,126,0.000329,true,0.0001 +qp,p32i16,path,127,0.000341,true,0.0001 +qp,p32i16,path,128,0.003517,false,0.0001 +qp,p32i16,path,129,0.006036,false,0.0001 +qp,p32i16,path,130,0.011487,false,0.0001 +qp,p32i16,path,131,0.000311,true,0.0001 +qp,p32i16,path,132,0.000293,true,0.0001 +qp,p32i16,path,133,0.006407,false,0.0001 +qp,p32i16,path,134,0.00513,false,0.0001 +qp,p32i16,path,135,0.007813,false,0.0001 +qp,p32i16,path,136,0.006245,false,0.0001 +qp,p32i16,path,137,0.005617,false,0.0001 +qp,p32i16,path,138,0.006903,false,0.0001 +qp,p32i16,path,139,0.012201,false,0.0001 +qp,p32i16,path,140,0.00032,true,0.0001 +qp,p32i16,path,141,0.00592,false,0.0001 +qp,p32i16,path,142,0.000529,true,0.0001 +qp,p32i16,path,143,0.004717,false,0.0001 +qp,p32i16,path,144,0.000566,true,0.0001 +qp,p32i16,path,145,0.003865,false,0.0001 +qp,p32i16,path,146,0.000303,true,0.0001 +qp,p32i16,path,147,0.00607,false,0.0001 +qp,p32i16,path,148,0.007077,false,0.0001 +qp,p32i16,path,149,0.000302,true,0.0001 +qp,p32i16,path,150,0.004882,false,0.0001 +qp,p32i16,path,151,0.000319,true,0.0001 +qp,p32i16,path,152,0.006638,false,0.0001 +qp,p32i16,path,153,0.000324,true,0.0001 +qp,p32i16,path,154,0.008448,false,0.0001 +qp,p32i16,path,155,0.00632,false,0.0001 +qp,p32i16,path,156,0.010241,false,0.0001 +qp,p32i16,path,157,0.00033,true,0.0001 +qp,p32i16,path,158,0.012144,false,0.0001 +qp,p32i16,path,159,0.000291,true,0.0001 +qp,p32i16,path,160,0.005335,false,0.0001 +qp,p32i16,path,161,0.000306,true,0.0001 +qp,p32i16,path,162,0.000295,true,0.0001 +qp,p32i16,path,163,0.000326,true,0.0001 +qp,p32i16,path,164,0.000305,true,0.0001 +qp,p32i16,path,165,0.007075,false,0.0001 +qp,p32i16,path,166,0.000302,true,0.0001 +qp,p32i16,path,167,0.009628,false,0.0001 +qp,p32i16,path,168,0.004936,false,0.0001 +qp,p32i16,path,169,0.005112,false,0.0001 +qp,p32i16,path,170,0.000303,true,0.0001 +qp,p32i16,path,171,0.006421,false,0.0001 +qp,p32i16,path,172,0.000331,true,0.0001 +qp,p32i16,path,173,0.000276,true,0.0001 +qp,p32i16,path,174,0.008021,false,0.0001 +qp,p32i16,path,175,0.004465,false,0.0001 +qp,p32i16,path,176,0.00029,true,0.0001 +qp,p32i16,path,177,0.004887,false,0.0001 +qp,p32i16,path,178,0.007311,false,0.0001 +qp,p32i16,path,179,0.000297,true,0.0001 +qp,p32i16,path,180,0.005863,false,0.0001 +qp,p32i16,path,181,0.005073,false,0.0001 +qp,p32i16,path,182,0.008652,false,0.0001 +qp,p32i16,path,183,0.010762,false,0.0001 +qp,p32i16,path,184,0.004372,false,0.0001 +qp,p32i16,path,185,0.011512,false,0.0001 +qp,p32i16,path,186,0.007616,false,0.0001 +qp,p32i16,path,187,0.006472,false,0.0001 +qp,p32i16,path,188,0.000323,true,0.0001 +qp,p32i16,path,189,0.000628,true,0.0001 +qp,p32i16,path,190,0.010822,false,0.0001 +qp,p32i16,path,191,0.0044,false,0.0001 +qp,p32i16,path,192,0.004079,false,0.0001 +qp,p32i16,path,193,0.000346,true,0.0001 +qp,p32i16,path,194,0.005771,false,0.0001 +qp,p32i16,path,195,0.000313,true,0.0001 +qp,p32i16,path,196,0.008547,false,0.0001 +qp,p32i16,path,197,0.005091,false,0.0001 +qp,p32i16,path,198,0.003439,false,0.0001 +qp,p32i16,path,199,0.000343,true,0.0001 +qp,p32i16,path,200,0.000298,true,0.0001 +qp,p32i16,path,201,0.015202,false,0.0001 +qp,p32i16,path,202,0.005532,false,0.0001 +qp,p32i16,path,203,0.01054,false,0.0001 +qp,p32i16,path,204,0.005259,false,0.0001 +qp,p32i16,path,205,0.004903,false,0.0001 +qp,p32i16,path,206,0.005576,false,0.0001 +qp,p32i16,path,207,0.009207,false,0.0001 +qp,p32i16,path,208,0.003972,false,0.0001 +qp,p32i16,path,209,0.000311,true,0.0001 +qp,p32i16,path,210,0.007181,false,0.0001 +qp,p32i16,path,211,0.009967,false,0.0001 +qp,p32i16,path,212,0.007203,false,0.0001 +qp,p32i16,path,213,0.000316,true,0.0001 +qp,p32i16,path,214,0.006191,false,0.0001 +qp,p32i16,path,215,0.003328,false,0.0001 +qp,p32i16,path,216,0.000288,true,0.0001 +qp,p32i16,path,217,0.010692,false,0.0001 +qp,p32i16,path,218,0.005843,false,0.0001 +qp,p32i16,path,219,0.000586,true,0.0001 +qp,p32i16,path,220,0.009939,false,0.0001 +qp,p32i16,path,221,0.007161,false,0.0001 +qp,p32i16,path,222,0.000324,true,0.0001 +qp,p32i16,path,223,0.00729,false,0.0001 +qp,p32i16,path,224,0.006933,false,0.0001 +qp,p32i16,path,225,0.007372,false,0.0001 +qp,p32i16,path,226,0.006897,false,0.0001 +qp,p32i16,path,227,0.003584,false,0.0001 +qp,p32i16,path,228,0.000309,true,0.0001 +qp,p32i16,path,229,0.000315,true,0.0001 +qp,p32i16,path,230,0.006199,false,0.0001 +qp,p32i16,path,231,0.005431,false,0.0001 +qp,p32i16,path,232,0.007496,false,0.0001 +qp,p32i16,path,233,0.00518,false,0.0001 +qp,p32i16,path,234,0.00053,true,0.0001 +qp,p32i16,path,235,0.005903,false,0.0001 +qp,p32i16,path,236,0.000814,true,0.0001 +qp,p32i16,path,237,0.005171,false,0.0001 +qp,p32i16,path,238,0.000282,true,0.0001 +qp,p32i16,path,239,0.004884,false,0.0001 +qp,p32i16,path,240,0.00028,true,0.0001 +qp,p32i16,path,241,0.004552,false,0.0001 +qp,p32i16,path,242,0.003627,false,0.0001 +qp,p32i16,path,243,0.000334,true,0.0001 +qp,p32i16,path,244,0.000281,true,0.0001 +qp,p32i16,path,245,0.000287,true,0.0001 +qp,p32i16,path,246,0.000286,true,0.0001 +qp,p32i16,path,247,0.000264,true,0.0001 +qp,p32i16,path,248,0.005106,false,0.0001 +qp,p32i16,path,249,0.00476,false,0.0001 +qp,p32i16,path,250,0.009071,false,0.0001 +qp,p32i16,path,251,0.000348,true,0.0001 +qp,p32i16,path,252,0.005163,false,0.0001 +qp,p32i16,path,253,0.006717,false,0.0001 +qp,p32i16,path,254,0.004606,false,0.0001 +qp,p32i16,path,255,0.000603,true,0.0001 +qp,p32i16,path,256,0.003838,false,0.0001 +qp,p32i16,path,257,0.009586,false,0.0001 +qp,p32i16,path,258,0.011889,false,0.0001 +qp,p32i16,path,259,0.005253,false,0.0001 +qp,p32i16,path,260,0.005367,false,0.0001 +qp,p32i16,path,261,0.000344,true,0.0001 +qp,p32i16,path,262,0.005462,false,0.0001 +qp,p32i16,path,263,0.007439,false,0.0001 +qp,p32i16,path,264,0.00032,true,0.0001 +qp,p32i16,path,265,0.00486,false,0.0001 +qp,p32i16,path,266,0.003518,false,0.0001 +qp,p32i16,path,267,0.000325,true,0.0001 +qp,p32i16,path,268,0.000306,true,0.0001 +qp,p32i16,path,269,0.000284,true,0.0001 +qp,p32i16,path,270,0.000272,true,0.0001 +qp,p32i16,path,271,0.00928,false,0.0001 +qp,p32i16,path,272,0.004795,false,0.0001 +qp,p32i16,path,273,0.00606,false,0.0001 +qp,p32i16,path,274,0.006793,false,0.0001 +qp,p32i16,path,275,0.004838,false,0.0001 +qp,p32i16,path,276,0.007735,false,0.0001 +qp,p32i16,path,277,0.008461,false,0.0001 +qp,p32i16,path,278,0.005731,false,0.0001 +qp,p32i16,path,279,0.007477,false,0.0001 +qp,p32i16,path,280,0.007228,false,0.0001 +qp,p32i16,path,281,0.007208,false,0.0001 +qp,p32i16,path,282,0.004287,false,0.0001 +qp,p32i16,path,283,0.005439,false,0.0001 +qp,p32i16,path,284,0.008436,false,0.0001 +qp,p32i16,path,285,0.008101,false,0.0001 +qp,p32i16,path,286,0.000336,true,0.0001 +qp,p32i16,path,287,0.006435,false,0.0001 +qp,p32i16,path,288,0.003728,false,0.0001 +qp,p32i16,path,289,0.005148,false,0.0001 +qp,p32i16,path,290,0.000316,true,0.0001 +qp,p32i16,path,291,0.000548,true,0.0001 +qp,p32i16,path,292,0.000591,true,0.0001 +qp,p32i16,path,293,0.000329,true,0.0001 +qp,p32i16,path,294,0.003697,false,0.0001 +qp,p32i16,path,295,0.000559,true,0.0001 +qp,p32i16,path,296,0.000506,true,0.0001 +qp,p32i16,path,297,0.000299,true,0.0001 +qp,p32i16,path,298,0.005087,false,0.0001 +qp,p32i16,path,299,0.000302,true,0.0001 +qp,p32i16,path,300,0.00692,false,0.0001 +qp,p32i16,path,301,0.00033,true,0.0001 +qp,p32i16,path,302,0.004204,false,0.0001 +qp,p32i16,path,303,0.007127,false,0.0001 +qp,p32i16,path,304,0.007239,false,0.0001 +qp,p32i16,path,305,0.005419,false,0.0001 +qp,p32i16,path,306,0.000533,true,0.0001 +qp,p32i16,path,307,0.000299,true,0.0001 +qp,p32i16,path,308,0.003962,false,0.0001 +qp,p32i16,path,309,0.007087,false,0.0001 +qp,p32i16,path,310,0.008863,false,0.0001 +qp,p32i16,path,311,0.007369,false,0.0001 +qp,p32i16,path,312,0.004326,false,0.0001 +qp,p32i16,path,313,0.010169,false,0.0001 +qp,p32i16,path,314,0.006073,false,0.0001 +qp,p32i16,path,315,0.005256,false,0.0001 +qp,p32i16,path,316,0.000321,true,0.0001 +qp,p32i16,path,317,0.000297,true,0.0001 +qp,p32i16,path,318,0.000538,true,0.0001 +qp,p32i16,path,319,0.0003,true,0.0001 +qp,p32i16,path,320,0.00333,false,0.0001 +qp,p32i16,path,321,0.000346,true,0.0001 +qp,p32i16,path,322,0.000321,true,0.0001 +qp,p32i16,path,323,0.003703,false,0.0001 +qp,p32i16,path,324,0.001579,true,0.0001 +qp,p32i16,path,325,0.008603,false,0.0001 +qp,p32i16,path,326,0.000309,true,0.0001 +qp,p32i16,path,327,0.006886,false,0.0001 +qp,p32i16,path,328,0.000323,true,0.0001 +qp,p32i16,path,329,0.000296,true,0.0001 +qp,p32i16,path,330,0.00033,true,0.0001 +qp,p32i16,path,331,0.005603,false,0.0001 +qp,p32i16,path,332,0.004133,false,0.0001 +qp,p32i16,path,333,0.004579,false,0.0001 +qp,p32i16,path,334,0.004958,false,0.0001 +qp,p32i16,path,335,0.000299,true,0.0001 +qp,p32i16,path,336,0.000305,true,0.0001 +qp,p32i16,path,337,0.006298,false,0.0001 +qp,p32i16,path,338,0.000549,true,0.0001 +qp,p32i16,path,339,0.000317,true,0.0001 +qp,p32i16,path,340,0.000289,true,0.0001 +qp,p32i16,path,341,0.000534,true,0.0001 +qp,p32i16,path,342,0.008509,false,0.0001 +qp,p32i16,path,343,0.003261,false,0.0001 +qp,p32i16,path,344,0.000339,true,0.0001 +qp,p32i16,path,345,0.000289,true,0.0001 +qp,p32i16,path,346,0.011059,false,0.0001 +qp,p32i16,path,347,0.004273,false,0.0001 +qp,p32i16,path,348,0.005079,false,0.0001 +qp,p32i16,path,349,0.000362,true,0.0001 +qp,p32i16,path,350,0.009507,false,0.0001 +qp,p32i16,path,351,0.00747,false,0.0001 +qp,p32i16,path,352,0.005994,false,0.0001 +qp,p32i16,path,353,0.000586,true,0.0001 +qp,p32i16,path,354,0.006487,false,0.0001 +qp,p32i16,path,355,0.000604,true,0.0001 +qp,p32i16,path,356,0.007333,false,0.0001 +qp,p32i16,path,357,0.009786,false,0.0001 +qp,p32i16,path,358,0.003847,false,0.0001 +qp,p32i16,path,359,0.004963,false,0.0001 +qp,p32i16,path,360,0.012052,false,0.0001 +qp,p32i16,path,361,0.000397,true,0.0001 +qp,p32i16,path,362,0.000336,true,0.0001 +qp,p32i16,path,363,0.006209,false,0.0001 +qp,p32i16,path,364,0.008572,false,0.0001 +qp,p32i16,path,365,0.005699,false,0.0001 +qp,p32i16,path,366,0.006067,false,0.0001 +qp,p32i16,path,367,0.011088,false,0.0001 +qp,p32i16,path,368,0.005496,false,0.0001 +qp,p32i16,path,369,0.007077,false,0.0001 +qp,p32i16,path,370,0.000297,true,0.0001 +qp,p32i16,path,371,0.000608,true,0.0001 +qp,p32i16,path,372,0.004174,false,0.0001 +qp,p32i16,path,373,0.000314,true,0.0001 +qp,p32i16,path,374,0.000285,true,0.0001 +qp,p32i16,path,375,0.008516,false,0.0001 +qp,p32i16,path,376,0.000313,true,0.0001 +qp,p32i16,path,377,0.003551,false,0.0001 +qp,p32i16,path,378,0.005464,false,0.0001 +qp,p32i16,path,379,0.000277,true,0.0001 +qp,p32i16,path,380,0.00825,false,0.0001 +qp,p32i16,path,381,0.000289,true,0.0001 +qp,p32i16,path,382,0.00032,true,0.0001 +qp,p32i16,path,383,0.000282,true,0.0001 +qp,p32i16,path,384,0.005635,false,0.0001 +qp,p32i16,path,385,0.000288,true,0.0001 +qp,p32i16,path,386,0.006998,false,0.0001 +qp,p32i16,path,387,0.005904,false,0.0001 +qp,p32i16,path,388,0.008961,false,0.0001 +qp,p32i16,path,389,0.000494,true,0.0001 +qp,p32i16,path,390,0.000297,true,0.0001 +qp,p32i16,path,391,0.007838,false,0.0001 +qp,p32i16,path,392,0.003423,false,0.0001 +qp,p32i16,path,393,0.000295,true,0.0001 +qp,p32i16,path,394,0.000286,true,0.0001 +qp,p32i16,path,395,0.007372,false,0.0001 +qp,p32i16,path,396,0.000598,true,0.0001 +qp,p32i16,path,397,0.006652,false,0.0001 +qp,p32i16,path,398,0.000298,true,0.0001 +qp,p32i16,path,399,0.00441,false,0.0001 +qp,p32i16,path,400,0.003731,false,0.0001 +qp,p32i16,path,401,0.009162,false,0.0001 +qp,p32i16,path,402,0.00032,true,0.0001 +qp,p32i16,path,403,0.005442,false,0.0001 +qp,p32i16,path,404,0.000323,true,0.0001 +qp,p32i16,path,405,0.004352,false,0.0001 +qp,p32i16,path,406,0.008499,false,0.0001 +qp,p32i16,path,407,0.00805,false,0.0001 +qp,p32i16,path,408,0.005438,false,0.0001 +qp,p32i16,path,409,0.003713,false,0.0001 +qp,p32i16,path,410,0.005758,false,0.0001 +qp,p32i16,path,411,0.000297,true,0.0001 +qp,p32i16,path,412,0.011199,false,0.0001 +qp,p32i16,path,413,0.00343,false,0.0001 +qp,p32i16,path,414,0.007298,false,0.0001 +qp,p32i16,path,415,0.00555,false,0.0001 +qp,p32i16,path,416,0.000323,true,0.0001 +qp,p32i16,path,417,0.000313,true,0.0001 +qp,p32i16,path,418,0.011142,false,0.0001 +qp,p32i16,path,419,0.006258,false,0.0001 +qp,p32i16,path,420,0.000567,true,0.0001 +qp,p32i16,path,421,0.004744,false,0.0001 +qp,p32i16,path,422,0.003998,false,0.0001 +qp,p32i16,path,423,0.003686,false,0.0001 +qp,p32i16,path,424,0.00268,true,0.0001 +qp,p32i16,path,425,0.000535,true,0.0001 +qp,p32i16,path,426,0.008293,false,0.0001 +qp,p32i16,path,427,0.000295,true,0.0001 +qp,p32i16,path,428,0.000323,true,0.0001 +qp,p32i16,path,429,0.004577,false,0.0001 +qp,p32i16,path,430,0.000302,true,0.0001 +qp,p32i16,path,431,0.000278,true,0.0001 +qp,p32i16,path,432,0.004003,false,0.0001 +qp,p32i16,path,433,0.00034,true,0.0001 +qp,p32i16,path,434,0.000302,true,0.0001 +qp,p32i16,path,435,0.000538,true,0.0001 +qp,p32i16,path,436,0.008968,false,0.0001 +qp,p32i16,path,437,0.006158,false,0.0001 +qp,p32i16,path,438,0.000288,true,0.0001 +qp,p32i16,path,439,0.000302,true,0.0001 +qp,p32i16,path,440,0.000309,true,0.0001 +qp,p32i16,path,441,0.008614,false,0.0001 +qp,p32i16,path,442,0.000305,true,0.0001 +qp,p32i16,path,443,0.000291,true,0.0001 +qp,p32i16,path,444,0.005057,false,0.0001 +qp,p32i16,path,445,0.005581,false,0.0001 +qp,p32i16,path,446,0.008893,false,0.0001 +qp,p32i16,path,447,0.008866,false,0.0001 +qp,p32i16,path,448,0.000309,true,0.0001 +qp,p32i16,path,449,0.000299,true,0.0001 +qp,p32i16,path,450,0.000302,true,0.0001 +qp,p32i16,path,451,0.000258,true,0.0001 +qp,p32i16,path,452,0.000283,true,0.0001 +qp,p32i16,path,453,0.004886,false,0.0001 +qp,p32i16,path,454,0.000303,true,0.0001 +qp,p32i16,path,455,0.000277,true,0.0001 +qp,p32i16,path,456,0.000304,true,0.0001 +qp,p32i16,path,457,0.010609,false,0.0001 +qp,p32i16,path,458,0.000314,true,0.0001 +qp,p32i16,path,459,0.000308,true,0.0001 +qp,p32i16,path,460,0.008129,false,0.0001 +qp,p32i16,path,461,0.005901,false,0.0001 +qp,p32i16,path,462,0.000348,true,0.0001 +qp,p32i16,path,463,0.000322,true,0.0001 +qp,p32i16,path,464,0.00043,true,0.0001 +qp,p32i16,path,465,0.008619,false,0.0001 +qp,p32i16,path,466,0.004831,false,0.0001 +qp,p32i16,path,467,0.000588,true,0.0001 +qp,p32i16,path,468,0.000323,true,0.0001 +qp,p32i16,path,469,0.000449,true,0.0001 +qp,p32i16,path,470,0.005543,false,0.0001 +qp,p32i16,path,471,0.004539,false,0.0001 +qp,p32i16,path,472,0.000281,true,0.0001 +qp,p32i16,path,473,0.003638,false,0.0001 +qp,p32i16,path,474,0.000327,true,0.0001 +qp,p32i16,path,475,0.011172,false,0.0001 +qp,p32i16,path,476,0.006474,false,0.0001 +qp,p32i16,path,477,0.005391,false,0.0001 +qp,p32i16,path,478,0.000562,true,0.0001 +qp,p32i16,path,479,0.00058,true,0.0001 +qp,p32i16,path,480,0.007923,false,0.0001 +qp,p32i16,path,481,0.000287,true,0.0001 +qp,p32i16,path,482,0.007762,false,0.0001 +qp,p32i16,path,483,0.008289,false,0.0001 +qp,p32i16,path,484,0.0071,false,0.0001 +qp,p32i16,path,485,0.000312,true,0.0001 +qp,p32i16,path,486,0.005417,false,0.0001 +qp,p32i16,path,487,0.000314,true,0.0001 +qp,p32i16,path,488,0.004039,false,0.0001 +qp,p32i16,path,489,0.000327,true,0.0001 +qp,p32i16,path,490,0.009553,false,0.0001 +qp,p32i16,path,491,0.00032,true,0.0001 +qp,p32i16,path,492,0.008616,false,0.0001 +qp,p32i16,path,493,0.000312,true,0.0001 +qp,p32i16,path,494,0.009779,false,0.0001 +qp,p32i16,path,495,0.000303,true,0.0001 +qp,p32i16,path,496,0.005157,false,0.0001 +qp,p32i16,path,497,0.007113,false,0.0001 +qp,p32i16,path,498,0.008877,false,0.0001 +qp,p32i16,path,499,0.007311,false,0.0001 +qp,p32i16,path,500,0.000808,true,0.0001 +qp,p32i16,path,501,0.000334,true,0.0001 +qp,p32i16,path,502,0.003957,false,0.0001 +qp,p32i16,path,503,0.000294,true,0.0001 +qp,p32i16,path,504,0.008974,false,0.0001 +qp,p32i16,path,505,0.003942,false,0.0001 +qp,p32i16,path,506,0.004984,false,0.0001 +qp,p32i16,path,507,0.006018,false,0.0001 +qp,p32i16,path,508,0.000648,true,0.0001 +qp,p32i16,path,509,0.004885,false,0.0001 +qp,p32i16,path,510,0.000348,true,0.0001 +qp,p32i16,path,511,0.006574,false,0.0001 +qp,p32i16,path,512,0.000288,true,0.0001 +qp,p32i16,path,513,0.00405,false,0.0001 +qp,p32i16,path,514,0.000333,true,0.0001 +qp,p32i16,path,515,0.000509,true,0.0001 +qp,p32i16,path,516,0.000544,true,0.0001 +qp,p32i16,path,517,0.000745,true,0.0001 +qp,p32i16,path,518,0.000312,true,0.0001 +qp,p32i16,path,519,0.000275,true,0.0001 +qp,p32i16,path,520,0.006758,false,0.0001 +qp,p32i16,path,521,0.000296,true,0.0001 +qp,p32i16,path,522,0.005402,false,0.0001 +qp,p32i16,path,523,0.000289,true,0.0001 +qp,p32i16,path,524,0.004885,false,0.0001 +qp,p32i16,path,525,0.004715,false,0.0001 +qp,p32i16,path,526,0.000502,true,0.0001 +qp,p32i16,path,527,0.007732,false,0.0001 +qp,p32i16,path,528,0.000322,true,0.0001 +qp,p32i16,path,529,0.000534,true,0.0001 +qp,p32i16,path,530,0.000293,true,0.0001 +qp,p32i16,path,531,0.007794,false,0.0001 +qp,p32i16,path,532,0.010522,false,0.0001 +qp,p32i16,path,533,0.004584,false,0.0001 +qp,p32i16,path,534,0.005354,false,0.0001 +qp,p32i16,path,535,0.004088,false,0.0001 +qp,p32i16,path,536,0.009281,false,0.0001 +qp,p32i16,path,537,0.00775,false,0.0001 +qp,p32i16,path,538,0.005991,false,0.0001 +qp,p32i16,path,539,0.007386,false,0.0001 +qp,p32i16,path,540,0.000326,true,0.0001 +qp,p32i16,path,541,0.000279,true,0.0001 +qp,p32i16,path,542,0.00029,true,0.0001 +qp,p32i16,path,543,0.005454,false,0.0001 +qp,p32i16,path,544,0.000839,true,0.0001 +qp,p32i16,path,545,0.00671,false,0.0001 +qp,p32i16,path,546,0.000291,true,0.0001 +qp,p32i16,path,547,0.009818,false,0.0001 +qp,p32i16,path,548,0.000302,true,0.0001 +qp,p32i16,path,549,0.000282,true,0.0001 +qp,p32i16,path,550,0.000281,true,0.0001 +qp,p32i16,path,551,0.004704,false,0.0001 +qp,p32i16,path,552,0.004809,false,0.0001 +qp,p32i16,path,553,0.000279,true,0.0001 +qp,p32i16,path,554,0.000769,true,0.0001 +qp,p32i16,path,555,0.007712,false,0.0001 +qp,p32i16,path,556,0.004341,false,0.0001 +qp,p32i16,path,557,0.007876,false,0.0001 +qp,p32i16,path,558,0.00953,false,0.0001 +qp,p32i16,path,559,0.00553,false,0.0001 +qp,p32i16,path,560,0.000524,true,0.0001 +qp,p32i16,path,561,0.000335,true,0.0001 +qp,p32i16,path,562,0.004797,false,0.0001 +qp,p32i16,path,563,0.001064,true,0.0001 +qp,p32i16,path,564,0.000317,true,0.0001 +qp,p32i16,path,565,0.00705,false,0.0001 +qp,p32i16,path,566,0.005567,false,0.0001 +qp,p32i16,path,567,0.003293,true,0.0001 +qp,p32i16,path,568,0.003916,false,0.0001 +qp,p32i16,path,569,0.005637,false,0.0001 +qp,p32i16,path,570,0.004503,false,0.0001 +qp,p32i16,path,571,0.004173,false,0.0001 +qp,p32i16,path,572,0.004406,false,0.0001 +qp,p32i16,path,573,0.008458,false,0.0001 +qp,p32i16,path,574,0.000283,true,0.0001 +qp,p32i16,path,575,0.007106,false,0.0001 +qp,p32i16,path,576,0.006538,false,0.0001 +qp,p32i16,path,577,0.004647,false,0.0001 +qp,p32i16,path,578,0.000465,true,0.0001 +qp,p32i16,path,579,0.005836,false,0.0001 +qp,p32i16,path,580,0.000319,true,0.0001 +qp,p32i16,path,581,0.007289,false,0.0001 +qp,p32i16,path,582,0.007029,false,0.0001 +qp,p32i16,path,583,0.000338,true,0.0001 +qp,p32i16,path,584,0.000327,true,0.0001 +qp,p32i16,path,585,0.000354,true,0.0001 +qp,p32i16,path,586,0.006799,false,0.0001 +qp,p32i16,path,587,0.007082,false,0.0001 +qp,p32i16,path,588,0.000551,true,0.0001 +qp,p32i16,path,589,0.000297,true,0.0001 +qp,p32i16,path,590,0.000278,true,0.0001 +qp,p32i16,path,591,0.000298,true,0.0001 +qp,p32i16,path,592,0.000293,true,0.0001 +qp,p32i16,path,593,0.010164,false,0.0001 +qp,p32i16,path,594,0.000323,true,0.0001 +qp,p32i16,path,595,0.000284,true,0.0001 +qp,p32i16,path,596,0.004295,false,0.0001 +qp,p32i16,path,597,0.00033,true,0.0001 +qp,p32i16,path,598,0.00031,true,0.0001 +qp,p32i16,path,599,0.000282,true,0.0001 +qp,p32i16,path,600,0.000311,true,0.0001 +qp,p32i16,path,601,0.004847,false,0.0001 +qp,p32i16,path,602,0.000324,true,0.0001 +qp,p32i16,path,603,0.007743,false,0.0001 +qp,p32i16,path,604,0.009838,false,0.0001 +qp,p32i16,path,605,0.000294,true,0.0001 +qp,p32i16,path,606,0.005604,false,0.0001 +qp,p32i16,path,607,0.005883,false,0.0001 +qp,p32i16,path,608,0.007483,false,0.0001 +qp,p32i16,path,609,0.006197,false,0.0001 +qp,p32i16,path,610,0.007508,false,0.0001 +qp,p32i16,path,611,0.000309,true,0.0001 +qp,p32i16,path,612,0.003755,false,0.0001 +qp,p32i16,path,613,0.006123,false,0.0001 +qp,p32i16,path,614,0.000293,true,0.0001 +qp,p32i16,path,615,0.000316,true,0.0001 +qp,p32i16,path,616,0.006759,false,0.0001 +qp,p32i16,path,617,0.000297,true,0.0001 +qp,p32i16,path,618,0.000566,true,0.0001 +qp,p32i16,path,619,0.008539,false,0.0001 +qp,p32i16,path,620,0.000483,true,0.0001 +qp,p32i16,path,621,0.000349,true,0.0001 +qp,p32i16,path,622,0.00586,false,0.0001 +qp,p32i16,path,623,0.000347,true,0.0001 +qp,p32i16,path,624,0.006008,false,0.0001 +qp,p32i16,path,625,0.000307,true,0.0001 +qp,p32i16,path,626,0.005133,false,0.0001 +qp,p32i16,path,627,0.012309,false,0.0001 +qp,p32i16,path,628,0.00523,false,0.0001 +qp,p32i16,path,629,0.000292,true,0.0001 +qp,p32i16,path,630,0.000311,true,0.0001 +qp,p32i16,path,631,0.004985,false,0.0001 +qp,p32i16,path,632,0.000312,true,0.0001 +qp,p32i16,path,633,0.003743,false,0.0001 +qp,p32i16,path,634,0.004672,false,0.0001 +qp,p32i16,path,635,0.008925,false,0.0001 +qp,p32i16,path,636,0.000309,true,0.0001 +qp,p32i16,path,637,0.00588,false,0.0001 +qp,p32i16,path,638,0.000331,true,0.0001 +qp,p32i16,path,639,0.006377,false,0.0001 +qp,p32i16,path,640,0.000292,true,0.0001 +qp,p32i16,path,641,0.004909,false,0.0001 +qp,p32i16,path,642,0.000289,true,0.0001 +qp,p32i16,path,643,0.014818,false,0.0001 +qp,p32i16,path,644,0.008557,false,0.0001 +qp,p32i16,path,645,0.004742,false,0.0001 +qp,p32i16,path,646,0.007214,false,0.0001 +qp,p32i16,path,647,0.006652,false,0.0001 +qp,p32i16,path,648,0.00387,false,0.0001 +qp,p32i16,path,649,0.003175,false,0.0001 +qp,p32i16,path,650,0.006328,false,0.0001 +qp,p32i16,path,651,0.015165,false,0.0001 +qp,p32i16,path,652,0.01136,false,0.0001 +qp,p32i16,path,653,0.008644,false,0.0001 +qp,p32i16,path,654,0.000355,true,0.0001 +qp,p32i16,path,655,0.003797,false,0.0001 +qp,p32i16,path,656,0.006694,false,0.0001 +qp,p32i16,path,657,0.000325,true,0.0001 +qp,p32i16,path,658,0.007132,false,0.0001 +qp,p32i16,path,659,0.000305,true,0.0001 +qp,p32i16,path,660,0.007394,false,0.0001 +qp,p32i16,path,661,0.00561,false,0.0001 +qp,p32i16,path,662,0.000333,true,0.0001 +qp,p32i16,path,663,0.003678,false,0.0001 +qp,p32i16,path,664,0.011759,false,0.0001 +qp,p32i16,path,665,0.000299,true,0.0001 +qp,p32i16,path,666,0.000297,true,0.0001 +qp,p32i16,path,667,0.000544,true,0.0001 +qp,p32i16,path,668,0.005641,false,0.0001 +qp,p32i16,path,669,0.005787,false,0.0001 +qp,p32i16,path,670,0.007315,false,0.0001 +qp,p32i16,path,671,0.00402,false,0.0001 +qp,p32i16,path,672,0.000297,true,0.0001 +qp,p32i16,path,673,0.00031,true,0.0001 +qp,p32i16,path,674,0.006726,false,0.0001 +qp,p32i16,path,675,0.004063,false,0.0001 +qp,p32i16,path,676,0.004824,false,0.0001 +qp,p32i16,path,677,0.003692,false,0.0001 +qp,p32i16,path,678,0.000381,true,0.0001 +qp,p32i16,path,679,0.004499,false,0.0001 +qp,p32i16,path,680,0.004335,false,0.0001 +qp,p32i16,path,681,0.003448,false,0.0001 +qp,p32i16,path,682,0.00075,true,0.0001 +qp,p32i16,path,683,0.006542,false,0.0001 +qp,p32i16,path,684,0.000369,true,0.0001 +qp,p32i16,path,685,0.005184,false,0.0001 +qp,p32i16,path,686,0.000315,true,0.0001 +qp,p32i16,path,687,0.000307,true,0.0001 +qp,p32i16,path,688,0.000288,true,0.0001 +qp,p32i16,path,689,0.000281,true,0.0001 +qp,p32i16,path,690,0.004285,false,0.0001 +qp,p32i16,path,691,0.006423,false,0.0001 +qp,p32i16,path,692,0.007357,false,0.0001 +qp,p32i16,path,693,0.000357,true,0.0001 +qp,p32i16,path,694,0.007409,false,0.0001 +qp,p32i16,path,695,0.000456,true,0.0001 +qp,p32i16,path,696,0.003335,false,0.0001 +qp,p32i16,path,697,0.016845,false,0.0001 +qp,p32i16,path,698,0.001025,true,0.0001 +qp,p32i16,path,699,0.003636,false,0.0001 +qp,p32i16,path,700,0.005474,false,0.0001 +qp,p32i16,path,701,0.014218,false,0.0001 +qp,p32i16,path,702,0.005494,false,0.0001 +qp,p32i16,path,703,0.000292,true,0.0001 +qp,p32i16,path,704,0.007519,false,0.0001 +qp,p32i16,path,705,0.000323,true,0.0001 +qp,p32i16,path,706,0.00029,true,0.0001 +qp,p32i16,path,707,0.00026,true,0.0001 +qp,p32i16,path,708,0.000277,true,0.0001 +qp,p32i16,path,709,0.000273,true,0.0001 +qp,p32i16,path,710,0.003354,false,0.0001 +qp,p32i16,path,711,0.000276,true,0.0001 +qp,p32i16,path,712,0.004504,false,0.0001 +qp,p32i16,path,713,0.000292,true,0.0001 +qp,p32i16,path,714,0.000278,true,0.0001 +qp,p32i16,path,715,0.005655,false,0.0001 +qp,p32i16,path,716,0.003802,false,0.0001 +qp,p32i16,path,717,0.000311,true,0.0001 +qp,p32i16,path,718,0.007322,false,0.0001 +qp,p32i16,path,719,0.006714,false,0.0001 +qp,p32i16,path,720,0.000309,true,0.0001 +qp,p32i16,path,721,0.004281,false,0.0001 +qp,p32i16,path,722,0.000563,true,0.0001 +qp,p32i16,path,723,0.00589,false,0.0001 +qp,p32i16,path,724,0.000337,true,0.0001 +qp,p32i16,path,725,0.007138,false,0.0001 +qp,p32i16,path,726,0.00327,false,0.0001 +qp,p32i16,path,727,0.005448,false,0.0001 +qp,p32i16,path,728,0.000311,true,0.0001 +qp,p32i16,path,729,0.005531,false,0.0001 +qp,p32i16,path,730,0.006391,false,0.0001 +qp,p32i16,path,731,0.000608,true,0.0001 +qp,p32i16,path,732,0.001929,true,0.0001 +qp,p32i16,path,733,0.000315,true,0.0001 +qp,p32i16,path,734,0.000286,true,0.0001 +qp,p32i16,path,735,0.000313,true,0.0001 +qp,p32i16,path,736,0.00436,false,0.0001 +qp,p32i16,path,737,0.00408,false,0.0001 +qp,p32i16,path,738,0.008728,false,0.0001 +qp,p32i16,path,739,0.007093,false,0.0001 +qp,p32i16,path,740,0.000289,true,0.0001 +qp,p32i16,path,741,0.00031,true,0.0001 +qp,p32i16,path,742,0.000297,true,0.0001 +qp,p32i16,path,743,0.008976,false,0.0001 +qp,p32i16,path,744,0.007134,false,0.0001 +qp,p32i16,path,745,0.00891,false,0.0001 +qp,p32i16,path,746,0.003772,false,0.0001 +qp,p32i16,path,747,0.009012,false,0.0001 +qp,p32i16,path,748,0.000331,true,0.0001 +qp,p32i16,path,749,0.000338,true,0.0001 +qp,p32i16,path,750,0.000299,true,0.0001 +qp,p32i16,path,751,0.00033,true,0.0001 +qp,p32i16,path,752,0.006753,false,0.0001 +qp,p32i16,path,753,0.005164,false,0.0001 +qp,p32i16,path,754,0.007632,false,0.0001 +qp,p32i16,path,755,0.000454,true,0.0001 +qp,p32i16,path,756,0.000301,true,0.0001 +qp,p32i16,path,757,0.008722,false,0.0001 +qp,p32i16,path,758,0.004534,false,0.0001 +qp,p32i16,path,759,0.003502,false,0.0001 +qp,p32i16,path,760,0.004611,false,0.0001 +qp,p32i16,path,761,0.011135,false,0.0001 +qp,p32i16,path,762,0.000324,true,0.0001 +qp,p32i16,path,763,0.009896,false,0.0001 +qp,p32i16,path,764,0.005235,false,0.0001 +qp,p32i16,path,765,0.000287,true,0.0001 +qp,p32i16,path,766,0.004861,false,0.0001 +qp,p32i16,path,767,0.003256,false,0.0001 +qp,p32i16,path,768,0.006846,false,0.0001 +qp,p32i16,path,769,0.009252,false,0.0001 +qp,p32i16,path,770,0.008007,false,0.0001 +qp,p32i16,path,771,0.000602,true,0.0001 +qp,p32i16,path,772,0.004707,false,0.0001 +qp,p32i16,path,773,0.006064,false,0.0001 +qp,p32i16,path,774,0.006798,false,0.0001 +qp,p32i16,path,775,0.007381,false,0.0001 +qp,p32i16,path,776,0.004767,false,0.0001 +qp,p32i16,path,777,0.015115,false,0.0001 +qp,p32i16,path,778,0.004671,false,0.0001 +qp,p32i16,path,779,0.008135,false,0.0001 +qp,p32i16,path,780,0.000288,true,0.0001 +qp,p32i16,path,781,0.000287,true,0.0001 +qp,p32i16,path,782,0.0003,true,0.0001 +qp,p32i16,path,783,0.009507,false,0.0001 +qp,p32i16,path,784,0.00381,false,0.0001 +qp,p32i16,path,785,0.000515,true,0.0001 +qp,p32i16,path,786,0.000325,true,0.0001 +qp,p32i16,path,787,0.000291,true,0.0001 +qp,p32i16,path,788,0.007457,false,0.0001 +qp,p32i16,path,789,0.003668,false,0.0001 +qp,p32i16,path,790,0.005283,false,0.0001 +qp,p32i16,path,791,0.006083,false,0.0001 +qp,p32i16,path,792,0.004182,false,0.0001 +qp,p32i16,path,793,0.013116,false,0.0001 +qp,p32i16,path,794,0.000325,true,0.0001 +qp,p32i16,path,795,0.005161,false,0.0001 +qp,p32i16,path,796,0.008846,false,0.0001 +qp,p32i16,path,797,0.000293,true,0.0001 +qp,p32i16,path,798,0.000315,true,0.0001 +qp,p32i16,path,799,0.007065,false,0.0001 +qp,p32i16,path,800,0.000307,true,0.0001 +qp,p32i16,path,801,0.011015,false,0.0001 +qp,p32i16,path,802,0.000303,true,0.0001 +qp,p32i16,path,803,0.000314,true,0.0001 +qp,p32i16,path,804,0.000268,true,0.0001 +qp,p32i16,path,805,0.000303,true,0.0001 +qp,p32i16,path,806,0.000276,true,0.0001 +qp,p32i16,path,807,0.011062,false,0.0001 +qp,p32i16,path,808,0.006496,false,0.0001 +qp,p32i16,path,809,0.000294,true,0.0001 +qp,p32i16,path,810,0.004636,false,0.0001 +qp,p32i16,path,811,0.000293,true,0.0001 +qp,p32i16,path,812,0.007139,false,0.0001 +qp,p32i16,path,813,0.000648,true,0.0001 +qp,p32i16,path,814,0.008804,false,0.0001 +qp,p32i16,path,815,0.000282,true,0.0001 +qp,p32i16,path,816,0.004406,false,0.0001 +qp,p32i16,path,817,0.000331,true,0.0001 +qp,p32i16,path,818,0.000273,true,0.0001 +qp,p32i16,path,819,0.005159,false,0.0001 +qp,p32i16,path,820,0.00031,true,0.0001 +qp,p32i16,path,821,0.005729,false,0.0001 +qp,p32i16,path,822,0.000318,true,0.0001 +qp,p32i16,path,823,0.00029,true,0.0001 +qp,p32i16,path,824,0.000272,true,0.0001 +qp,p32i16,path,825,0.000276,true,0.0001 +qp,p32i16,path,826,0.004427,false,0.0001 +qp,p32i16,path,827,0.000328,true,0.0001 +qp,p32i16,path,828,0.000284,true,0.0001 +qp,p32i16,path,829,0.009781,false,0.0001 +qp,p32i16,path,830,0.009382,false,0.0001 +qp,p32i16,path,831,0.0003,true,0.0001 +qp,p32i16,path,832,0.008968,false,0.0001 +qp,p32i16,path,833,0.0072,false,0.0001 +qp,p32i16,path,834,0.00587,false,0.0001 +qp,p32i16,path,835,0.008211,false,0.0001 +qp,p32i16,path,836,0.005032,false,0.0001 +qp,p32i16,path,837,0.003608,false,0.0001 +qp,p32i16,path,838,0.006827,false,0.0001 +qp,p32i16,path,839,0.005017,false,0.0001 +qp,p32i16,path,840,0.000306,true,0.0001 +qp,p32i16,path,841,0.006214,false,0.0001 +qp,p32i16,path,842,0.005516,false,0.0001 +qp,p32i16,path,843,0.00029,true,0.0001 +qp,p32i16,path,844,0.000307,true,0.0001 +qp,p32i16,path,845,0.000343,true,0.0001 +qp,p32i16,path,846,0.005061,false,0.0001 +qp,p32i16,path,847,0.004026,false,0.0001 +qp,p32i16,path,848,0.000307,true,0.0001 +qp,p32i16,path,849,0.004923,false,0.0001 +qp,p32i16,path,850,0.003999,false,0.0001 +qp,p32i16,path,851,0.000644,true,0.0001 +qp,p32i16,path,852,0.000323,true,0.0001 +qp,p32i16,path,853,0.000329,true,0.0001 +qp,p32i16,path,854,0.011543,false,0.0001 +qp,p32i16,path,855,0.010837,false,0.0001 +qp,p32i16,path,856,0.006866,false,0.0001 +qp,p32i16,path,857,0.000311,true,0.0001 +qp,p32i16,path,858,0.000529,true,0.0001 +qp,p32i16,path,859,0.000573,true,0.0001 +qp,p32i16,path,860,0.000282,true,0.0001 +qp,p32i16,path,861,0.007951,false,0.0001 +qp,p32i16,path,862,0.007122,false,0.0001 +qp,p32i16,path,863,0.000305,true,0.0001 +qp,p32i16,path,864,0.000514,true,0.0001 +qp,p32i16,path,865,0.007021,false,0.0001 +qp,p32i16,path,866,0.007078,false,0.0001 +qp,p32i16,path,867,0.004267,false,0.0001 +qp,p32i16,path,868,0.004119,false,0.0001 +qp,p32i16,path,869,0.000298,true,0.0001 +qp,p32i16,path,870,0.005015,false,0.0001 +qp,p32i16,path,871,0.000468,true,0.0001 +qp,p32i16,path,872,0.000313,true,0.0001 +qp,p32i16,path,873,0.003467,false,0.0001 +qp,p32i16,path,874,0.000332,true,0.0001 +qp,p32i16,path,875,0.005845,false,0.0001 +qp,p32i16,path,876,0.009204,false,0.0001 +qp,p32i16,path,877,0.000439,true,0.0001 +qp,p32i16,path,878,0.005735,false,0.0001 +qp,p32i16,path,879,0.000424,true,0.0001 +qp,p32i16,path,880,0.000583,true,0.0001 +qp,p32i16,path,881,0.00036,true,0.0001 +qp,p32i16,path,882,0.000319,true,0.0001 +qp,p32i16,path,883,0.000331,true,0.0001 +qp,p32i16,path,884,0.000814,true,0.0001 +qp,p32i16,path,885,0.000757,true,0.0001 +qp,p32i16,path,886,0.004924,false,0.0001 +qp,p32i16,path,887,0.000653,true,0.0001 +qp,p32i16,path,888,0.000299,true,0.0001 +qp,p32i16,path,889,0.005155,false,0.0001 +qp,p32i16,path,890,0.006616,false,0.0001 +qp,p32i16,path,891,0.009345,false,0.0001 +qp,p32i16,path,892,0.005392,false,0.0001 +qp,p32i16,path,893,0.003907,false,0.0001 +qp,p32i16,path,894,0.000301,true,0.0001 +qp,p32i16,path,895,0.012154,false,0.0001 +qp,p32i16,path,896,0.000428,true,0.0001 +qp,p32i16,path,897,0.004492,false,0.0001 +qp,p32i16,path,898,0.005027,false,0.0001 +qp,p32i16,path,899,0.004476,false,0.0001 +qp,p32i16,path,900,0.000317,true,0.0001 +qp,p32i16,path,901,0.000713,true,0.0001 +qp,p32i16,path,902,0.004791,false,0.0001 +qp,p32i16,path,903,0.000303,true,0.0001 +qp,p32i16,path,904,0.012151,false,0.0001 +qp,p32i16,path,905,0.003706,false,0.0001 +qp,p32i16,path,906,0.007168,false,0.0001 +qp,p32i16,path,907,0.000327,true,0.0001 +qp,p32i16,path,908,0.000321,true,0.0001 +qp,p32i16,path,909,0.000552,true,0.0001 +qp,p32i16,path,910,0.000293,true,0.0001 +qp,p32i16,path,911,0.005152,false,0.0001 +qp,p32i16,path,912,0.00494,false,0.0001 +qp,p32i16,path,913,0.000715,true,0.0001 +qp,p32i16,path,914,0.009881,false,0.0001 +qp,p32i16,path,915,0.00744,false,0.0001 +qp,p32i16,path,916,0.000364,true,0.0001 +qp,p32i16,path,917,0.009153,false,0.0001 +qp,p32i16,path,918,0.003478,false,0.0001 +qp,p32i16,path,919,0.000325,true,0.0001 +qp,p32i16,path,920,0.000285,true,0.0001 +qp,p32i16,path,921,0.009445,false,0.0001 +qp,p32i16,path,922,0.010739,false,0.0001 +qp,p32i16,path,923,0.00528,false,0.0001 +qp,p32i16,path,924,0.000325,true,0.0001 +qp,p32i16,path,925,0.008344,false,0.0001 +qp,p32i16,path,926,0.004649,false,0.0001 +qp,p32i16,path,927,0.000305,true,0.0001 +qp,p32i16,path,928,0.00407,false,0.0001 +qp,p32i16,path,929,0.004963,false,0.0001 +qp,p32i16,path,930,0.00054,true,0.0001 +qp,p32i16,path,931,0.004235,false,0.0001 +qp,p32i16,path,932,0.000301,true,0.0001 +qp,p32i16,path,933,0.004184,false,0.0001 +qp,p32i16,path,934,0.004185,false,0.0001 +qp,p32i16,path,935,0.000314,true,0.0001 +qp,p32i16,path,936,0.005182,false,0.0001 +qp,p32i16,path,937,0.000305,true,0.0001 +qp,p32i16,path,938,0.00468,false,0.0001 +qp,p32i16,path,939,0.000296,true,0.0001 +qp,p32i16,path,940,0.0003,true,0.0001 +qp,p32i16,path,941,0.000504,true,0.0001 +qp,p32i16,path,942,0.000306,true,0.0001 +qp,p32i16,path,943,0.005536,false,0.0001 +qp,p32i16,path,944,0.015277,false,0.0001 +qp,p32i16,path,945,0.009136,false,0.0001 +qp,p32i16,path,946,0.005632,false,0.0001 +qp,p32i16,path,947,0.000545,true,0.0001 +qp,p32i16,path,948,0.000428,true,0.0001 +qp,p32i16,path,949,0.000308,true,0.0001 +qp,p32i16,path,950,0.004076,false,0.0001 +qp,p32i16,path,951,0.005033,false,0.0001 +qp,p32i16,path,952,0.000566,true,0.0001 +qp,p32i16,path,953,0.00929,false,0.0001 +qp,p32i16,path,954,0.007184,false,0.0001 +qp,p32i16,path,955,0.006663,false,0.0001 +qp,p32i16,path,956,0.007106,false,0.0001 +qp,p32i16,path,957,0.000434,true,0.0001 +qp,p32i16,path,958,0.010794,false,0.0001 +qp,p32i16,path,959,0.008774,false,0.0001 +qp,p32i16,path,960,0.005244,false,0.0001 +qp,p32i16,path,961,0.006147,false,0.0001 +qp,p32i16,path,962,0.000745,true,0.0001 +qp,p32i16,path,963,0.010388,false,0.0001 +qp,p32i16,path,964,0.008798,false,0.0001 +qp,p32i16,path,965,0.00034,true,0.0001 +qp,p32i16,path,966,0.000285,true,0.0001 +qp,p32i16,path,967,0.006222,false,0.0001 +qp,p32i16,path,968,0.000321,true,0.0001 +qp,p32i16,path,969,0.004883,false,0.0001 +qp,p32i16,path,970,0.004315,false,0.0001 +qp,p32i16,path,971,0.00861,false,0.0001 +qp,p32i16,path,972,0.006093,false,0.0001 +qp,p32i16,path,973,0.006952,false,0.0001 +qp,p32i16,path,974,0.008226,false,0.0001 +qp,p32i16,path,975,0.000777,true,0.0001 +qp,p32i16,path,976,0.005159,false,0.0001 +qp,p32i16,path,977,0.00031,true,0.0001 +qp,p32i16,path,978,0.000331,true,0.0001 +qp,p32i16,path,979,0.00659,false,0.0001 +qp,p32i16,path,980,0.00343,false,0.0001 +qp,p32i16,path,981,0.009466,false,0.0001 +qp,p32i16,path,982,0.009621,false,0.0001 +qp,p32i16,path,983,0.007496,false,0.0001 +qp,p32i16,path,984,0.004855,false,0.0001 +qp,p32i16,path,985,0.000321,true,0.0001 +qp,p32i16,path,986,0.004334,false,0.0001 +qp,p32i16,path,987,0.000287,true,0.0001 +qp,p32i16,path,988,0.006773,false,0.0001 +qp,p32i16,path,989,0.000369,true,0.0001 +qp,p32i16,path,990,0.007436,false,0.0001 +qp,p32i16,path,991,0.006003,false,0.0001 +qp,p32i16,path,992,0.00411,false,0.0001 +qp,p32i16,path,993,0.000287,true,0.0001 +qp,p32i16,path,994,0.000853,true,0.0001 +qp,p32i16,path,995,0.000469,true,0.0001 +qp,p32i16,path,996,0.000316,true,0.0001 +qp,p32i16,path,997,0.00573,false,0.0001 +qp,p32i16,path,998,0.011791,false,0.0001 +qp,p32i16,path,999,0.000331,true,0.0001 +qp,p32i16,path,1000,0.003912,false,0.0001 +qp,p32i16,path,1001,0.006911,false,0.0001 +qp,p32i16,path,1002,0.004263,false,0.0001 +qp,p32i16,path,1003,0.000323,true,0.0001 +qp,p32i16,path,1004,0.009497,false,0.0001 +qp,p32i16,path,1005,0.000324,true,0.0001 +qp,p32i16,path,1006,0.000321,true,0.0001 +qp,p32i16,path,1007,0.006506,false,0.0001 +qp,p32i16,path,1008,0.006977,false,0.0001 +qp,p32i16,path,1009,0.005476,false,0.0001 +qp,p32i16,path,1010,0.000299,true,0.0001 +qp,p32i16,path,1011,0.00031,true,0.0001 +qp,p32i16,path,1012,0.000323,true,0.0001 +qp,p32i16,path,1013,0.004033,false,0.0001 +qp,p32i16,path,1014,0.009844,false,0.0001 +qp,p32i16,path,1015,0.000314,true,0.0001 +qp,p32i16,path,1016,0.000305,true,0.0001 +qp,p32i16,path,1017,0.000321,true,0.0001 +qp,p32i16,path,1018,0.000309,true,0.0001 +qp,p32i16,path,1019,0.000484,true,0.0001 +qp,p32i16,path,1020,0.000304,true,0.0001 +qp,p32i16,path,1021,0.000295,true,0.0001 +qp,p32i16,path,1022,0.005025,false,0.0001 +qp,p32i16,path,1023,0.004073,false,0.0001 +qp,p32i16,path,1024,0.004364,false,0.0001 diff --git a/benchmark/results/per_rep.csv b/benchmark/results/per_rep.csv new file mode 100644 index 0000000..320530d --- /dev/null +++ b/benchmark/results/per_rep.csv @@ -0,0 +1,457 @@ +problem,size,solver,device,warm_start,rep,total_time_s,num_solved,num_samples,tol +qp,p32i16,batched,cpu,false,1,0.599817,424,1024,0.0001 +qp,p32i16,batched,cpu,false,2,0.613425,424,1024,0.0001 +qp,p32i16,batched,cpu,false,3,0.601105,424,1024,0.0001 +qp,p32i16,batched,cpu,false,4,0.599712,424,1024,0.0001 +qp,p32i16,batched,cpu,false,5,0.669222,424,1024,0.0001 +qp,p32i16,batched,cpu,false,6,0.517992,424,1024,0.0001 +qp,p32i16,batched,cpu,false,7,0.563071,424,1024,0.0001 +qp,p32i16,batched,cpu,false,8,0.647179,424,1024,0.0001 +qp,p32i16,batched,cpu,false,9,0.564534,424,1024,0.0001 +qp,p32i16,batched,cpu,false,10,0.660265,424,1024,0.0001 +qp,p32i16,batched,cpu,false,11,0.548362,424,1024,0.0001 +qp,p32i16,batched,cpu,false,12,0.653945,424,1024,0.0001 +qp,p32i16,batched,cpu,false,13,0.668498,424,1024,0.0001 +qp,p32i16,batched,cpu,false,14,0.612879,424,1024,0.0001 +qp,p32i16,batched,cpu,false,15,0.669736,424,1024,0.0001 +qp,p32i16,batched,cpu,false,16,0.544749,424,1024,0.0001 +qp,p32i16,batched,cpu,false,17,0.647662,424,1024,0.0001 +qp,p32i16,batched,cpu,false,18,0.609009,424,1024,0.0001 +qp,p32i16,batched,cpu,false,19,0.601602,424,1024,0.0001 +qp,p32i16,batched,cpu,false,20,0.642311,424,1024,0.0001 +qp,p32i16,batched,gpu,false,1,0.391049,424,1024,0.0001 +qp,p32i16,batched,gpu,false,2,0.390667,424,1024,0.0001 +qp,p32i16,batched,gpu,false,3,0.392199,424,1024,0.0001 +qp,p32i16,batched,gpu,false,4,0.392625,424,1024,0.0001 +qp,p32i16,batched,gpu,false,5,0.39231,424,1024,0.0001 +qp,p32i16,batched,gpu,false,6,0.391284,424,1024,0.0001 +qp,p32i16,batched,gpu,false,7,0.392235,424,1024,0.0001 +qp,p32i16,batched,gpu,false,8,0.520424,424,1024,0.0001 +qp,p32i16,batched,gpu,false,9,0.393688,424,1024,0.0001 +qp,p32i16,batched,gpu,false,10,0.391159,424,1024,0.0001 +qp,p32i16,batched,gpu,false,11,0.390996,424,1024,0.0001 +qp,p32i16,batched,gpu,false,12,0.390398,424,1024,0.0001 +qp,p32i16,batched,gpu,false,13,0.390686,424,1024,0.0001 +qp,p32i16,batched,gpu,false,14,0.390681,424,1024,0.0001 +qp,p32i16,batched,gpu,false,15,0.392124,424,1024,0.0001 +qp,p32i16,batched,gpu,false,16,0.391825,424,1024,0.0001 +qp,p32i16,batched,gpu,false,17,0.39149,424,1024,0.0001 +qp,p32i16,batched,gpu,false,18,0.392622,424,1024,0.0001 +qp,p32i16,batched,gpu,false,19,0.392119,424,1024,0.0001 +qp,p32i16,batched,gpu,false,20,0.394684,424,1024,0.0001 +game,T10,batched,cpu,false,1,0.474872,1024,1024,0.0001 +game,T10,batched,cpu,false,2,0.507517,1024,1024,0.0001 +game,T10,batched,cpu,false,3,0.302325,1024,1024,0.0001 +game,T10,batched,cpu,false,4,0.570637,1024,1024,0.0001 +game,T10,batched,cpu,false,5,0.433228,1024,1024,0.0001 +game,T10,batched,cpu,false,6,0.282485,1024,1024,0.0001 +game,T10,batched,cpu,false,7,0.442229,1024,1024,0.0001 +game,T10,batched,cpu,false,8,0.279201,1024,1024,0.0001 +game,T10,batched,cpu,false,9,0.44026,1024,1024,0.0001 +game,T10,batched,cpu,false,10,0.298423,1024,1024,0.0001 +game,T10,batched,cpu,false,11,0.40945,1024,1024,0.0001 +game,T10,batched,cpu,false,12,0.453036,1024,1024,0.0001 +game,T10,batched,cpu,false,13,0.297792,1024,1024,0.0001 +game,T10,batched,cpu,false,14,0.417649,1024,1024,0.0001 +game,T10,batched,cpu,false,15,0.351663,1024,1024,0.0001 +game,T10,batched,cpu,false,16,0.348659,1024,1024,0.0001 +game,T10,batched,cpu,false,17,0.430731,1024,1024,0.0001 +game,T10,batched,cpu,false,18,0.284659,1024,1024,0.0001 +game,T10,batched,cpu,false,19,0.443422,1024,1024,0.0001 +game,T10,batched,cpu,false,20,0.298395,1024,1024,0.0001 +game,T10,batched,gpu,false,1,0.81738,1024,1024,0.0001 +game,T10,batched,gpu,false,2,0.823644,1024,1024,0.0001 +game,T10,batched,gpu,false,3,0.819903,1024,1024,0.0001 +game,T10,batched,gpu,false,4,0.819406,1024,1024,0.0001 +game,T10,batched,gpu,false,5,0.820591,1024,1024,0.0001 +game,T10,batched,gpu,false,6,1.015199,1024,1024,0.0001 +game,T10,batched,gpu,false,7,0.82113,1024,1024,0.0001 +game,T10,batched,gpu,false,8,0.817922,1024,1024,0.0001 +game,T10,batched,gpu,false,9,0.817328,1024,1024,0.0001 +game,T10,batched,gpu,false,10,0.817005,1024,1024,0.0001 +game,T10,batched,gpu,false,11,0.816593,1024,1024,0.0001 +game,T10,batched,gpu,false,12,0.949767,1024,1024,0.0001 +game,T10,batched,gpu,false,13,0.821657,1024,1024,0.0001 +game,T10,batched,gpu,false,14,0.818534,1024,1024,0.0001 +game,T10,batched,gpu,false,15,0.819339,1024,1024,0.0001 +game,T10,batched,gpu,false,16,0.818293,1024,1024,0.0001 +game,T10,batched,gpu,false,17,0.818874,1024,1024,0.0001 +game,T10,batched,gpu,false,18,0.941832,1024,1024,0.0001 +game,T10,batched,gpu,false,19,0.819523,1024,1024,0.0001 +game,T10,batched,gpu,false,20,0.818636,1024,1024,0.0001 +game,T10,batched,cpu,true,1,0.261484,1024,1024,0.0001 +game,T10,batched,cpu,true,2,0.409763,1024,1024,0.0001 +game,T10,batched,cpu,true,3,0.384662,1024,1024,0.0001 +game,T10,batched,cpu,true,4,0.269249,1024,1024,0.0001 +game,T10,batched,cpu,true,5,0.395009,1024,1024,0.0001 +game,T10,batched,cpu,true,6,0.261279,1024,1024,0.0001 +game,T10,batched,cpu,true,7,0.393254,1024,1024,0.0001 +game,T10,batched,cpu,true,8,0.398278,1024,1024,0.0001 +game,T10,batched,cpu,true,9,0.258898,1024,1024,0.0001 +game,T10,batched,cpu,true,10,0.267636,1024,1024,0.0001 +game,T10,batched,cpu,true,11,0.383898,1024,1024,0.0001 +game,T10,batched,cpu,true,12,0.392458,1024,1024,0.0001 +game,T10,batched,cpu,true,13,0.247449,1024,1024,0.0001 +game,T10,batched,cpu,true,14,0.389922,1024,1024,0.0001 +game,T10,batched,cpu,true,15,0.327846,1024,1024,0.0001 +game,T10,batched,cpu,true,16,0.323841,1024,1024,0.0001 +game,T10,batched,cpu,true,17,0.386701,1024,1024,0.0001 +game,T10,batched,cpu,true,18,0.259169,1024,1024,0.0001 +game,T10,batched,cpu,true,19,0.385859,1024,1024,0.0001 +game,T10,batched,cpu,true,20,0.25426,1024,1024,0.0001 +game,T10,batched,gpu,true,1,0.527608,1024,1024,0.0001 +game,T10,batched,gpu,true,2,0.532232,1024,1024,0.0001 +game,T10,batched,gpu,true,3,0.529131,1024,1024,0.0001 +game,T10,batched,gpu,true,4,0.528282,1024,1024,0.0001 +game,T10,batched,gpu,true,5,0.529239,1024,1024,0.0001 +game,T10,batched,gpu,true,6,0.549755,1024,1024,0.0001 +game,T10,batched,gpu,true,7,0.653787,1024,1024,0.0001 +game,T10,batched,gpu,true,8,0.529498,1024,1024,0.0001 +game,T10,batched,gpu,true,9,0.53213,1024,1024,0.0001 +game,T10,batched,gpu,true,10,0.529548,1024,1024,0.0001 +game,T10,batched,gpu,true,11,0.529705,1024,1024,0.0001 +game,T10,batched,gpu,true,12,0.529788,1024,1024,0.0001 +game,T10,batched,gpu,true,13,0.529588,1024,1024,0.0001 +game,T10,batched,gpu,true,14,0.693617,1024,1024,0.0001 +game,T10,batched,gpu,true,15,0.529675,1024,1024,0.0001 +game,T10,batched,gpu,true,16,0.531963,1024,1024,0.0001 +game,T10,batched,gpu,true,17,0.529429,1024,1024,0.0001 +game,T10,batched,gpu,true,18,0.529011,1024,1024,0.0001 +game,T10,batched,gpu,true,19,0.529226,1024,1024,0.0001 +game,T10,batched,gpu,true,20,0.529507,1024,1024,0.0001 +qp,p32i16,batched,cpu,false,1,0.083542,23,64,0.0001 +qp,p32i16,batched,cpu,false,2,0.055062,23,64,0.0001 +qp,p32i16,batched,cpu,false,3,0.074918,23,64,0.0001 +qp,p32i16,batched,cpu,false,4,0.053039,23,64,0.0001 +qp,p32i16,batched,cpu,false,5,0.05494,23,64,0.0001 +qp,p32i16,batched,cpu,false,6,0.077357,23,64,0.0001 +qp,p32i16,batched,cpu,false,7,0.055541,23,64,0.0001 +qp,p32i16,batched,cpu,false,8,0.070595,23,64,0.0001 +qp,p32i16,batched,cpu,false,9,0.056779,23,64,0.0001 +qp,p32i16,batched,cpu,false,10,0.065446,23,64,0.0001 +qp,p32i16,batched,gpu,false,1,0.11163,23,64,0.0001 +qp,p32i16,batched,gpu,false,2,0.106974,23,64,0.0001 +qp,p32i16,batched,gpu,false,3,0.105387,23,64,0.0001 +qp,p32i16,batched,gpu,false,4,0.104823,23,64,0.0001 +qp,p32i16,batched,gpu,false,5,0.104702,23,64,0.0001 +qp,p32i16,batched,gpu,false,6,0.10563,23,64,0.0001 +qp,p32i16,batched,gpu,false,7,0.1042,23,64,0.0001 +qp,p32i16,batched,gpu,false,8,0.104326,23,64,0.0001 +qp,p32i16,batched,gpu,false,9,0.10509,23,64,0.0001 +qp,p32i16,batched,gpu,false,10,0.105076,23,64,0.0001 +qp,p32i16,batched,cpu,false,1,0.160448,98,256,0.0001 +qp,p32i16,batched,cpu,false,2,0.155986,98,256,0.0001 +qp,p32i16,batched,cpu,false,3,0.155445,98,256,0.0001 +qp,p32i16,batched,cpu,false,4,0.15605,98,256,0.0001 +qp,p32i16,batched,cpu,false,5,0.157089,98,256,0.0001 +qp,p32i16,batched,cpu,false,6,0.156229,98,256,0.0001 +qp,p32i16,batched,cpu,false,7,0.212304,98,256,0.0001 +qp,p32i16,batched,cpu,false,8,0.222475,98,256,0.0001 +qp,p32i16,batched,cpu,false,9,0.149553,98,256,0.0001 +qp,p32i16,batched,cpu,false,10,0.155163,98,256,0.0001 +qp,p32i16,batched,gpu,false,1,0.187004,98,256,0.0001 +qp,p32i16,batched,gpu,false,2,0.17931,98,256,0.0001 +qp,p32i16,batched,gpu,false,3,0.17925,98,256,0.0001 +qp,p32i16,batched,gpu,false,4,0.179259,98,256,0.0001 +qp,p32i16,batched,gpu,false,5,0.180606,98,256,0.0001 +qp,p32i16,batched,gpu,false,6,0.179984,98,256,0.0001 +qp,p32i16,batched,gpu,false,7,0.179067,98,256,0.0001 +qp,p32i16,batched,gpu,false,8,0.178995,98,256,0.0001 +qp,p32i16,batched,gpu,false,9,0.179397,98,256,0.0001 +qp,p32i16,batched,gpu,false,10,0.181842,98,256,0.0001 +qp,p32i16,batched,cpu,false,1,0.53266,424,1024,0.0001 +qp,p32i16,batched,cpu,false,2,0.673591,424,1024,0.0001 +qp,p32i16,batched,cpu,false,3,0.656413,424,1024,0.0001 +qp,p32i16,batched,cpu,false,4,0.537141,424,1024,0.0001 +qp,p32i16,batched,cpu,false,5,0.691474,424,1024,0.0001 +qp,p32i16,batched,cpu,false,6,0.542654,424,1024,0.0001 +qp,p32i16,batched,cpu,false,7,0.581002,424,1024,0.0001 +qp,p32i16,batched,cpu,false,8,0.619252,424,1024,0.0001 +qp,p32i16,batched,cpu,false,9,0.607725,424,1024,0.0001 +qp,p32i16,batched,cpu,false,10,0.612005,424,1024,0.0001 +qp,p32i16,batched,gpu,false,1,0.393875,424,1024,0.0001 +qp,p32i16,batched,gpu,false,2,0.392277,424,1024,0.0001 +qp,p32i16,batched,gpu,false,3,0.391693,424,1024,0.0001 +qp,p32i16,batched,gpu,false,4,0.391792,424,1024,0.0001 +qp,p32i16,batched,gpu,false,5,0.392171,424,1024,0.0001 +qp,p32i16,batched,gpu,false,6,0.395422,424,1024,0.0001 +qp,p32i16,batched,gpu,false,7,0.394625,424,1024,0.0001 +qp,p32i16,batched,gpu,false,8,0.391495,424,1024,0.0001 +qp,p32i16,batched,gpu,false,9,0.391946,424,1024,0.0001 +qp,p32i16,batched,gpu,false,10,0.392787,424,1024,0.0001 +qp,p32i16,batched,cpu,false,1,2.494034,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,2,2.163243,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,3,2.349593,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,4,2.376208,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,5,2.157119,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,6,2.370658,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,7,2.424349,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,8,2.160141,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,9,2.34791,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,10,2.412252,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,1,1.327728,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,2,1.325509,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,3,1.324726,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,4,1.323152,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,5,1.326916,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,6,1.33005,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,7,1.323598,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,8,1.32748,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,9,1.331634,1664,4096,0.0001 +qp,p32i16,batched,gpu,false,10,1.428003,1664,4096,0.0001 +qp,p32i16,batched,cpu,false,1,9.467169,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,2,9.367302,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,3,9.55423,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,4,9.532582,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,5,9.440348,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,6,9.479375,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,7,9.304971,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,8,9.5093,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,9,9.508871,6802,16384,0.0001 +qp,p32i16,batched,cpu,false,10,9.41383,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,1,7.384833,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,2,7.362054,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,3,7.361213,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,4,7.400652,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,5,7.365688,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,6,7.369036,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,7,7.354212,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,8,7.440264,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,9,7.459234,6802,16384,0.0001 +qp,p32i16,batched,gpu,false,10,7.726441,6802,16384,0.0001 +game,T10,batched,cpu,false,1,0.014383,64,64,0.0001 +game,T10,batched,cpu,false,2,0.014278,64,64,0.0001 +game,T10,batched,cpu,false,3,0.013786,64,64,0.0001 +game,T10,batched,cpu,false,4,0.050785,64,64,0.0001 +game,T10,batched,cpu,false,5,0.015095,64,64,0.0001 +game,T10,batched,cpu,false,6,0.015521,64,64,0.0001 +game,T10,batched,cpu,false,7,0.041743,64,64,0.0001 +game,T10,batched,cpu,false,8,0.013928,64,64,0.0001 +game,T10,batched,cpu,false,9,0.015214,64,64,0.0001 +game,T10,batched,cpu,false,10,0.014332,64,64,0.0001 +game,T10,batched,gpu,false,1,0.055822,64,64,0.0001 +game,T10,batched,gpu,false,2,0.056117,64,64,0.0001 +game,T10,batched,gpu,false,3,0.056015,64,64,0.0001 +game,T10,batched,gpu,false,4,0.052509,64,64,0.0001 +game,T10,batched,gpu,false,5,0.051503,64,64,0.0001 +game,T10,batched,gpu,false,6,0.051196,64,64,0.0001 +game,T10,batched,gpu,false,7,0.051264,64,64,0.0001 +game,T10,batched,gpu,false,8,0.051394,64,64,0.0001 +game,T10,batched,gpu,false,9,0.051354,64,64,0.0001 +game,T10,batched,gpu,false,10,0.051276,64,64,0.0001 +game,T10,batched,gpu,true,1,0.044502,64,64,0.0001 +game,T10,batched,gpu,true,2,0.04443,64,64,0.0001 +game,T10,batched,gpu,true,3,0.044409,64,64,0.0001 +game,T10,batched,gpu,true,4,0.04427,64,64,0.0001 +game,T10,batched,gpu,true,5,0.044404,64,64,0.0001 +game,T10,batched,gpu,true,6,0.044242,64,64,0.0001 +game,T10,batched,gpu,true,7,0.044452,64,64,0.0001 +game,T10,batched,gpu,true,8,0.044324,64,64,0.0001 +game,T10,batched,gpu,true,9,0.044286,64,64,0.0001 +game,T10,batched,gpu,true,10,0.044308,64,64,0.0001 +game,T10,batched,cpu,false,1,0.069984,256,256,0.0001 +game,T10,batched,cpu,false,2,0.242637,256,256,0.0001 +game,T10,batched,cpu,false,3,0.068166,256,256,0.0001 +game,T10,batched,cpu,false,4,0.06762,256,256,0.0001 +game,T10,batched,cpu,false,5,0.070096,256,256,0.0001 +game,T10,batched,cpu,false,6,0.072362,256,256,0.0001 +game,T10,batched,cpu,false,7,0.071348,256,256,0.0001 +game,T10,batched,cpu,false,8,0.061088,256,256,0.0001 +game,T10,batched,cpu,false,9,0.071107,256,256,0.0001 +game,T10,batched,cpu,false,10,0.070857,256,256,0.0001 +game,T10,batched,gpu,false,1,0.211813,256,256,0.0001 +game,T10,batched,gpu,false,2,0.213148,256,256,0.0001 +game,T10,batched,gpu,false,3,0.212481,256,256,0.0001 +game,T10,batched,gpu,false,4,0.213448,256,256,0.0001 +game,T10,batched,gpu,false,5,0.212126,256,256,0.0001 +game,T10,batched,gpu,false,6,0.211794,256,256,0.0001 +game,T10,batched,gpu,false,7,0.212103,256,256,0.0001 +game,T10,batched,gpu,false,8,0.211804,256,256,0.0001 +game,T10,batched,gpu,false,9,0.212321,256,256,0.0001 +game,T10,batched,gpu,false,10,0.212709,256,256,0.0001 +game,T10,batched,gpu,true,1,0.136557,256,256,0.0001 +game,T10,batched,gpu,true,2,0.137274,256,256,0.0001 +game,T10,batched,gpu,true,3,0.135853,256,256,0.0001 +game,T10,batched,gpu,true,4,0.135933,256,256,0.0001 +game,T10,batched,gpu,true,5,0.135437,256,256,0.0001 +game,T10,batched,gpu,true,6,0.137122,256,256,0.0001 +game,T10,batched,gpu,true,7,0.1378,256,256,0.0001 +game,T10,batched,gpu,true,8,0.136319,256,256,0.0001 +game,T10,batched,gpu,true,9,0.135449,256,256,0.0001 +game,T10,batched,gpu,true,10,0.135639,256,256,0.0001 +game,T10,batched,cpu,false,1,0.465195,1024,1024,0.0001 +game,T10,batched,cpu,false,2,0.498511,1024,1024,0.0001 +game,T10,batched,cpu,false,3,0.364217,1024,1024,0.0001 +game,T10,batched,cpu,false,4,0.477601,1024,1024,0.0001 +game,T10,batched,cpu,false,5,0.292679,1024,1024,0.0001 +game,T10,batched,cpu,false,6,0.369244,1024,1024,0.0001 +game,T10,batched,cpu,false,7,0.358721,1024,1024,0.0001 +game,T10,batched,cpu,false,8,0.46299,1024,1024,0.0001 +game,T10,batched,cpu,false,9,0.304187,1024,1024,0.0001 +game,T10,batched,cpu,false,10,0.452223,1024,1024,0.0001 +game,T10,batched,gpu,false,1,0.816122,1024,1024,0.0001 +game,T10,batched,gpu,false,2,0.823214,1024,1024,0.0001 +game,T10,batched,gpu,false,3,0.819479,1024,1024,0.0001 +game,T10,batched,gpu,false,4,0.819235,1024,1024,0.0001 +game,T10,batched,gpu,false,5,0.819217,1024,1024,0.0001 +game,T10,batched,gpu,false,6,0.97357,1024,1024,0.0001 +game,T10,batched,gpu,false,7,0.818675,1024,1024,0.0001 +game,T10,batched,gpu,false,8,0.821509,1024,1024,0.0001 +game,T10,batched,gpu,false,9,0.818298,1024,1024,0.0001 +game,T10,batched,gpu,false,10,0.817305,1024,1024,0.0001 +game,T10,batched,gpu,true,1,0.671466,1024,1024,0.0001 +game,T10,batched,gpu,true,2,0.53138,1024,1024,0.0001 +game,T10,batched,gpu,true,3,0.528238,1024,1024,0.0001 +game,T10,batched,gpu,true,4,0.529345,1024,1024,0.0001 +game,T10,batched,gpu,true,5,0.52868,1024,1024,0.0001 +game,T10,batched,gpu,true,6,0.529332,1024,1024,0.0001 +game,T10,batched,gpu,true,7,0.54689,1024,1024,0.0001 +game,T10,batched,gpu,true,8,0.661657,1024,1024,0.0001 +game,T10,batched,gpu,true,9,0.529669,1024,1024,0.0001 +game,T10,batched,gpu,true,10,0.531308,1024,1024,0.0001 +game,T10,batched,cpu,false,1,2.359572,4095,4096,0.0001 +game,T10,batched,cpu,false,2,2.280813,4095,4096,0.0001 +game,T10,batched,cpu,false,3,2.424329,4095,4096,0.0001 +game,T10,batched,cpu,false,4,2.447946,4095,4096,0.0001 +game,T10,batched,cpu,false,5,2.498108,4095,4096,0.0001 +game,T10,batched,cpu,false,6,2.319666,4095,4096,0.0001 +game,T10,batched,cpu,false,7,2.429578,4095,4096,0.0001 +game,T10,batched,cpu,false,8,2.429935,4095,4096,0.0001 +game,T10,batched,cpu,false,9,2.460079,4095,4096,0.0001 +game,T10,batched,cpu,false,10,2.256778,4095,4096,0.0001 +game,T10,batched,gpu,false,1,7.165538,4095,4096,0.0001 +game,T10,batched,gpu,false,2,7.226483,4095,4096,0.0001 +game,T10,batched,gpu,false,3,7.105812,4095,4096,0.0001 +game,T10,batched,gpu,false,4,7.105162,4095,4096,0.0001 +game,T10,batched,gpu,false,5,7.106738,4095,4096,0.0001 +game,T10,batched,gpu,false,6,7.104153,4095,4096,0.0001 +game,T10,batched,gpu,false,7,7.106061,4095,4096,0.0001 +game,T10,batched,gpu,false,8,7.104183,4095,4096,0.0001 +game,T10,batched,gpu,false,9,7.105398,4095,4096,0.0001 +game,T10,batched,gpu,false,10,7.10282,4095,4096,0.0001 +game,T10,batched,gpu,true,1,2.351519,4096,4096,0.0001 +game,T10,batched,gpu,true,2,2.297775,4096,4096,0.0001 +game,T10,batched,gpu,true,3,2.295651,4096,4096,0.0001 +game,T10,batched,gpu,true,4,2.295378,4096,4096,0.0001 +game,T10,batched,gpu,true,5,2.295149,4096,4096,0.0001 +game,T10,batched,gpu,true,6,2.296366,4096,4096,0.0001 +game,T10,batched,gpu,true,7,2.295769,4096,4096,0.0001 +game,T10,batched,gpu,true,8,2.295533,4096,4096,0.0001 +game,T10,batched,gpu,true,9,2.296182,4096,4096,0.0001 +game,T10,batched,gpu,true,10,2.295547,4096,4096,0.0001 +qp,p64i32,batched,cpu,false,1,1.030538,986,1024,0.0001 +qp,p64i32,batched,cpu,false,2,0.797772,986,1024,0.0001 +qp,p64i32,batched,cpu,false,3,1.082528,986,1024,0.0001 +qp,p64i32,batched,cpu,false,4,0.75489,986,1024,0.0001 +qp,p64i32,batched,cpu,false,5,1.028176,986,1024,0.0001 +qp,p64i32,batched,gpu,false,1,1.023946,986,1024,0.0001 +qp,p64i32,batched,gpu,false,2,1.020873,986,1024,0.0001 +qp,p64i32,batched,gpu,false,3,1.014923,986,1024,0.0001 +qp,p64i32,batched,gpu,false,4,1.017093,986,1024,0.0001 +qp,p64i32,batched,gpu,false,5,1.011117,986,1024,0.0001 +qp,p128i64,batched,cpu,false,1,2.948246,1024,1024,0.0001 +qp,p128i64,batched,cpu,false,2,2.918183,1024,1024,0.0001 +qp,p128i64,batched,cpu,false,3,2.904045,1024,1024,0.0001 +qp,p128i64,batched,cpu,false,4,2.89518,1024,1024,0.0001 +qp,p128i64,batched,cpu,false,5,2.897522,1024,1024,0.0001 +qp,p128i64,batched,gpu,false,1,0.939785,1024,1024,0.0001 +qp,p128i64,batched,gpu,false,2,0.939888,1024,1024,0.0001 +qp,p128i64,batched,gpu,false,3,0.940488,1024,1024,0.0001 +qp,p128i64,batched,gpu,false,4,0.940471,1024,1024,0.0001 +qp,p128i64,batched,gpu,false,5,1.086177,1024,1024,0.0001 +game,T20,batched,cpu,false,1,1.518191,1021,1024,0.0001 +game,T20,batched,cpu,false,2,1.292947,1021,1024,0.0001 +game,T20,batched,cpu,false,3,1.391381,1021,1024,0.0001 +game,T20,batched,cpu,false,4,1.404668,1021,1024,0.0001 +game,T20,batched,cpu,false,5,1.092272,1021,1024,0.0001 +game,T20,batched,gpu,false,1,3.653947,1021,1024,0.0001 +game,T20,batched,gpu,false,2,3.632989,1021,1024,0.0001 +game,T20,batched,gpu,false,3,3.642101,1021,1024,0.0001 +game,T20,batched,gpu,false,4,3.620777,1021,1024,0.0001 +game,T20,batched,gpu,false,5,3.637732,1021,1024,0.0001 +game,T20,batched,cpu,true,1,1.635918,1017,1024,0.0001 +game,T20,batched,cpu,true,2,1.237655,1017,1024,0.0001 +game,T20,batched,cpu,true,3,1.600012,1017,1024,0.0001 +game,T20,batched,cpu,true,4,1.212294,1017,1024,0.0001 +game,T20,batched,cpu,true,5,1.576506,1017,1024,0.0001 +game,T20,batched,gpu,true,1,3.508502,1015,1024,0.0001 +game,T20,batched,gpu,true,2,3.533831,1015,1024,0.0001 +game,T20,batched,gpu,true,3,3.504738,1015,1024,0.0001 +game,T20,batched,gpu,true,4,3.47895,1015,1024,0.0001 +game,T20,batched,gpu,true,5,3.497428,1015,1024,0.0001 +game,T30,batched,cpu,false,1,5.683269,174,1024,0.0001 +game,T30,batched,cpu,false,2,5.677042,174,1024,0.0001 +game,T30,batched,cpu,false,3,5.689163,174,1024,0.0001 +game,T30,batched,cpu,false,4,5.396987,174,1024,0.0001 +game,T30,batched,cpu,false,5,5.682752,174,1024,0.0001 +game,T30,batched,gpu,false,1,7.243592,172,1024,0.0001 +game,T30,batched,gpu,false,2,7.032012,172,1024,0.0001 +game,T30,batched,gpu,false,3,7.159027,172,1024,0.0001 +game,T30,batched,gpu,false,4,7.302148,172,1024,0.0001 +game,T30,batched,gpu,false,5,7.103491,172,1024,0.0001 +game,T30,batched,cpu,true,1,4.342422,950,1024,0.0001 +game,T30,batched,cpu,true,2,3.927561,950,1024,0.0001 +game,T30,batched,cpu,true,3,4.146048,950,1024,0.0001 +game,T30,batched,cpu,true,4,3.919642,950,1024,0.0001 +game,T30,batched,cpu,true,5,4.172348,950,1024,0.0001 +game,T30,batched,gpu,true,1,8.623802,952,1024,0.0001 +game,T30,batched,gpu,true,2,8.673846,952,1024,0.0001 +game,T30,batched,gpu,true,3,8.013584,952,1024,0.0001 +game,T30,batched,gpu,true,4,6.867861,952,1024,0.0001 +game,T30,batched,gpu,true,5,6.519391,952,1024,0.0001 +game,T40,batched,cpu,false,1,6.717804,49,1024,0.0001 +game,T40,batched,cpu,false,2,6.373365,49,1024,0.0001 +game,T40,batched,cpu,false,3,6.479074,49,1024,0.0001 +game,T40,batched,cpu,false,4,6.440173,49,1024,0.0001 +game,T40,batched,cpu,false,5,6.476284,49,1024,0.0001 +game,T40,batched,gpu,false,1,4.354277,50,1024,0.0001 +game,T40,batched,gpu,false,2,4.408235,50,1024,0.0001 +game,T40,batched,gpu,false,3,4.451327,50,1024,0.0001 +game,T40,batched,gpu,false,4,4.610987,50,1024,0.0001 +game,T40,batched,gpu,false,5,4.292617,50,1024,0.0001 +game,T40,batched,cpu,true,1,7.986635,809,1024,0.0001 +game,T40,batched,cpu,true,2,7.646192,809,1024,0.0001 +game,T40,batched,cpu,true,3,7.693728,809,1024,0.0001 +game,T40,batched,cpu,true,4,8.162665,809,1024,0.0001 +game,T40,batched,cpu,true,5,7.770964,809,1024,0.0001 +game,T40,batched,gpu,true,1,11.865145,806,1024,0.0001 +game,T40,batched,gpu,true,2,14.341875,806,1024,0.0001 +game,T40,batched,gpu,true,3,11.493685,806,1024,0.0001 +game,T40,batched,gpu,true,4,12.941129,806,1024,0.0001 +game,T40,batched,gpu,true,5,13.040193,806,1024,0.0001 +game,T50,batched,cpu,false,1,10.378459,23,1024,0.0001 +game,T50,batched,cpu,false,2,9.954274,23,1024,0.0001 +game,T50,batched,cpu,false,3,10.40323,23,1024,0.0001 +game,T50,batched,cpu,false,4,10.281037,23,1024,0.0001 +game,T50,batched,cpu,false,5,10.392979,23,1024,0.0001 +game,T50,batched,gpu,false,1,11.452575,19,1024,0.0001 +game,T50,batched,gpu,false,2,11.427243,19,1024,0.0001 +game,T50,batched,gpu,false,3,11.764461,19,1024,0.0001 +game,T50,batched,gpu,false,4,12.786048,19,1024,0.0001 +game,T50,batched,gpu,false,5,12.150012,19,1024,0.0001 +game,T50,batched,cpu,true,1,12.990801,587,1024,0.0001 +game,T50,batched,cpu,true,2,12.617942,587,1024,0.0001 +game,T50,batched,cpu,true,3,12.586991,587,1024,0.0001 +game,T50,batched,cpu,true,4,12.65606,587,1024,0.0001 +game,T50,batched,cpu,true,5,12.724873,587,1024,0.0001 +game,T50,batched,gpu,true,1,15.145487,582,1024,0.0001 +game,T50,batched,gpu,true,2,17.704947,582,1024,0.0001 +game,T50,batched,gpu,true,3,16.313671,582,1024,0.0001 +game,T50,batched,gpu,true,4,14.311715,582,1024,0.0001 +game,T50,batched,gpu,true,5,18.137736,582,1024,0.0001 +game,T10,path,na,false,1,2.675894,63,64,0.0001 +game,T10,path,na,false,2,2.60248,63,64,0.0001 +game,T10,path,na,false,3,2.597438,63,64,0.0001 +game,T10,path,na,false,1,11.118953,252,256,0.0001 +game,T10,path,na,false,2,11.139425,252,256,0.0001 +game,T10,path,na,false,3,11.111228,252,256,0.0001 +game,T10,path,na,false,1,46.412037,996,1024,0.0001 +game,T10,path,na,false,1,187.061708,3960,4096,0.0001 +qp,p32i16,path,na,false,1,0.365217,25,64,0.0001 +qp,p32i16,path,na,false,2,0.290492,25,64,0.0001 +qp,p32i16,path,na,false,3,0.265094,25,64,0.0001 +qp,p32i16,path,na,false,1,1.086877,101,256,0.0001 +qp,p32i16,path,na,false,2,1.04071,101,256,0.0001 +qp,p32i16,path,na,false,3,1.058513,101,256,0.0001 +qp,p32i16,path,na,false,1,3.966139,437,1024,0.0001 +qp,p32i16,path,na,false,1,16.241138,1693,4096,0.0001 diff --git a/benchmark/results/percall_timing.csv b/benchmark/results/percall_timing.csv new file mode 100644 index 0000000..ea535b4 --- /dev/null +++ b/benchmark/results/percall_timing.csv @@ -0,0 +1,11 @@ +horizon,d,device,jac_ms,fac_ms,ldiv_ms,jacfac_ms +10,700,CPU,0.65,5.69,3.09,6.34 +10,700,GPU,1.18,10.99,6.26,12.18 +20,1400,CPU,2.55,13.1,8.99,15.65 +20,1400,GPU,1.47,18.66,10.99,20.13 +30,2100,CPU,3.41,19.34,14.8,22.75 +30,2100,GPU,2.47,21.03,9.23,23.5 +50,3500,CPU,6.25,32.19,25.07,38.44 +50,3500,GPU,4.24,26.05,11.86,30.29 +70,4900,CPU,8.9,45.15,33.97,54.06 +70,4900,GPU,5.97,32.75,15.37,38.72 diff --git a/benchmark/results/run_metadata.txt b/benchmark/results/run_metadata.txt new file mode 100644 index 0000000..cab8917 --- /dev/null +++ b/benchmark/results/run_metadata.txt @@ -0,0 +1,7 @@ +timestamp_utc=2026-07-29T13:29:55Z +git_commit=3724e8a40dfbd751e15cb5f6484f80f5e74dfda6 +git_branch=docs/technical-report +cpu_model=AMD Ryzen 9 7950X 16-Core Processor +cpu_cores_logical=32 +gpu=NVIDIA GeForce RTX 4090, 24564 MiB, 580.173.02 +julia=julia version 1.12.6 diff --git a/benchmark/results/scripts/active_frac.jl b/benchmark/results/scripts/active_frac.jl new file mode 100644 index 0000000..5aa40ac --- /dev/null +++ b/benchmark/results/scripts/active_frac.jl @@ -0,0 +1,57 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +using CUDA, CUDSS +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +using MixedComplementarityProblems: MixedComplementarityProblems; const M = MixedComplementarityProblems +using KernelAbstractions: KernelAbstractions +using Adapt: Adapt +using Statistics: median +import Random + +sync(device) = device isa CUDA.CUDABackend && CUDA.synchronize() +const N = 1024; const TOL = 1e-4; const T = 50 # d = 3500, GPU wins all-active + +btype = MCP.TrajectoryGameBenchmark() +w = MCP.benchmark_throughput(btype; num_samples=1, tol=TOL, problem_kwargs=(; horizon=T), + run_sequential_ip=false, run_path=false, device=KernelAbstractions.CPU()) +mcp = w.batched_mcp + +function setup(device) + rng = Random.MersenneTwister(1) + Θ = Adapt.adapt(device, reduce(hcat, [MCP.generate_random_parameter(btype; rng, horizon=T) for _ in 1:N])) + nx=mcp.unconstrained_dimension; ny=mcp.constrained_dimension; d=nx+2ny + cache = M.materialize(mcp, M.BatchedSparse(), device; batch_size=N) + X=KernelAbstractions.zeros(device,Float64,nx,N); Y=KernelAbstractions.ones(device,Float64,ny,N); S=KernelAbstractions.ones(device,Float64,ny,N) + F=KernelAbstractions.zeros(device,Float64,d,N); δz=KernelAbstractions.zeros(device,Float64,d,N) + ϵ=KernelAbstractions.zeros(device,Float64,N); ϵ.=1.0; η=KernelAbstractions.zeros(device,Float64,N); η.=TOL + M.residual!(F,mcp,X,Y,S,Θ,ϵ; device) + # Warm up with ALL active so every instance's factor is materialized once (as in a real solve). + full = KernelAbstractions.ones(device, Bool, N) + for _ in 1:3 + M.jacobian!(cache,mcp,X,Y,S,Θ,ϵ,η; device, regularize_linear_solve=:identity, active=full) + M.factorize!(cache; active=full); M.ldiv!(δz,cache,-F; active=full); sync(device) + end + (; cache, mcp, X, Y, S, Θ, F, δz, ϵ, η, device) +end + +function timek(st, k; reps=7) + (; cache, mcp, X, Y, S, Θ, F, δz, ϵ, η, device) = st + amask = falses(N); amask[1:k] .= true + active = Adapt.adapt(device, amask) + jf() = (M.jacobian!(cache,mcp,X,Y,S,Θ,ϵ,η; device, regularize_linear_solve=:identity, active); + M.factorize!(cache; active); sync(device); nothing) + sv() = (M.ldiv!(δz,cache,-F; active); sync(device); nothing) + jf(); sv() # warm this active set + (; jacfac = median([@elapsed jf() for _ in 1:reps]), ldiv = median([@elapsed sv() for _ in 1:reps])) +end + +cpu = setup(KernelAbstractions.CPU()) +gpu = setup(CUDA.CUDABackend()) +println("active_k,cpu_jacfac_ms,gpu_jacfac_ms,jacfac_GPU/CPU,cpu_ldiv_ms,gpu_ldiv_ms,ldiv_GPU/CPU") +for k in (1024, 512, 256, 128, 64, 32) + c = timek(cpu, k); g = timek(gpu, k) + ms(x)=round(1000x;digits=2) + println("$k,$(ms(c.jacfac)),$(ms(g.jacfac)),$(round(g.jacfac/c.jacfac;digits=2)),$(ms(c.ldiv)),$(ms(g.ldiv)),$(round(g.ldiv/c.ldiv;digits=2))") + flush(stdout) +end +println("=== ACTIVE_FRAC DONE (T=$T, d=3500, N=$N) ===") diff --git a/benchmark/results/scripts/ad_gradient_check.jl b/benchmark/results/scripts/ad_gradient_check.jl new file mode 100644 index 0000000..71e558b --- /dev/null +++ b/benchmark/results/scripts/ad_gradient_check.jl @@ -0,0 +1,65 @@ +""" Verifies the differentiability claim in docs/paper/main.tex's "Differentiable +Solving" section: AD gradients (via ForwardDiff, exercising the implicit-function- +theorem sensitivity machinery in src/AutoDiff.jl) match central finite differences, +on the running-example lane-change trajectory game (same T=10 family as Table I/teaser). + +Run with: julia --project=benchmark benchmark/results/scripts/ad_gradient_check.jl +""" + +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks +const B = SolverBenchmarks +const Utils = B.TrajectoryGameBenchmarkUtils + +using MixedComplementarityProblems: MixedComplementarityProblems +const MCP = MixedComplementarityProblems +import ForwardDiff +import Random + +const HORIZON = 10 + +(; environment) = Utils.setup_road_environment() +game = Utils.setup_trajectory_game(; environment) +components = Utils.build_mcp_components(; game, horizon = HORIZON, params_per_player = 1) +mcp = MCP.PrimalDualMCP( + components.K_symbolic, components.z_symbolic, components.θ_symbolic, + components.lower_bounds, components.upper_bounds; + η_symbolic = components.η_symbolic, compute_sensitivities = true, +) + +solve_at(θ) = MCP.solve(MCP.InteriorPoint(), mcp, θ; tol = 1e-4, regularize_linear_solve = :identity) +f(θ) = sum(solve_at(θ).x .^ 2) + sum(solve_at(θ).y .^ 2) + +function central_fd(f, θ; h = 1e-6) + map(eachindex(θ)) do i + θp = copy(θ) + θp[i] += h + θm = copy(θ) + θm[i] -= h + (f(θp) - f(θm)) / 2h + end +end + +rng = Random.MersenneTwister(1) +n_ok = 0 +max_relerrs = Float64[] +norm_relerrs = Float64[] +attempt = 0 +while n_ok < 20 && attempt < 100 + global attempt += 1 + θ0 = B.generate_random_parameter(B.TrajectoryGameBenchmark(); rng, horizon = HORIZON) + sol0 = solve_at(θ0) + sol0.status == :solved || continue + global n_ok += 1 + + grad_ad = ForwardDiff.gradient(f, θ0) + grad_fd = central_fd(f, θ0) + + push!(max_relerrs, maximum(abs.(grad_ad .- grad_fd) ./ max.(abs.(grad_fd), 1e-8))) + push!(norm_relerrs, sqrt(sum((grad_ad .- grad_fd) .^ 2)) / sqrt(sum(grad_fd .^ 2))) +end + +println("checked $n_ok converged instances (of $attempt attempts)") +println("componentwise max relative error: worst=$(maximum(max_relerrs)) median=$(sort(max_relerrs)[n_ok÷2+1])") +println("gradient-norm relative error: worst=$(maximum(norm_relerrs)) median=$(sort(norm_relerrs)[n_ok÷2+1])") diff --git a/benchmark/results/scripts/confirm_game_gpu.jl b/benchmark/results/scripts/confirm_game_gpu.jl new file mode 100644 index 0000000..9c29090 --- /dev/null +++ b/benchmark/results/scripts/confirm_game_gpu.jl @@ -0,0 +1,42 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +using CUDA, CUDSS +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks +const MCP = SolverBenchmarks +using KernelAbstractions: KernelAbstractions +using Statistics: median +using MixedComplementarityProblems: MixedComplementarityProblems +using Adapt: Adapt +import Random + +btype = MCP.TrajectoryGameBenchmark(); pkw = (; horizon=30); N=1024; tol=1e-4 +w = MCP.benchmark_throughput(btype; num_samples=1, tol, problem_kwargs=pkw, + run_sequential_ip=false, run_path=false, device=KernelAbstractions.CPU(), use_initial_guess=true) +mcp = w.batched_mcp +rng = Random.MersenneTwister(1) +θs = [MCP.generate_random_parameter(btype; rng, pkw...) for _ in 1:N] +Θ_host = reduce(hcat, θs) + +function timeit(device, warm; reps=5) + Θ = Adapt.adapt(device, Θ_host) + X₀ = warm ? MCP.generate_initial_guess(btype, mcp, Θ, device; pkw...) : nothing + solve() = MixedComplementarityProblems.solve(MixedComplementarityProblems.BatchedInteriorPoint(), + mcp, Θ; tol, regularize_linear_solve=:identity, device, X₀) + sol = solve(); device isa CUDA.CUDABackend && CUDA.synchronize() # warmup + nsolved = count(==(:solved), sol.status) + ts = Float64[] + for _ in 1:reps + t = @elapsed begin; s = solve(); device isa CUDA.CUDABackend && CUDA.synchronize(); end + push!(ts, t) + end + (; med=median(ts), all=round.(ts;digits=3), nsolved) +end + +for warm in (false, true) + cpu = timeit(KernelAbstractions.CPU(), warm) + gpu = timeit(CUDA.CUDABackend(), warm) + println("=== game T=30 N=1024 warm=$warm (median-of-5) ===") + println(" CPU: med=$(round(cpu.med;digits=3))s all=$(cpu.all) solved=$(cpu.nsolved)") + println(" GPU: med=$(round(gpu.med;digits=3))s all=$(gpu.all) solved=$(gpu.nsolved)") + println(" GPU/CPU=$(round(gpu.med/cpu.med;digits=2)) (>1 => GPU slower)") +end diff --git a/benchmark/results/scripts/pcie_probe.jl b/benchmark/results/scripts/pcie_probe.jl new file mode 100644 index 0000000..d821802 --- /dev/null +++ b/benchmark/results/scripts/pcie_probe.jl @@ -0,0 +1,13 @@ +using CUDA +n = 256*1024*1024 ÷ 8 # 256 MB of Float64 +h = rand(Float64, n); d = CUDA.zeros(Float64, n) +# warmup +copyto!(d, h); copyto!(h, Array(d)); CUDA.synchronize() +println("running 60 large H2D/D2H transfers (sample nvidia-smi now)...") +t = @elapsed for i in 1:60 + copyto!(d, h) # H2D + copyto!(h, Array(d)) # D2H + CUDA.synchronize() +end +gb = 60*2*sizeof(Float64)*n/1e9 +println("transferred $(round(gb;digits=1)) GB in $(round(t;digits=2)) s => $(round(gb/t;digits=1)) GB/s aggregate") diff --git a/benchmark/results/scripts/percall.jl b/benchmark/results/scripts/percall.jl new file mode 100644 index 0000000..bed22b6 --- /dev/null +++ b/benchmark/results/scripts/percall.jl @@ -0,0 +1,56 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +using CUDA, CUDSS +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +using MixedComplementarityProblems: MixedComplementarityProblems; const M = MixedComplementarityProblems +using KernelAbstractions: KernelAbstractions +using Adapt: Adapt +using Statistics: median +import Random + +sync(device) = device isa CUDA.CUDABackend && CUDA.synchronize() +const HORIZONS = (10, 20, 30, 50, 70) +const N = 1024 +const TOL = 1e-4 + +# Build all MCPs at TOP LEVEL first, so the runtime-eval'd kernel closures are in-world +# before the timing function is ever called (else: world-age MethodError on the evaluator). +btype = MCP.TrajectoryGameBenchmark() +mcps = Dict{Int,Any}() +for T in HORIZONS + w = MCP.benchmark_throughput(btype; num_samples=1, tol=TOL, problem_kwargs=(; horizon=T), + run_sequential_ip=false, run_path=false, device=KernelAbstractions.CPU()) + mcps[T] = w.batched_mcp +end + +function percall(mcp, T; device, reps=7, warmup=3) + pkw = (; horizon=T) + rng = Random.MersenneTwister(1) + Θ = Adapt.adapt(device, reduce(hcat, [MCP.generate_random_parameter(btype; rng, pkw...) for _ in 1:N])) + nx=mcp.unconstrained_dimension; ny=mcp.constrained_dimension; d=nx+2ny; B=N + cache = M.materialize(mcp, M.BatchedSparse(), device; batch_size=B) + X=KernelAbstractions.zeros(device,Float64,nx,B); Y=KernelAbstractions.ones(device,Float64,ny,B); S=KernelAbstractions.ones(device,Float64,ny,B) + F=KernelAbstractions.zeros(device,Float64,d,B); δz=KernelAbstractions.zeros(device,Float64,d,B) + ϵ=KernelAbstractions.zeros(device,Float64,B); ϵ.=1.0; η=KernelAbstractions.zeros(device,Float64,B); η.=TOL + M.residual!(F,mcp,X,Y,S,Θ,ϵ; device) + jac() = (M.jacobian!(cache,mcp,X,Y,S,Θ,ϵ,η; device, regularize_linear_solve=:identity); nothing) + fac() = (M.factorize!(cache); sync(device); nothing) + solv() = (M.ldiv!(δz,cache,-F); sync(device); nothing) + for _ in 1:warmup; jac(); fac(); solv(); end + tj = median([@elapsed jac() for _ in 1:reps]) + tf = median([@elapsed fac() for _ in 1:reps]) + ts = median([@elapsed solv() for _ in 1:reps]) + (; d, jac=tj, fac=tf, ldiv=ts, jacfac=tj+tf) +end + +println("T,d,device,jac_ms,fac_ms,ldiv_ms,jacfac_ms") +for T in HORIZONS + cpu = percall(mcps[T], T; device=KernelAbstractions.CPU()) + gpu = percall(mcps[T], T; device=CUDA.CUDABackend()) + ms(x)=round(1000x;digits=2) + println("$T,$(cpu.d),CPU,$(ms(cpu.jac)),$(ms(cpu.fac)),$(ms(cpu.ldiv)),$(ms(cpu.jacfac))") + println("$T,$(gpu.d),GPU,$(ms(gpu.jac)),$(ms(gpu.fac)),$(ms(gpu.ldiv)),$(ms(gpu.jacfac))") + println(" >> T=$T d=$(cpu.d): fac GPU/CPU=$(round(gpu.fac/cpu.fac;digits=2)) jacfac GPU/CPU=$(round(gpu.jacfac/cpu.jacfac;digits=2)) ldiv GPU/CPU=$(round(gpu.ldiv/cpu.ldiv;digits=2))") + flush(stdout) +end +println("=== PERCALL DONE ===") diff --git a/benchmark/results/scripts/raw_data.jl b/benchmark/results/scripts/raw_data.jl new file mode 100644 index 0000000..8ace807 --- /dev/null +++ b/benchmark/results/scripts/raw_data.jl @@ -0,0 +1,135 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +# Raw per-sample benchmark data for the headline throughput + GPU-scaling results. +# • per_instance.csv : per-instance solve time+status for the SEQUENTIAL baselines +# (PATH, unbatched InteriorPoint) — reveals feasible/infeasible bimodality. +# • per_rep.csv : per-repetition full-batch wall-clock for the BATCHED solver (CPU/GPU) +# and (few reps) sequential PATH totals — for mean±stddev / violins. +# STAGE=throughput_raw | scaling_raw WARMSTART unused (we sweep warm explicitly for the game). +using CUDA, CUDSS +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +using MixedComplementarityProblems: MixedComplementarityProblems; const M = MixedComplementarityProblems +using ParametricMCPs: ParametricMCPs +using PATHSolver: PATHSolver +using KernelAbstractions: KernelAbstractions +using Adapt: Adapt +import Random + +const RESULTS = joinpath(REPO, "benchmark", "results") +const TOL = 1e-4 +const CPU = KernelAbstractions.CPU() +sync(dev) = dev isa CUDA.CUDABackend && CUDA.synchronize() +const QP = MCP.QuadraticProgramBenchmark; const GAME = MCP.TrajectoryGameBenchmark + +const PI_CSV = joinpath(RESULTS, "per_instance.csv") +const PR_CSV = joinpath(RESULTS, "per_rep.csv") +pih() = isfile(PI_CSV) || open(io->println(io,"problem,size,solver,instance,time_s,solved,tol"), PI_CSV, "w") +prh() = isfile(PR_CSV) || open(io->println(io,"problem,size,solver,device,warm_start,rep,total_time_s,num_solved,num_samples,tol"), PR_CSV, "w") +pirow(a...) = open(io->println(io, join(a, ",")), PI_CSV, "a") +prrow(a...) = open(io->println(io, join(a, ",")), PR_CSV, "a") + +# Build both MCPs (+ deterministic θ's) at top level → runtime-eval'd kernels are in-world. +function build(btype, pkw, N) + w = MCP.benchmark_throughput(btype; num_samples=1, tol=TOL, problem_kwargs=pkw, device=CPU) + rng = Random.MersenneTwister(1) + θs = [MCP.generate_random_parameter(btype; rng, pkw...) for _ in 1:N] + (; batched_mcp=w.batched_mcp, path_mcp=w.path_mcp, θs, Θ_host=reduce(hcat, θs)) +end + +# per-instance sequential timings (PATH + unbatched IP), cold. +function per_instance!(problem, sz, b) + ParametricMCPs.solve(b.path_mcp, b.θs[1]; convergence_tolerance=TOL, warn_on_convergence_failure=false) # warmup + for (i,θ) in enumerate(b.θs) + t = @elapsed s = ParametricMCPs.solve(b.path_mcp, θ; convergence_tolerance=TOL, warn_on_convergence_failure=false) + pirow(problem, sz, "path", i, round(t;digits=6), s.status==PATHSolver.MCP_Solved, TOL) + end + M.solve(M.InteriorPoint(), b.batched_mcp, b.θs[1]; tol=TOL, regularize_linear_solve=:identity) # warmup + for (i,θ) in enumerate(b.θs) + t = @elapsed s = M.solve(M.InteriorPoint(), b.batched_mcp, θ; tol=TOL, regularize_linear_solve=:identity) + pirow(problem, sz, "ip_seq", i, round(t;digits=6), s.status==:solved, TOL) + end +end + +# per-rep batched full-batch wall-clock on a device, given warm on/off. +function per_rep_batched!(problem, sz, btype, pkw, b, N, device, warm; reps=20) + Θ = Adapt.adapt(device, b.Θ_host) + X₀ = warm ? MCP.generate_initial_guess(btype, b.batched_mcp, Θ, device; pkw...) : nothing + run() = M.solve(M.BatchedInteriorPoint(), b.batched_mcp, Θ; tol=TOL, regularize_linear_solve=:identity, device, X₀) + s = run(); sync(device) # warmup + ns = count(==(:solved), s.status) + dev = device isa CUDA.CUDABackend ? "gpu" : "cpu" + for rep in 1:reps + t = @elapsed (run(); sync(device)) + prrow(problem, sz, "batched", dev, warm, rep, round(t;digits=6), ns, N, TOL) + end +end + +# few-rep sequential PATH totals (the serial baseline), cold. +function per_rep_path!(problem, sz, b, N; reps=3) + ParametricMCPs.solve(b.path_mcp, b.θs[1]; convergence_tolerance=TOL, warn_on_convergence_failure=false) + for rep in 1:reps + t = @elapsed n = count(θ->ParametricMCPs.solve(b.path_mcp, θ; convergence_tolerance=TOL, warn_on_convergence_failure=false).status==PATHSolver.MCP_Solved, b.θs) + prrow(problem, sz, "path", "na", false, rep, round(t;digits=6), n, N, TOL) + end +end + +pih(); prh() +stage = get(ENV, "STAGE", "throughput_raw") +@info "=== raw_data stage=$stage, threads=$(Threads.nthreads()) ===" + +if stage == "throughput_raw" + N = 1024 + for (problem, btype, pkw, sz) in (("qp", QP(), (;num_primals=32,num_inequalities=16), "p32i16"), + ("game", GAME(), (;horizon=10), "T10")) + @info "throughput_raw: $problem N=$N building..." + b = build(btype, pkw, N) + per_instance!(problem, sz, b) + per_rep_batched!(problem, sz, btype, pkw, b, N, CPU, false) + per_rep_batched!(problem, sz, btype, pkw, b, N, CUDA.CUDABackend(), false) + if problem == "game" # also warm (realistic MPC regime) + per_rep_batched!(problem, sz, btype, pkw, b, N, CPU, true) + per_rep_batched!(problem, sz, btype, pkw, b, N, CUDA.CUDABackend(), true) + end + GC.gc(); CUDA.reclaim() + end +elseif stage == "problem_size_raw" + # Median-of-5 raw reps for the PROBLEM-SIZE sweep (fixed B=1024, varying per-instance size), + # to match the batch-size study's per-rep coverage. The base configs (qp p32i16, game T10 at + # B=1024) already have ≥30 reps from `throughput_raw`; here we fill the larger sizes. + # • qp: p64i32, p128i64 (cold; QP has no warm/initial-guess) + # • game: T20, T30, T40, T50 (cold + warm, matching the T=30 median-of-5) + N = 1024 + for (problem, btype, pkw, sz) in (("qp", QP(), (;num_primals=64,num_inequalities=32), "p64i32"), + ("qp", QP(), (;num_primals=128,num_inequalities=64), "p128i64")) + @info "problem_size_raw: $problem $sz N=$N building..." + b = build(btype, pkw, N) + per_rep_batched!(problem, sz, btype, pkw, b, N, CPU, false; reps=5) + per_rep_batched!(problem, sz, btype, pkw, b, N, CUDA.CUDABackend(), false; reps=5) + GC.gc(); CUDA.reclaim() + end + for T in (20, 30, 40, 50) + pkw = (;horizon=T); sz = "T$T" + @info "problem_size_raw: game $sz N=$N building..." + b = build(GAME(), pkw, N) + per_rep_batched!("game", sz, GAME(), pkw, b, N, CPU, false; reps=5) + per_rep_batched!("game", sz, GAME(), pkw, b, N, CUDA.CUDABackend(), false; reps=5) + per_rep_batched!("game", sz, GAME(), pkw, b, N, CPU, true; reps=5) + per_rep_batched!("game", sz, GAME(), pkw, b, N, CUDA.CUDABackend(), true; reps=5) + GC.gc(); CUDA.reclaim() + end +elseif stage == "scaling_raw" + for (problem, btype, sweep, pkw, sz) in ( + ("qp", QP(), [64,256,1024,4096,16384], (;num_primals=32,num_inequalities=16), "p32i16"), + ("game", GAME(), [64,256,1024,4096], (;horizon=10), "T10")) + @info "scaling_raw: $problem building (max N=$(maximum(sweep)))..." + for N in sweep + b = build(btype, pkw, N) + per_rep_batched!(problem, sz, btype, pkw, b, N, CPU, false; reps=10) + per_rep_batched!(problem, sz, btype, pkw, b, N, CUDA.CUDABackend(), false; reps=10) + problem == "game" && per_rep_batched!(problem, sz, btype, pkw, b, N, CUDA.CUDABackend(), true; reps=10) + N <= 4096 && per_rep_path!(problem, sz, b, N; reps=(N<=256 ? 3 : 1)) + GC.gc(); CUDA.reclaim() + end + end +end +@info "=== raw_data stage=$stage DONE ===" diff --git a/benchmark/results/scripts/rerun_path_tol.jl b/benchmark/results/scripts/rerun_path_tol.jl new file mode 100644 index 0000000..f90500c --- /dev/null +++ b/benchmark/results/scripts/rerun_path_tol.jl @@ -0,0 +1,116 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +# Re-time ALL PATH evaluations at convergence_tolerance = 1e-4 (matching the IP/batched +# solver's `tol`) and surgically patch the PATH rows in every results CSV, leaving the +# batched / sequential-IP / GPU rows untouched. Previously PATH ran at its built-in default +# convergence_tolerance = 1e-6 while our solver used 1e-4 — an unfair 100x-tighter bar for +# PATH. One PATH measurement per (config, batch size, rep) feeds all CSVs for consistency. +# PATH appears only for the two base configs (qp p32i16, game T10); the problem-size / +# horizon studies are CPU-vs-GPU only. See results/README.md "PATH tolerance" note. +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +using ParametricMCPs: ParametricMCPs +using PATHSolver: PATHSolver +using KernelAbstractions: KernelAbstractions +import Random + +const RESULTS = joinpath(REPO, "benchmark", "results") +const CTOL = 1e-4 +const DEV = KernelAbstractions.CPU() +const QP = MCP.QuadraticProgramBenchmark; const GAME = MCP.TrajectoryGameBenchmark +psolved(s) = s.status == PATHSolver.MCP_Solved +psolve(mcp, θ) = ParametricMCPs.solve(mcp, θ; convergence_tolerance=CTOL, warn_on_convergence_failure=false) + +const Bset = [64, 256, 1024, 4096] +const REPS = Dict(64=>3, 256=>3, 1024=>1, 4096=>1) # match existing per_rep.csv rep counts +const Nmax = 4096 +const NPI = 1024 # per-instance sample count + +# (key, size-label, btype, problem_kwargs, num_primals, num_inequalities, horizon) — the last +# three as the exact strings used in experiments.csv (empty where not applicable). +configs = ( + (:qp, "p32i16", QP(), (; num_primals=32, num_inequalities=16), "32", "16", ""), + (:game, "T10", GAME(), (; horizon=10), "", "", "10"), +) + +results = Dict{Symbol,Any}() +for (key, sz, btype, pkw, np, ni, T) in configs + @info "rerun_path: building $key $sz ..." + w = MCP.benchmark_throughput(btype; num_samples=1, tol=CTOL, problem_kwargs=pkw, device=DEV, + run_batched=false, run_sequential_ip=false, run_path=true) + path_mcp = w.path_mcp + rng = Random.MersenneTwister(1) + θs = [MCP.generate_random_parameter(btype; rng, pkw...) for _ in 1:Nmax] + psolve(path_mcp, θs[1]) # warmup + + # Per-instance timings (N = 1024) → per_instance.csv, per_instance_table1.csv. + pinst = Tuple{Float64,Bool}[] + for i in 1:NPI + t = @elapsed s = psolve(path_mcp, θs[i]) + push!(pinst, (t, psolved(s))) + end + @info " $key per-instance: solved=$(count(last, pinst))/$NPI" + + # Full-batch wall-clock totals per batch size → per_rep / throughput_klu / experiments. + totals = Dict{Int,Vector{Tuple{Float64,Int}}}() + for B in Bset + totals[B] = Tuple{Float64,Int}[] + for _ in 1:REPS[B] + t = @elapsed n = count(θ -> psolved(psolve(path_mcp, θ)), @view θs[1:B]) + push!(totals[B], (t, n)) + end + @info " $key B=$B: total=$(round(totals[B][1][1];digits=3))s solved=$(totals[B][1][2])" + end + results[key] = (; prob=String(key), sz, np, ni, T, pinst, totals) +end + +# ---- CSV surgery: drop old PATH rows, append freshly-timed ones. ---- +r4(x) = round(x; digits=4); r6(x) = round(x; digits=6) +function patch!(fname, is_path_row, newrows) + path = joinpath(RESULTS, fname) + lines = readlines(path) + kept = filter(l -> !is_path_row(split(l, ',')), @view lines[2:end]) + open(path, "w") do io + println(io, lines[1]) + foreach(l -> println(io, l), kept) + foreach(l -> println(io, l), newrows) + end + @info "patched $fname: dropped $(length(lines)-1-length(kept)) PATH rows, added $(length(newrows))" +end + +# per_instance.csv / per_instance_table1.csv (problem,size,solver,instance,time_s,solved,tol) +pi_rows = String[] +for (_, r) in results, (i, (t, sol)) in enumerate(r.pinst) + push!(pi_rows, join((r.prob, r.sz, "path", i, r6(t), sol, CTOL), ",")) +end +patch!("per_instance.csv", f -> f[3] == "path", pi_rows) +patch!("per_instance_table1.csv", f -> f[3] == "path", pi_rows) + +# per_rep.csv (problem,size,solver,device,warm_start,rep,total_time_s,num_solved,num_samples,tol) +pr_rows = String[] +for (_, r) in results, B in Bset, (rep, (t, n)) in enumerate(r.totals[B]) + push!(pr_rows, join((r.prob, r.sz, "path", "na", false, rep, r6(t), n, B, CTOL), ",")) +end +patch!("per_rep.csv", f -> f[3] == "path", pr_rows) + +# throughput_klu.csv (problem,solver,warm_start,total_time_s,num_solved,num_samples,tol) — B=1024 +tk_rows = String[] +for (_, r) in results + t, n = r.totals[1024][1] + push!(tk_rows, join((r.prob, "path", false, r4(t), n, 1024, CTOL), ",")) +end +patch!("throughput_klu.csv", f -> f[2] == "path", tk_rows) + +# experiments.csv (experiment,problem,num_primals,num_inequalities,horizon,num_samples, +# nthreads,solver,device,warm_start,total_time_s,num_solved,tol) +ex_rows = String[] +for (_, r) in results + for B in Bset + t, n = r.totals[B][1] + push!(ex_rows, join(("gpu_scaling", r.prob, r.np, r.ni, r.T, B, 32, "path", "na", false, r4(t), n, CTOL), ",")) + end + t, n = r.totals[1024][1] + push!(ex_rows, join(("throughput", r.prob, r.np, r.ni, r.T, 1024, 32, "path", "na", false, r4(t), n, CTOL), ",")) +end +patch!("experiments.csv", f -> f[8] == "path", ex_rows) + +println("=== RERUN_PATH_TOL DONE ===") diff --git a/benchmark/results/scripts/run_benchmarks.jl b/benchmark/results/scripts/run_benchmarks.jl new file mode 100644 index 0000000..015cabc --- /dev/null +++ b/benchmark/results/scripts/run_benchmarks.jl @@ -0,0 +1,197 @@ +#!/usr/bin/env julia +# Benchmark driver for the technical-report Experiments section. +# +# Runs the batched-throughput and GPU-vs-CPU experiments and appends results to a single +# long-format CSV (one row per solver/device/sweep-point) so all stages concatenate and a +# mid-sweep crash keeps partial results. Select the stage with ENV["STAGE"]. +# +# Run from repo root: +# STAGE=throughput julia -t 32 --project=benchmark/gpu +# +# Stages: throughput | gpu_scaling | problem_size | horizon | all + +using CUDA: CUDA +using CUDSS: CUDSS # loads MixedComplementarityProblemsCUDSSExt +# Repo root: from ENV["REPO_ROOT"] if set, else the known checkout path. (This driver +# lives in a scratchpad outside the repo, so a relative walk-up won't find it.) +const REPO_ROOT = get(ENV, "REPO_ROOT", + normpath(joinpath(@__DIR__, "..", "..", ".."))) +isfile(joinpath(REPO_ROOT, "benchmark", "SolverBenchmarks.jl")) || + error("benchmark/SolverBenchmarks.jl not found under REPO_ROOT=$REPO_ROOT") +include(joinpath(REPO_ROOT, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks +using KernelAbstractions: KernelAbstractions + +const QP = SolverBenchmarks.QuadraticProgramBenchmark +const GAME = SolverBenchmarks.TrajectoryGameBenchmark +const TOL = 1e-4 +const RESULTS = joinpath(REPO_ROOT, "benchmark", "results") +const CSV = joinpath(RESULTS, "experiments.csv") +mkpath(RESULTS) + +# Warm-start knob: cold-start everywhere by default (WARMSTART=0) for clean, apples-to- +# apples comparisons; set WARMSTART=1 to capture a warm-started reference. Only affects +# the batched solve, and only for benchmark types with a `generate_initial_guess` override +# (the trajectory game). The QP has no initial guess, so it is cold regardless. +const USE_IG = get(ENV, "WARMSTART", "0") == "1" + +const HEADER = "experiment,problem,num_primals,num_inequalities,horizon,num_samples,nthreads,solver,device,warm_start,total_time_s,num_solved,tol" + +function ensure_header() + if !isfile(CSV) || filesize(CSV) == 0 + open(CSV, "w") do io + println(io, HEADER) + end + end +end + +# Append one row. `r` is a benchmark_throughput sub-result (; total_time, num_solved) or +# `nothing` (skipped solver → no row written). `warm` records whether THIS solver/device +# actually used the initial guess (only the batched solve can; PATH/seq-IP are always cold). +function append_row!(; experiment, problem, num_primals="", num_inequalities="", horizon="", + num_samples, nthreads, solver, device, warm, r) + isnothing(r) && return + open(CSV, "a") do io + println(io, join((experiment, problem, num_primals, num_inequalities, horizon, + num_samples, nthreads, solver, device, warm, + round(r.total_time; digits=4), r.num_solved, TOL), ",")) + end + @info " logged: $experiment/$problem/$solver/$device N=$num_samples warm=$warm t=$(round(r.total_time;digits=3))s solved=$(r.num_solved)/$num_samples" +end + +# The batched solve is warm only when USE_IG is on AND the type supplies a guess (game). +batched_warm(problem) = USE_IG && problem == "game" + +const NT = Threads.nthreads() + +# --------------------------------------------------------------------------------------- +# Stage: batched throughput (Table II) — PATH vs sequential IP vs batched-CPU, one B. +# --------------------------------------------------------------------------------------- +function stage_throughput(; qp_B=1024, game_B=1024, qp_kwargs=(; num_primals=32, num_inequalities=16), + game_kwargs=(; horizon=10)) + @info "STAGE throughput (QP B=$qp_B, game B=$game_B, $NT threads)" + for (problem, btype, B, pkw) in (("qp", QP(), qp_B, qp_kwargs), ("game", GAME(), game_B, game_kwargs)) + @info "throughput: $problem (B=$B) ..." + d = SolverBenchmarks.benchmark_throughput(btype; num_samples=B, problem_kwargs=pkw, + tol=TOL, device=KernelAbstractions.CPU(), + run_batched=true, run_sequential_ip=true, run_path=true, use_initial_guess=USE_IG) + np = get(pkw, :num_primals, ""); ni = get(pkw, :num_inequalities, ""); hz = get(pkw, :horizon, "") + common = (; experiment="throughput", problem, num_primals=np, num_inequalities=ni, + horizon=hz, num_samples=B, nthreads=NT) + append_row!(; common..., solver="path", device="na", warm=false, r=d.path) + append_row!(; common..., solver="ip_seq", device="cpu", warm=false, r=d.ip) + append_row!(; common..., solver="batched", device="cpu", warm=batched_warm(problem), r=d.batched) + end +end + +# --------------------------------------------------------------------------------------- +# Helper: build MCPs once (num_samples=1) then run a device point, reusing them. +# --------------------------------------------------------------------------------------- +function build_mcps(btype, pkw; want_path) + w = SolverBenchmarks.benchmark_throughput(btype; num_samples=1, tol=TOL, + problem_kwargs=pkw, run_sequential_ip=false, run_path=want_path, + device=KernelAbstractions.CPU(), use_initial_guess=USE_IG) + (; batched_mcp=w.batched_mcp, path_mcp=w.path_mcp) +end + +function device_point(btype, pkw, n, device, mcps; run_path, warm=USE_IG) + SolverBenchmarks.benchmark_throughput(btype; num_samples=n, tol=TOL, problem_kwargs=pkw, + device, batched_mcp=mcps.batched_mcp, path_mcp=mcps.path_mcp, + run_sequential_ip=false, run_path, use_initial_guess=warm) +end + +# --------------------------------------------------------------------------------------- +# Stage: GPU vs CPU, sweep batch size at fixed problem size (both families). +# --------------------------------------------------------------------------------------- +function stage_gpu_scaling(; qp_sweep=[64,256,1024,4096,16384], game_sweep=[64,256,1024,4096], + qp_kwargs=(; num_primals=32, num_inequalities=16), + game_kwargs=(; horizon=10), + path_max=4096, cpu_max=16384) + for (problem, btype, sweep, pkw) in (("qp", QP(), qp_sweep, qp_kwargs), + ("game", GAME(), game_sweep, game_kwargs)) + @info "STAGE gpu_scaling: $problem (building MCPs once)..." + mcps = build_mcps(btype, pkw; want_path=true) + np = get(pkw, :num_primals, ""); ni = get(pkw, :num_inequalities, ""); hz = get(pkw, :horizon, "") + for n in sweep + common = (; experiment="gpu_scaling", problem, num_primals=np, num_inequalities=ni, + horizon=hz, num_samples=n, nthreads=NT) + @info "gpu_scaling: $problem N=$n GPU ..." + dg = device_point(btype, pkw, n, CUDA.CUDABackend(), mcps; run_path=(n<=path_max)) + append_row!(; common..., solver="batched", device="gpu", warm=batched_warm(problem), r=dg.batched) + append_row!(; common..., solver="path", device="na", warm=false, r=dg.path) + if n <= cpu_max + @info "gpu_scaling: $problem N=$n CPU ($NT threads) ..." + dc = device_point(btype, pkw, n, KernelAbstractions.CPU(), mcps; run_path=false) + append_row!(; common..., solver="batched", device="cpu", warm=batched_warm(problem), r=dc.batched) + end + GC.gc(); CUDA.reclaim() + end + mcps = nothing; GC.gc(); CUDA.reclaim() + end +end + +# --------------------------------------------------------------------------------------- +# Stage: GPU vs CPU, sweep QP problem size at fixed batch size(s). +# --------------------------------------------------------------------------------------- +function stage_problem_size(; sizes=[(;num_primals=32,num_inequalities=16), + (;num_primals=64,num_inequalities=32), + (;num_primals=128,num_inequalities=64)], + samples=[1024,4096]) + for pkw in sizes + @info "STAGE problem_size: $pkw (building MCP once)..." + mcps = build_mcps(QP(), pkw; want_path=false) + for n in samples + common = (; experiment="problem_size", problem="qp", + num_primals=pkw.num_primals, num_inequalities=pkw.num_inequalities, + horizon="", num_samples=n, nthreads=NT) + @info "problem_size: $pkw N=$n GPU ..." + dg = device_point(QP(), pkw, n, CUDA.CUDABackend(), mcps; run_path=false) + append_row!(; common..., solver="batched", device="gpu", warm=false, r=dg.batched) + @info "problem_size: $pkw N=$n CPU ..." + dc = device_point(QP(), pkw, n, KernelAbstractions.CPU(), mcps; run_path=false) + append_row!(; common..., solver="batched", device="cpu", warm=false, r=dc.batched) + GC.gc(); CUDA.reclaim() + end + mcps = nothing; GC.gc(); CUDA.reclaim() + end +end + +# --------------------------------------------------------------------------------------- +# Stage: GPU vs CPU, sweep trajectory-game horizon at fixed batch size (the crossover). +# --------------------------------------------------------------------------------------- +# Horizon sweep: for each horizon, build the (compile-heavy) MCP ONCE and solve it under +# both cold and warm start on both devices, so we get the cold (fair) and warm (realistic +# receding-horizon) crossover from a single compile per horizon. +function stage_horizon(; horizons=[10,20,30,40,50], N=1024) + for hz in horizons + pkw = (; horizon=hz) + @info "STAGE horizon: T=$hz (building MCP once — compile grows with horizon)..." + mcps = build_mcps(GAME(), pkw; want_path=false) + common = (; experiment="horizon", problem="game", num_primals="", num_inequalities="", + horizon=hz, num_samples=N, nthreads=NT) + for warm in (false, true) + @info "horizon: T=$hz N=$N warm=$warm GPU ..." + dg = device_point(GAME(), pkw, N, CUDA.CUDABackend(), mcps; run_path=false, warm) + append_row!(; common..., solver="batched", device="gpu", warm, r=dg.batched) + @info "horizon: T=$hz N=$N warm=$warm CPU ..." + dc = device_point(GAME(), pkw, N, KernelAbstractions.CPU(), mcps; run_path=false, warm) + append_row!(; common..., solver="batched", device="cpu", warm, r=dc.batched) + GC.gc(); CUDA.reclaim() + end + mcps = nothing; GC.gc(); CUDA.reclaim() + end +end + +# --------------------------------------------------------------------------------------- +ensure_header() +CUDA.functional() || error("CUDA not functional") +stage = get(ENV, "STAGE", "throughput") +@info "=== running stage=$stage, threads=$NT, CSV=$CSV ===" +stage == "throughput" && stage_throughput() +stage == "gpu_scaling" && stage_gpu_scaling() +stage == "problem_size" && stage_problem_size() +stage == "horizon" && stage_horizon() +if stage == "all" + stage_throughput(); stage_gpu_scaling(); stage_problem_size(); stage_horizon() +end +@info "=== STAGE $stage DONE ===" diff --git a/benchmark/results/scripts/table1_klu.jl b/benchmark/results/scripts/table1_klu.jl new file mode 100644 index 0000000..4c9b44a --- /dev/null +++ b/benchmark/results/scripts/table1_klu.jl @@ -0,0 +1,59 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +# Table I (single-instance): reliability + per-solve time for PATH vs unbatched IP with +# UMFPACK (current default) vs KLU (candidate). Per-instance times → per_instance_table1.csv. +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +using MixedComplementarityProblems: MixedComplementarityProblems; const M = MixedComplementarityProblems +using ParametricMCPs: ParametricMCPs +using PATHSolver: PATHSolver +using KernelAbstractions: KernelAbstractions +using Statistics: mean, median, std +import Random + +const RESULTS = joinpath(REPO, "benchmark", "results") +const CSV = joinpath(RESULTS, "per_instance_table1.csv") +const TOL = 1e-4 +const UMF = M.UMFPACKFactorization() +const KLU = M.KLUFactorization() +const QP = MCP.QuadraticProgramBenchmark; const GAME = MCP.TrajectoryGameBenchmark +open(io->println(io,"problem,size,solver,instance,time_s,solved,tol"), CSV, "w") +row(a...) = open(io->println(io, join(a, ",")), CSV, "a") + +# Build MCPs + θ's at top level (world-age safety for runtime-eval'd evaluators). +N = 1024 +configs = (("qp", QP(), (;num_primals=32,num_inequalities=16), "p32i16"), + ("game", GAME(), (;horizon=10), "T10")) +built = map(configs) do (problem, btype, pkw, sz) + w = MCP.benchmark_throughput(btype; num_samples=1, tol=TOL, problem_kwargs=pkw, device=KernelAbstractions.CPU()) + rng = Random.MersenneTwister(1) + θs = [MCP.generate_random_parameter(btype; rng, pkw...) for _ in 1:N] + (; problem, sz, mcp=w.batched_mcp, path_mcp=w.path_mcp, θs) +end + +ip(mcp, θ, alg) = M.solve(M.InteriorPoint(), mcp, θ; tol=TOL, regularize_linear_solve=:identity, linear_solve_algorithm=alg) + +for b in built + @info "table1: $(b.problem) ..." + # warmups + ParametricMCPs.solve(b.path_mcp, b.θs[1]; convergence_tolerance=TOL, warn_on_convergence_failure=false) + ip(b.mcp, b.θs[1], UMF); ip(b.mcp, b.θs[1], KLU) + for (i,θ) in enumerate(b.θs) + tp = @elapsed sp = ParametricMCPs.solve(b.path_mcp, θ; convergence_tolerance=TOL, warn_on_convergence_failure=false) + row(b.problem, b.sz, "path", i, round(tp;digits=6), sp.status==PATHSolver.MCP_Solved, TOL) + tu = @elapsed su = ip(b.mcp, θ, UMF) + row(b.problem, b.sz, "ip_umfpack", i, round(tu;digits=6), su.status==:solved, TOL) + tk = @elapsed sk = ip(b.mcp, θ, KLU) + row(b.problem, b.sz, "ip_klu", i, round(tk;digits=6), sk.status==:solved, TOL) + end +end + +# Summary +using DelimitedFiles +println("\n=== Table I summary (N=$N per problem) ===") +data = readdlm(CSV, ','; skipstart=1) +for problem in ("qp","game"), solver in ("path","ip_umfpack","ip_klu") + mask = (data[:,1].==problem) .& (data[:,3].==solver) + ts = Float64.(data[mask,5]); solved = sum(data[mask,6].==true) + println(" $(rpad(problem,5)) $(rpad(solver,11)): solved=$solved/$(length(ts)) mean=$(round(1000mean(ts);digits=3))ms median=$(round(1000median(ts);digits=3))ms std=$(round(1000std(ts);digits=3))ms") +end +println("=== TABLE1 DONE ===") diff --git a/benchmark/results/scripts/thread_scaling_run.jl b/benchmark/results/scripts/thread_scaling_run.jl new file mode 100644 index 0000000..47c2b5b --- /dev/null +++ b/benchmark/results/scripts/thread_scaling_run.jl @@ -0,0 +1,18 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +include(joinpath(REPO, "benchmark", "thread_scaling_benchmark.jl")) +const OUT = joinpath(REPO, "benchmark", "results", "thread_scaling.csv") +open(io->println(io,"problem,nthreads,total_time_s,num_solved,num_samples,throughput_per_s,tol"), OUT, "w") +row(a...) = open(io->println(io, join(a, ",")), OUT, "a") + +for (problem, btype, ns, pk) in (("qp", :qp, 1024, nothing), + ("game", :trajectory_game, 1024, (; horizon=10))) + @info "thread scaling: $problem ..." + data = isnothing(pk) ? thread_scaling_benchmark(btype; num_samples=ns) : + thread_scaling_benchmark(btype; num_samples=ns, problem_kwargs=pk) + for e in data.batched_by_threads + thr = e.num_samples / e.batched.total_time + row(problem, e.nthreads, round(e.batched.total_time;digits=4), e.batched.num_solved, e.num_samples, round(thr;digits=1), e.tol) + @info " $problem t=$(e.nthreads): $(round(e.batched.total_time;digits=3))s $(round(thr;digits=1)) prob/s solved $(e.batched.num_solved)/$(e.num_samples)" + end +end +println("=== THREAD_SCALING DONE ===") diff --git a/benchmark/results/scripts/throughput_klu.jl b/benchmark/results/scripts/throughput_klu.jl new file mode 100644 index 0000000..4e8465b --- /dev/null +++ b/benchmark/results/scripts/throughput_klu.jl @@ -0,0 +1,27 @@ +const REPO = get(ENV, "REPO_ROOT", normpath(joinpath(@__DIR__, "..", "..", ".."))) +# Clean Table 2 with the KLU default now active: whole-loop timing of PATH, sequential IP +# (KLU), and batched CPU, for QP + game at B=1024 (cold; game also warm). +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks; const MCP = SolverBenchmarks +const OUT = joinpath(REPO, "benchmark", "results", "throughput_klu.csv") +open(io->println(io,"problem,solver,warm_start,total_time_s,num_solved,num_samples,tol"), OUT, "w") +row(a...) = open(io->println(io, join(a, ",")), OUT, "a") +B=1024 +for (problem, btype, pkw) in (("qp", MCP.QuadraticProgramBenchmark(), (;num_primals=32,num_inequalities=16)), + ("game", MCP.TrajectoryGameBenchmark(), (;horizon=10))) + # cold: PATH + sequential IP (now KLU default) + batched CPU + d = MCP.benchmark_throughput(btype; num_samples=B, problem_kwargs=pkw, tol=1e-4, + run_batched=true, run_sequential_ip=true, run_path=true, use_initial_guess=false) + row(problem,"path",false,round(d.path.total_time;digits=4),d.path.num_solved,B,1e-4) + row(problem,"ip_klu",false,round(d.ip.total_time;digits=4),d.ip.num_solved,B,1e-4) + row(problem,"batched_cpu",false,round(d.batched.total_time;digits=4),d.batched.num_solved,B,1e-4) + @info "$problem cold: PATH=$(d.path.total_time)s IP-KLU=$(d.ip.total_time)s batched=$(d.batched.total_time)s" + if problem == "game" # warm batched (realistic) + dw = MCP.benchmark_throughput(btype; num_samples=B, problem_kwargs=pkw, tol=1e-4, + run_batched=true, run_sequential_ip=false, run_path=false, use_initial_guess=true, + batched_mcp=d.batched_mcp) + row(problem,"batched_cpu",true,round(dw.batched.total_time;digits=4),dw.batched.num_solved,B,1e-4) + @info "$problem warm batched=$(dw.batched.total_time)s" + end +end +println("=== THROUGHPUT_KLU DONE ===") diff --git a/benchmark/results/scripts/verify_paper_numbers.jl b/benchmark/results/scripts/verify_paper_numbers.jl new file mode 100644 index 0000000..ae72ab7 --- /dev/null +++ b/benchmark/results/scripts/verify_paper_numbers.jl @@ -0,0 +1,293 @@ +# Recomputes every specific number cited in the Experiments section of +# docs/paper/main.tex directly from the raw files in benchmark/results/, and diffs +# each against the value currently asserted in the paper (hardcoded below as +# `claimed=`). Dependency-free (stdlib only) since benchmark/Project.toml carries no +# CSV/DataFrames dependency and these files are plain comma-joined rows (no +# quoting/escaping), matching how the generating scripts wrote them. +# +# Usage: julia benchmark/results/scripts/verify_paper_numbers.jl +# +# NOTE: the `claimed=` values are transcribed from main.tex at the time this script +# was written. If the prose/tables change, update the corresponding `claimed=` here +# too — this script does not read main.tex itself. + +using Statistics: mean, median, std +using Printf: @sprintf, @printf + +const HERE = @__DIR__ +const RESULTS = normpath(joinpath(HERE, "..")) + +# --------------------------------------------------------------------------- +# Minimal CSV reader: header row + comma-joined fields, numeric where parseable. +# --------------------------------------------------------------------------- +function readcsv(name) + lines = readlines(joinpath(RESULTS, name)) + header = [Symbol(replace(h, "/" => "_")) for h in split(lines[1], ",")] + rows = NamedTuple[] + for line in lines[2:end] + isempty(line) && continue + fields = split(line, ",") + vals = map(fields) do f + isempty(f) && return missing + v = tryparse(Float64, f) + v === nothing ? String(f) : v + end + push!(rows, NamedTuple{Tuple(header)}(Tuple(vals))) + end + rows +end + +matches(r, kw) = all(getproperty(r, k) == v for (k, v) in pairs(kw)) +filt(rows; kw...) = filter(r -> matches(r, kw), rows) +onlyrow(rows; kw...) = only(filt(rows; kw...)) + +const NCHECKS = Ref(0) +const NFAIL = Ref(0) + +function check(name, claimed, actual; rtol = 0.03) + NCHECKS[] += 1 + ok = isapprox(claimed, actual; rtol) + ok || (NFAIL[] += 1) + @printf("%-8s %-62s paper=%-10s data=%-10s\n", + ok ? "ok" : "MISMATCH", name, string(claimed), @sprintf("%.4g", actual)) + ok +end + +function checkeq(name, claimed, actual) + NCHECKS[] += 1 + ok = claimed == actual + ok || (NFAIL[] += 1) + @printf("%-8s %-62s paper=%-10s data=%-10s\n", + ok ? "ok" : "MISMATCH", name, string(claimed), string(actual)) + ok +end + +section(title) = println("\n== ", title, " ", "="^max(1, 76 - length(title))) + +# =========================================================================== +section("Table I — single-instance reliability & speed (per_instance_table1.csv)") +# =========================================================================== +t1 = readcsv("per_instance_table1.csv") + +# Every (solved, mean, std) triple in Table I's body, plus the median asserted in its +# caption (only given there for the QP row; `nothing` where the paper doesn't assert one). +const TABLE1_CLAIMS = Dict( + ("qp", "path") => (solved = 437, mean = 3.9, std = 3.6, median = 4.1), + ("qp", "ip_umfpack") => (solved = 431, mean = 17.7, std = 19.6, median = 2.5), + ("qp", "ip_klu") => (solved = 431, mean = 4.7, std = 6.3, median = 0.6), + ("game", "path") => (solved = 996, mean = 45.2, std = 22.3, median = nothing), + ("game", "ip_umfpack") => (solved = 1024, mean = 5.5, std = 4.4, median = nothing), + ("game", "ip_klu") => (solved = 1024, mean = 0.9, std = 0.5, median = nothing), +) + +stats = Dict() +for problem in ("qp", "game"), solver in ("path", "ip_umfpack", "ip_klu") + rs = filt(t1; problem, solver) + ms = 1000 .* getproperty.(rs, :time_s) + solved = count(r -> r.solved == "true", rs) + stats[(problem, solver)] = (; n = length(rs), solved, mean = mean(ms), median = median(ms), std = std(ms)) + r = stats[(problem, solver)] + @printf(" %-4s %-11s solved=%4d/%-4d mean=%7.3fms median=%7.3fms std=%7.3fms\n", + problem, solver, r.solved, r.n, r.mean, r.median, r.std) + + claim = TABLE1_CLAIMS[(problem, solver)] + checkeq("Table I $problem/$solver solved", claim.solved, r.solved) + check("Table I $problem/$solver mean ms", claim.mean, r.mean) + check("Table I $problem/$solver std ms", claim.std, r.std) + # caption medians are rounded to 1 decimal place; at ~0.6ms that's a wider relative + # band than the default rtol, so widen it here rather than loosen the default globally. + claim.median === nothing || check("Table I $problem/$solver median ms (caption)", claim.median, r.median; rtol = 0.04) +end + +qp_median_speedup = stats[("qp", "path")].median / stats[("qp", "ip_klu")].median +game_median_speedup = stats[("game", "path")].median / stats[("game", "ip_klu")].median +check("text: median speedup vs PATH, qp (~7x)", 7.0, qp_median_speedup) +check("text: median speedup vs PATH, game (~55x)", 55.0, game_median_speedup) + +qp_klu_vs_umf = stats[("qp", "ip_umfpack")].median / stats[("qp", "ip_klu")].median +game_klu_vs_umf = stats[("game", "ip_umfpack")].median / stats[("game", "ip_klu")].median +println(" KLU vs UMFPACK (median ratio): qp=$(round(qp_klu_vs_umf, digits=2))x ", + "game=$(round(game_klu_vs_umf, digits=2))x (text claims 4--6x)") + +# =========================================================================== +section("Table II — batched CPU throughput vs. PATH (throughput_klu.csv)") +# =========================================================================== +t2 = readcsv("throughput_klu.csv") +qp_path = onlyrow(t2; problem = "qp", solver = "path") +qp_seq = onlyrow(t2; problem = "qp", solver = "ip_klu") +qp_batch = onlyrow(t2; problem = "qp", solver = "batched_cpu", warm_start = "false") +game_path = onlyrow(t2; problem = "game", solver = "path") +game_seq = onlyrow(t2; problem = "game", solver = "ip_klu") +game_batch = onlyrow(t2; problem = "game", solver = "batched_cpu", warm_start = "false") + +for r in (qp_path, qp_seq, qp_batch, game_path, game_seq, game_batch) + @printf(" %-5s %-12s total=%7.4fs solved=%d/%d\n", + r.problem, r.solver, r.total_time_s, Int(r.num_solved), Int(r.num_samples)) +end + +# Every (solved, total_time_s) pair in Table II's body, for all six rows. +# PATH totals reflect commit 79f12df's matched-tolerance rerun (convergence_tolerance=1e-4, +# was PATH's stricter default 1e-6) — negligible per-instance effect, but Table II's PATH +# row/speedups were updated in main.tex to the re-timed values. +const TABLE2_CLAIMS = Dict( + "qp path" => (row = qp_path, solved = 437, total = 3.97), + "qp seq" => (row = qp_seq, solved = 431, total = 5.61), + "qp batch" => (row = qp_batch, solved = 424, total = 0.58), + "game path" => (row = game_path, solved = 996, total = 46.4), + "game seq" => (row = game_seq, solved = 1024, total = 0.97), + "game batch" => (row = game_batch, solved = 1024, total = 0.44), +) +for (label, claim) in TABLE2_CLAIMS + checkeq("Table II $label solved", claim.solved, Int(claim.row.num_solved)) + check("Table II $label total (s)", claim.total, claim.row.total_time_s) +end + +check("Table II qp speedup vs PATH (6.8x)", 6.8, qp_path.total_time_s / qp_batch.total_time_s) +check("Table II qp seq/PATH (0.7x)", 0.7, qp_path.total_time_s / qp_seq.total_time_s) +check("Table II game speedup vs PATH (105.5x)", 105.5, game_path.total_time_s / game_batch.total_time_s) +check("text: unbatched already ~48x on game", 47.8, game_path.total_time_s / game_seq.total_time_s) +check("text: threading-only speedup, qp (9.7x)", 9.7, qp_seq.total_time_s / qp_batch.total_time_s) +check("text: threading-only speedup, game (2.2x)", 2.2, game_seq.total_time_s / game_batch.total_time_s) + +# =========================================================================== +section("CPU thread scaling (thread_scaling.csv)") +# =========================================================================== +ts = readcsv("thread_scaling.csv") +for problem in ("qp", "game") + rs = sort(filt(ts; problem), by = r -> r.nthreads) + for r in rs + @printf(" %-4s threads=%2d throughput=%7.1f/s\n", problem, Int(r.nthreads), r.throughput_per_s) + end + println(" $problem peak throughput: $(maximum(r.throughput_per_s for r in rs))/s at ", + "$(rs[argmax([r.throughput_per_s for r in rs])].nthreads) threads") +end +check("qp throughput @1 thread", 371.0, onlyrow(ts; problem = "qp", nthreads = 1.0).throughput_per_s) +check("qp throughput @4 threads", 1211.0, onlyrow(ts; problem = "qp", nthreads = 4.0).throughput_per_s) +check("game throughput @1 thread", 725.0, onlyrow(ts; problem = "game", nthreads = 1.0).throughput_per_s) +check("game throughput @4 threads", 2486.0, onlyrow(ts; problem = "game", nthreads = 4.0).throughput_per_s) + +# =========================================================================== +section("GPU vs. CPU — batch-size and problem-size sweeps") +# =========================================================================== +# Statistic policy for this section: MEDIAN throughout, from per_rep.csv wherever +# repeated trials exist. As of commit 79f12df's `problem_size_raw` stage, that now +# covers: the QP batch-size sweep (gpu_scaling, p32i16, all B), the T=10 horizon point +# (both already had >=30 reps), the larger-problem-size sweep (p64i32/p128i64 @ B=1024, +# 5 reps), and the FULL horizon sweep (T=20/30/40/50 @ B=1024, cold+warm, 5 reps each). +# Only the problem-size sweep's B=4096 points (n_x=64,128) remain single-run (that stage +# only added reps at B=1024); labeled accordingly below. The old one-off +# `confirm_game_T30_median.txt` recheck is superseded by this per_rep.csv coverage (it +# used a different set of 5 runs and is no longer read here). +ex = readcsv("experiments.csv") +pr = readcsv("per_rep.csv") + +function median_reps(; kw...) + rs = filt(pr; kw...) + isempty(rs) && return nothing + (; + n = length(rs), median = median(getproperty.(rs, :total_time_s)), + solved = Int(first(rs).num_solved), total = Int(first(rs).num_samples), + ) +end + +qp_b4096_cpu_reps = median_reps(problem = "qp", size = "p32i16", solver = "batched", device = "cpu", warm_start = "false", num_samples = 4096.0) +qp_b4096_gpu_reps = median_reps(problem = "qp", size = "p32i16", solver = "batched", device = "gpu", warm_start = "false", num_samples = 4096.0) +println(" QP B=4096: median of $(qp_b4096_cpu_reps.n) CPU reps = $(round(qp_b4096_cpu_reps.median, digits=4))s, ", + "median of $(qp_b4096_gpu_reps.n) GPU reps = $(round(qp_b4096_gpu_reps.median, digits=4))s") +check("QP GPU speedup at B=4096 (1.8x, median of $(qp_b4096_cpu_reps.n) reps)", + 1.8, qp_b4096_cpu_reps.median / qp_b4096_gpu_reps.median) + +println(" problem-size sweep (n_x=64,128 @ B=1024: median of 5 reps; @ B=4096: single run)") +sizelabel = Dict(32.0 => "p32i16", 64.0 => "p64i32", 128.0 => "p128i64") +for nx in (32.0, 64.0, 128.0), B in (1024.0, 4096.0) + cpu_reps = median_reps(problem = "qp", size = sizelabel[nx], solver = "batched", device = "cpu", warm_start = "false", num_samples = B) + gpu_reps = median_reps(problem = "qp", size = sizelabel[nx], solver = "batched", device = "gpu", warm_start = "false", num_samples = B) + if !isnothing(cpu_reps) && cpu_reps.n > 1 + ratio = cpu_reps.median / gpu_reps.median + @printf(" qp n_x=%-4g B=%-5g cpu/gpu=%.2fx (median of %d reps) solved=%d/%d\n", + nx, B, ratio, cpu_reps.n, cpu_reps.solved, cpu_reps.total) + else + gpu = onlyrow(ex; experiment = "problem_size", problem = "qp", num_primals = nx, num_samples = B, device = "gpu") + cpu = onlyrow(ex; experiment = "problem_size", problem = "qp", num_primals = nx, num_samples = B, device = "cpu") + ratio = cpu.total_time_s / gpu.total_time_s + @printf(" qp n_x=%-4g B=%-5g cpu/gpu=%.2fx (single run) solved=%d/%d\n", + nx, B, ratio, Int(gpu.num_solved), Int(B)) + end +end +nx128_reps = ( + cpu = median_reps(problem = "qp", size = "p128i64", solver = "batched", device = "cpu", warm_start = "false", num_samples = 1024.0), + gpu = median_reps(problem = "qp", size = "p128i64", solver = "batched", device = "gpu", warm_start = "false", num_samples = 1024.0), +) +nx128_ratio = nx128_reps.cpu.median / nx128_reps.gpu.median +check("text: QP n_x=128 GPU speedup (roughly 3x, median of 5)", 3.0, nx128_ratio; rtol = 0.05) + +nx32 = median_reps(problem = "qp", size = "p32i16", solver = "batched", device = "cpu", warm_start = "false", num_samples = 1024.0) +nx64 = median_reps(problem = "qp", size = "p64i32", solver = "batched", device = "cpu", warm_start = "false", num_samples = 1024.0) +nx128 = median_reps(problem = "qp", size = "p128i64", solver = "batched", device = "cpu", warm_start = "false", num_samples = 1024.0) +check("text: QP solved fraction 41% (n_x=32)", 0.41, nx32.solved / 1024) +check("text: QP solved fraction 96% (n_x=64, median of 5)", 0.96, nx64.solved / 1024) +check("text: QP solved fraction 100% (n_x=128, median of 5)", 1.00, nx128.solved / 1024) + +println("\n horizon sweep (T=10: >=30 reps; T=20/30/40/50: median of 5 reps, cold+warm)") +horizons = Dict() +for T in (10.0, 20.0, 30.0, 40.0, 50.0), warm in (false, true) + sz = T == 10.0 ? "T10" : "T$(Int(T))" + cpu_reps = median_reps(problem = "game", size = sz, solver = "batched", device = "cpu", warm_start = string(warm), num_samples = 1024.0) + gpu_reps = median_reps(problem = "game", size = sz, solver = "batched", device = "gpu", warm_start = string(warm), num_samples = 1024.0) + isnothing(cpu_reps) && continue + horizons[(T, warm)] = (cpu = cpu_reps, gpu = gpu_reps) + @printf(" game T=%-3g warm=%-5s CPU=%7.4fs(n=%d) GPU=%7.4fs(n=%d) GPU/CPU=%.2fx solved=%d/%d\n", + T, warm, cpu_reps.median, cpu_reps.n, gpu_reps.median, gpu_reps.n, + gpu_reps.median / cpu_reps.median, cpu_reps.solved, cpu_reps.total) +end + +t30 = horizons[(30.0, true)] +check("text: game T=30 CPU total (4.1s, median of $(t30.cpu.n))", 4.1, t30.cpu.median) +check("text: game T=30 GPU total (8.0s, median of $(t30.gpu.n))", 8.0, t30.gpu.median) +check("text: game T=30 GPU/CPU ratio (1.9x slower)", 1.9, t30.gpu.median / t30.cpu.median) +check("text: game T=30 solved fraction ~92% (paper text; per_rep.csv gives ~93%)", 0.92, t30.cpu.solved / 1024; rtol = 0.02) + +t50 = horizons[(50.0, true)] +check("text: game T=50 CPU total (12.7s, median of $(t50.cpu.n))", 12.7, t50.cpu.median) +check("text: game T=50 GPU total (16.3s, median of $(t50.gpu.n))", 16.3, t50.gpu.median) +check("text: game T=50 solved fraction ~57% (median of 5)", 0.57, t50.cpu.solved / 1024; rtol = 0.05) + +# =========================================================================== +section("Per-call kernel crossover (percall_timing.csv)") +# =========================================================================== +pc = readcsv("percall_timing.csv") +for r in sort(pc, by = r -> (r.d, r.device)) + ratio_here = begin + other = onlyrow(pc; horizon = r.horizon, device = r.device == "CPU" ? "GPU" : "CPU") + r.device == "CPU" ? other.jacfac_ms / r.jacfac_ms : r.jacfac_ms / other.jacfac_ms + end + @printf(" T=%-3g d=%-5g %-3s jacfac=%6.2fms (GPU/CPU=%.3g)\n", r.horizon, r.d, r.device, r.jacfac_ms, ratio_here) +end +cpu2100 = onlyrow(pc; horizon = 30.0, device = "CPU") +gpu2100 = onlyrow(pc; horizon = 30.0, device = "GPU") +cpu3500 = onlyrow(pc; horizon = 50.0, device = "CPU") +gpu3500 = onlyrow(pc; horizon = 50.0, device = "GPU") +cpu4900 = onlyrow(pc; horizon = 70.0, device = "CPU") +gpu4900 = onlyrow(pc; horizon = 70.0, device = "GPU") +println(" d=2100 GPU/CPU=$(round(gpu2100.jacfac_ms/cpu2100.jacfac_ms, digits=3)) (still >1, GPU slower)") +println(" d=3500 GPU/CPU=$(round(gpu3500.jacfac_ms/cpu3500.jacfac_ms, digits=3)) (now <1, GPU faster)") +println(" => crossover lies between d=2100 and d=3500; text claims d\\approx 2500") +check("text: GPU ~1.4x cheaper per-step by d=4900", 1.4, cpu4900.jacfac_ms / gpu4900.jacfac_ms) + +# =========================================================================== +section("Active-set mechanism at d=3500 (active_fraction_T50.csv)") +# =========================================================================== +af = readcsv("active_fraction_T50.csv") +for r in sort(af, by = r -> -r.active_k) + @printf(" active_k=%4d jacfac_GPU/CPU=%.3g\n", Int(r.active_k), r.jacfac_GPU_CPU) +end +full = onlyrow(af; active_k = 1024.0) +sparse_ = onlyrow(af; active_k = 32.0) +check("text: GPU per-step advantage at full batch (1.3x)", 1.3, 1 / full.jacfac_GPU_CPU) +check("text: GPU per-step disadvantage at active=32 (8x)", 8.0, sparse_.jacfac_GPU_CPU) + +# =========================================================================== +section("Summary") +# =========================================================================== +println("$(NCHECKS[] - NFAIL[])/$(NCHECKS[]) checks passed.") +NFAIL[] > 0 && (println("$(NFAIL[]) MISMATCH(es) — see above."); exit(1)) diff --git a/benchmark/results/table1_summary.txt b/benchmark/results/table1_summary.txt new file mode 100644 index 0000000..fb67184 --- /dev/null +++ b/benchmark/results/table1_summary.txt @@ -0,0 +1,8 @@ +=== Table I summary (N=1024 per problem) === + qp path : solved=437/1024 mean=3.931ms median=4.124ms std=3.61ms + qp ip_umfpack : solved=431/1024 mean=17.697ms median=2.49ms std=19.594ms + qp ip_klu : solved=431/1024 mean=4.666ms median=0.579ms std=6.317ms + game path : solved=996/1024 mean=45.543ms median=41.848ms std=22.375ms + game ip_umfpack : solved=1024/1024 mean=5.459ms median=4.426ms std=4.426ms + game ip_klu : solved=1024/1024 mean=0.895ms median=0.752ms std=0.513ms +=== TABLE1 DONE === diff --git a/benchmark/results/thread_scaling.csv b/benchmark/results/thread_scaling.csv new file mode 100644 index 0000000..9f63a0d --- /dev/null +++ b/benchmark/results/thread_scaling.csv @@ -0,0 +1,13 @@ +problem,nthreads,total_time_s,num_solved,num_samples,throughput_per_s,tol +qp,1,2.7597,424,1024,371.0,0.0001 +qp,2,1.6235,424,1024,630.7,0.0001 +qp,4,0.8456,424,1024,1211.0,0.0001 +qp,8,0.6814,424,1024,1502.8,0.0001 +qp,16,0.7514,424,1024,1362.8,0.0001 +qp,32,0.7387,424,1024,1386.3,0.0001 +game,1,1.4129,1024,1024,724.7,0.0001 +game,2,0.7736,1024,1024,1323.7,0.0001 +game,4,0.4119,1024,1024,2485.9,0.0001 +game,8,0.4275,1024,1024,2395.3,0.0001 +game,16,0.5115,1024,1024,2002.1,0.0001 +game,32,0.3896,1024,1024,2628.5,0.0001 diff --git a/benchmark/results/throughput_klu.csv b/benchmark/results/throughput_klu.csv new file mode 100644 index 0000000..a92db70 --- /dev/null +++ b/benchmark/results/throughput_klu.csv @@ -0,0 +1,8 @@ +problem,solver,warm_start,total_time_s,num_solved,num_samples,tol +qp,ip_klu,false,5.6124,431,1024,0.0001 +qp,batched_cpu,false,0.5791,424,1024,0.0001 +game,ip_klu,false,0.9713,1024,1024,0.0001 +game,batched_cpu,false,0.44,1024,1024,0.0001 +game,batched_cpu,true,0.293,1024,1024,0.0001 +game,path,false,46.412,996,1024,0.0001 +qp,path,false,3.9661,437,1024,0.0001 diff --git a/docs/paper/.gitignore b/docs/paper/.gitignore new file mode 100644 index 0000000..5bb20a4 --- /dev/null +++ b/docs/paper/.gitignore @@ -0,0 +1,11 @@ +*.aux +*.log +*.out +*.bbl +*.blg +*.synctex.gz +*.fdb_latexmk +*.fls +missfont.log +build.log +auto/ diff --git a/docs/paper/IEEEtran.bst b/docs/paper/IEEEtran.bst new file mode 100644 index 0000000..b2c7edc --- /dev/null +++ b/docs/paper/IEEEtran.bst @@ -0,0 +1,2369 @@ +%% +%% IEEEtran.bst +%% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted) +%% Version 1.11 (2003/04/02) +%% +%% Copyright (c) 2003 Michael Shell +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% +%% +%% See: +%% http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/ +%% for latest version and current contact information. +%% +%% For use with BibTeX version 0.99a or later +%% +%% This is a numerical citation style. +%% +%%********************************************************************** +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% This code is distributed under the Perl Artistic License +%% ( http://language.perl.com/misc/Artistic.html ) +%% and may be freely used, distributed and modified - subject to the +%% constraints therein. +%% Retain all contribution notices, credits and disclaimers. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%%********************************************************************** +% +% +% Changelog: +% +% 1.00 (2002/08/13) Initial release +% +% 1.10 (2002/09/27) +% 1. Corrected minor bug for improperly formed warning message when a +% book was not given a title. Thanks to Ming Kin Lai for reporting this. +% 2. Added support for CTLname_format_string and CTLname_latex_cmd fields +% in the BST control entry type. +% +% 1.11 (2003/04/02) +% 1. Fixed bug with URLs containing underscores when using url.sty. Thanks +% to Ming Kin Lai for reporting this. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite#1{\@bsphack +% \@for\@citeb:=#1\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} { #0 } + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} { #10 } + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { #1 } + + +% The default name format control string. +FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FILE VERSION AND BANNER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{bst.file.version} { "1.11" } +FUNCTION{bst.file.date} { "2003/04/02" } +FUNCTION{bst.file.website} { "http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/" } + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- IEEEtran.bst version" " " * bst.file.version * + " (" * bst.file.date * ") " * "by Michael Shell." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {bbl.and}{ "and" } +FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.urlprefix}{ "[Online]. Available:" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sept."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% IEEE's rather unusual bibliography style. For example, IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.punct punct.comma = + { "," * } + { skip$ } + if$ + prev.status.punct punct.period = + { add.period$ } + { skip$ } + if$ + prev.status.quote quote.close = + { "''" * } + { skip$ } + if$ + prev.status.space space.normal = + { " " * } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { add.period$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ +write$ +newline$ +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word}{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% IEEE separates large numbers with more than 4 digits into groups of +% three. IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% least significant digit always determines the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairburns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@rmstyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand\BIBentrySTDinterwordspacing{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand\BIBentryALTinterwordspacing{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand\BIBforeignlanguage[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%" + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { punct.period 'prev.status.punct := + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { ", " * } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check * } + if$ + } + { month "month" bibinfo.check * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + name.format.string + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := + #1 'namesleft := + } + { skip$ } + if$ + namesleft #1 > + { ", " * t do.name.latex.cmd * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + bbl.and + space.word * t do.name.latex.cmd * + } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors}{ author "author" format.names } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ + month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { emphasize + bbl.in " " * + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + "l" change.case$ + * "~" * bbl.edition * + } + if$ + bbl.in " " * swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + select.language + "``" swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + status.cap + { "t" } + { "l" } + if$ + change.case$ + * "~" * bbl.edition * + } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ + this.to.prev.status + this.status.std + cap.status.std + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { this.to.prev.status + this.status.std + cap.status.std + tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + bbl.urlprefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + format.address.publisher.date output + format.volume output + format.number output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + format.address.publisher.date output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + format.address.publisher.date.nowarn output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/docs/paper/IEEEtran.cls b/docs/paper/IEEEtran.cls new file mode 100644 index 0000000..8d2b1c6 --- /dev/null +++ b/docs/paper/IEEEtran.cls @@ -0,0 +1,6347 @@ +%% +%% IEEEtran.cls 2015/08/26 version V1.8b +%% +%% This is the IEEEtran LaTeX class for authors of the Institute of +%% Electrical and Electronics Engineers (IEEE) Transactions journals and +%% conferences. +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and +%% http://www.ieee.org/ +%% +%% Based on the original 1993 IEEEtran.cls, but with many bug fixes +%% and enhancements (from both JVH and MDS) over the 1996/7 version. +%% +%% +%% Contributors: +%% Gerry Murray (1993), Silvano Balemi (1993), +%% Jon Dixon (1996), Peter N"uchter (1996), +%% Juergen von Hagen (2000), and Michael Shell (2001-2014) +%% +%% +%% Copyright (c) 1993-2000 by Gerry Murray, Silvano Balemi, +%% Jon Dixon, Peter N"uchter, +%% Juergen von Hagen +%% and +%% Copyright (c) 2001-2015 by Michael Shell +%% +%% Current maintainer (V1.3 to V1.8b): Michael Shell +%% See: +%% http://www.michaelshell.org/ +%% for current contact information. +%% +%% Special thanks to Peter Wilson (CUA) and Donald Arseneau +%% for allowing the inclusion of the \@ifmtarg command +%% from their ifmtarg LaTeX package. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%% +%% This work is distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%% +%% File list of work: IEEEtran.cls, IEEEtran_HOWTO.pdf, bare_adv.tex, +%% bare_conf.tex, bare_jrnl.tex, bare_conf_compsoc.tex, +%% bare_jrnl_compsoc.tex +%% +%% Major changes to the user interface should be indicated by an +%% increase in the version numbers. If a version is a beta, it will +%% be indicated with a BETA suffix, i.e., 1.4 BETA. +%% Small changes can be indicated by appending letters to the version +%% such as "IEEEtran_v14a.cls". +%% In all cases, \Providesclass, any \typeout messages to the user, +%% \IEEEtransversionmajor and \IEEEtransversionminor must reflect the +%% correct version information. +%% The changes should also be documented via source comments. +%%************************************************************************* +%% +% +% Available class options +% e.g., \documentclass[10pt,conference]{IEEEtran} +% +% *** choose only one from each category *** +% +% 9pt, 10pt, 11pt, 12pt +% Sets normal font size. The default is 10pt. +% +% conference, journal, technote, peerreview, peerreviewca +% determines format mode - conference papers, journal papers, +% correspondence papers (technotes), or peer review papers. The user +% should also select 9pt when using technote. peerreview is like +% journal mode, but provides for a single-column "cover" title page for +% anonymous peer review. The paper title (without the author names) is +% repeated at the top of the page after the cover page. For peer review +% papers, the \IEEEpeerreviewmaketitle command must be executed (will +% automatically be ignored for non-peerreview modes) at the place the +% cover page is to end, usually just after the abstract (keywords are +% not normally used with peer review papers). peerreviewca is like +% peerreview, but allows the author names to be entered and formatted +% as with conference mode so that author affiliation and contact +% information can be easily seen on the cover page. +% The default is journal. +% +% draft, draftcls, draftclsnofoot, final +% determines if paper is formatted as a widely spaced draft (for +% handwritten editor comments) or as a properly typeset final version. +% draftcls restricts draft mode to the class file while all other LaTeX +% packages (i.e., \usepackage{graphicx}) will behave as final - allows +% for a draft paper with visible figures, etc. draftclsnofoot is like +% draftcls, but does not display the date and the word "DRAFT" at the foot +% of the pages. If using one of the draft modes, the user will probably +% also want to select onecolumn. +% The default is final. +% +% letterpaper, a4paper, cspaper +% determines paper size: 8.5in X 11in, 210mm X 297mm or 7.875in X 10.75in. +% Changing the paper size in the standard journal and conference modes +% will not alter the typesetting of the document - only the margins will +% be affected. In particular, documents using the a4paper option will +% have reduced side margins (A4 is narrower than US letter) and a longer +% bottom margin (A4 is longer than US letter). For both cases, the top +% margins will be the same and the text will be horizontally centered. +% For the compsoc conference and draft modes, it is the margins that will +% remain constant, and thus the text area size will vary, with changes in +% the paper size. +% The cspaper option is the special ``trim'' paper size (7.875in x 10.75in) +% used in the actual publication of Computer Society journals. Under +% compsoc journal mode, this option does not alter the typesetting of the +% document. Authors should invoke the cspaper option only if requested to +% do so by the editors of the specific journal they are submitting to. +% For final submission to the IEEE, authors should generally use US letter +% (8.5 X 11in) paper unless otherwise instructed. Note that authors should +% ensure that all post-processing (ps, pdf, etc.) uses the same paper +% specificiation as the .tex document. Problems here are by far the number +% one reason for incorrect margins. IEEEtran will automatically set the +% default paper size under pdflatex (without requiring any change to +% pdftex.cfg), so this issue is more important to dvips users. Fix +% config.ps, config.pdf, or ~/.dvipsrc for dvips, or use the +% dvips -t papersize option instead as needed. For the cspaper option, +% the corresponding dvips paper name is "ieeecs". +% See the testflow documentation +% http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/testflow +% for more details on dvips paper size configuration. +% The default is letterpaper. +% +% oneside, twoside +% determines if layout follows single sided or two sided (duplex) +% printing. The only notable change is with the headings at the top of +% the pages. +% The default is oneside. +% +% onecolumn, twocolumn +% determines if text is organized into one or two columns per page. One +% column mode is usually used only with draft papers. +% The default is twocolumn. +% +% comsoc, compsoc, transmag +% Use the format of the IEEE Communications Society, IEEE Computer Society +% or IEEE Transactions on Magnetics, respectively. +% +% romanappendices +% Use the "Appendix I" convention when numbering appendices. IEEEtran.cls +% now defaults to Alpha "Appendix A" convention - the opposite of what +% v1.6b and earlier did. +% +% captionsoff +% disables the display of the figure/table captions. Some IEEE journals +% request that captions be removed and figures/tables be put on pages +% of their own at the end of an initial paper submission. The endfloat +% package can be used with this class option to achieve this format. +% +% nofonttune +% turns off tuning of the font interword spacing. Maybe useful to those +% not using the standard Times fonts or for those who have already "tuned" +% their fonts. +% The default is to enable IEEEtran to tune font parameters. +% +% +%---------- +% Available CLASSINPUTs provided (all are macros unless otherwise noted): +% \CLASSINPUTbaselinestretch +% \CLASSINPUTinnersidemargin +% \CLASSINPUToutersidemargin +% \CLASSINPUTtoptextmargin +% \CLASSINPUTbottomtextmargin +% +% Available CLASSINFOs provided: +% \ifCLASSINFOpdf (TeX if conditional) +% \CLASSINFOpaperwidth (macro) +% \CLASSINFOpaperheight (macro) +% \CLASSINFOnormalsizebaselineskip (length) +% \CLASSINFOnormalsizeunitybaselineskip (length) +% +% Available CLASSOPTIONs provided: +% all class option flags (TeX if conditionals) unless otherwise noted, +% e.g., \ifCLASSOPTIONcaptionsoff +% point size options provided as a single macro: +% \CLASSOPTIONpt +% which will be defined as 9, 10, 11, or 12 depending on the document's +% normalsize point size. +% also, class option peerreviewca implies the use of class option peerreview +% and classoption draft implies the use of class option draftcls + + + + + +\ProvidesClass{IEEEtran}[2015/08/26 V1.8b by Michael Shell] +\typeout{-- See the "IEEEtran_HOWTO" manual for usage information.} +\typeout{-- http://www.michaelshell.org/tex/ieeetran/} +\NeedsTeXFormat{LaTeX2e} + +% IEEEtran.cls version numbers, provided as of V1.3 +% These values serve as a way a .tex file can +% determine if the new features are provided. +% The version number of this IEEEtrans.cls can be obtained from +% these values. i.e., V1.4 +% KEEP THESE AS INTEGERS! i.e., NO {4a} or anything like that- +% (no need to enumerate "a" minor changes here) +\def\IEEEtransversionmajor{1} +\def\IEEEtransversionminor{8} + + +% hook to allow easy changeover to IEEEtran.cls/tools.sty error reporting +\def\@IEEEclspkgerror{\ClassError{IEEEtran}} + + +% These do nothing, but provide them like in article.cls +\newif\if@restonecol +\newif\if@titlepage + + +% class option conditionals +\newif\ifCLASSOPTIONonecolumn \CLASSOPTIONonecolumnfalse +\newif\ifCLASSOPTIONtwocolumn \CLASSOPTIONtwocolumntrue + +\newif\ifCLASSOPTIONoneside \CLASSOPTIONonesidetrue +\newif\ifCLASSOPTIONtwoside \CLASSOPTIONtwosidefalse + +\newif\ifCLASSOPTIONfinal \CLASSOPTIONfinaltrue +\newif\ifCLASSOPTIONdraft \CLASSOPTIONdraftfalse +\newif\ifCLASSOPTIONdraftcls \CLASSOPTIONdraftclsfalse +\newif\ifCLASSOPTIONdraftclsnofoot \CLASSOPTIONdraftclsnofootfalse + +\newif\ifCLASSOPTIONpeerreview \CLASSOPTIONpeerreviewfalse +\newif\ifCLASSOPTIONpeerreviewca \CLASSOPTIONpeerreviewcafalse + +\newif\ifCLASSOPTIONjournal \CLASSOPTIONjournaltrue +\newif\ifCLASSOPTIONconference \CLASSOPTIONconferencefalse +\newif\ifCLASSOPTIONtechnote \CLASSOPTIONtechnotefalse + +\newif\ifCLASSOPTIONnofonttune \CLASSOPTIONnofonttunefalse + +\newif\ifCLASSOPTIONcaptionsoff \CLASSOPTIONcaptionsofffalse + +\newif\ifCLASSOPTIONcomsoc \CLASSOPTIONcomsocfalse +\newif\ifCLASSOPTIONcompsoc \CLASSOPTIONcompsocfalse +\newif\ifCLASSOPTIONtransmag \CLASSOPTIONtransmagfalse + +\newif\ifCLASSOPTIONromanappendices \CLASSOPTIONromanappendicesfalse + + +% class info conditionals + +% indicates if pdf (via pdflatex) output +\newif\ifCLASSINFOpdf \CLASSINFOpdffalse + + +% V1.6b internal flag to show if using a4paper +\newif\if@IEEEusingAfourpaper \@IEEEusingAfourpaperfalse +% V1.6b internal flag to show if using cspaper +\newif\if@IEEEusingcspaper \@IEEEusingcspaperfalse + + +% IEEEtran class scratch pad registers +% dimen +\newdimen\@IEEEtrantmpdimenA +\newdimen\@IEEEtrantmpdimenB +\newdimen\@IEEEtrantmpdimenC +% count +\newcount\@IEEEtrantmpcountA +\newcount\@IEEEtrantmpcountB +\newcount\@IEEEtrantmpcountC +% token list +\newtoks\@IEEEtrantmptoksA + +% we use \CLASSOPTIONpt so that we can ID the point size (even for 9pt docs) +% as well as LaTeX's \@ptsize to retain some compatability with some +% external packages +\def\@ptsize{0} +% LaTeX does not support 9pt, so we set \@ptsize to 0 - same as that of 10pt +\DeclareOption{9pt}{\def\CLASSOPTIONpt{9}\def\@ptsize{0}} +\DeclareOption{10pt}{\def\CLASSOPTIONpt{10}\def\@ptsize{0}} +\DeclareOption{11pt}{\def\CLASSOPTIONpt{11}\def\@ptsize{1}} +\DeclareOption{12pt}{\def\CLASSOPTIONpt{12}\def\@ptsize{2}} + + + +\DeclareOption{letterpaper}{\setlength{\paperwidth}{8.5in}% + \setlength{\paperheight}{11in}% + \@IEEEusingAfourpaperfalse + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{letter}% + \def\CLASSINFOpaperwidth{8.5in}% + \def\CLASSINFOpaperheight{11in}} + + +\DeclareOption{a4paper}{\setlength{\paperwidth}{210mm}% + \setlength{\paperheight}{297mm}% + \@IEEEusingAfourpapertrue + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{a4}% + \def\CLASSINFOpaperwidth{210mm}% + \def\CLASSINFOpaperheight{297mm}} + +% special paper option for compsoc journals +\DeclareOption{cspaper}{\setlength{\paperwidth}{7.875in}% + \setlength{\paperheight}{10.75in}% + \@IEEEusingcspapertrue + \@IEEEusingAfourpaperfalse + \def\CLASSOPTIONpaper{ieeecs}% + \def\CLASSINFOpaperwidth{7.875in}% + \def\CLASSINFOpaperheight{10.75in}} + +\DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse + \CLASSOPTIONonesidetrue\CLASSOPTIONtwosidefalse} +\DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue + \CLASSOPTIONtwosidetrue\CLASSOPTIONonesidefalse} + +\DeclareOption{onecolumn}{\CLASSOPTIONonecolumntrue\CLASSOPTIONtwocolumnfalse} +\DeclareOption{twocolumn}{\CLASSOPTIONtwocolumntrue\CLASSOPTIONonecolumnfalse} + +% If the user selects draft, then this class AND any packages +% will go into draft mode. +\DeclareOption{draft}{\CLASSOPTIONdrafttrue\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftcls is for a draft mode which will not affect any packages +% used by the document. +\DeclareOption{draftcls}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftclsnofoot is like draftcls, but without the footer. +\DeclareOption{draftclsnofoot}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofoottrue} +\DeclareOption{final}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclsfalse + \CLASSOPTIONdraftclsnofootfalse} + +\DeclareOption{journal}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournaltrue\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{conference}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencetrue\CLASSOPTIONtechnotefalse} + +\DeclareOption{technote}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotetrue} + +\DeclareOption{peerreview}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{peerreviewca}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcatrue + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{nofonttune}{\CLASSOPTIONnofonttunetrue} + +\DeclareOption{captionsoff}{\CLASSOPTIONcaptionsofftrue} + +\DeclareOption{comsoc}{\CLASSOPTIONcomsoctrue\CLASSOPTIONcompsocfalse\CLASSOPTIONtransmagfalse} + +\DeclareOption{compsoc}{\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsoctrue\CLASSOPTIONtransmagfalse} + +\DeclareOption{transmag}{\CLASSOPTIONtransmagtrue\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsocfalse} + +\DeclareOption{romanappendices}{\CLASSOPTIONromanappendicestrue} + + +% default to US letter paper, 10pt, twocolumn, one sided, final, journal +\ExecuteOptions{letterpaper,10pt,twocolumn,oneside,final,journal} +% overrride these defaults per user requests +\ProcessOptions + + + +%% -- Command Argument Scanning Support Functions -- + +% Sets the category codes for punctuation to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodespunct{\catcode`\!=12 \catcode`\,=12 \catcode`\:=12 +\catcode`\;=12 \catcode`\`=12 \catcode`\'=12 \catcode`\"=12 \catcode`\.=12 +\catcode`\/=12 \catcode`\?=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12 +\catcode`\<=12 \catcode`\>=12 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12 +\catcode`\]=12 \catcode`\==12 \catcode`\|=12} +% Sets the category codes for numbers to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodesnum{\catcode`\0=12 \catcode`\1=12 \catcode`\2=12 +\catcode`\3=12 \catcode`\4=12 \catcode`\5=12 \catcode`\6=12 \catcode`\7=12 +\catcode`\8=12 \catcode`\9=12} +% combined action of \IEEEnormalcatcodespunct and \IEEEnormalcatcodesnum +\def\IEEEnormalcatcodes{\IEEEnormalcatcodespunct\IEEEnormalcatcodesnum} + + +% usage: \@IEEEextracttoken*{} +% \@IEEEextracttoken fully expands its argument (which it then stores in +% \@IEEEextracttokenarg) via \edef and then the meaning of the first +% nonbrace (but including the empty group) token found is assigned via \let +% to \@IEEEextractedtoken as well as stored in the macro +% \@IEEEextractedtokenmacro. Tokens that would otherwise be discarded during +% the acquisition of the first are stored in \@IEEEextractedtokensdiscarded, +% however their original relative brace nesting depths are not guaranteed to +% be preserved. +% If the argument is empty, or if a first nonbrace token does not exist (or +% is an empty group), \@IEEEextractedtoken will be \relax and +% \@IEEEextractedtokenmacro and \@IEEEextractedtokensdiscarded will be empty. +% +% For example: +% \@IEEEextracttoken{{{ab}{cd}}{{ef}g}} +% results in: +% +% \@IEEEextracttokenarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedtoken ==> the letter a +% \@IEEEextractedtokenmacro ==> a macro containing a +% \@IEEEextractedtokensdiscarded ==> a macro containing bcd{ef}g +% +% the *-star form, \@IEEEextracttoken*, does not expand its argument +% contents during processing. +\def\@IEEEextracttoken{\@ifstar{\let\@IEEEextracttokendef=\def\@@IEEEextracttoken}{\let\@IEEEextracttokendef=\edef\@@IEEEextracttoken}} + +\def\@@IEEEextracttoken#1{\@IEEEextracttokendef\@IEEEextracttokenarg{#1}\relax +\def\@IEEEextractedtokensdiscarded{}\relax % initialize to empty +% if the macro is unchanged after being acquired as a single undelimited argument +% with anything after it being stripped off as a delimited argument +% we know we have one token without any enclosing braces. loop until this is true. +\let\@IEEEextracttokencurgroup\@IEEEextracttokenarg +\loop + % trap case of an empty argument as this would cause a problem with + % \@@@IEEEextracttoken's first (nondelimited) argument acquisition + \ifx\@IEEEextracttokencurgroup\@empty + \def\@IEEEextractedtokenmacro{}\relax + \else + \expandafter\@@@IEEEextracttoken\@IEEEextracttokencurgroup\@IEEEgeneralsequenceDELIMITER\relax + \fi + \ifx\@IEEEextractedtokenmacro\@IEEEextracttokencurgroup + \else + \let\@IEEEextracttokencurgroup=\@IEEEextractedtokenmacro +\repeat +% we can safely do a \let= here because there should be at most one token +% the relax is needed to handle the case of no token found +\expandafter\let\expandafter\@IEEEextractedtoken\@IEEEextractedtokenmacro\relax} + +\def\@@@IEEEextracttoken#1#2\@IEEEgeneralsequenceDELIMITER{\def\@IEEEextractedtokenmacro{#1}\relax +\def\@@IEEEextractedtokensdiscarded{#2}\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter +\@IEEEextractedtokensdiscarded\expandafter\expandafter\expandafter +{\expandafter\@@IEEEextractedtokensdiscarded\@IEEEextractedtokensdiscarded}} +%% +%% -- End of Command Argument Scanning Support Functions -- + + + +% Computer Society conditional execution command +\long\def\@IEEEcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\relax#1\relax\fi\relax} +% inverse +\long\def\@IEEEnotcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\else\relax#1\relax\fi\relax} +% compsoc conference +\long\def\@IEEEcompsocconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\relax#1\relax\fi\fi\relax} +% compsoc not conference +\long\def\@IEEEcompsocnotconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\else\relax#1\relax\fi\fi\relax} + + +% comsoc verify that newtxmath, mtpro2, mt11p or mathtime has been loaded +\def\@IEEEcomsocverifymathfont{\typeout{-- Verifying Times compatible math font.}\relax + \@ifpackageloaded{newtxmath}{\typeout{-- newtxmath loaded, OK.}}{\@@IEEEcomsocverifymathfont}} +\def\@@IEEEcomsocverifymathfont{\@ifpackageloaded{mtpro2}{\typeout{-- mtpro2 loaded, OK.}}{\@@@IEEEcomsocverifymathfont}} +\def\@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mt11p}{\typeout{-- mt11p2 loaded, OK.}}{\@@@@IEEEcomsocverifymathfont}} +\def\@@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mathtime}{\typeout{-- mathtime loaded, OK.}}{\@IEEEcomsocenforcemathfont}} + +% comsoc, if a Times math font was not loaded by user, enforce it +\def\@IEEEcomsocenforcemathfont{\typeout{** Times compatible math font not found, forcing.}\relax +\IfFileExists{newtxmath.sty}{\typeout{-- Found newtxmath, loading.}\RequirePackage{newtxmath}}{\@@IEEEcomsocenforcemathfont}} +\def\@@IEEEcomsocenforcemathfont{\IfFileExists{mtpro2.sty}{\typeout{-- Found mtpro2, loading.}\RequirePackage{mtpro2}}{\@@@IEEEcomsocenforcemathfont}} +\def\@@@IEEEcomsocenforcemathfont{\IfFileExists{mt11p.sty}{\typeout{-- Found mt11p, loading.}\RequirePackage{mt11p}}{\@@@@IEEEcomsocenforcemathfont}} +\def\@@@@IEEEcomsocenforcemathfont{\IfFileExists{mathtime.sty}{\typeout{-- Found mathtime, loading.}\RequirePackage{mathtime}}{\@@@@@IEEEcomsocenforcemathfont}} +% if no acceptable Times math font package found, error with newtxmath requirement +\def\@@@@@IEEEcomsocenforcemathfont{\typeout{** No Times compatible math font package found. newtxmath is required.}\RequirePackage{newtxmath}} + + +\ifCLASSOPTIONcomsoc + % ensure that if newtxmath is used, the cmintegrals option is also invoked + \PassOptionsToPackage{cmintegrals}{newtxmath} + % comsoc requires a Times like math font + % ensure this requirement is satisfied at document start + \AtBeginDocument{\@IEEEcomsocverifymathfont} +\fi + + + +% The IEEE uses Times Roman font, so we'll default to Times. +% These three commands make up the entire times.sty package. +\renewcommand{\sfdefault}{phv} +\renewcommand{\rmdefault}{ptm} +\renewcommand{\ttdefault}{pcr} + +% V1.7 compsoc nonconference papers, use Palatino/Palladio as the main text font, +% not Times Roman. +\@IEEEcompsocnotconfonly{\renewcommand{\rmdefault}{ppl}} + +% enable the selected main text font +\normalfont\selectfont + + +\ifCLASSOPTIONcomsoc + \typeout{-- Using IEEE Communications Society mode.} +\fi + +\ifCLASSOPTIONcompsoc + \typeout{-- Using IEEE Computer Society mode.} +\fi + + +% V1.7 conference notice message hook +\def\@IEEEconsolenoticeconference{\typeout{}% +\typeout{** Conference Paper **}% +\typeout{Before submitting the final camera ready copy, remember to:}% +\typeout{}% +\typeout{ 1. Manually equalize the lengths of two columns on the last page}% +\typeout{ of your paper;}% +\typeout{}% +\typeout{ 2. Ensure that any PostScript and/or PDF output post-processing}% +\typeout{ uses only Type 1 fonts and that every step in the generation}% +\typeout{ process uses the appropriate paper size.}% +\typeout{}} + + +% we can send console reminder messages to the user here +\AtEndDocument{\ifCLASSOPTIONconference\@IEEEconsolenoticeconference\fi} + + +% warn about the use of single column other than for draft mode +\ifCLASSOPTIONtwocolumn\else% + \ifCLASSOPTIONdraftcls\else% + \typeout{** ATTENTION: Single column mode is not typically used with IEEE publications.}% + \fi% +\fi + + +% V1.7 improved paper size setting code. +% Set pdfpage and dvips paper sizes. Conditional tests are similar to that +% of ifpdf.sty. Retain within {} to ensure tested macros are never altered, +% even if only effect is to set them to \relax. +% if \pdfoutput is undefined or equal to relax, output a dvips special +{\@ifundefined{pdfoutput}{\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}}{% +% pdfoutput is defined and not equal to \relax +% check for pdfpageheight existence just in case someone sets pdfoutput +% under non-pdflatex. If exists, set them regardless of value of \pdfoutput. +\@ifundefined{pdfpageheight}{\relax}{\global\pdfpagewidth\paperwidth +\global\pdfpageheight\paperheight}% +% if using \pdfoutput=0 under pdflatex, send dvips papersize special +\ifcase\pdfoutput +\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}% +\else +% we are using pdf output, set CLASSINFOpdf flag +\global\CLASSINFOpdftrue +\fi}} + +% let the user know the selected papersize +\typeout{-- Using \CLASSINFOpaperwidth\space x \CLASSINFOpaperheight\space +(\CLASSOPTIONpaper)\space paper.} + +\ifCLASSINFOpdf +\typeout{-- Using PDF output.} +\else +\typeout{-- Using DVI output.} +\fi + + +% The idea hinted here is for LaTeX to generate markleft{} and markright{} +% automatically for you after you enter \author{}, \journal{}, +% \journaldate{}, journalvol{}, \journalnum{}, etc. +% However, there may be some backward compatibility issues here as +% well as some special applications for IEEEtran.cls and special issues +% that may require the flexible \markleft{}, \markright{} and/or \markboth{}. +% We'll leave this as an open future suggestion. +%\newcommand{\journal}[1]{\def\@journal{#1}} +%\def\@journal{} + + + +% pointsize values +% used with ifx to determine the document's normal size +\def\@IEEEptsizenine{9} +\def\@IEEEptsizeten{10} +\def\@IEEEptsizeeleven{11} +\def\@IEEEptsizetwelve{12} + + + +% FONT DEFINITIONS (No sizexx.clo file needed) +% V1.6 revised font sizes, displayskip values and +% revised normalsize baselineskip to reduce underfull vbox problems +% on the 58pc = 696pt = 9.5in text height we want +% normalsize #lines/column baselineskip (aka leading) +% 9pt 63 11.0476pt (truncated down) +% 10pt 58 12pt (exact) +% 11pt 52 13.3846pt (truncated down) +% 12pt 50 13.92pt (exact) +% + +% we need to store the nominal baselineskip for the given font size +% in case baselinestretch ever changes. +% this is a dimen, so it will not hold stretch or shrink +\newdimen\@IEEEnormalsizeunitybaselineskip +\@IEEEnormalsizeunitybaselineskip\baselineskip + + + +%% ******* WARNING! ******* +%% +%% Authors should not alter font sizes, baselineskip ("leading"), +%% margins or other spacing values in an attempt to squeeze more +%% material on each page. +%% +%% The IEEE's own typesetting software will restore the correct +%% values when re-typesetting/proofing the submitted document, +%% possibly resulting in unexpected article over length charges. +%% +%% ******* WARNING! ******* + + +% 9pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\typeout{-- This is a 9 point document.} +\def\normalsize{\@setfontsize{\normalsize}{9}{11.0476pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.0476pt} +\normalsize +\abovedisplayskip 1.5ex plus 3pt minus 1pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 3pt +\belowdisplayshortskip 1.5ex plus 3pt minus 1pt +\def\small{\@setfontsize{\small}{8.5}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is the same as large - 10pt +\def\sublargesize{\@setfontsize{\sublargesize}{10}{12pt}} +\def\large{\@setfontsize{\large}{10}{12pt}} +\def\Large{\@setfontsize{\Large}{12}{14pt}} +\def\LARGE{\@setfontsize{\LARGE}{14}{17pt}} +\def\huge{\@setfontsize{\huge}{17}{20pt}} +\def\Huge{\@setfontsize{\Huge}{20}{24pt}} +\fi +% +% 10pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\typeout{-- This is a 10 point document.} +\def\normalsize{\@setfontsize{\normalsize}{10}{12.00pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12pt} +\normalsize +\abovedisplayskip 1.5ex plus 4pt minus 2pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4pt +\belowdisplayshortskip 1.5ex plus 4pt minus 2pt +\def\small{\@setfontsize{\small}{9}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is a tad smaller than large - 11pt +\def\sublargesize{\@setfontsize{\sublargesize}{11}{13.4pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 11pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\typeout{-- This is an 11 point document.} +\def\normalsize{\@setfontsize{\normalsize}{11}{13.3846pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.3846pt} +\normalsize +\abovedisplayskip 1.5ex plus 5pt minus 3pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5pt +\belowdisplayshortskip 1.5ex plus 5pt minus 3pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 12pt +\def\sublargesize{\@setfontsize{\sublargesize}{12}{14pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 12pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\typeout{-- This is a 12 point document.} +\def\normalsize{\@setfontsize{\normalsize}{12}{13.92pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.92pt} +\normalsize +\abovedisplayskip 1.5ex plus 6pt minus 4pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6pt +\belowdisplayshortskip 1.5ex plus 6pt minus 4pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 14pt +\def\sublargesize{\@setfontsize{\sublargesize}{14}{17pt}} +\def\large{\@setfontsize{\large}{14}{17pt}} +\def\Large{\@setfontsize{\Large}{17}{20pt}} +\def\LARGE{\@setfontsize{\LARGE}{20}{24pt}} +\def\huge{\@setfontsize{\huge}{22}{26pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi + + + +% V1.8a compsoc font sizes +% compsoc font sizes use bp "Postscript" point units (1/72in) +% rather than the traditional pt (1/72.27) +\ifCLASSOPTIONcompsoc +% -- compsoc defaults -- +% ** will override some of these values later ** +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{11bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\def\small{\@setfontsize{\small}{8.5bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is the same as large - 10bp +\def\sublargesize{\@setfontsize{\sublargesize}{10bp}{12bp}} +\def\large{\@setfontsize{\large}{10bp}{12bp}} +\def\Large{\@setfontsize{\Large}{12bp}{14bp}} +\def\LARGE{\@setfontsize{\LARGE}{14bp}{17bp}} +\def\huge{\@setfontsize{\huge}{17bp}{20bp}} +\def\Huge{\@setfontsize{\Huge}{20bp}{24bp}} +\fi +% +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{12bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\def\small{\@setfontsize{\small}{9bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is a tad smaller than large - 11bp +\def\sublargesize{\@setfontsize{\sublargesize}{11bp}{13.5bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.5bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.5bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 12bp +\def\sublargesize{\@setfontsize{\sublargesize}{12bp}{14bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14bp}}% +\setlength{\@IEEEnormalsizeunitybaselineskip}{14bp}% +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 14bp +\def\sublargesize{\@setfontsize{\sublargesize}{14bp}{17bp}} +\def\large{\@setfontsize{\large}{14bp}{17bp}} +\def\Large{\@setfontsize{\Large}{17bp}{20bp}} +\def\LARGE{\@setfontsize{\LARGE}{20bp}{24bp}} +\def\huge{\@setfontsize{\huge}{22bp}{26bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% -- override defaults: compsoc journals use special normalsizes -- +\ifCLASSOPTIONconference +% +% compsoc conferences +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{11.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +% +% compsoc nonconferences +\else +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +% the official spec is 9.5bp with 11.4bp leading for 10pt, +% but measurements of proofs suggest upto 11.723bp leading +% here we'll use 11.54bp which gives 61 lines per column +% with the standard compsoc margins +\def\normalsize{\@setfontsize{\normalsize}{9.5bp}{11.54bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.54bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +\fi\fi + + + + +% V1.6 The Computer Modern Fonts will issue a substitution warning for +% 24pt titles (24.88pt is used instead, but the default and correct +% Times font will scale exactly as needed) increase the substitution +% tolerance to turn off this warning. +% +% V1.8a, the compsoc bp font sizes can also cause bogus font substitution +% warnings with footnote or scriptsize math and the $\bullet$ itemized +% list of \IEEEcompsocitemizethanks. So, increase this to 1.5pt or more. +\def\fontsubfuzz{1.7bp} + + +% warn the user in case they forget to use the 9pt option with +% technote +\ifCLASSOPTIONtechnote% + \ifx\CLASSOPTIONpt\@IEEEptsizenine\else% + \typeout{** ATTENTION: Technotes are normally 9pt documents.}% + \fi% +\fi + + +% V1.7 +% Improved \textunderscore to provide a much better fake _ when used with +% OT1 encoding. Under OT1, detect use of pcr or cmtt \ttfamily and use +% available true _ glyph for those two typewriter fonts. +\def\@IEEEstringptm{ptm} % Times Roman family +\def\@IEEEstringppl{ppl} % Palatino Roman family +\def\@IEEEstringphv{phv} % Helvetica Sans Serif family +\def\@IEEEstringpcr{pcr} % Courier typewriter family +\def\@IEEEstringcmtt{cmtt} % Computer Modern typewriter family +\DeclareTextCommandDefault{\textunderscore}{\leavevmode +\ifx\f@family\@IEEEstringpcr\string_\else +\ifx\f@family\@IEEEstringcmtt\string_\else +\ifx\f@family\@IEEEstringptm\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringppl\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringphv\kern -0.03em\vbox{\hrule\@width 0.62em\@height 0.52pt\kern -0.33ex}\kern -0.03em\else +\kern 0.09em\vbox{\hrule\@width 0.6em\@height 0.44pt\kern -0.63pt\kern -0.42ex}\kern 0.09em\fi\fi\fi\fi\fi\relax} + + + + +% set the default \baselinestretch +\def\baselinestretch{1} +\ifCLASSOPTIONdraftcls + \def\baselinestretch{1.5}% default baselinestretch for draft modes +\fi + + +% process CLASSINPUT baselinestretch +\ifx\CLASSINPUTbaselinestretch\@IEEEundefined +\else + \edef\baselinestretch{\CLASSINPUTbaselinestretch} % user CLASSINPUT override + \typeout{** ATTENTION: Overriding \string\baselinestretch\space to + \baselinestretch\space via \string\CLASSINPUT.} +\fi + +\small\normalsize % make \baselinestretch take affect + + + + +% store the normalsize baselineskip +\newdimen\CLASSINFOnormalsizebaselineskip +\CLASSINFOnormalsizebaselineskip=\baselineskip\relax +% and the normalsize unity (baselinestretch=1) baselineskip +% we could save a register by giving the user access to +% \@IEEEnormalsizeunitybaselineskip. However, let's protect +% its read only internal status +\newdimen\CLASSINFOnormalsizeunitybaselineskip +\CLASSINFOnormalsizeunitybaselineskip=\@IEEEnormalsizeunitybaselineskip\relax +% store the nominal value of jot +\newdimen\IEEEnormaljot +\IEEEnormaljot=0.25\baselineskip\relax + +% set \jot +\jot=\IEEEnormaljot\relax + + + + +% V1.6, we are now going to fine tune the interword spacing +% The default interword glue for Times under TeX appears to use a +% nominal interword spacing of 25% (relative to the font size, i.e., 1em) +% a maximum of 40% and a minimum of 19%. +% For example, 10pt text uses an interword glue of: +% +% 2.5pt plus 1.49998pt minus 0.59998pt +% +% However, the IEEE allows for a more generous range which reduces the need +% for hyphenation, especially for two column text. Furthermore, the IEEE +% tends to use a little bit more nominal space between the words. +% The IEEE's interword spacing percentages appear to be: +% 35% nominal +% 23% minimum +% 50% maximum +% (They may even be using a tad more for the largest fonts such as 24pt.) +% +% for bold text, the IEEE increases the spacing a little more: +% 37.5% nominal +% 23% minimum +% 55% maximum + +% here are the interword spacing ratios we'll use +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.35} +\def\@IEEEinterspaceMINratioM{0.23} +\def\@IEEEinterspaceMAXratioM{0.50} + +% for bold +\def\@IEEEinterspaceratioB{0.375} +\def\@IEEEinterspaceMINratioB{0.23} +\def\@IEEEinterspaceMAXratioB{0.55} + + +% compsoc nonconference papers use Palatino, +% tweak settings to better match the proofs +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference\else +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.28} +\def\@IEEEinterspaceMINratioM{0.21} +\def\@IEEEinterspaceMAXratioM{0.47} +% for bold +\def\@IEEEinterspaceratioB{0.305} +\def\@IEEEinterspaceMINratioB{0.21} +\def\@IEEEinterspaceMAXratioB{0.52} +\fi\fi + + +% command to revise the interword spacing for the current font under TeX: +% \fontdimen2 = nominal interword space +% \fontdimen3 = interword stretch +% \fontdimen4 = interword shrink +% since all changes to the \fontdimen are global, we can enclose these commands +% in braces to confine any font attribute or length changes +\def\@@@IEEEsetfontdimens#1#2#3{{% +\setlength{\@IEEEtrantmpdimenB}{\f@size pt}% grab the font size in pt, could use 1em instead. +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\fontdimen2\font=\@IEEEtrantmpdimenA\relax +\addtolength{\@IEEEtrantmpdimenA}{-#2\@IEEEtrantmpdimenB}% +\fontdimen3\font=-\@IEEEtrantmpdimenA\relax +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\addtolength{\@IEEEtrantmpdimenA}{-#3\@IEEEtrantmpdimenB}% +\fontdimen4\font=\@IEEEtrantmpdimenA\relax}} + +% revise the interword spacing for each font weight +\def\@@IEEEsetfontdimens{{% +\mdseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioM}{\@IEEEinterspaceMAXratioM}{\@IEEEinterspaceMINratioM}% +\bfseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioB}{\@IEEEinterspaceMAXratioB}{\@IEEEinterspaceMINratioB}% +}} + +% revise the interword spacing for each font shape +% \slshape is not often used for IEEE work and is not altered here. The \scshape caps are +% already a tad too large in the free LaTeX fonts (as compared to what the IEEE uses) so we +% won't alter these either. +\def\@IEEEsetfontdimens{{% +\normalfont +\@@IEEEsetfontdimens +\normalfont\itshape +\@@IEEEsetfontdimens +}} + +% command to revise the interword spacing for each font size (and shape +% and weight). Only the \rmfamily is done here as \ttfamily uses a +% fixed spacing and \sffamily is not used as the main text of IEEE papers. +\def\@IEEEtunefonts{{\selectfont\rmfamily +\tiny\@IEEEsetfontdimens +\scriptsize\@IEEEsetfontdimens +\footnotesize\@IEEEsetfontdimens +\small\@IEEEsetfontdimens +\normalsize\@IEEEsetfontdimens +\sublargesize\@IEEEsetfontdimens +\large\@IEEEsetfontdimens +\LARGE\@IEEEsetfontdimens +\huge\@IEEEsetfontdimens +\Huge\@IEEEsetfontdimens}} + +% if the nofonttune class option is not given, revise the interword spacing +% now - in case IEEEtran makes any default length measurements, and make +% sure all the default fonts are loaded +\ifCLASSOPTIONnofonttune\else +\@IEEEtunefonts +\fi + +% and again at the start of the document in case the user loaded different fonts +\AtBeginDocument{\ifCLASSOPTIONnofonttune\else\@IEEEtunefonts\fi} + + + + + +% -- V1.8a page setup commands -- + +% The default sample text for calculating margins +% Note that IEEE publications use \scriptsize for headers and footers. +\def\IEEEdefaultsampletext{\normalfont\normalsize gT} +\def\IEEEdefaultheadersampletext{\normalfont\scriptsize T}% IEEE headers default to uppercase +\def\IEEEdefaultfootersampletext{\normalfont\scriptsize gT} + + + +% usage: \IEEEsettextwidth{inner margin}{outer margin} +% Sets \textwidth to allow the specified inner and outer margins +% for the current \paperwidth. +\def\IEEEsettextwidth#1#2{\@IEEEtrantmpdimenA\paperwidth +\@IEEEtrantmpdimenB#1\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\@IEEEtrantmpdimenB#2\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\textwidth\@IEEEtrantmpdimenA} + + + +% usage: \IEEEsetsidemargin{mode: i, o, c, a}{margin/offset} +% Sets \oddsidemargin and \evensidemargin to yield the specified margin +% of the given mode. +% The available modes are: +% i = inner margin +% o = outer margin +% c = centered, with the given offset +% a = adjust the margins using the given offset +% For the offsets, positive values increase the inner margin. +% \textwidth should be set properly for the given margins before calling this +% function. +\def\IEEEsetsidemargin#1#2{\@IEEEtrantmpdimenA #2\relax +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}{Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}\relax + \let\@IEEEextractedtoken=i\relax + \def\@IEEEextractedtokenmacro{i}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetsidemargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \divide\oddsidemargin by 2\relax + \advance\oddsidemargin by -1in\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken o\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \advance\oddsidemargin by -\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\else + \if\@IEEEextractedtoken i\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}% + {Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}% + \fi + \oddsidemargin\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\fi\fi\fi +% odd and even side margins both mean "inner" for single sided pages +\evensidemargin\oddsidemargin +% but are mirrors of each other when twosided is in effect +\if@twoside + \evensidemargin\paperwidth + \advance\evensidemargin by -\textwidth + \advance\evensidemargin by -\oddsidemargin + % have to compensate for both the builtin 1in LaTex offset + % and the fact we already subtracted this offset from \oddsidemargin + \advance\evensidemargin -2in\relax +\fi} + + + +% usage: \IEEEsettextheight[sample text]{top text margin}{bottom text margin} +% Sets \textheight based on the specified top margin and bottom margin. +% Takes into consideration \paperheight, \topskip, and (by default) the +% the actual height and depth of the \IEEEdefaultsampletext text. +\def\IEEEsettextheight{\@ifnextchar [{\@IEEEsettextheight}{\@IEEEsettextheight[\IEEEdefaultsampletext]}} +\def\@IEEEsettextheight[#1]#2#3{\textheight\paperheight\relax + \@IEEEtrantmpdimenA #2\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract top margin + \@IEEEtrantmpdimenA #3\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract bottom margin + \advance \textheight by \topskip% add \topskip + % subtract off everything above the top, and below the bottom, baselines + \settoheight{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA + \settodepth{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA} + + + +\newdimen\IEEEquantizedlength +\IEEEquantizedlength 0sp\relax +\newdimen\IEEEquantizedlengthdiff +\IEEEquantizedlengthdiff 0sp\relax +\def\IEEEquantizedlengthint{0} + +% usage: \IEEEquantizelength{mode: d, c, i}{base unit}{length} +% Sets the length \IEEEquantizedlength to be an integer multiple of the given +% (nonzero) base unit such that \IEEEquantizedlength approximates the given +% length. +% \IEEEquantizedlengthdiff is a length equal to the difference between the +% \IEEEquantizedlength and the given length. +% \IEEEquantizedlengthint is a macro containing the integer number of base units +% in \IEEEquantizedlength. +% i.e., \IEEEquantizedlength = \IEEEquantizedlengthint * base unit +% The mode determines how \IEEEquantizedlength is quantized: +% d = always decrease (always round down \IEEEquantizeint) +% c = use the closest match +% i = always increase (always round up \IEEEquantizeint) +% In anycase, if the given length is already quantized, +% \IEEEquantizedlengthdiff will be set to zero. +\def\IEEEquantizelength#1#2#3{\begingroup +% work in isolation so as not to externally disturb the \@IEEEtrantmp +% variables +% load the argument values indirectly via \IEEEquantizedlengthdiff +% in case the user refers to our \@IEEEtrantmpdimenX, \IEEEquantizedlength, +% etc. in the arguments. we also will work with these as counters, +% i.e., in sp units +% A has the base unit +\IEEEquantizedlengthdiff #2\relax\relax\relax\relax +\@IEEEtrantmpcountA\IEEEquantizedlengthdiff +% B has the input length +\IEEEquantizedlengthdiff #3\relax\relax\relax\relax +\@IEEEtrantmpcountB\IEEEquantizedlengthdiff +\@IEEEtrantmpdimenA\the\@IEEEtrantmpcountA sp\relax +\@IEEEtrantmpdimenB\the\@IEEEtrantmpcountB sp\relax +% \@IEEEtrantmpcountC will have the quantized int +% \IEEEquantizedlength will have the quantized length +% \@IEEEtrantmpdimenC will have the quantized diff +% initialize them to zero as this is what will be +% exported if an error occurs +\@IEEEtrantmpcountC 0\relax +\IEEEquantizedlength 0sp\relax +\@IEEEtrantmpdimenC 0sp\relax +% extract mode +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}{Valid modes for \string\IEEEquantizelength\space are: d, c and i.}\relax + \let\@IEEEextractedtoken=d\relax + \def\@IEEEextractedtokenmacro{d}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEquantizelength\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% check for base unit is zero error +\ifnum\@IEEEtrantmpcountA=0\relax +\@IEEEclspkgerror{Base unit is zero in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + \string\IEEEquantizedlength\space and \string\IEEEquantizedlengthdiff\space are set to zero}{Division by zero is not allowed.}\relax +\else% base unit is nonzero + % \@IEEEtrantmpcountC carries the number of integer units + % in the quantized length (integer length \ base) + \@IEEEtrantmpcountC\@IEEEtrantmpcountB\relax + \divide\@IEEEtrantmpcountC by \@IEEEtrantmpcountA\relax + % \IEEEquantizedlength has the (rounded down) quantized length + % = base * int + \IEEEquantizedlength\@IEEEtrantmpdimenA\relax + \multiply\IEEEquantizedlength by \@IEEEtrantmpcountC\relax + % \@IEEEtrantmpdimenC has the difference + % = quantized length - length + \@IEEEtrantmpdimenC\IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenC by -\@IEEEtrantmpdimenB\relax + % trap special case of length being already quantized + % to avoid a roundup under i option + \ifdim\@IEEEtrantmpdimenC=0sp\relax + \else % length not is already quantized + % set dimenA to carry the upper quantized (absolute value) difference: + % quantizedlength + base - length + \advance\@IEEEtrantmpdimenA by \IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB\relax + % set dimenB to carry the lower quantized (absolute value) difference: + % length - quantizedlength + \advance\@IEEEtrantmpdimenB by -\IEEEquantizedlength\relax + % handle each mode + \if\@IEEEextractedtoken c\relax + % compare upper and lower amounts, select upper if lower > upper + \ifdim\@IEEEtrantmpdimenB>\@IEEEtrantmpdimenA\relax + % use upper + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else% <=. uselower + % no need to do anything for lower, use output values already setup + \fi + \else% not mode c + \if\@IEEEextractedtoken i\relax + % always round up under i mode + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else + \if\@IEEEextractedtoken d\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}% + {Valid modes for \string\IEEEquantizelength\space are: d, c, and i.}\relax + \fi % if d + % no need to do anything for d, use output values already setup + \fi\fi % if i, c + \fi % if length is already quantized +\fi% if base unit is zero +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +% \@IEEEtrantmpcountC has the quantized int +% \IEEEquantizedlength has the quantized length +% \@IEEEtrantmpdimenC has the quantized diff +\xdef\@IEEEquantizedlengthintmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedlengthmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\@IEEEtrantmpdimenC\relax +\xdef\@IEEEquantizedlengthdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\expandafter\IEEEquantizedlength\@IEEEquantizedlengthmacro sp\relax +\expandafter\IEEEquantizedlengthdiff\@IEEEquantizedlengthdiffmacro sp\relax +\edef\IEEEquantizedlengthint{\@IEEEquantizedlengthintmacro}\relax} + + + +\newdimen\IEEEquantizedtextheightdiff +\IEEEquantizedtextheightdiff 0sp\relax + +% usage: \IEEEquantizetextheight[base unit]{mode: d, c, i} +% Sets \textheight to be an integer multiple of the current \baselineskip +% (or the optionally specified base unit) plus the first (\topskip) line. +% \IEEEquantizedtextheightdiff is a length equal to the difference between +% the new quantized and original \textheight. +% \IEEEquantizedtextheightlpc is a macro containing the integer number of +% lines per column under the quantized \textheight. i.e., +% \textheight = \IEEEquantizedtextheightlpc * \baselineskip + \topskip +% The mode determines how \textheight is quantized: +% d = always decrease (always round down the number of lines per column) +% c = use the closest match +% i = always increase (always round up the number of lines per column) +% In anycase, if \textheight is already quantized, it will remain unchanged, +% and \IEEEquantizedtextheightdiff will be set to zero. +% Depends on: \IEEEquantizelength +\def\IEEEquantizetextheight{\@ifnextchar [{\@IEEEquantizetextheight}{\@IEEEquantizetextheight[\baselineskip]}} +\def\@IEEEquantizetextheight[#1]#2{\begingroup +% use our \IEEEquantizedtextheightdiff as a scratch pad +% we need to subtract off \topskip before quantization +\IEEEquantizedtextheightdiff\textheight +\advance\IEEEquantizedtextheightdiff by -\topskip\relax +\IEEEquantizelength{#2}{#1}{\IEEEquantizedtextheightdiff} +% add back \topskip line +\advance\IEEEquantizedlength by \topskip +\@IEEEtrantmpcountC\IEEEquantizedlengthint\relax +\advance\@IEEEtrantmpcountC by 1\relax +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +\xdef\@IEEEquantizedtextheightlpcmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedtextheightmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlengthdiff\relax +\xdef\@IEEEquantizedtextheightdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\textheight\@IEEEquantizedtextheightmacro sp\relax +\IEEEquantizedtextheightdiff\@IEEEquantizedtextheightdiffmacro sp\relax +\edef\IEEEquantizedtextheightlpc{\@IEEEquantizedtextheightlpcmacro}} + + + +% usage: \IEEEsettopmargin[sample text]{mode: t, b, c, a, q}{margin/offset} +% Sets \topmargin based on the specified vertical margin. +% Takes into consideration the base 1in offset, \headheight, \headsep, +% \topskip, and (by default) the the actual height (or, for the bottom, depth) +% of the \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin +% b = bottom margin +% c = vertically centered, with the given offset +% a = adjust the vertical margins using the given offset +% q = adjust the margins using \IEEEquantizedtextheightdiff and the given offset +% For the offsets, positive values increase the top margin. +% \headheight, \headsep, \topskip and \textheight should be set properly for the +% given margins before calling this function. +\def\IEEEsettopmargin{\@ifnextchar [{\@IEEEsettopmargin}{\@IEEEsettopmargin[\IEEEdefaultsampletext]}} +\def\@IEEEsettopmargin[#1]#2#3{\@IEEEtrantmpdimenA #3\relax +\@IEEEextracttoken{#2}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsettopmargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken q\relax + % we need to adjust by half the \IEEEquantizedtextheightdiff value + \@IEEEtrantmpdimenB\IEEEquantizedtextheightdiff\relax + \divide\@IEEEtrantmpdimenB by 2\relax + % a positive \IEEEquantizedtextheightdiff means we need to reduce \topmargin + % because \textheight has been lenghtened + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \divide\topmargin by 2\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken b\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by -\@IEEEtrantmpdimenA\relax +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \fi + \topmargin\@IEEEtrantmpdimenA\relax + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by \@IEEEtrantmpdimenB\relax +\fi\fi % if t, b, c +% convert desired top margin into actual \topmargin +% this is not done for the q or a modes because they are only adjustments +\advance \topmargin by -\topskip +\advance \topmargin by -1in +\advance \topmargin by -\headheight +\advance \topmargin by -\headsep +\fi\fi % if q, a +} + + + +% usage: \IEEEsetheadermargin[header sample][text sample]{mode: t, b, c, a}{margin/offset} +% Differentially adjusts \topmargin and \headsep (such that their sum is unchanged) +% based on the specified header margin. +% Takes into consideration the base 1in offset, \headheight, \topskip, and (by default) +% the actual height (or depth) of the \IEEEdefaultheadersampletext and +% \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the header text to the top of the page) +% b = bottom margin (bottom of the header text to the top of the main text) +% c = vertically centered between the main text and the top of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the header downward. +% \headheight, \headsep, \topskip and \topmargin should be set properly before +% calling this function. +\def\IEEEsetheadermargin{\@ifnextchar [{\@IEEEsetheadermargin}{\@IEEEsetheadermargin[\IEEEdefaultheadersampletext]}} +\def\@IEEEsetheadermargin[#1]{\@ifnextchar [{\@@IEEEsetheadermargin[#1]}{\@@IEEEsetheadermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetheadermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetheadermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetheadermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \topmargin and \headsep will + % do all that is needed +\else +\if\@IEEEextractedtoken c\relax + % get the bottom margin + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % subtract from it the top header margin + \advance\@IEEEtrantmpdimenB -1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by -\topmargin + \advance\@IEEEtrantmpdimenB by -\headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom and top margins + % we need to adjust by half this amount to center the header + \divide\@IEEEtrantmpdimenB by 2\relax + % and add to offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetheadermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB 1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by \topmargin + \advance\@IEEEtrantmpdimenB by \headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \topmargin by the needed amount and reduce \headsep by the same +% so as not to disturb the location of the main text +\advance\topmargin by \@IEEEtrantmpdimenA\relax +\advance\headsep by -\@IEEEtrantmpdimenA\relax +} + + + +% usage: \IEEEsetfootermargin[footer sample][text sample]{mode: t, b, c, a}{margin/offset} +% Adjusts \footskip based on the specified footer margin. +% Takes into consideration the base 1in offset, \paperheight, \headheight, +% \headsep, \textheight and (by default) the actual height (or depth) of the +% \IEEEdefaultfootersampletext and \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the footer text to the bottom of the main text) +% b = bottom margin (bottom of the footer text to the bottom of page) +% c = vertically centered between the main text and the bottom of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the footer downward. +% \headheight, \headsep, \topskip, \topmargin, and \textheight should be set +% properly before calling this function. +\def\IEEEsetfootermargin{\@ifnextchar [{\@IEEEsetfootermargin}{\@IEEEsetfootermargin[\IEEEdefaultfootersampletext]}} +\def\@IEEEsetfootermargin[#1]{\@ifnextchar [{\@@IEEEsetfootermargin[#1]}{\@@IEEEsetfootermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetfootermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetfootermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetfootermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \footskip will do all that + % is needed +\else +\if\@IEEEextractedtoken c\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % now subtract off the footer top margin + \advance\@IEEEtrantmpdimenB -\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom + % and top footer margins + % our adjustment must be half this value to center the footer + \divide\@IEEEtrantmpdimenB by 2\relax + % add to the offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetfootermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \footskip by the needed amount +\advance\footskip by \@IEEEtrantmpdimenA\relax +} + +% -- End V1.8a page setup commands -- + + + + + +% V1.6 +% LaTeX is a little to quick to use hyphenations +% So, we increase the penalty for their use and raise +% the badness level that triggers an underfull hbox +% warning. The author may still have to tweak things, +% but the appearance will be much better "right out +% of the box" than that under V1.5 and prior. +% TeX default is 50 +\hyphenpenalty=750 +\ifCLASSOPTIONcompsoc +\hyphenpenalty 500 +\fi +% If we didn't adjust the interword spacing, 2200 might be better. +% The TeX default is 1000 +\hbadness=1350 +% The IEEE does not use extra spacing after punctuation +\frenchspacing + +% V1.7 increase this a tad to discourage equation breaks +\binoppenalty=1000 % default 700 +\relpenalty=800 % default 500 + +% v1.8a increase these to discourage widows and orphans +\clubpenalty=1000 % default 150 +\widowpenalty=1000 % default 150 +\displaywidowpenalty=1000 % default 50 + + +% margin note stuff +\marginparsep 10pt +\marginparwidth 20pt +\marginparpush 25pt + + +% if things get too close, go ahead and let them touch +\lineskip 0pt +\normallineskip 0pt +\lineskiplimit 0pt +\normallineskiplimit 0pt + +% The distance from the lower edge of the text body to the +% footline +\footskip 0.4in + +% normally zero, should be relative to font height. +% put in a little rubber to help stop some bad breaks (underfull vboxes) +\parskip 0ex plus 0.2ex minus 0.1ex + +\parindent 1.0em +\ifCLASSOPTIONcompsoc + \parindent 1.5em +\fi + +\headheight 12pt +\headsep 18pt +% use the normal font baselineskip +% so that \topskip is unaffected by changes in \baselinestretch +\topskip=\@IEEEnormalsizeunitybaselineskip + + +% V1.8 \maxdepth defaults to 4pt, but should be font size dependent +\maxdepth=0.5\@IEEEnormalsizeunitybaselineskip +\textheight 58pc % 9.63in, 696pt + +% set the default top margin to 58pt +% which results in a \topmargin of -49.59pt for 10pt documents +\IEEEsettopmargin{t}{58pt} +% tweak textheight to a perfect integer number of lines/column. +% standard is: 9pt/63 lpc; 10pt/58 lpc; 11pt/52 lpc; 12pt/50 lpc +\IEEEquantizetextheight{c} +% tweak top margin so that the error is shared equally at the top and bottom +\IEEEsettopmargin{q}{0sp} + + +\columnsep 1pc +\textwidth 43pc % 2 x 21pc + 1pc = 43pc + +% set the default side margins to center the text +\IEEEsetsidemargin{c}{0pt} + + +% adjust margins for default conference mode +\ifCLASSOPTIONconference + \textheight 9.25in % The standard for conferences (668.4975pt) + \IEEEsettopmargin{t}{0.75in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/61 lpc; 10pt/56 lpc; 11pt/50 lpc; 12pt/48 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + +% compsoc text sizes, margins and spacings +\ifCLASSOPTIONcompsoc + \columnsep 12bp + % CS specs for \textwdith are 6.875in + % \textwidth 6.875in + % however, measurements from proofs show they are using 3.5in columns + \textwidth 7in + \advance\textwidth by \columnsep + % set the side margins to center the text + \IEEEsetsidemargin{c}{0pt} + % top/bottom margins to center + % could just set \textheight to 9.75in for all the different paper sizes + % and then quantize, but we'll do it the long way here to allow for easy + % future per-paper size adjustments + \IEEEsettextheight{0.625in}{0.625in}% 11in - 2 * 0.625in = 9.75in is the standard text height for compsoc journals + \IEEEsettopmargin{t}{0.625in} + \if@IEEEusingcspaper + \IEEEsettextheight{0.5in}{0.5in}% 10.75in - 2 * 0.5in = 9.75in + \IEEEsettopmargin{t}{0.5in} + \fi + \if@IEEEusingAfourpaper + \IEEEsettextheight{24.675mm}{24.675mm}% 297mm - 2 * 24.675mm = 247.650mm (9.75in) + \IEEEsettopmargin{t}{24.675mm} + \fi + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/65 lpc; 10pt/61 lpc; 11pt/53 lpc; 12pt/49 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + +% compsoc conference + \ifCLASSOPTIONconference + % compsoc conference use a larger value for columnsep + \columnsep 0.25in + \IEEEsettextwidth{0.75in}{0.75in} + % set the side margins to center the text (0.75in for letterpaper) + \IEEEsetsidemargin{c}{0pt} + % compsoc conferences want 1in top and bottom margin + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/58 lpc; 10pt/53 lpc; 11pt/48 lpc; 12pt/46 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + \fi +\fi + + + +% draft mode settings override that of all other modes +% provides a nice 1in margin all around the paper and extra +% space between the lines for editor's comments +\ifCLASSOPTIONdraftcls + % we want 1in side margins regardless of paper type + \IEEEsettextwidth{1in}{1in} + \IEEEsetsidemargin{c}{0pt} + % want 1in top and bottom margins + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % digitize textheight to be an integer number of lines. + % this may cause the top and bottom margins to be off a tad + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + + +% process CLASSINPUT inner/outer margin +% if inner margin defined, but outer margin not, set outer to inner. +\ifx\CLASSINPUTinnersidemargin\@IEEEundefined +\else + \ifx\CLASSINPUToutersidemargin\@IEEEundefined + \edef\CLASSINPUToutersidemargin{\CLASSINPUTinnersidemargin} + \fi +\fi + +\ifx\CLASSINPUToutersidemargin\@IEEEundefined +\else + % if outer margin defined, but inner margin not, set inner to outer. + \ifx\CLASSINPUTinnersidemargin\@IEEEundefined + \edef\CLASSINPUTinnersidemargin{\CLASSINPUToutersidemargin} + \fi + \IEEEsettextwidth{\CLASSINPUTinnersidemargin}{\CLASSINPUToutersidemargin} + \IEEEsetsidemargin{i}{\CLASSINPUTinnersidemargin} + \typeout{** ATTENTION: Overriding inner side margin to \CLASSINPUTinnersidemargin\space and + outer side margin to \CLASSINPUToutersidemargin\space via \string\CLASSINPUT.} +\fi + + + +% process CLASSINPUT top/bottom text margin +% if toptext margin defined, but bottomtext margin not, set bottomtext to toptext margin +\ifx\CLASSINPUTtoptextmargin\@IEEEundefined +\else + \ifx\CLASSINPUTbottomtextmargin\@IEEEundefined + \edef\CLASSINPUTbottomtextmargin{\CLASSINPUTtoptextmargin} + \fi +\fi + +\ifx\CLASSINPUTbottomtextmargin\@IEEEundefined +\else + % if bottomtext margin defined, but toptext margin not, set toptext to bottomtext margin + \ifx\CLASSINPUTtoptextmargin\@IEEEundefined + \edef\CLASSINPUTtoptextmargin{\CLASSINPUTbottomtextmargin} + \fi + \IEEEsettextheight{\CLASSINPUTtoptextmargin}{\CLASSINPUTbottomtextmargin} + \IEEEsettopmargin{t}{\CLASSINPUTtoptextmargin} + \typeout{** ATTENTION: Overriding top text margin to \CLASSINPUTtoptextmargin\space and + bottom text margin to \CLASSINPUTbottomtextmargin\space via \string\CLASSINPUT.} +\fi + + + +% default to center header and footer text in the margins +\IEEEsetheadermargin{c}{0pt} +\IEEEsetfootermargin{c}{0pt} + +% adjust header and footer positions for compsoc journals +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONjournal + \IEEEsetheadermargin{b}{\@IEEEnormalsizeunitybaselineskip} + \IEEEsetfootermargin{t}{\@IEEEnormalsizeunitybaselineskip} + \fi +\fi + + +% V1.8a display lines per column info message on user's console +\def\IEEEdisplayinfolinespercolumn{\@IEEEtrantmpdimenA=\textheight +% topskip represents only one line even if > baselineskip +\advance\@IEEEtrantmpdimenA by -1\topskip +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenA +\divide\@IEEEtrantmpcountB by \baselineskip +% need to add one line to include topskip (first) line +\advance\@IEEEtrantmpcountB by 1 +% save lines per column value as text +\edef\@IEEEnumlinespercolumninfotxt{\the\@IEEEtrantmpcountB} +% backout topskip advance to allow direct \@IEEEtrantmpcountA comparison +\advance\@IEEEtrantmpcountB by -1 +% restore value as text height (without topskip) rather than just as number of lines +\multiply\@IEEEtrantmpcountB by \baselineskip +% is the column height an integer number of lines per column? +\ifnum\@IEEEtrantmpcountA=\@IEEEtrantmpcountB +\edef\@IEEEnumlinespercolumnexactinfotxt{exact} +\else +\@IEEEtrantmpdimenA\@IEEEtrantmpcountA sp\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpcountB sp\relax +\edef\@IEEEnumlinespercolumnexactinfotxt{approximate, difference = \the\@IEEEtrantmpdimenA} +\fi +\typeout{-- Lines per column: \@IEEEnumlinespercolumninfotxt\space (\@IEEEnumlinespercolumnexactinfotxt).}} +% delay execution till start of document to allow for user changes +\AtBeginDocument{\IEEEdisplayinfolinespercolumn} + + + +% LIST SPACING CONTROLS + +% Controls the amount of EXTRA spacing +% above and below \trivlist +% Both \list and IED lists override this. +% However, \trivlist will use this as will most +% things built from \trivlist like the \center +% environment. +\topsep 0.5\baselineskip + +% Controls the additional spacing around lists preceded +% or followed by blank lines. the IEEE does not increase +% spacing before or after paragraphs so it is set to zero. +% \z@ is the same as zero, but faster. +\partopsep \z@ + +% Controls the spacing between paragraphs in lists. +% The IEEE does not increase spacing before or after paragraphs +% so this is also zero. +% With IEEEtran.cls, global changes to +% this value DO affect lists (but not IED lists). +\parsep \z@ + +% Controls the extra spacing between list items. +% The IEEE does not put extra spacing between items. +% With IEEEtran.cls, global changes to this value DO affect +% lists (but not IED lists). +\itemsep \z@ + +% \itemindent is the amount to indent the FIRST line of a list +% item. It is auto set to zero within the \list environment. To alter +% it, you have to do so when you call the \list. +% However, the IEEE uses this for the theorem environment +% There is an alternative value for this near \leftmargini below +\itemindent -1em + +% \leftmargin, the spacing from the left margin of the main text to +% the left of the main body of a list item is set by \list. +% Hence this statement does nothing for lists. +% But, quote and verse do use it for indention. +\leftmargin 2em + +% we retain this stuff from the older IEEEtran.cls so that \list +% will work the same way as before. However, itemize, enumerate and +% description (IED) could care less about what these are as they +% all are overridden. +\leftmargini 2em +%\itemindent 2em % Alternative values: sometimes used. +%\leftmargini 0em +\leftmarginii 1em +\leftmarginiii 1.5em +\leftmarginiv 1.5em +\leftmarginv 1.0em +\leftmarginvi 1.0em +\labelsep 0.5em +\labelwidth \z@ + + +% The old IEEEtran.cls behavior of \list is retained. +% However, the new V1.3 IED list environments override all the +% @list stuff (\@listX is called within \list for the +% appropriate level just before the user's list_decl is called). +% \topsep is now 2pt as the IEEE puts a little extra space around +% lists - used by those non-IED macros that depend on \list. +% Note that \parsep and \itemsep are not redefined as in +% the sizexx.clo \@listX (which article.cls uses) so global changes +% of these values DO affect \list +% +\def\@listi{\leftmargin\leftmargini \topsep 2pt plus 1pt minus 1pt} +\let\@listI\@listi +\def\@listii{\leftmargin\leftmarginii\labelwidth\leftmarginii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiii{\leftmargin\leftmarginiii\labelwidth\leftmarginiii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiv{\leftmargin\leftmarginiv\labelwidth\leftmarginiv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listv{\leftmargin\leftmarginv\labelwidth\leftmarginv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listvi{\leftmargin\leftmarginvi\labelwidth\leftmarginvi% + \advance\labelwidth-\labelsep \topsep 2pt} + + +% The IEEE uses 5) not 5. +\def\labelenumi{\theenumi)} \def\theenumi{\arabic{enumi}} + +% The IEEE uses a) not (a) +\def\labelenumii{\theenumii)} \def\theenumii{\alph{enumii}} + +% The IEEE uses iii) not iii. +\def\labelenumiii{\theenumiii)} \def\theenumiii{\roman{enumiii}} + +% The IEEE uses A) not A. +\def\labelenumiv{\theenumiv)} \def\theenumiv{\Alph{enumiv}} + +% exactly the same as in article.cls +\def\p@enumii{\theenumi} +\def\p@enumiii{\theenumi(\theenumii)} +\def\p@enumiv{\p@enumiii\theenumiii} + +% itemized list label styles +\def\labelitemi{$\scriptstyle\bullet$} +\def\labelitemii{\textbf{--}} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + + + +% **** V1.3 ENHANCEMENTS **** +% Itemize, Enumerate and Description (IED) List Controls +% *************************** +% +% +% The IEEE seems to use at least two different values by +% which ITEMIZED list labels are indented to the right +% For The Journal of Lightwave Technology (JLT) and The Journal +% on Selected Areas in Communications (JSAC), they tend to use +% an indention equal to \parindent. For Transactions on Communications +% they tend to indent ITEMIZED lists a little more--- 1.3\parindent. +% We'll provide both values here for you so that you can choose +% which one you like in your document using a command such as: +% setlength{\IEEEilabelindent}{\IEEEilabelindentB} +\newdimen\IEEEilabelindentA +\IEEEilabelindentA \parindent + +\newdimen\IEEEilabelindentB +\IEEEilabelindentB 1.3\parindent +% However, we'll default to using \parindent +% which makes more sense to me +\newdimen\IEEEilabelindent +\IEEEilabelindent \IEEEilabelindentA + + +% This controls the default amount the enumerated list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEelabelindent +\IEEEelabelindent \parindent + +% This controls the default amount the description list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEdlabelindent +\IEEEdlabelindent \parindent + +% This is the value actually used within the IED lists. +% The IED environments automatically set its value to +% one of the three values above, so global changes do +% not have any effect +\newdimen\IEEElabelindent +\IEEElabelindent \parindent + +% The actual amount labels will be indented is +% \IEEElabelindent multiplied by the factor below +% corresponding to the level of nesting depth +% This provides a means by which the user can +% alter the effective \IEEElabelindent for deeper +% levels +% There may not be such a thing as correct "standard IEEE" +% values. What the IEEE actually does may depend on the specific +% circumstances. +% The first list level almost always has full indention. +% The second levels I've seen have only 75% of the normal indentation +% Three level or greater nestings are very rare. I am guessing +% that they don't use any indentation. +\def\IEEElabelindentfactori{1.0} % almost always one +\def\IEEElabelindentfactorii{0.75} % 0.0 or 1.0 may be used in some cases +\def\IEEElabelindentfactoriii{0.0} % 0.75? 0.5? 0.0? +\def\IEEElabelindentfactoriv{0.0} +\def\IEEElabelindentfactorv{0.0} +\def\IEEElabelindentfactorvi{0.0} + +% value actually used within IED lists, it is auto +% set to one of the 6 values above +% global changes here have no effect +\def\IEEElabelindentfactor{1.0} + +% This controls the default spacing between the end of the IED +% list labels and the list text, when normal text is used for +% the labels. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newdimen\IEEEiednormlabelsep +\IEEEiednormlabelsep 0.6em + +% This controls the default spacing between the end of the IED +% list labels and the list text, when math symbols are used for +% the labels (nomenclature lists). The IEEE usually increases the +% spacing in these cases +\newdimen\IEEEiedmathlabelsep +\IEEEiedmathlabelsep 1.2em + +% This controls the extra vertical separation put above and +% below each IED list. the IEEE usually puts a little extra spacing +% around each list. However, this spacing is barely noticeable. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newskip\IEEEiedtopsep +\IEEEiedtopsep 2pt plus 1pt minus 1pt + + +% This command is executed within each IED list environment +% at the beginning of the list. You can use this to set the +% parameters for some/all your IED list(s) without disturbing +% global parameters that affect things other than lists. +% i.e., renewcommand{\IEEEiedlistdecl}{\setlength{\labelsep}{5em}} +% will alter the \labelsep for the next list(s) until +% \IEEEiedlistdecl is redefined. +\def\IEEEiedlistdecl{\relax} + +% This command provides an easy way to set \leftmargin based +% on the \labelwidth, \labelsep and the argument \IEEElabelindent +% Usage: \IEEEcalcleftmargin{width-to-indent-the-label} +% output is in the \leftmargin variable, i.e., effectively: +% \leftmargin = argument + \labelwidth + \labelsep +% Note controlled spacing here, shield end of lines with % +\def\IEEEcalcleftmargin#1{\setlength{\leftmargin}{#1}% +\addtolength{\leftmargin}{\labelwidth}% +\addtolength{\leftmargin}{\labelsep}} + +% This command provides an easy way to set \labelwidth to the +% width of the given text. It is the same as +% \settowidth{\labelwidth}{label-text} +% and useful as a shorter alternative. +% Typically used to set \labelwidth to be the width +% of the longest label in the list +\def\IEEEsetlabelwidth#1{\settowidth{\labelwidth}{#1}} + +% When this command is executed, IED lists will use the +% IEEEiedmathlabelsep label separation rather than the normal +% spacing. To have an effect, this command must be executed via +% the \IEEEiedlistdecl or within the option of the IED list +% environments. +\def\IEEEusemathlabelsep{\setlength{\labelsep}{\IEEEiedmathlabelsep}} + +% A flag which controls whether the IED lists automatically +% calculate \leftmargin from \IEEElabelindent, \labelwidth and \labelsep +% Useful if you want to specify your own \leftmargin +% This flag must be set (\IEEEnocalcleftmargintrue or \IEEEnocalcleftmarginfalse) +% via the \IEEEiedlistdecl or within the option of the IED list +% environments to have an effect. +\newif\ifIEEEnocalcleftmargin +\IEEEnocalcleftmarginfalse + +% A flag which controls whether \IEEElabelindent is multiplied by +% the \IEEElabelindentfactor for each list level. +% This flag must be set via the \IEEEiedlistdecl or within the option +% of the IED list environments to have an effect. +\newif\ifIEEEnolabelindentfactor +\IEEEnolabelindentfactorfalse + + +% internal variable to indicate type of IED label +% justification +% 0 - left; 1 - center; 2 - right +\def\@IEEEiedjustify{0} + + +% commands to allow the user to control IED +% label justifications. Use these commands within +% the IED environment option or in the \IEEEiedlistdecl +% Note that changing the normal list justifications +% is nonstandard and the IEEE may not like it if you do so! +% I include these commands as they may be helpful to +% those who are using these enhanced list controls for +% other non-IEEE related LaTeX work. +% itemize and enumerate automatically default to right +% justification, description defaults to left. +\def\IEEEiedlabeljustifyl{\def\@IEEEiedjustify{0}}%left +\def\IEEEiedlabeljustifyc{\def\@IEEEiedjustify{1}}%center +\def\IEEEiedlabeljustifyr{\def\@IEEEiedjustify{2}}%right + + + + +% commands to save to and restore from the list parameter copies +% this allows us to set all the list parameters within +% the list_decl and prevent \list (and its \@list) +% from overriding any of our parameters +% V1.6 use \edefs instead of dimen's to conserve dimen registers +% Note controlled spacing here, shield end of lines with % +\def\@IEEEsavelistparams{\edef\@IEEEiedtopsep{\the\topsep}% +\edef\@IEEEiedlabelwidth{\the\labelwidth}% +\edef\@IEEEiedlabelsep{\the\labelsep}% +\edef\@IEEEiedleftmargin{\the\leftmargin}% +\edef\@IEEEiedpartopsep{\the\partopsep}% +\edef\@IEEEiedparsep{\the\parsep}% +\edef\@IEEEieditemsep{\the\itemsep}% +\edef\@IEEEiedrightmargin{\the\rightmargin}% +\edef\@IEEEiedlistparindent{\the\listparindent}% +\edef\@IEEEieditemindent{\the\itemindent}} + +% Note controlled spacing here +\def\@IEEErestorelistparams{\topsep\@IEEEiedtopsep\relax% +\labelwidth\@IEEEiedlabelwidth\relax% +\labelsep\@IEEEiedlabelsep\relax% +\leftmargin\@IEEEiedleftmargin\relax% +\partopsep\@IEEEiedpartopsep\relax% +\parsep\@IEEEiedparsep\relax% +\itemsep\@IEEEieditemsep\relax% +\rightmargin\@IEEEiedrightmargin\relax% +\listparindent\@IEEEiedlistparindent\relax% +\itemindent\@IEEEieditemindent\relax} + + +% v1.6b provide original LaTeX IED list environments +% note that latex.ltx defines \itemize and \enumerate, but not \description +% which must be created by the base classes +% save original LaTeX itemize and enumerate +\let\LaTeXitemize\itemize +\let\endLaTeXitemize\enditemize +\let\LaTeXenumerate\enumerate +\let\endLaTeXenumerate\endenumerate + +% provide original LaTeX description environment from article.cls +\newenvironment{LaTeXdescription} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} + + +% override LaTeX's default IED lists +\def\itemize{\@IEEEitemize} +\def\enditemize{\@endIEEEitemize} +\def\enumerate{\@IEEEenumerate} +\def\endenumerate{\@endIEEEenumerate} +\def\description{\@IEEEdescription} +\def\enddescription{\@endIEEEdescription} + +% provide the user with aliases - may help those using packages that +% override itemize, enumerate, or description +\def\IEEEitemize{\@IEEEitemize} +\def\endIEEEitemize{\@endIEEEitemize} +\def\IEEEenumerate{\@IEEEenumerate} +\def\endIEEEenumerate{\@endIEEEenumerate} +\def\IEEEdescription{\@IEEEdescription} +\def\endIEEEdescription{\@endIEEEdescription} + + +% V1.6 we want to keep the IEEEtran IED list definitions as our own internal +% commands so they are protected against redefinition +\def\@IEEEitemize{\@ifnextchar[{\@@IEEEitemize}{\@@IEEEitemize[\relax]}} +\def\@IEEEenumerate{\@ifnextchar[{\@@IEEEenumerate}{\@@IEEEenumerate[\relax]}} +\def\@IEEEdescription{\@ifnextchar[{\@@IEEEdescription}{\@@IEEEdescription[\relax]}} +\def\@endIEEEitemize{\endlist} +\def\@endIEEEenumerate{\endlist} +\def\@endIEEEdescription{\endlist} + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran itemized list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEitemize[#1]{% + \ifnum\@itemdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@itemdepth\@ne% + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEilabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % the user can override this later if + % they specified a \labelwidth + \settowidth{\labelwidth}{\csname labelitem\romannumeral\the\@itemdepth\endcsname}% + \@IEEEsavelistparams% save our list parameters + \list{\csname\@itemitem\endcsname}{% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran enumerate list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEenumerate[#1]{% + \ifnum\@enumdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@enumdepth\@ne% + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEelabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % We'll set it to the width suitable for all labels using + % normalfont 1) to 9) + % The user can override this later + \settowidth{\labelwidth}{9)}% + \@IEEEsavelistparams% save our list parameters + \list{\csname label\@enumctr\endcsname}{\usecounter{\@enumctr}% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran description list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEdescription[#1]{% + \ifnum\@listdepth>5\relax\@toodeep\else% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{0}% left justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEdlabelindent% + % assume normal labelsep + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % Bogus label width in case the user forgets + % to set it. + % TIP: If you want to see what a variable's width is you + % can use the TeX command \showthe\width-variable to + % display it on the screen during compilation + % (This might be helpful to know when you need to find out + % which label is the widest) + \settowidth{\labelwidth}{Hello}% + \@IEEEsavelistparams% save our list parameters + \list{}{\@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % labelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}\relax% + \fi}\fi} + +% v1.6b we use one makelabel that does justification as needed. +\def\@IEEEiedmakelabel#1{\relax\if\@IEEEiedjustify 0\relax +\makebox[\labelwidth][l]{\normalfont #1}\else +\if\@IEEEiedjustify 1\relax +\makebox[\labelwidth][c]{\normalfont #1}\else +\makebox[\labelwidth][r]{\normalfont #1}\fi\fi} + + +% compsoc uses a larger value for the normal labelsep +% and also extra spacing above and below each list +\ifCLASSOPTIONcompsoc + \IEEEiednormlabelsep 1.2em + \IEEEiedtopsep 6pt plus 3pt minus 3pt +\fi + + +% VERSE and QUOTE +% V1.7 define environments with newenvironment +\newenvironment{verse}{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em \listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item\relax} + {\endlist} +\newenvironment{quotation}{\list{}{\listparindent 1.5em \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item\relax} + {\endlist} +\newenvironment{quote}{\list{}{\rightmargin\leftmargin}\item\relax} + {\endlist} + + +% \titlepage +% provided only for backward compatibility. \maketitle is the correct +% way to create the title page. +\def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \else \newpage \fi \thispagestyle{empty}\c@page\z@} +\def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi} + +% standard values from article.cls +\arraycolsep 5pt +\arrayrulewidth .4pt +\doublerulesep 2pt + +\tabcolsep 6pt +\tabbingsep 0.5em + + +%% FOOTNOTES +% +%\skip\footins 10pt plus 4pt minus 2pt +% V1.6 respond to changes in font size +% space added above the footnotes (if present) +\skip\footins 0.9\baselineskip plus 0.4\baselineskip minus 0.2\baselineskip + +% V1.6, we need to make \footnotesep responsive to changes +% in \baselineskip or strange spacings will result when in +% draft mode. Here is a little LaTeX secret - \footnotesep +% determines the height of an invisible strut that is placed +% *above* the baseline of footnotes after the first. Since +% LaTeX considers the space for characters to be 0.7\baselineskip +% above the baseline and 0.3\baselineskip below it, we need to +% use 0.7\baselineskip as a \footnotesep to maintain equal spacing +% between all the lines of the footnotes. The IEEE often uses a tad +% more, so use 0.8\baselineskip. This slightly larger value also helps +% the text to clear the footnote marks. Note that \thanks in IEEEtran +% uses its own value of \footnotesep which is set in \maketitle. +{\footnotesize +\global\footnotesep 0.8\baselineskip} + + +\skip\@mpfootins = \skip\footins +\fboxsep = 3pt +\fboxrule = .4pt +% V1.6 use 1em, then use LaTeX2e's \@makefnmark +% Note that the IEEE normally *left* aligns the footnote marks, so we don't need +% box resizing tricks here. +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@makefnmark}#1}% V1.6 use 1em +% V1.7 compsoc does not use superscipts for footnote marks +\ifCLASSOPTIONcompsoc +\def\@IEEEcompsocmakefnmark{\hbox{\normalfont\@thefnmark.\ }} +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@IEEEcompsocmakefnmark}#1} +\fi + +% The IEEE does not use footnote rules +\def\footnoterule{} + +% V1.7 for compsoc, the IEEE uses a footnote rule only for \thanks. We devise a "one-shot" +% system to implement this. +\newif\if@IEEEenableoneshotfootnoterule +\@IEEEenableoneshotfootnoterulefalse +\ifCLASSOPTIONcompsoc +\def\footnoterule{\relax\if@IEEEenableoneshotfootnoterule +\kern-5pt +\hbox to \columnwidth{\hfill\vrule width 0.5\columnwidth height 0.4pt\hfill} +\kern4.6pt +\global\@IEEEenableoneshotfootnoterulefalse +\else +\relax +\fi} +\fi + +% V1.6 do not allow LaTeX to break a footnote across multiple pages +\interfootnotelinepenalty=10000 + +% V1.6 discourage breaks within equations +% Note that amsmath normally sets this to 10000, +% but LaTeX2e normally uses 100. +\interdisplaylinepenalty=2500 + +% default allows section depth up to /paragraph +\setcounter{secnumdepth}{4} + +% technotes do not allow /paragraph +\ifCLASSOPTIONtechnote + \setcounter{secnumdepth}{3} +\fi +% neither do compsoc conferences +\@IEEEcompsocconfonly{\setcounter{secnumdepth}{3}} + + +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] + +% used only by IEEEtran's IEEEeqnarray as other packages may +% have their own, different, implementations +\newcounter{IEEEsubequation}[equation] + +% as shown when called by user from \ref, \label and in table of contents +\def\theequation{\arabic{equation}} % 1 +\def\theIEEEsubequation{\theequation\alph{IEEEsubequation}} % 1a (used only by IEEEtran's IEEEeqnarray) +\ifCLASSOPTIONcompsoc +% compsoc is all arabic +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} +\else +\def\thesection{\Roman{section}} % I +% V1.7, \mbox prevents breaks around - +\def\thesubsection{\mbox{\thesection-\Alph{subsection}}} % I-A +% V1.7 use I-A1 format used by the IEEE rather than I-A.1 +\def\thesubsubsection{\thesubsection\arabic{subsubsection}} % I-A1 +\def\theparagraph{\thesubsubsection\alph{paragraph}} % I-A1a +\fi + +% From Heiko Oberdiek. Because of the \mbox in \thesubsection, we need to +% tell hyperref to disable the \mbox command when making PDF bookmarks. +% This done already with hyperref.sty version 6.74o and later, but +% it will not hurt to do it here again for users of older versions. +\@ifundefined{pdfstringdefPreHook}{\let\pdfstringdefPreHook\@empty}{}% +\g@addto@macro\pdfstringdefPreHook{\let\mbox\relax} + + +% Main text forms (how shown in main text headings) +% V1.6, using \thesection in \thesectiondis allows changes +% in the former to automatically appear in the latter +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference + \def\thesectiondis{\thesection.} + \def\thesubsectiondis{\thesectiondis\arabic{subsection}.} + \def\thesubsubsectiondis{\thesubsectiondis\arabic{subsubsection}.} + \def\theparagraphdis{\thesubsubsectiondis\arabic{paragraph}.} + \else% compsoc not conferencs + \def\thesectiondis{\thesection} + \def\thesubsectiondis{\thesectiondis.\arabic{subsection}} + \def\thesubsubsectiondis{\thesubsectiondis.\arabic{subsubsection}} + \def\theparagraphdis{\thesubsubsectiondis.\arabic{paragraph}} + \fi +\else% not compsoc + \def\thesectiondis{\thesection.} % I. + \def\thesubsectiondis{\Alph{subsection}.} % B. + \def\thesubsubsectiondis{\arabic{subsubsection})} % 3) + \def\theparagraphdis{\alph{paragraph})} % d) +\fi + +% just like LaTeX2e's \@eqnnum +\def\theequationdis{{\normalfont \normalcolor (\theequation)}}% (1) +% IEEEsubequation used only by IEEEtran's IEEEeqnarray +\def\theIEEEsubequationdis{{\normalfont \normalcolor (\theIEEEsubequation)}}% (1a) +% redirect LaTeX2e's equation number display and all that depend on +% it, through IEEEtran's \theequationdis +\def\@eqnnum{\theequationdis} + + + +% V1.7 provide string macros as article.cls does +\def\contentsname{Contents} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\refname{References} +\def\indexname{Index} +\def\figurename{Fig.} +\def\tablename{TABLE} +\@IEEEcompsocconfonly{\def\figurename{Figure}} +\def\partname{Part} +\def\appendixname{Appendix} +\def\abstractname{Abstract} +% IEEE specific names +\def\IEEEkeywordsname{Index Terms} +\def\IEEEproofname{Proof} + + +% LIST OF FIGURES AND TABLES AND TABLE OF CONTENTS +% +\def\@pnumwidth{1.55em} +\def\@tocrmarg{2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +% adjusted some spacings here so that section numbers will not easily +% collide with the section titles. +% VIII; VIII-A; and VIII-A.1 are usually the worst offenders. +% MDS 1/2001 +\def\tableofcontents{\section*{\contentsname}\@starttoc{toc}} +\def\l@section#1#2{\addpenalty{\@secpenalty}\addvspace{1.0em plus 1pt}% + \@tempdima 2.75em \begingroup \parindent \z@ \rightskip \@pnumwidth% + \parfillskip-\@pnumwidth {\bfseries\leavevmode #1}\hfil\hbox to\@pnumwidth{\hss #2}\par% + \endgroup} +% argument format #1:level, #2:labelindent,#3:labelsep +\def\l@subsection{\@dottedtocline{2}{2.75em}{3.75em}} +\def\l@subsubsection{\@dottedtocline{3}{6.5em}{4.5em}} +% must provide \l@ defs for ALL sublevels EVEN if tocdepth +% is such as they will not appear in the table of contents +% these defs are how TOC knows what level these things are! +\def\l@paragraph{\@dottedtocline{4}{6.5em}{5.5em}} +\def\l@subparagraph{\@dottedtocline{5}{6.5em}{6.5em}} +\def\listoffigures{\section*{\listfigurename}\@starttoc{lof}} +\def\l@figure{\@dottedtocline{1}{0em}{2.75em}} +\def\listoftables{\section*{\listtablename}\@starttoc{lot}} +\let\l@table\l@figure + + +% Definitions for floats +% +% Normal Floats +% V1.8 floatsep et al. revised down by 0.15\baselineskip +% to account for the sideeffects of \topskip compensation +\floatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\textfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +\@fptop 0pt plus 1fil +\@fpsep 0.75\baselineskip plus 2fil +\@fpbot 0pt plus 1fil +\def\topfraction{0.9} +\def\bottomfraction{0.4} +\def\floatpagefraction{0.8} +% V1.7, let top floats approach 90% of page +\def\textfraction{0.1} + +% Double Column Floats +\dblfloatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip + +\dbltextfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +% Note that it would be nice if the rubber here actually worked in LaTeX2e. +% There is a long standing limitation in LaTeX, first discovered (to the best +% of my knowledge) by Alan Jeffrey in 1992. LaTeX ignores the stretchable +% portion of \dbltextfloatsep, and as a result, double column figures can and +% do result in an non-integer number of lines in the main text columns with +% underfull vbox errors as a consequence. A post to comp.text.tex +% by Donald Arseneau confirms that this had not yet been fixed in 1998. +% IEEEtran V1.6 will fix this problem for you in the titles, but it doesn't +% protect you from other double floats. Happy vspace'ing. + +\@dblfptop 0pt plus 1fil +\@dblfpsep 0.75\baselineskip plus 2fil +\@dblfpbot 0pt plus 1fil +\def\dbltopfraction{0.8} +\def\dblfloatpagefraction{0.8} +\setcounter{dbltopnumber}{4} + +\intextsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} + + + +% article class provides these, we should too. +\newlength\abovecaptionskip +\newlength\belowcaptionskip +% but only \abovecaptionskip is used above figure captions and *below* table +% captions +\setlength\abovecaptionskip{0.5\baselineskip} +% compsoc journals are a little more generous +\ifCLASSOPTIONcompsoc\ifCLASSOPTIONjournal + \setlength\abovecaptionskip{0.75\baselineskip} +\fi\fi +\setlength\belowcaptionskip{0pt} +% V1.6 create hooks in case the caption spacing ever needs to be +% overridden by a user +\def\@IEEEfigurecaptionsepspace{\vskip\abovecaptionskip\relax}% +\def\@IEEEtablecaptionsepspace{\vskip\abovecaptionskip\relax}% + + +% 1.6b revise caption system so that \@makecaption uses two arguments +% as with LaTeX2e. Otherwise, there will be problems when using hyperref. +\def\@IEEEtablestring{table} + + +% V1.8 compensate for \topskip so top of top figures align with tops of the first lines of main text +% here we calculate a space equal to the amount \topskip exceeds the main text height +% we hook in at \@floatboxreset +\def\@IEEEfiguretopskipspace{\ifdim\prevdepth=-1000pt\relax +\setlength{\@IEEEtrantmpdimenA}{1\topskip}\relax +\addtolength{\@IEEEtrantmpdimenA}{-0.7\@IEEEnormalsizeunitybaselineskip}\relax +\vspace*{\@IEEEtrantmpdimenA}\fi} +% V1.8 compensate for \topskip at the top of top tables so caption text is on main text baseline +% use a strut set on the caption baseline within \@makecaption +\def\@IEEEtabletopskipstrut{\ifdim\prevdepth=-1000pt\rule{0pt}{\topskip}\fi} +% the \ifdim\prevdepth checks are always expected to be true for IEEE style float caption ordering +% because top of figure content and top of captions in tables is the first thing on the vertical +% list of these floats +% thanks to Donald Arseneau for his 2000/11/11 post "Re: caption hacking" with info on this topic. + + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc \@makecaption +\ifCLASSOPTIONconference% compsoc conference +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize {#1.}\nobreakspace\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center +\else% +\hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\fi\fi} +% +\else% nonconference compsoc +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\sffamily\footnotesize #1}\\{\normalfont\sffamily\footnotesize #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\sffamily\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, left justify +\else% +\hbox to\hsize{\normalfont\sffamily\footnotesize\box\@tempboxa\hfil}% +\fi\fi} +\fi +% +\else% traditional noncompsoc \@makecaption +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize #1}\\{\normalfont\footnotesize\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +% 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center if conference, left justify otherwise +\else% +\ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\else \hbox to\hsize{\normalfont\footnotesize\box\@tempboxa\hfil}% +\fi\fi\fi} +\fi + + + +% V1.7 disable captions class option, do so in a way that retains operation of \label +% within \caption +\ifCLASSOPTIONcaptionsoff +\long\def\@makecaption#1#2{\vspace*{2em}\footnotesize\bgroup\par\addvspace{0.5\baselineskip}\centering{\footnotesize #1}\par\addvspace{0.5\baselineskip}\egroup% +\let\@IEEEtemporiglabeldefsave\label +\let\@IEEEtemplabelargsave\relax +\def\label##1{\gdef\@IEEEtemplabelargsave{##1}}% +\setbox\@tempboxa\hbox{#2}% +\let\label\@IEEEtemporiglabeldefsave +\ifx\@IEEEtemplabelargsave\relax\else\label{\@IEEEtemplabelargsave}\fi} +\fi + + +% V1.7 define end environments with \def not \let so as to work OK with +% preview-latex +\newcounter{figure} +\def\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreakspace\thefigure} +% V1.8 within figures add \@IEEEfiguretopskipspace compensation to LaTeX2e's \@floatboxreset +\def\figure{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@float{figure}} +\def\endfigure{\end@float} +% V1.8 also add \@IEEEfiguretopskipspace compensation to \figure* +\@namedef{figure*}{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\newcounter{table} +\ifCLASSOPTIONcompsoc +\def\thetable{\arabic{table}} +\else +\def\thetable{\@Roman\c@table} +\fi +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreakspace\thetable} +% V1.6 The IEEE uses 8pt text for tables +% within tables alter LaTeX2e's \@floatboxreset to use \footnotesize +\def\table{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@float{table}} +\def\endtable{\end@float} +% v1.6b double column tables need to default to footnotesize as well. +\@namedef{table*}{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + + + + +%% -- Command Argument Scanning Support Functions -- +%% V1.8a + +% usage: \@IEEEstripouterbraces*{} +% \@IEEEstripouterbraces fully expands its argument (which it then stores +% in \@IEEEstripouterbracesarg) via \edef, then removes any outer enclosing +% braces, and finally stores the result in the macro +% \@IEEEstrippedouterbraces. +% +% For example: +% \@IEEEstripouterbraces{{{{ab}c}}} +% results in: +% +% \@IEEEstripouterbracesarg ==> a macro containing {{{ab}c}} +% \@IEEEstrippedouterbraces ==> a macro containing {ab}c +% +% the *-star form,\@IEEEstripouterbraces*, does not expand the argument +% contents during processing +\def\@IEEEstripouterbraces{\@ifstar{\let\@IEEEstripouterbracesdef=\def\@@IEEEstripouterbraces}{\let\@IEEEstripouterbracesdef=\edef\@@IEEEstripouterbraces}} + +\def\@@IEEEstripouterbraces#1{\@IEEEstripouterbracesdef\@IEEEstripouterbracesarg{#1}\relax +% If the macro is unchanged after being acquired as a single delimited +% argument, we know we have one sequence of tokens without any enclosing +% braces. Loop until this is true. +\loop + \expandafter\@@@IEEEstripouterbraces\@IEEEstripouterbracesarg\@IEEEgeneralsequenceDELIMITER +\ifx\@IEEEstrippedouterbraces\@IEEEstripouterbracesarg +\else + \let\@IEEEstripouterbracesarg\@IEEEstrippedouterbraces +\repeat} + +\def\@@@IEEEstripouterbraces#1\@IEEEgeneralsequenceDELIMITER{\def\@IEEEstrippedouterbraces{#1}} + + + +% usage: \@IEEEextractgroup*{} +% \@IEEEextractgroup fully expands its argument (which it then stores in +% \@IEEEextractgrouparg) via \edef and then assigns the first "brace group" +% of tokens to the macro \@IEEEextractedgroup. +% The remaining groups, if any, are stored in the macro +% \@IEEEextractedgroupremain. If the argument does not contain the requisite +% groups, the respective macros will be defined to be empty. +% There is an asymmetry in that \@IEEEextractedgroup is stripped of its first +% outer grouping while \@IEEEextractedgroupremain retains even the outer +% grouping (if present) that originally identified it as a group. +% +% For example: +% \@IEEEextractgroup{{{ab}}{c{de}}} +% results in: +% +% \@IEEEextractgrouparg ==> a macro containing {{ab}}{c{de}} +% \@IEEEextractedgroup ==> a macro containing {ab} +% \@IEEEextractedgroupremain ==> a macro containing {c{de}} +% +% The *-star form, \@IEEEextractgroup*, does not expand its argument +% contents during processing. +\def\@IEEEextractgroup{\@ifstar{\let\@IEEEextractgroupdef=\def\@@IEEEextractgroup}{\let\@IEEEextractgroupdef=\edef\@@IEEEextractgroup}} + +\def\@@IEEEextractgroup#1{\@IEEEextractgroupdef\@IEEEextractgrouparg{#1}\relax +% trap the case of an empty extracted group as this would cause problems with +% \@IEEEextractgroupremain's argument acquisition +\ifx\@IEEEextractgrouparg\@empty + \def\@IEEEextractedgroup{}\relax + \def\@IEEEextractedgroupremain{}\relax +\else + % We have to use some dirty tricks here. We want to insert {} around + % whatever remains after the first group so that TeX's argument scanner + % will preserve any originally enclosing braces as well as provide an + % empty argument to acquire even if there isn't a second group. + % In this first of two dirty tricks, we put a } at the end of the structure + % we are going to extract from. The \ifnum0=`{\fi keeps TeX happy to allow + % what would otherwise be an unbalanced macro definition for + % \@@IEEEextractgroup to be acceptable to it. + \ifnum0=`{\fi\expandafter\@IEEEextractgroupremain\@IEEEextractgrouparg}\relax +\fi} + +% In the second part of the dirty tricks, we insert a leading { right after +% the first group is acquired, but before the remainder is. Again, the +% \ifnum0=`}\fi keeps TeX happy during definition time, but will disappear +% during run time. +\def\@IEEEextractgroupremain#1{\def\@IEEEextractedgroup{#1}\expandafter\@@IEEEextractgroupremain\expandafter{\ifnum0=`}\fi} + +\def\@@IEEEextractgroupremain#1{\def\@IEEEextractedgroupremain{#1}} + + + +% \@IEEEextracttoken relocated at top because margin setting commands rely on it + + + +% usage: \@IEEEextracttokengroups*{} +% \@IEEEextracttokengroups fully expands its argument (which it then stores +% in \@IEEEextracttokengroupsarg) and then assigns the first "brace group" of +% tokens (with the outermost braces removed) to the macro +% \@IEEEextractedfirstgroup. +% The meaning of the first nonbrace (but including the empty group) token +% within this first group is assigned via \let to \@IEEEextractedfirsttoken +% as well as stored in the macro \@IEEEextractedfirsttokenmacro. If a first +% nonbrace token does not exist (or is an empty group), these will be \relax +% and empty, respectively. Tokens that would otherwise be discarded during +% the acquisition of the first token in the first group are stored in +% \@IEEEextractedfirsttokensdiscarded, however their original relative brace +% nesting depths are not guaranteed to be preserved. +% The first group within this first group is stored in the macro +% \@IEEEextractedfirstfirstgroup. +% Likewise for the next group after the first: \@IEEEextractednextgroup, +% \@IEEEextractednextfirstgroup, \@IEEEextractednextgroupfirsttoken, +% \@IEEEextractednextgroupfirsttokenmacro, and +% \@IEEEextractednextfirsttokensdiscarded. +% All tokens/groups after the first group, including any enclosing braces, +% are stored in the macro \@IEEEextractedafterfirstgroupremain which will +% be empty if none exist. +% +% For example: +% \@IEEEextracttokengroups{{{ab}{cd}}{{ef}g}} +% will result in: +% +% \@IEEEextracttokengroupsarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedfirstgroup ==> a macro containing {ab}{cd} +% \@IEEEextractedafterfirstgroupremain ==> a macro containing {{ef}g} +% \@IEEEextractedfirsttoken ==> the letter a +% \@IEEEextractedfirsttokenmacro ==> a macro containing a +% \@IEEEextractedfirsttokensdiscarded ==> a macro containing bcd +% \@IEEEextractedfirstfirstgroup ==> a macro containing ab +% \@IEEEextractednextgroup ==> a macro containing {ef}g +% \@IEEEextractednextfirsttoken ==> the letter e +% \@IEEEextractednextfirsttokenmacro ==> a macro containing e +% \@IEEEextractednextfirsttokensdiscarded ==> a macro containing fg +% \@IEEEextractednextfirstgroup ==> a macro containing ef +% +% If given an empty argument, \@IEEEextractedfirsttoken and +% \@IEEEextractednextfirsttoken will be set to \relax +% and all the macros will be empty. +% the *-star form, \@IEEEextracttokengroups*, does not expand its argument +% contents during processing. +% +% Depends on: \@IEEEextractgroup, \@IEEEextracttoken +\def\@IEEEextracttokengroups{\@ifstar{\let\@IEEEextracttokengroupsdef=\def\@@IEEEextracttokengroups}{\let\@IEEEextracttokengroupsdef=\edef\@@IEEEextracttokengroups}} +\def\@@IEEEextracttokengroups#1{\@IEEEextracttokengroupsdef\@IEEEextracttokengroupsarg{#1}\relax +% begin extraction, these functions are safe with empty arguments +% first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextracttokengroupsarg}\relax +\let\@IEEEextractedfirstgroup\@IEEEextractedgroup +\let\@IEEEextractedafterfirstgroupremain\@IEEEextractedgroupremain +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirsttoken\@IEEEextractedtoken +\let\@IEEEextractedfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractedfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% first first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirstfirstgroup\@IEEEextractedgroup +% next group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedafterfirstgroupremain}\relax +\let\@IEEEextractednextgroup\@IEEEextractedgroup +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirsttoken\@IEEEextractedtoken +\let\@IEEEextractednextfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractednextfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% next first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirstgroup\@IEEEextractedgroup} + + +%% -- End of Command Argument Scanning Support Functions -- + + + + +%% +%% START OF IEEEeqnarray DEFINITIONS +%% +%% Inspired by the concepts, examples, and previous works of LaTeX +%% coders and developers such as Donald Arseneau, Fred Bartlett, +%% David Carlisle, Tony Liu, Frank Mittelbach, Piet van Oostrum, +%% Roland Winkler and Mark Wooding. +%% I don't make the claim that my work here is even near their calibre. ;) + + +\newif\if@IEEEeqnarrayboxnojot% flag to indicate if the environment was called as the star form +\@IEEEeqnarrayboxnojotfalse + +\newif\if@advanceIEEEeqncolcnt% tracks if the environment should advance the col counter +% allows a way to make an \IEEEeqnarraybox that can be used within an \IEEEeqnarray +% used by IEEEeqnarraymulticol so that it can work properly in both +\@advanceIEEEeqncolcnttrue + +\newcount\@IEEEeqnnumcols % tracks how many IEEEeqnarray cols are defined +\newcount\@IEEEeqncolcnt % tracks how many IEEEeqnarray cols the user actually used + + +% The default math style used by the columns +\def\IEEEeqnarraymathstyle{\displaystyle} +% The default text style used by the columns +% default to using the current font +\def\IEEEeqnarraytextstyle{\relax} + +% like the iedlistdecl but for \IEEEeqnarray +\def\IEEEeqnarraydecl{\relax} +\def\IEEEeqnarrayboxdecl{\relax} + + + +% V1.8 flags to indicate that equation numbering is to persist +\newif\if@IEEEeqnumpersist% +\@IEEEeqnumpersistfalse +\newif\if@IEEEsubeqnumpersist% +\@IEEEsubeqnumpersistfalse +% +% V1.8 flags to indicate if (sub)equation number of last line was preadvanced +\newif\if@IEEEeqnumpreadv% +\@IEEEeqnumpreadvfalse +\newif\if@IEEEsubeqnumpreadv% +\@IEEEsubeqnumpreadvfalse + +\newcount\@IEEEsubeqnnumrollback% saves previous value of IEEEsubequation number in case we need to restore it + +% \yesnumber is the opposite of \nonumber +% a novel concept with the same def as the equationarray package +% However, we give IEEE versions too since some LaTeX packages such as +% the MDWtools mathenv.sty redefine \nonumber to something else. +% This command is intended for use in non-IEEEeqnarray math environments +\providecommand{\yesnumber}{\global\@eqnswtrue} + + +% IEEEyes/nonumber +% V1.8 add persistant * forms +% These commands can alter the type of equation an IEEEeqnarray line is. +\def\IEEEyesnumber{\@ifstar{\global\@IEEEeqnumpersisttrue\global\@IEEEsubeqnumpersistfalse\@IEEEyesnumber}{\@IEEEyesnumber}} + +\def\@IEEEyesnumber{\global\@eqnswtrue +\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray +\ifnum\c@IEEEsubequation>0\relax + \stepcounter{equation}\setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label +\fi +% even if we reached this eqn num via a preadv, it is legit now +\global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse +\fi} + +\def\IEEEnonumber{\@ifstar{\global\@IEEEeqnumpersistfalse\global\@IEEEsubeqnumpersistfalse\global\@eqnswfalse}{\global\@eqnswfalse}} + + +\def\IEEEyessubnumber{\@ifstar{\global\@IEEEsubeqnumpersisttrue\@IEEEyessubnumber}{\@IEEEyessubnumber}} +% +\def\@IEEEyessubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \ifnum\c@IEEEsubequation>0\relax% if it already is a subequation, we are good to go as-is + \else% if we are a regular equation we have to watch out for two cases + \if@IEEEeqnumpreadv% if this equation is the result of a preadvance, backout and bump the sub eqnnum + \global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\addtocounter{IEEEsubequation}{1}\relax + \else% non-preadvanced equations just need initialization of their sub eqnnum + \setcounter{IEEEsubequation}{1}\relax + \fi + \fi% fi already is subequation + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \global\@eqnswtrue +\fi} + + +\def\IEEEnosubnumber{\@ifstar{\global\@IEEEsubeqnumpersistfalse\@IEEEnosubnumber}{\@IEEEnosubnumber}} +% +\def\@IEEEnosubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \if@eqnsw % we do nothing unless we know we will display because we play with the counters here + % if it currently is a subequation, bump up to the next equation number and turn off the subequation + \ifnum\c@IEEEsubequation>0\relax\addtocounter{equation}{1}\setcounter{IEEEsubequation}{0}\relax + \fi + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi +\fi} + + + +% allows users to "push away" equations that get too close to the equation numbers +\def\IEEEeqnarraynumspace{\hphantom{\ifnum\c@IEEEsubequation>0\relax\theIEEEsubequationdis\else\theequationdis\fi}} + +% provides a way to span multiple columns within IEEEeqnarray environments +% will consider \if@advanceIEEEeqncolcnt before globally advancing the +% column counter - so as to work within \IEEEeqnarraybox +% usage: \IEEEeqnarraymulticol{number cols. to span}{col type}{cell text} +\long\def\IEEEeqnarraymulticol#1#2#3{\multispan{#1}\relax +% check if column is defined for the precolumn definition +% We have to be careful here because TeX scans for & even within an \iffalse +% where it does not expand macros. So, if we used only one \ifx and a #3 +% appeared in the false branch and the user inserted another alignment +% structure that uses & in the \IEEEeqnarraymulticol{}, TeX will not see that +% there is an inner alignment in the false branch yet still will see any & +% there and will think that they apply to the outer alignment resulting in an +% incomplete \ifx error. +% So, here we use separate checks for the pre and post parts in order to keep +% the #3 outside of all conditionals. +\relax\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPRE#2\endcsname +\else% if not, error and use default type +\@IEEEclspkgerror{Invalid column type "#2" in \string\IEEEeqnarraymulticol.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\csname @IEEEeqnarraycolPRE@IEEEdefault\endcsname +\fi +% The ten \relax are to help prevent misleading error messages in case a user +% accidently inserted a macro that tries to acquire additional arguments. +#3\relax\relax\relax\relax\relax\relax\relax\relax\relax\relax +% check if column is defined for the postcolumn definition +\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPOST#2\endcsname +\else% if not, use the default type +\csname @IEEEeqnarraycolPOST@IEEEdefault\endcsname +\fi +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by #1\relax\fi} + +% like \omit, but maintains track of the column counter for \IEEEeqnarray +\def\IEEEeqnarrayomit{\omit\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by 1\relax\fi} + + +% provides a way to define a letter referenced column type +% usage: \IEEEeqnarraydefcol{col. type letter/name}{pre insertion text}{post insertion text} +\def\IEEEeqnarraydefcol#1#2#3{\expandafter\def\csname @IEEEeqnarraycolPRE#1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolPOST#1\endcsname{#3}% +\expandafter\def\csname @IEEEeqnarraycolDEF#1\endcsname{1}} + + +% provides a way to define a numerically referenced inter-column glue types +% usage: \IEEEeqnarraydefcolsep{col. glue number}{glue definition} +\def\IEEEeqnarraydefcolsep#1#2{\expandafter\def\csname @IEEEeqnarraycolSEP\romannumeral #1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolSEPDEF\romannumeral #1\endcsname{1}} + + +\def\@IEEEeqnarraycolisdefined{1}% just a macro for 1, used for checking undefined column types + + +% expands and appends the given argument to the \@IEEEtrantmptoksA token list +% used to build up the \halign preamble +\def\@IEEEappendtoksA#1{\edef\@@IEEEappendtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA #1}}% +\@@IEEEappendtoksA} + +% also appends to \@IEEEtrantmptoksA, but does not expand the argument +% uses \toks8 as a scratchpad register +\def\@IEEEappendNOEXPANDtoksA#1{\toks8={#1}% +\edef\@@IEEEappendNOEXPANDtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA\the\toks8}}% +\@@IEEEappendNOEXPANDtoksA} + +% define some common column types for the user +% math +\IEEEeqnarraydefcol{l}{$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{c}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{r}{\hfil$\IEEEeqnarraymathstyle}{$} +\IEEEeqnarraydefcol{L}{$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{C}{\hfil$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{R}{\hfil$\IEEEeqnarraymathstyle{}}{{}$} +% text +\IEEEeqnarraydefcol{s}{\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{t}{\hfil\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{u}{\hfil\IEEEeqnarraytextstyle}{} + +% vertical rules +\IEEEeqnarraydefcol{v}{}{\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{vv}{\vrule width\arrayrulewidth\hfil}{\hfil\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{V}{}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{VV}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth\hfil}% +{\hfil\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} + +% horizontal rules +\IEEEeqnarraydefcol{h}{}{\leaders\hrule height\arrayrulewidth\hfil} +\IEEEeqnarraydefcol{H}{}{\leaders\vbox{\hrule width\arrayrulewidth\vskip\doublerulesep\hrule width\arrayrulewidth}\hfil} + +% plain +\IEEEeqnarraydefcol{x}{}{} +\IEEEeqnarraydefcol{X}{$}{$} + +% the default column type to use in the event a column type is not defined +\IEEEeqnarraydefcol{@IEEEdefault}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} + + +% a zero tabskip (used for "-" col types) +\def\@IEEEeqnarraycolSEPzero{0pt plus 0pt minus 0pt} +% a centering tabskip (used for "+" col types) +\def\@IEEEeqnarraycolSEPcenter{1000pt plus 0pt minus 1000pt} + +% top level default tabskip glues for the start, end, and inter-column +% may be reset within environments not always at the top level, e.g., \IEEEeqnarraybox +\edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPcenter}% default start glue +\edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPcenter}% default end glue +\edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + + + +% creates a vertical rule that extends from the bottom to the top a a cell +% Provided in case other packages redefine \vline some other way. +% usage: \IEEEeqnarrayvrule[rule thickness] +% If no argument is provided, \arrayrulewidth will be used for the rule thickness. +\newcommand\IEEEeqnarrayvrule[1][\arrayrulewidth]{\vrule\@width#1\relax} + +% creates a blank separator row +% usage: \IEEEeqnarrayseprow[separation length][font size commands] +% default is \IEEEeqnarrayseprow[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprow{\relax\@ifnextchar[{\@IEEEeqnarrayseprow}{\@IEEEeqnarrayseprow[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprow[#1]}{\@@IEEEeqnarrayseprow[#1][\relax]}} +\def\@@IEEEeqnarrayseprow[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\@IEEEeqnarrayhoptolastcolumn\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + +% creates a blank separator row, but omits all the column templates +% usage: \IEEEeqnarrayseprowcut[separation length][font size commands] +% default is \IEEEeqnarrayseprowcut[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayseprowcut}{\@IEEEeqnarrayseprowcut[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprowcut[#1]}{\@@IEEEeqnarrayseprowcut[#1][\relax]}} +\def\@@IEEEeqnarrayseprowcut[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + + + +% draws a single rule across all the columns optional +% argument determines the rule width, \arrayrulewidth is the default +% updates column counter as needed and turns off struts +% usage: \IEEEeqnarrayrulerow[rule line thickness] +\def\IEEEeqnarrayrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayrulerow}{\@IEEEeqnarrayrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarrayrulerow[#1]{\leaders\hrule height#1\hfil\relax% put in our rule +% turn off any struts +\IEEEeqnarraystrutsize{0pt}{0pt}[\relax]\relax} + + +% draws a double rule by using a single rule row, a separator row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerow}{\@IEEEeqnarraydblrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerow[#1]}% +{\@@IEEEeqnarraydblrulerow[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerow[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]\relax% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprow[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprow[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + +% draws a double rule by using a single rule row, a separator (cutting) row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerowcut}{\@IEEEeqnarraydblrulerowcut[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerowcut[#1]}% +{\@@IEEEeqnarraydblrulerowcut[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerowcut[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprowcut[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprowcut[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + + + +% inserts a full row's worth of &'s +% relies on \@IEEEeqnnumcols to provide the correct number of columns +% uses \@IEEEtrantmptoksA, \count0 as scratch registers +\def\@IEEEeqnarrayhoptolastcolumn{\@IEEEtrantmptoksA={}\count0=1\relax% +\loop% add cols if the user did not use them all +\ifnum\count0<\@IEEEeqnnumcols\relax% +\@IEEEappendtoksA{&}% +\advance\count0 by 1\relax% update the col count +\repeat% +\the\@IEEEtrantmptoksA%execute the &'s +} + + + +\newif\if@IEEEeqnarrayISinner % flag to indicate if we are within the lines +\@IEEEeqnarrayISinnerfalse % of an IEEEeqnarray - after the IEEEeqnarraydecl + +\edef\@IEEEeqnarrayTHEstrutheight{0pt} % height and depth of IEEEeqnarray struts +\edef\@IEEEeqnarrayTHEstrutdepth{0pt} + +\edef\@IEEEeqnarrayTHEmasterstrutheight{0pt} % default height and depth of +\edef\@IEEEeqnarrayTHEmasterstrutdepth{0pt} % struts within an IEEEeqnarray + +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{0pt} % saved master strut height +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{0pt} % and depth + +\newif\if@IEEEeqnarrayusemasterstrut % flag to indicate that the master strut value +\@IEEEeqnarrayusemasterstruttrue % is to be used + + + +% saves the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutsave{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% save values +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{\the\dimen2}} + +% restores the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutrestore{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutHSAVE\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutDSAVE\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}} + + +% globally restores the strut height and depth to the +% master values and sets the master strut flag to true +\def\@IEEEeqnarraystrutreset{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\xdef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\global\@IEEEeqnarrayusemasterstruttrue} + + +% if the master strut is not to be used, make the current +% values of \@IEEEeqnarrayTHEstrutheight, \@IEEEeqnarrayTHEstrutdepth +% and the use master strut flag, global +% this allows user strut commands issued in the last column to be carried +% into the isolation/strut column +\def\@IEEEeqnarrayglobalizestrutstatus{\relax% +\if@IEEEeqnarrayusemasterstrut\else% +\xdef\@IEEEeqnarrayTHEstrutheight{\@IEEEeqnarrayTHEstrutheight}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\@IEEEeqnarrayTHEstrutdepth}% +\global\@IEEEeqnarrayusemasterstrutfalse% +\fi} + + + +% usage: \IEEEeqnarraystrutsize{height}{depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, sets the height +% and depth of both the master and local struts. If called inside +% an IEEEeqnarray line, sets the height and depth of the local strut +% only and sets the flag to indicate the use of the local strut +% values. If the height or depth is left blank, 0.7\normalbaselineskip +% and 0.3\normalbaselineskip will be used, respectively. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsize#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsize{#1}{#2}}{\@IEEEeqnarraystrutsize{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsize#1#2[#3]{\def\@IEEEeqnarraystrutsizeARG{#1}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.7\normalbaselineskip}}% +\skip0=\skip3\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1\relax}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizeARG{#2}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.3\normalbaselineskip}}% +\skip2=\skip3\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2\relax}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% usage: \IEEEeqnarraystrutsizeadd{added height}{added depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, adds the given height +% and depth to both the master and local struts. +% If called inside an IEEEeqnarray line, adds the given height and depth +% to the local strut only and sets the flag to indicate the use +% of the local strut values. +% In both cases, if a height or depth is left blank, 0pt is used instead. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsizeadd#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsizeadd{#1}{#2}}{\@IEEEeqnarraystrutsizeadd{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsizeadd#1#2[#3]{\def\@IEEEeqnarraystrutsizearg{#1}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip0=0pt\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizearg{#2}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip2=0pt\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local and master strut sizes +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% allow user a way to see the struts +\newif\ifIEEEvisiblestruts +\IEEEvisiblestrutsfalse + +% inserts an invisible strut using the master or local strut values +% uses scratch registers \skip0, \skip2, \dimen0, \dimen2 +\def\@IEEEeqnarrayinsertstrut{\relax% +\if@IEEEeqnarrayusemasterstrut +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +\else% +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +% allow user to see struts if desired +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0pt height\dimen0 depth\dimen2\relax\fi} + + +% creates an invisible strut, useable even outside \IEEEeqnarray +% if \IEEEvisiblestrutstrue, the strut will be visible and 0.2pt wide. +% usage: \IEEEstrut[height][depth][font size commands] +% default is \IEEEstrut[0.7\normalbaselineskip][0.3\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \dimen0, \dimen2, \skip0, \skip2 +\def\IEEEstrut{\relax\@ifnextchar[{\@IEEEstrut}{\@IEEEstrut[0.7\normalbaselineskip]}} +\def\@IEEEstrut[#1]{\relax\@ifnextchar[{\@@IEEEstrut[#1]}{\@@IEEEstrut[#1][0.3\normalbaselineskip]}} +\def\@@IEEEstrut[#1][#2]{\relax\@ifnextchar[{\@@@IEEEstrut[#1][#2]}{\@@@IEEEstrut[#1][#2][\relax]}} +\def\@@@IEEEstrut[#1][#2][#3]{\mbox{#3\relax% +\def\@IEEEstrutARG{#1}% +\ifx\@IEEEstrutARG\@empty% +\skip0=0.7\normalbaselineskip\relax% +\else% +\skip0=#1\relax% +\fi% +\def\@IEEEstrutARG{#2}% +\ifx\@IEEEstrutARG\@empty% +\skip2=0.3\normalbaselineskip\relax% +\else% +\skip2=#2\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0.0pt height\dimen0 depth\dimen2\relax\fi}} + + +% enables strut mode by setting a default strut size and then zeroing the +% \baselineskip, \lineskip, \lineskiplimit and \jot +\def\IEEEeqnarraystrutmode{\IEEEeqnarraystrutsize{0.7\normalbaselineskip}{0.3\normalbaselineskip}[\relax]% +\baselineskip=0pt\lineskip=0pt\lineskiplimit=0pt\jot=0pt} + + +% equation and subequation forms to use to setup hyperref's \@currentHref +\def\@IEEEtheHrefequation{equation.\theHequation} +\def\@IEEEtheHrefsubequation{equation.\theHequation\alph{IEEEsubequation}} + + +\def\IEEEeqnarray{\@IEEEeqnumpersisttrue\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\def\endIEEEeqnarray{\end@IEEEeqnarray} + +\@namedef{IEEEeqnarray*}{\@IEEEeqnumpersistfalse\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\@namedef{endIEEEeqnarray*}{\end@IEEEeqnarray} + + +% \IEEEeqnarray is an enhanced \eqnarray. +% The star form defaults to not putting equation numbers at the end of each row. +% usage: \IEEEeqnarray[decl]{cols} +\def\@IEEEeqnarray{\relax\@ifnextchar[{\@@IEEEeqnarray}{\@@IEEEeqnarray[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarray[#1]{\begingroup\IEEEnormalcatcodes\@@@IEEEeqnarray[#1]} +\def\@@@IEEEeqnarray[#1]#2{\endgroup + % default to showing the equation number or not based on whether or not + % the star form was involked + \if@IEEEeqnumpersist\global\@eqnswtrue + \else% not the star form + \global\@eqnswfalse + \fi% if star form + % provide a basic hyperref \theHequation if this has not already been setup (hyperref not loaded, or no section counter) + \@ifundefined{theHequation}{\def\theHequation{\arabic{equation}}}{}\relax + % provide dummy hyperref commands in case hyperref is not loaded + \providecommand{\Hy@raisedlink}[1]{}\relax + \providecommand{\hyper@anchorstart}[1]{}\relax + \providecommand{\hyper@anchorend}{}\relax + \providecommand{\@currentHref}{}\relax + \@IEEEeqnumpreadvfalse% reset eqnpreadv flag + \@IEEEsubeqnumpreadvfalse% reset subeqnpreadv flag + \@IEEEeqnarrayISinnerfalse% not yet within the lines of the halign + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax + \lineskiplimit=0pt\relax + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + \@advanceIEEEeqncolcnttrue% advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + %V1.8 Here we preadvance to the next equation number. + % If the user later wants a continued subequation, we can roll back. + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation% + \stepcounter{equation}\@IEEEeqnumpreadvtrue% advance equation counter before first line + \setcounter{IEEEsubequation}{0}% no subequation yet + \let\@IEEEcurrentlabelsave\@currentlabel% save current label as we later change it globally + \let\@IEEEcurrentHrefsave\@currentHref% save current href label as we later change it globally + \def\@currentlabel{\p@equation\theequation}% redefine the ref label + \def\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \IEEEeqnarraydecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarraycr% replace newline with one that can put in eqn. numbers + \global\@IEEEeqncolcnt\z@% col. count = 0 for first line + \@IEEEbuildpreamble{#2}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % put in the column for the equation number + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % advance the \@IEEEeqncolcnt for the isolation col, this helps with error checking + \@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the isolation column + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % advance the \@IEEEeqncolcnt for the equation number col, this helps with error checking + \@IEEEappendtoksA{&\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the equation number col to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\hb@xt@\z@\bgroup\hss\the\toks0\egroup}% + % note \@IEEEeqnnumcols does not count the equation col or isolation col + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the display alignment + \@IEEEeqnarrayISinnertrue% commands are now within the lines + $$\everycr{}\halign to\displaywidth\bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% enter isolation/strut column (or the next column if the user did not use +% every column), record the strut status, complete the columns, do the strut if needed, +% restore counters (to backout any equation setup for a next line that was never used) +% to their correct values and exit +\def\end@IEEEeqnarray{\@IEEEeqnarrayglobalizestrutstatus&\@@IEEEeqnarraycr\egroup +\if@IEEEsubeqnumpreadv\global\advance\c@IEEEsubequation\m@ne\fi +\if@IEEEeqnumpreadv\global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\fi +\global\let\@currentlabel\@IEEEcurrentlabelsave% restore current label +\global\let\@currentHref\@IEEEcurrentHrefsave% restore current href label +$$\@ignoretrue} + + +% IEEEeqnarray uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\*[vskip amount] +% These "cr" macros are modified versions of those for LaTeX2e's eqnarray +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the next column +% as there is an isolation/strut column after the user's columns +\def\@IEEEeqnarraycr{\@IEEEeqnarrayglobalizestrutstatus&% save strut status and advance to next column + {\ifnum0=`}\fi + \@ifstar{% + \global\@eqpen\@M\@IEEEeqnarrayYCR + }{% + \global\@eqpen\interdisplaylinepenalty \@IEEEeqnarrayYCR + }% +} + +\def\@IEEEeqnarrayYCR{\@testopt\@IEEEeqnarrayXCR\z@skip} + +\def\@IEEEeqnarrayXCR[#1]{% + \ifnum0=`{\fi}% + \@@IEEEeqnarraycr + \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}% + +\def\@@IEEEeqnarraycr{\@IEEEtrantmptoksA={}% clear token register + \advance\@IEEEeqncolcnt by -1\relax% adjust col count because of the isolation column + \ifnum\@IEEEeqncolcnt>\@IEEEeqnnumcols\relax + \@IEEEclspkgerror{Too many columns within the IEEEeqnarray\MessageBreak + environment}% + {Use fewer \string &'s or put more columns in the IEEEeqnarray column\MessageBreak + specifications.}\relax% + \else + \loop% add cols if the user did not use them all + \ifnum\@IEEEeqncolcnt<\@IEEEeqnnumcols\relax + \@IEEEappendtoksA{&}% + \advance\@IEEEeqncolcnt by 1\relax% update the col count + \repeat + % this number of &'s will take us the the isolation column + \fi + % execute the &'s + \the\@IEEEtrantmptoksA% + % handle the strut/isolation column + \@IEEEeqnarrayinsertstrut% do the strut if needed + \@IEEEeqnarraystrutreset% reset the strut system for next line or IEEEeqnarray + &% and enter the equation number column + \if@eqnsw% only if we display something + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% start a hyperref anchor + \global\@IEEEeqnumpreadvfalse\relax% displaying an equation number means + \global\@IEEEsubeqnumpreadvfalse\relax% the equation counters point to valid equations + % V1.8 Here we setup the counters, currentlabel and status for what would be the *next* + % equation line as would be the case under the current settings. However, there are two problems. + % One problem is that there might not ever be a next line. The second problem is that the user + % may later alter the meaning of a line with commands such as \IEEEyessubnumber. So, to handle + % these cases we have to record the current values of the (sub)equation counters and revert back + % to them if the next line is changed or never comes. The \if@IEEEeqnumpreadv, \if@IEEEsubeqnumpreadv + % and \@IEEEsubeqnnumrollback stuff tracks this. + % The logic to handle all this is surprisingly complex, but a nice feature of the approach here is + % that the equation counters and labels remain valid for what the line would be unless a + % \IEEEyessubnumber et al. later changes it. So, any hyperref links are always correct. + \ifnum\c@IEEEsubequation>0\relax% handle subequation + \theIEEEsubequationdis\relax + \if@IEEEsubeqnumpersist% setup for default type of next line + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \else% display a standard equation number + \theequationdis\relax + \setcounter{IEEEsubequation}{0}\relax% not really needed + \if@IEEEsubeqnumpersist% setup for default type of next line + % subequations that follow plain equations carry the same equation number e.g, 5, 5a rather than 5, 6a + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \fi% + \Hy@raisedlink{\hyper@anchorend}% end hyperref anchor + \fi% fi only if we display something + % reset the flags to indicate the default preferences of the display of equation numbers + \if@IEEEeqnumpersist\global\@eqnswtrue\else\global\@eqnswfalse\fi + \if@IEEEsubeqnumpersist\global\@eqnswtrue\fi% ditto for the subequation flag + % reset the number of columns the user actually used + \global\@IEEEeqncolcnt\z@\relax + % the real end of the line + \cr} + + + + + +% \IEEEeqnarraybox is like \IEEEeqnarray except the box form puts everything +% inside a vtop, vbox, or vcenter box depending on the letter in the second +% optional argument (t,b,c). Vbox is the default. Unlike \IEEEeqnarray, +% equation numbers are not displayed and \IEEEeqnarraybox can be nested. +% \IEEEeqnarrayboxm is for math mode (like \array) and does not put the vbox +% within an hbox. +% \IEEEeqnarrayboxt is for text mode (like \tabular) and puts the vbox within +% a \hbox{$ $} construct. +% \IEEEeqnarraybox will auto detect whether to use \IEEEeqnarrayboxm or +% \IEEEeqnarrayboxt depending on the math mode. +% The third optional argument specifies the width this box is to be set to - +% natural width is the default. +% The * forms do not add \jot line spacing +% usage: \IEEEeqnarraybox[decl][pos][width]{cols} +\def\IEEEeqnarrayboxm{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxm{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxm*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxm*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarrayboxt{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxt{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxt*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxt*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarraybox{\@IEEEeqnarrayboxnojotfalse\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\def\endIEEEeqnarraybox{\end@IEEEeqnarraybox} + +\@namedef{IEEEeqnarraybox*}{\@IEEEeqnarrayboxnojottrue\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarraybox*}{\end@IEEEeqnarraybox} + +% flag to indicate if the \IEEEeqnarraybox needs to put things into an hbox{$ $} +% for \vcenter in non-math mode +\newif\if@IEEEeqnarrayboxHBOXSW% +\@IEEEeqnarrayboxHBOXSWfalse + +\def\@IEEEeqnarraybox{\relax\@ifnextchar[{\@@IEEEeqnarraybox}{\@@IEEEeqnarraybox[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarraybox[#1]{\relax\begingroup\IEEEnormalcatcodes\@ifnextchar[{\@@@IEEEeqnarraybox[#1]}{\@@@IEEEeqnarraybox[#1][b]}} +\def\@@@IEEEeqnarraybox[#1][#2]{\relax\@ifnextchar[{\@@@@IEEEeqnarraybox[#1][#2]}{\@@@@IEEEeqnarraybox[#1][#2][\relax]}} + +% #1 = decl; #2 = t,b,c; #3 = width, #4 = col specs +\def\@@@@IEEEeqnarraybox[#1][#2][#3]#4{\endgroup\@IEEEeqnarrayISinnerfalse % not yet within the lines of the halign + \@IEEEeqnarraymasterstrutsave% save current master strut values + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax% + \lineskiplimit=0pt\relax% + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + % the default end glues are zero for an \IEEEeqnarraybox + \edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPzero}% default start glue + \edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPzero}% default end glue + \edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + \@advanceIEEEeqncolcntfalse% do not advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + \IEEEeqnarrayboxdecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarrayboxcr% replace newline with one that allows optional spacing + \@IEEEbuildpreamble{#4}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % add an isolation column to the preamble to stop \\'s {} from getting into the last col + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % add the isolation column to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the alignment + \everycr{}% + % use only the very first token to determine the positioning + \@IEEEextracttoken{#2}\relax + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarraybox position specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi + % \@IEEEextractedtoken has the first token, the rest are ignored + % if we need to put things into and hbox and go into math mode, do so now + \if@IEEEeqnarrayboxHBOXSW \leavevmode \hbox \bgroup $\fi% + % use the appropriate vbox type + \if\@IEEEextractedtoken t\relax\vtop\else\if\@IEEEextractedtoken c\relax% + \vcenter\else\vbox\fi\fi\bgroup% + \@IEEEeqnarrayISinnertrue% commands are now within the lines + \ifx#3\relax\halign\else\halign to #3\relax\fi% + \bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% carry strut status and enter the isolation/strut column, +% exit from math mode if needed, and exit +\def\end@IEEEeqnarraybox{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +\@IEEEeqnarraymasterstrutrestore% restore the previous master strut values +% reset the strut system for next IEEEeqnarray +% (sets local strut values back to previous master strut values) +\@IEEEeqnarraystrutreset% +% ensure last line, exit from halign, close vbox +\crcr\egroup\egroup% +% exit from math mode and close hbox if needed +\if@IEEEeqnarrayboxHBOXSW $\egroup\fi} + + + +% IEEEeqnarraybox uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\[vskip amount] +% This "cr" macros are modified versions those for LaTeX2e's eqnarray +% For IEEEeqnarraybox, \\* is the same as \\ +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the isolation/strut column +% carry strut status into isolation/strut column +\def\@IEEEeqnarrayboxcr{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +% reset the strut system for next line or IEEEeqnarray +\@IEEEeqnarraystrutreset% +{\ifnum0=`}\fi% +\@ifstar{\@IEEEeqnarrayboxYCR}{\@IEEEeqnarrayboxYCR}} + +% test and setup the optional argument to \\[] +\def\@IEEEeqnarrayboxYCR{\@testopt\@IEEEeqnarrayboxXCR\z@skip} + +% IEEEeqnarraybox does not automatically increase line spacing by \jot +\def\@IEEEeqnarrayboxXCR[#1]{\ifnum0=`{\fi}% +\cr\noalign{\if@IEEEeqnarrayboxnojot\else\vskip\jot\fi\vskip#1\relax}} + + + +% usage: \@IEEEbuildpreamble{column specifiers} +% starts the halign preamble build +% the assembled preamble is put in \@IEEEtrantmptoksA +\def\@IEEEbuildpreamble#1{\@IEEEtrantmptoksA={}% clear token register +\let\@IEEEBPcurtype=u%current column type is not yet known +\let\@IEEEBPprevtype=s%the previous column type was the start +\let\@IEEEBPnexttype=u%next column type is not yet known +% ensure these are valid +\def\@IEEEBPcurglue={0pt plus 0pt minus 0pt}% +\def\@IEEEBPcurcolname{@IEEEdefault}% name of current column definition +% currently acquired numerically referenced glue +% use a name that is easier to remember +\let\@IEEEBPcurnum=\@IEEEtrantmpcountA% +\@IEEEBPcurnum=0% +% tracks number of columns in the preamble +\@IEEEeqnnumcols=0% +% record the default end glues +\edef\@IEEEBPstartglue{\@IEEEeqnarraycolSEPdefaultstart}% +\edef\@IEEEBPendglue{\@IEEEeqnarraycolSEPdefaultend}% +\edef\@IEEEedefMACRO{#1}\relax% fully expand the preamble to support macro containers +% now parse the user's column specifications +% \ignorespaces is used as a delimiter, need at least one trailing \relax because +% \@@IEEEbuildpreamble looks into the future +\expandafter\@@IEEEbuildpreamble\@IEEEedefMACRO\ignorespaces\relax\relax} + + +% usage: \@@IEEEbuildpreamble{current column}{next column} +% parses and builds the halign preamble +\def\@@IEEEbuildpreamble#1#2{\let\@@nextIEEEbuildpreamble=\@@IEEEbuildpreamble% +% use only the very first token to check the end +\@IEEEextracttokengroups{#1}\relax +\ifx\@IEEEextractedfirsttoken\ignorespaces\let\@@nextIEEEbuildpreamble=\@@IEEEfinishpreamble\else% +% identify current and next token type +\@IEEEgetcoltype{#1}{\@IEEEBPcurtype}{1}% current, error on invalid +\@IEEEgetcoltype{#2}{\@IEEEBPnexttype}{0}% next, no error on invalid next +% if curtype is a glue, get the glue def +\if\@IEEEBPcurtype g\@IEEEgetcurglue{#1}{\@IEEEBPcurglue}\fi% +% if curtype is a column, get the column def and set the current column name +\if\@IEEEBPcurtype c\@IEEEgetcurcol{#1}\fi% +% if curtype is a numeral, acquire the user defined glue +\if\@IEEEBPcurtype n\@IEEEprocessNcol{#1}\fi% +% process the acquired glue +\if\@IEEEBPcurtype g\@IEEEprocessGcol\fi% +% process the acquired col +\if\@IEEEBPcurtype c\@IEEEprocessCcol\fi% +% ready prevtype for next col spec. +\let\@IEEEBPprevtype=\@IEEEBPcurtype% +% be sure and put back the future token(s) as a group +\fi\@@nextIEEEbuildpreamble{#2}} + + +% usage: \@@IEEEfinishpreamble{discarded} +% executed just after preamble build is completed +% warn about zero cols, and if prevtype type = u, put in end tabskip glue +% argument is not used +\def\@@IEEEfinishpreamble#1{\ifnum\@IEEEeqnnumcols<1\relax +\@IEEEclspkgerror{No column specifiers declared for IEEEeqnarray}% +{At least one column type must be declared for each IEEEeqnarray.}% +\fi%num cols less than 1 +%if last type undefined, set default end tabskip glue +\if\@IEEEBPprevtype u\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue}\fi} + + +% usage: \@IEEEgetcoltype{col specifier}{\output}{error more} +% Identify and return the column specifier's type code in the given +% \output macro: +% n = number +% g = glue (any other char in catagory 12) +% c = letter +% e = \ignorespaces (end of sequence) +% u = undefined +% error mode: 0 = no error message, 1 = error on invalid char +\def\@IEEEgetcoltype#1#2#3{% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +% \@IEEEextractedtoken has the first token, the rest are discarded +\let#2=u\relax% assume invalid until know otherwise +\ifx\@IEEEextractedtoken\ignorespaces\let#2=e\else +\ifcat\@IEEEextractedtoken\relax\else% screen out control sequences +\if0\@IEEEextractedtoken\let#2=n\else +\if1\@IEEEextractedtoken\let#2=n\else +\if2\@IEEEextractedtoken\let#2=n\else +\if3\@IEEEextractedtoken\let#2=n\else +\if4\@IEEEextractedtoken\let#2=n\else +\if5\@IEEEextractedtoken\let#2=n\else +\if6\@IEEEextractedtoken\let#2=n\else +\if7\@IEEEextractedtoken\let#2=n\else +\if8\@IEEEextractedtoken\let#2=n\else +\if9\@IEEEextractedtoken\let#2=n\else +\ifcat,\@IEEEextractedtoken\let#2=g\relax +\else\ifcat a\@IEEEextractedtoken\let#2=c\relax\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +\if#2u\relax +\if0\noexpand#3\relax\else\@IEEEclspkgerror{Invalid character in column specifications}% +{Only letters, numerals and certain other symbols are allowed \MessageBreak +as IEEEeqnarray column specifiers.}\fi\fi} + + +% usage: \@IEEEgetcurcol{col specifier} +% verify the letter referenced column exists +% and return its name in \@IEEEBPcurcolname +% if column specifier is invalid, use the default column @IEEEdefault +\def\@IEEEgetcurcol#1{\expandafter\ifx\csname @IEEEeqnarraycolDEF#1\endcsname\@IEEEeqnarraycolisdefined% +\def\@IEEEBPcurcolname{#1}\else% invalid column name +\@IEEEclspkgerror{Invalid column type "#1" in column specifications.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\def\@IEEEBPcurcolname{@IEEEdefault}\fi} + + +% usage: \@IEEEgetcurglue{glue specifier}{\output} +% identify the predefined (punctuation) glue value +% and return it in the given output macro +\def\@IEEEgetcurglue#1#2{% +% ! = \! (neg small) -0.16667em (-3/18 em) +% , = \, (small) 0.16667em ( 3/18 em) +% : = \: (med) 0.22222em ( 4/18 em) +% ; = \; (large) 0.27778em ( 5/18 em) +% ' = \quad 1em +% " = \qquad 2em +% . = 0.5\arraycolsep +% / = \arraycolsep +% ? = 2\arraycolsep +% * = 1fil +% + = \@IEEEeqnarraycolSEPcenter +% - = \@IEEEeqnarraycolSEPzero +% Note that all em values are referenced to the math font (textfont2) fontdimen6 +% value for 1em. +% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +\ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarray predefined inter-column glue type specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax +\fi +% get the math font 1em value +% LaTeX2e's NFSS2 does not preload the fonts, but \IEEEeqnarray needs +% to gain access to the math (\textfont2) font's spacing parameters. +% So we create a bogus box here that uses the math font to ensure +% that \textfont2 is loaded and ready. If this is not done, +% the \textfont2 stuff here may not work. +% Thanks to Bernd Raichle for his 1997 post on this topic. +{\setbox0=\hbox{$\displaystyle\relax$}}% +% fontdimen6 has the width of 1em (a quad). +\@IEEEtrantmpdimenA=\fontdimen6\textfont2\relax% +% identify the glue value based on the first token +% we discard anything after the first +\if!\@IEEEextractedtoken\@IEEEtrantmpdimenA=-0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if,\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if:\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.22222\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if;\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.27778\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if'\@IEEEextractedtoken\@IEEEtrantmpdimenA=1\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if"\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if.\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.5\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if/\@IEEEextractedtoken\edef#2{\the\arraycolsep}\else +\if?\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if *\@IEEEextractedtoken\edef#2{0pt plus 1fil minus 0pt}\else +\if+\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPcenter}\else +\if-\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPzero}\else +\edef#2{\@IEEEeqnarraycolSEPzero}% +\@IEEEclspkgerror{Invalid predefined inter-column glue type "#1" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{Only !,:;'"./?*+ and - are valid predefined glue types in the\MessageBreak +IEEEeqnarray column specifications.}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + + +% usage: \@IEEEprocessNcol{digit} +% process a numerical digit from the column specification +% and look up the corresponding user defined glue value +% can transform current type from n to g or a as the user defined glue is acquired +\def\@IEEEprocessNcol#1{\if\@IEEEBPprevtype g% +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue, future digits will be discarded +\@IEEEBPcurnum=0\relax% +\else% if we previously aborted a glue +\if\@IEEEBPprevtype a\@IEEEBPcurnum=0\let\@IEEEBPcurtype=a%maintain digit abortion +\else%acquire this number +% save the previous type before the numerical digits started +\if\@IEEEBPprevtype n\else\let\@IEEEBPprevsavedtype=\@IEEEBPprevtype\fi% +\multiply\@IEEEBPcurnum by 10\relax% +\advance\@IEEEBPcurnum by #1\relax% add in number, \relax is needed to stop TeX's number scan +\if\@IEEEBPnexttype n\else%close acquisition +\expandafter\ifx\csname @IEEEeqnarraycolSEPDEF\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname\@IEEEeqnarraycolisdefined% +\edef\@IEEEBPcurglue{\csname @IEEEeqnarraycolSEP\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname}% +\else%user glue not defined +\@IEEEclspkgerror{Invalid user defined inter-column glue type "\number\@IEEEBPcurnum" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{You must define all IEEEeqnarray numerical inter-column glue types via\MessageBreak +\string\IEEEeqnarraydefcolsep \space before they are used in column specifications.}% +\edef\@IEEEBPcurglue{\@IEEEeqnarraycolSEPzero}% +\fi% glue defined or not +\let\@IEEEBPcurtype=g% change the type to reflect the acquired glue +\let\@IEEEBPprevtype=\@IEEEBPprevsavedtype% restore the prev type before this number glue +\@IEEEBPcurnum=0\relax%ready for next acquisition +\fi%close acquisition, get glue +\fi%discard or acquire number +\fi%prevtype glue or not +} + + +% process an acquired glue +% add any acquired column/glue pair to the preamble +\def\@IEEEprocessGcol{\if\@IEEEBPprevtype a\let\@IEEEBPcurtype=a%maintain previous glue abortions +\else +% if this is the start glue, save it, but do nothing else +% as this is not used in the preamble, but before +\if\@IEEEBPprevtype s\edef\@IEEEBPstartglue{\@IEEEBPcurglue}% +\else%not the start glue +\if\@IEEEBPprevtype g%ignore if back to back glues +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue +\else% not a back to back glue +\if\@IEEEBPprevtype c\relax% if the previoustype was a col, add column/glue pair to preamble +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column defintion into the preamble, being careful not to expand +% the column definition +\@IEEEappendtoksA{\tabskip=\@IEEEBPcurglue}% +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\else% error: non-start glue with no pending column +\@IEEEclspkgerror{Inter-column glue specifier without a prior column\MessageBreak +type in the column specifications. Ignoring this glue\MessageBreak +specifier}% +{Except for the first and last positions, glue can be placed only\MessageBreak +between column types.}% +\let\@IEEEBPcurtype=a% abort this glue +\fi% previous was a column +\fi% back-to-back glues +\fi% is start column glue +\fi% prev type not a +} + + +% process an acquired letter referenced column and, if necessary, add it to the preamble +\def\@IEEEprocessCcol{\if\@IEEEBPnexttype g\else +\if\@IEEEBPnexttype n\else +% we have a column followed by something other than a glue (or numeral glue) +% so we must add this column to the preamble now +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi%col separator for those after the first +\if\@IEEEBPnexttype e\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue\relax}\else%put in end glue +\@IEEEappendtoksA{\tabskip=\@IEEEeqnarraycolSEPdefaultmid\relax}\fi% or default mid glue +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column definition into the preamble, being careful not to expand +% the column definition +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\fi%next type not numeral +\fi%next type not glue +} + + +%% +%% END OF IEEEeqnarray DEFINITIONS +%% + + + + + +% set up the running headers and footers +% +% header and footer font and size specifications +\def\@IEEEheaderstyle{\normalfont\scriptsize} +\def\@IEEEfooterstyle{\normalfont\scriptsize} +% +% compsoc uses sans-serif headers and footers +\ifCLASSOPTIONcompsoc + \def\@IEEEheaderstyle{\normalfont\sffamily\scriptsize} + \def\@IEEEfooterstyle{\normalfont\sffamily\scriptsize} +\fi + + +% standard page style, ps@headings +\def\ps@headings{% default to standard twoside headers, no footers +% will change later if the mode requires otherwise +\def\@oddhead{\hbox{}\@IEEEheaderstyle\rightmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +\ifCLASSOPTIONtechnote + % technote twoside + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\fi +\ifCLASSOPTIONdraftcls + % draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax +\fi +% oneside +\if@twoside\else + % standard one side headers + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \let\@evenhead\@empty + \ifCLASSOPTIONdraftcls + % oneside draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \let\@evenfoot\@empty + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi +% turn off footers for draftclsnofoot +\ifCLASSOPTIONdraftclsnofoot + \let\@oddfoot\@empty + \let\@evenfoot\@empty +\fi} + + +% title page style, ps@IEEEtitlepagestyle +\def\ps@IEEEtitlepagestyle{% default title page headers, no footers +\def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for title pages that are using a pubid + % do not repeat pubid on the title page if using a peer review cover page + \ifCLASSOPTIONpeerreview\else + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi} + + +% peer review cover page style, ps@IEEEpeerreviewcoverpagestyle +\def\ps@IEEEpeerreviewcoverpagestyle{% default peer review cover no headers, no footers +\let\@oddhead\@empty +\let\@evenhead\@empty +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for peer review cover pages that are using a pubid + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi +\fi} + + + +%% Defines the command for putting the header. +%% Note that all the text is forced into uppercase, if you have some text +%% that needs to be in lower case, for instance et. al., then either manually +%% set \leftmark and \rightmark or use \MakeLowercase{et. al.} within the +%% arguments to \markboth. +%% V1.7b add \protect to work with Babel +\def\markboth#1#2{\def\leftmark{\MakeUppercase{\protect#1}}% +\def\rightmark{\MakeUppercase{\protect#2}}} + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + + + + +%% CITATION AND BIBLIOGRAPHY COMMANDS +%% +%% V1.6 no longer supports the older, nonstandard \shortcite and \citename setup stuff +% +% +% Modify Latex2e \@citex to separate citations with "], [" +\def\@citex[#1]#2{% + \let\@citea\@empty + \@cite{\@for\@citeb:=#2\do + {\@citea\def\@citea{], [}% + \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi + \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\hbox{\csname b@\@citeb\endcsname}}}}{#1}} + +% V1.6 we create hooks for the optional use of Donald Arseneau's +% cite.sty package. cite.sty is "smart" and will notice that the +% following format controls are already defined and will not +% redefine them. The result will be the proper sorting of the +% citation numbers and auto detection of 3 or more entry "ranges" - +% all in IEEE style: [1], [2], [5]--[7], [12] +% This also allows for an optional note, i.e., \cite[mynote]{..}. +% If the \cite with note has more than one reference, the note will +% be applied to the last of the listed references. It is generally +% desired that if a note is given, only one reference is listed in +% that \cite. +% Thanks to Mr. Arseneau for providing the required format arguments +% to produce the IEEE style. +\def\citepunct{], [} +\def\citedash{]--[} + +% V1.7 default to using same font for urls made by url.sty +\AtBeginDocument{\csname url@samestyle\endcsname} + +% V1.6 class files should always provide these +\def\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +% V1.8b article.cls is now providing these too +% we do not use \@mkboth, nor alter the page style +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \twocolumn[\section*{\indexname}]% + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \z@ + \columnsep 35\p@ + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + + + +% Provide support for the control entries of IEEEtran.bst V1.00 and later. +% V1.7 optional argument allows for a different aux file to be specified in +% order to handle multiple bibliographies. For example, with multibib.sty: +% \newcites{sec}{Secondary Literature} +% \bstctlcite[@auxoutsec]{BSTcontrolhak} +\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +\def\@bstctlcite[#1]#2{\@bsphack + \@for\@citeb:=#2\do{% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% + \@esphack} + +% \IEEEnoauxwrite{} allows for citations that do not add to or affect +% the order of the existing citation list. Can be useful for \cite +% within \thanks{}. +\DeclareRobustCommand{\IEEEnoauxwrite}[1]{\relax +\if@filesw +\@fileswfalse +#1\relax\relax\relax\relax\relax +\@fileswtrue +\else +#1\relax\relax\relax\relax\relax +\fi} + +% V1.6 provide a way for a user to execute a command just before +% a given reference number - used to insert a \newpage to balance +% the columns on the last page +\edef\@IEEEtriggerrefnum{0} % the default of zero means that + % the command is not executed +\def\@IEEEtriggercmd{\newpage} + +% allow the user to alter the triggered command +\long\def\IEEEtriggercmd#1{\long\def\@IEEEtriggercmd{#1}} + +% allow user a way to specify the reference number just before the +% command is executed +\def\IEEEtriggeratref#1{\@IEEEtrantmpcountA=#1% +\edef\@IEEEtriggerrefnum{\the\@IEEEtrantmpcountA}}% + +% trigger command at the given reference +\def\@IEEEbibitemprefix{\@IEEEtrantmpcountA=\@IEEEtriggerrefnum\relax% +\advance\@IEEEtrantmpcountA by -1\relax% +\ifnum\c@enumiv=\@IEEEtrantmpcountA\relax\@IEEEtriggercmd\relax\fi} + + +\def\@biblabel#1{[#1]} + +% compsoc journals and conferences left align the reference numbers +\@IEEEcompsoconly{\def\@biblabel#1{[#1]\hfill}} + +% controls bib item spacing +\def\IEEEbibitemsep{0pt plus .5pt} + +\@IEEEcompsocconfonly{\def\IEEEbibitemsep{0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}} + + +\def\thebibliography#1{\section*{\refname}% + \addcontentsline{toc}{section}{\refname}% + % V1.6 add some rubber space here and provide a command trigger + \footnotesize\vskip 0.3\baselineskip plus 0.1\baselineskip minus 0.1\baselineskip% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep\relax + \itemsep \IEEEbibitemsep\relax + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \let\@IEEElatexbibitem\bibitem% + \def\bibitem{\@IEEEbibitemprefix\@IEEElatexbibitem}% +\def\newblock{\hskip .11em plus .33em minus .07em}% +% originally: +% \sloppy\clubpenalty4000\widowpenalty4000% +% by adding the \interlinepenalty here, we make it more +% difficult, but not impossible, for LaTeX to break within a reference. +% The IEEE almost never breaks a reference (but they do it more often with +% technotes). You may get an underfull vbox warning around the bibliography, +% but the final result will be much more like what the IEEE will publish. +% MDS 11/2000 +\ifCLASSOPTIONtechnote\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty100% +\else\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty500\fi% + \sfcode`\.=1000\relax} +\let\endthebibliography=\endlist + + + + +% TITLE PAGE COMMANDS +% +% +% \IEEEmembership is used to produce the sublargesize italic font used to indicate author +% IEEE membership. compsoc uses a large size sans slant font +\def\IEEEmembership#1{{\@IEEEnotcompsoconly{\sublargesize}\normalfont\@IEEEcompsoconly{\sffamily}\textit{#1}}} + + +% \IEEEauthorrefmark{} produces a footnote type symbol to indicate author affiliation. +% When given an argument of 1 to 9, \IEEEauthorrefmark{} follows the standard LaTeX footnote +% symbol sequence convention. However, for arguments 10 and above, \IEEEauthorrefmark{} +% reverts to using lower case roman numerals, so it cannot overflow. Do note that you +% cannot use \footnotemark[] in place of \IEEEauthorrefmark{} within \author as the footnote +% symbols will have been turned off to prevent \thanks from creating footnote marks. +% \IEEEauthorrefmark{} produces a symbol that appears to LaTeX as having zero vertical +% height - this allows for a more compact line packing, but the user must ensure that +% the interline spacing is large enough to prevent \IEEEauthorrefmark{} from colliding +% with the text above. +% V1.7 make this a robust command +% V1.8 transmag uses an arabic author affiliation symbol +\ifCLASSOPTIONtransmag +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize #1}}} +\else +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or% + \mathsection\or \mathparagraph\or \|\or **\or \dagger\dagger% + \or \ddagger\ddagger \else\textsuperscript{\expandafter\romannumeral#1}\fi}}}} +\fi + + +% FONT CONTROLS AND SPACINGS FOR CONFERENCE MODE AUTHOR NAME AND AFFILIATION BLOCKS +% +% The default font styles for the author name and affiliation blocks (confmode) +\def\@IEEEauthorblockNstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} +\def\@IEEEauthorblockAstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\@IEEEcompsocconfonly{\itshape}\normalsize} +% The default if the user does not use an author block +\def\@IEEEauthordefaulttextstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} + +% adjustment spacing from title (or special paper notice) to author name blocks (confmode) +% can be negative +\def\@IEEEauthorblockconfadjspace{-0.25em} +% compsoc conferences need more space here +\@IEEEcompsocconfonly{\def\@IEEEauthorblockconfadjspace{0.75\@IEEEnormalsizeunitybaselineskip}} + +% spacing between name and affiliation blocks (confmode) +% This can be negative. +% The IEEE doesn't want any added spacing here, but I will leave these +% controls in place in case they ever change their mind. +% Personally, I like 0.75ex. +%\def\@IEEEauthorblockNtopspace{0.75ex} +%\def\@IEEEauthorblockAtopspace{0.75ex} +\def\@IEEEauthorblockNtopspace{0.0ex} +\def\@IEEEauthorblockAtopspace{0.0ex} +\ifCLASSOPTIONtransmag +% transmag uses one line of space above first affiliation block +\def\@IEEEauthorblockAtopspace{1\@IEEEnormalsizeunitybaselineskip} +\fi + +% baseline spacing within name and affiliation blocks (confmode) +% must be positive, spacings below certain values will make +% the position of line of text sensitive to the contents of the +% line above it i.e., whether or not the prior line has descenders, +% subscripts, etc. For this reason it is a good idea to keep +% these above 2.6ex +\def\@IEEEauthorblockNinterlinespace{2.6ex} +\def\@IEEEauthorblockAinterlinespace{2.75ex} + +% This tracks the required strut size. +% See the \@IEEEauthorhalign command for the actual default value used. +\def\@IEEEauthorblockXinterlinespace{2.7ex} + +% variables to retain font size and style across groups +% values given here have no effect as they will be overwritten later +\gdef\@IEEESAVESTATEfontsize{10} +\gdef\@IEEESAVESTATEfontbaselineskip{12} +\gdef\@IEEESAVESTATEfontencoding{OT1} +\gdef\@IEEESAVESTATEfontfamily{ptm} +\gdef\@IEEESAVESTATEfontseries{m} +\gdef\@IEEESAVESTATEfontshape{n} + +% saves the current font attributes +\def\@IEEEcurfontSAVE{\global\let\@IEEESAVESTATEfontsize\f@size% +\global\let\@IEEESAVESTATEfontbaselineskip\f@baselineskip% +\global\let\@IEEESAVESTATEfontencoding\f@encoding% +\global\let\@IEEESAVESTATEfontfamily\f@family% +\global\let\@IEEESAVESTATEfontseries\f@series% +\global\let\@IEEESAVESTATEfontshape\f@shape} + +% restores the saved font attributes +\def\@IEEEcurfontRESTORE{\fontsize{\@IEEESAVESTATEfontsize}{\@IEEESAVESTATEfontbaselineskip}% +\fontencoding{\@IEEESAVESTATEfontencoding}% +\fontfamily{\@IEEESAVESTATEfontfamily}% +\fontseries{\@IEEESAVESTATEfontseries}% +\fontshape{\@IEEESAVESTATEfontshape}% +\selectfont} + + +% variable to indicate if the current block is the first block in the column +\newif\if@IEEEprevauthorblockincol \@IEEEprevauthorblockincolfalse + + +% the command places a strut with height and depth = \@IEEEauthorblockXinterlinespace +% we use this technique to have complete manual control over the spacing of the lines +% within the halign environment. +% We set the below baseline portion at 30%, the above +% baseline portion at 70% of the total length. +% Responds to changes in the document's \baselinestretch +\def\@IEEEauthorstrutrule{\@IEEEtrantmpdimenA\@IEEEauthorblockXinterlinespace% +\@IEEEtrantmpdimenA=\baselinestretch\@IEEEtrantmpdimenA% +\rule[-0.3\@IEEEtrantmpdimenA]{0pt}{\@IEEEtrantmpdimenA}} + + +% blocks to hold the authors' names and affilations. +% Makes formatting easy for conferences +% +% use real definitions in conference mode +% name block +\def\IEEEauthorblockN#1{\relax\@IEEEauthorblockNstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}% disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockNtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockNinterlinespace}% +% input the author names +#1% +% end the row if the user did not already +\crcr} +% spacer row for names +\def\@IEEEauthorblockNtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockNtopspace}} +% +% affiliation block +\def\IEEEauthorblockA#1{\relax\@IEEEauthorblockAstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}%disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockAtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockAinterlinespace}% +% input the author affiliations +#1% +% end the row if the user did not already +\crcr +% V1.8 transmag does not use any additional affiliation spacing after the first author +\ifCLASSOPTIONtransmag\gdef\@IEEEauthorblockAtopspace{0pt}\fi} + +% spacer row for affiliations +\def\@IEEEauthorblockAtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockAtopspace}} + + +% allow papers to compile even if author blocks are used in modes other +% than conference or peerreviewca. For such cases, we provide dummy blocks. +\ifCLASSOPTIONconference +\else + \ifCLASSOPTIONpeerreviewca\else + % not conference, peerreviewca or transmag mode + \ifCLASSOPTIONtransmag\else + \def\IEEEauthorblockN#1{#1}% + \def\IEEEauthorblockA#1{#1}% + \fi + \fi +\fi + + + +% we provide our own halign so as not to have to depend on tabular +\def\@IEEEauthorhalign{\@IEEEauthordefaulttextstyle% default text style + \lineskip=0pt\relax% disable line spacing + \lineskiplimit=0pt\relax% + \baselineskip=0pt\relax% + \@IEEEcurfontSAVE% save the current font + \mathsurround\z@\relax% no extra spacing around math + \let\\\@IEEEauthorhaligncr% replace newline with halign friendly one + \tabskip=0pt\relax% no column spacing + \everycr{}% ensure no problems here + \@IEEEprevauthorblockincolfalse% no author blocks yet + \def\@IEEEauthorblockXinterlinespace{2.7ex}% default interline space + \vtop\bgroup%vtop box + \halign\bgroup&\relax\hfil\@IEEEcurfontRESTORE\relax ##\relax + \hfil\@IEEEcurfontSAVE\@IEEEauthorstrutrule\cr} + +% ensure last line, exit from halign, close vbox +\def\end@IEEEauthorhalign{\crcr\egroup\egroup} + +% handle bogus star form +\def\@IEEEauthorhaligncr{{\ifnum0=`}\fi\@ifstar{\@@IEEEauthorhaligncr}{\@@IEEEauthorhaligncr}} + +% test and setup the optional argument to \\[] +\def\@@IEEEauthorhaligncr{\@testopt\@@@IEEEauthorhaligncr\z@skip} + +% end the line and do the optional spacer +\def\@@@IEEEauthorhaligncr[#1]{\ifnum0=`{\fi}\cr\noalign{\vskip#1\relax}} + + + +% flag to prevent multiple \and warning messages +\newif\if@IEEEWARNand +\@IEEEWARNandtrue + +% if in conference or peerreviewca modes, we support the use of \and as \author is a +% tabular environment, otherwise we warn the user that \and is invalid +% outside of conference or peerreviewca modes. +\def\and{\relax} % provide a bogus \and that we will then override + +\renewcommand{\and}[1][\relax]{\if@IEEEWARNand\typeout{** WARNING: \noexpand\and is valid only + when in conference or peerreviewca}\typeout{modes (line \the\inputlineno).}\fi\global\@IEEEWARNandfalse} + +\ifCLASSOPTIONconference% +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +\ifCLASSOPTIONpeerreviewca +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +% V1.8 transmag uses conference author format +\ifCLASSOPTIONtransmag +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi + +% page clearing command +% based on LaTeX2e's \cleardoublepage, but allows different page styles +% for the inserted blank pages +\def\@IEEEcleardoublepage#1{\clearpage\if@twoside\ifodd\c@page\else +\hbox{}\thispagestyle{#1}\newpage\if@twocolumn\hbox{}\thispagestyle{#1}\newpage\fi\fi\fi} + +% V1.8b hooks to allow adjustment of space above title +\def\IEEEtitletopspace{0.5\baselineskip} +% an added extra amount to allow for adjustment/offset +\def\IEEEtitletopspaceextra{0pt} + +% user command to invoke the title page +\def\maketitle{\par% + \begingroup% + \normalfont% + \def\thefootnote{}% the \thanks{} mark type is empty + \def\footnotemark{}% and kill space from \thanks within author + \let\@makefnmark\relax% V1.7, must *really* kill footnotemark to remove all \textsuperscript spacing as well. + \footnotesize% equal spacing between thanks lines + \footnotesep 0.7\baselineskip%see global setting of \footnotesep for more info + % V1.7 disable \thanks note indention for compsoc + \@IEEEcompsoconly{\long\def\@makefntext##1{\parindent 1em\noindent\hbox{\@makefnmark}##1}}% + \normalsize% + \ifCLASSOPTIONpeerreview + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \thispagestyle{IEEEpeerreviewcoverpagestyle}\@thanks% + \else + \if@twocolumn% + \ifCLASSOPTIONtechnote% + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \else + \twocolumn[{\IEEEquantizevspace{\@maketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}\@IEEEaftertitletext}]% + \fi + \else + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \fi + \thispagestyle{IEEEtitlepagestyle}\@thanks% + \fi + % pullup page for pubid if used. + \if@IEEEusingpubid + \enlargethispage{-\@IEEEpubidpullup}% + \fi + \endgroup + \setcounter{footnote}{0}\let\maketitle\relax\let\@maketitle\relax + \gdef\@thanks{}% + % v1.6b do not clear these as we will need the title again for peer review papers + % \gdef\@author{}\gdef\@title{}% + \let\thanks\relax} + + +% V1.8 parbox to format \@IEEEtitleabstractindextext +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{1\textwidth}{#1}} +% V1.8 compsoc is partial width +\ifCLASSOPTIONcompsoc +% comparison with proofs suggests it's in the range of 92.1-92.3% +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{0.922\textwidth}{\@IEEEcompsocnotconfonly{\rightskip\@flushglue\leftskip\z@skip}#1}} +\fi + +% formats the Title, authors names, affiliations and special paper notice +% THIS IS A CONTROLLED SPACING COMMAND! Do not allow blank lines or unintentional +% spaces to enter the definition - use % at the end of each line +\def\@maketitle{\newpage +\bgroup\par\vskip\IEEEtitletopspace\vskip\IEEEtitletopspaceextra\centering% +\ifCLASSOPTIONtechnote% technotes, V1.8a abstract and index terms are not treated differently for compsoc technotes + {\bfseries\large\@IEEEcompsoconly{\Large\sffamily}\@title\par}\vskip 1.3em{\lineskip .5em\@IEEEcompsoconly{\large\sffamily}\@author + \@IEEEspecialpapernotice\par}\relax +\else% not a technote + \vskip0.2em{\Huge\ifCLASSOPTIONtransmag\bfseries\LARGE\fi\@IEEEcompsoconly{\sffamily}\@IEEEcompsocconfonly{\normalfont\normalsize\vskip 2\@IEEEnormalsizeunitybaselineskip + \bfseries\Large}\@IEEEcompsocnotconfonly{\vskip 0.75\@IEEEnormalsizeunitybaselineskip}\@title\par}\relax + \@IEEEcompsocnotconfonly{\vskip 0.5\@IEEEnormalsizeunitybaselineskip}\vskip1.0em\par% + % V1.6 handle \author differently if in conference mode + \ifCLASSOPTIONconference% + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par}\relax + \else% peerreviewca, peerreview or journal + \ifCLASSOPTIONpeerreviewca + % peerreviewca handles author names just like conference mode + {\@IEEEcompsoconly{\sffamily}\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \else% journal, peerreview or transmag + \ifCLASSOPTIONtransmag + % transmag also handles author names just like conference mode + % it also uses \@IEEEtitleabstractindextex, but with one line less + % space above, and one more below + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\vspace{0.5\baselineskip}\relax\@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\vspace{-1\baselineskip}\par}}\relax + \else% journal or peerreview + {\lineskip.5em\@IEEEcompsoconly{\sffamily}\sublargesize\@author\@IEEEspecialpapernotice\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \fi + \fi + \fi +\fi\par\addvspace{0.5\baselineskip}\egroup} + + +% V1.7 Computer Society "diamond line" which follows index terms for nonconference papers +% V1.8a full width diamond line for single column use +\def\@IEEEcompsocdiamondlinei{\vrule depth 0pt height 0.5pt width 4cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 4cm\relax} +% V1.8a narrower width diamond line for double column use +\def\@IEEEcompsocdiamondlineii{\vrule depth 0pt height 0.5pt width 2.5cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 2.5cm\relax} +% V1.8a bare core without rules to base a last resort on for very narrow linewidths +\def\@IEEEcompsocdiamondlineiii{\mbox{}\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\mbox{}\relax} + +% V1.8a allow \IEEEcompsocdiamondline to adjust for different linewidths. +% Use \@IEEEcompsocdiamondlinei if its width is less than 0.66\linewidth (0.487 nominal for single column) +% if not, fall back to \@IEEEcompsocdiamondlineii if its width is less than 0.75\linewidth (0.659 nominal for double column) +% if all else fails, try to make a custom diamondline based on the abnormally narrow linewidth +\def\IEEEcompsocdiamondline{\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlinei}\relax +\ifdim\@IEEEtrantmpdimenA<0.66\linewidth\relax\@IEEEcompsocdiamondlinei\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineii}\relax +\ifdim\@IEEEtrantmpdimenA<0.75\linewidth\relax\@IEEEcompsocdiamondlineii\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineiii}\relax +\@IEEEtrantmpdimenB=\linewidth\relax +\addtolength{\@IEEEtrantmpdimenB}{-1\@IEEEtrantmpdimenA}\relax +\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\@IEEEcompsocdiamondlineiii\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\relax +\fi\fi} + + +% V1.7 standard LateX2e \thanks, but with \itshape under compsoc. Also make it a \long\def +% We also need to trigger the one-shot footnote rule +\def\@IEEEtriggeroneshotfootnoterule{\global\@IEEEenableoneshotfootnoteruletrue} + + +\long\def\thanks#1{\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\@IEEEcompsoconly{\itshape + \protect\@IEEEtriggeroneshotfootnoterule\relax}\ignorespaces#1}}} +\let\@thanks\@empty + + +% V1.7 allow \author to contain \par's. This is needed to allow \thanks to contain \par. +\long\def\author#1{\gdef\@author{#1}} + + +% in addition to setting up IEEEitemize, we need to remove a baselineskip space above and +% below it because \list's \pars introduce blank lines because of the footnote struts. +\def\@IEEEsetupcompsocitemizelist{\def\labelitemi{$\bullet$}% +\setlength{\IEEElabelindent}{0pt}\setlength{\labelsep}{1.2em}\setlength{\parskip}{0pt}% +\setlength{\partopsep}{0pt}\setlength{\topsep}{0.5\baselineskip}\vspace{-1\baselineskip}\relax} + + +% flag for fake non-compsoc \IEEEcompsocthanksitem - prevents line break on very first item +\newif\if@IEEEbreakcompsocthanksitem \@IEEEbreakcompsocthanksitemfalse + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc bullet item \thanks +% also, we need to redefine this to destroy the argument in \IEEEquantizevspace +\long\def\IEEEcompsocitemizethanks#1{\relax\@IEEEbreakcompsocthanksitemfalse\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\itshape\protect\@IEEEtriggeroneshotfootnoterule + {\let\IEEEiedlistdecl\relax\protect\begin{IEEEitemize}[\protect\@IEEEsetupcompsocitemizelist]\ignorespaces#1\relax + \protect\end{IEEEitemize}}\protect\vspace{-1\baselineskip}}}} +\DeclareRobustCommand*{\IEEEcompsocthanksitem}{\item} +\else +% non-compsoc, allow for dual compilation via rerouting to normal \thanks +\long\def\IEEEcompsocitemizethanks#1{\thanks{#1}} +% redirect to "pseudo-par" \hfil\break\indent after swallowing [] from \IEEEcompsocthanksitem[] +\DeclareRobustCommand{\IEEEcompsocthanksitem}{\@ifnextchar [{\@IEEEthanksswallowoptionalarg}% +{\@IEEEthanksswallowoptionalarg[\relax]}} +% be sure and break only after first item, be sure and ignore spaces after optional argument +\def\@IEEEthanksswallowoptionalarg[#1]{\relax\if@IEEEbreakcompsocthanksitem\hfil\break +\indent\fi\@IEEEbreakcompsocthanksitemtrue\ignorespaces} +\fi + + +% V1.6b define the \IEEEpeerreviewmaketitle as needed +\ifCLASSOPTIONpeerreview +\def\IEEEpeerreviewmaketitle{\@IEEEcleardoublepage{empty}% +\ifCLASSOPTIONtwocolumn +\twocolumn[{\IEEEquantizevspace{\@IEEEpeerreviewmaketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}}] +\else +\newpage\@IEEEpeerreviewmaketitle\@IEEEstatictitlevskip +\fi +\thispagestyle{IEEEtitlepagestyle}} +\else +% \IEEEpeerreviewmaketitle does nothing if peer review option has not been selected +\def\IEEEpeerreviewmaketitle{\relax} +\fi + +% peerreview formats the repeated title like the title in journal papers. +\def\@IEEEpeerreviewmaketitle{\bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEcompsoconly{\sffamily}% +\normalfont\normalsize\vskip0.2em{\Huge\@title\par}\vskip1.0em\par +\par\addvspace{0.5\baselineskip}\egroup} + + + +% V1.6 +% this is a static rubber spacer between the title/authors and the main text +% used for single column text, or when the title appears in the first column +% of two column text (technotes). +\def\@IEEEstatictitlevskip{{\normalfont\normalsize +% adjust spacing to next text +% v1.6b handle peer review papers +\ifCLASSOPTIONpeerreview +% for peer review papers, the same value is used for both title pages +% regardless of the other paper modes + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip +\else + \ifCLASSOPTIONconference% conference + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% + \ifCLASSOPTIONtechnote% technote + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% journal uses more space + \vskip 2.5\baselineskip plus 0.75\baselineskip minus 0.375\baselineskip% + \fi + \fi +\fi}} + + +% set the nominal and minimum values for the quantized title spacer +% the quantization algorithm will not allow the spacer size to +% become less than \@IEEEMINtitlevspace - instead it will be lengthened +% default to journal values +\def\@IEEENORMtitlevspace{2.5\baselineskip} +\def\@IEEEMINtitlevspace{2\baselineskip} +% conferences and technotes need tighter spacing +\ifCLASSOPTIONconference% conference + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi +\ifCLASSOPTIONtechnote% technote + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi + + +% V1.8a +\def\IEEEquantizevspace{\begingroup\@ifstar{\@IEEEquantizevspacestarformtrue\@IEEEquantizevspace}{\@IEEEquantizevspacestarformfalse\@IEEEquantizevspace}} +% \IEEEquantizevspace[output dimen register]{object}[object decl] +% {top baselineskip} +% [offset][prevdepth][lineskip limit][lineskip] +% {unit height}{nominal vspace}{minimum vspace} +% +% Calculates and creates the vspace needed to make the combined height with +% the given object an integer multiple of the given unit height. This command +% is more general than the older \@IEEEdynamictitlevspace it replaces. +% +% The star form has no effect at present, but is reserved for future use. +% +% If the optional argument [output dimen register] is given, the calculated +% vspace height is stored in the given output dimen (or skip) register +% and no other action is taken, otherwise the object followed by a vspace* +% of the appropriate height is evaluated/output. +% +% The optional object decl (declarations) is code that is evaluated just +% before the object's height is evaluated. Its intented purpose is to allow +% for the alteration or disabling of code within the object during internal +% height evaluation (e.g., \long\def\thanks#1{\relax} ). +% This special code is not invoked if/when the object is rendered at the end. +% +% The nominal vspace is the target value of the added vspace and the minimum +% vspace is the lower allowed limit. The vspacer will be the value that achieves +% integral overall height, in terms of the given unit height, that is closest +% to the nominal vspace and that is not less than the specified minimum vspace. +% +% The line spacing algorithm of TeX is somewhat involved and requires special +% care with regard to the first line of a vertical list (which is indicated +% when \prevdepth is -1000pt or less). top baselineskip specifies the +% baselineskip or topskip used prior to the object. If the height of the +% first line of the object is greater than the given top baselineskip, then +% the top baselineskip is subtracted from the height of the first line and +% that difference is considered along with the rest of the object height +% (because the object will be shifted down by an amount = +% top line height - top baselineskip). Otherwise, the height of the first line +% of the object is ignored as far as the calculations are concerned. +% This algorithm is adequate for objects that appear at the top of a page +% (e.g., titles) where \topskip spacing is used. +% +% However, as explained on page 78 of the TeXbook, interline spacing is more +% complex when \baselineskip is being used (indicated by \prevdepth > +% -1000pt). The four optional parameters offset, prevdepth, lineskip limit and +% lineskip are assumed to be equal to be 0pt, \prevdepth, \lineskiplimit and +% \lineskip, respectively, if they are omitted. +% +% The prevdepth is the depth of the line before the object, the lineskip limit +% specifies how close the top of the object can come to the bottom of the +% previous line before \baselineskip is ignored and \lineskip is inserted +% between the object and the line above it. Lineskip does not come into +% play unless the first line of the object is high enough to "get too close" +% (as specified by lineskiplimit) to the line before it. The the prevdepth, +% lineskip limit, and lineskip optional parameters are not needed for the +% first object/line on a page (i.e., prevdepth <= -1000pt) where the simplier +% \topskip spacing rules are in effect. +% +% Offset is a manual adjustment that is added to the height calculations of +% object irrespective of the value of \prevdepth. It is useful when the top +% baselineskip will result in a noninteger unit height object placement even +% if the object itself has integral height. e.g., a footnotesize baselineskip +% is used before the object, thus an offset of, say -3pt, can be given as a +% correction. + +% Common combinations of these parameters include: +% +% top baselineskip: (and default values for offset, prevdepth, etc.) +% \topskip % for objects that appear at the top of a page +% \maxdimen % always ignore the height of the top line +% 0pt % always consider any positive height of the top line +% +% for objects to appear inline in normal text: +% top baselineskip = \baselineskip +% +% set prevdepth = -1000pt and top baselineskip = 0pt to consider the +% overall height of the object without any other external skip +% consideration + +\newif\if@IEEEquantizevspacestarform % flag to indicate star form +\newif\if@IEEEquantizevspaceuseoutdimenreg % flag to indicate output dimen register is to be used +% Use our own private registers because the object could contain a +% structure that uses the existing tmp scratch pad registers +\newdimen\@IEEEquantizeheightA +\newdimen\@IEEEquantizeheightB +\newdimen\@IEEEquantizeheightC +\newdimen\@IEEEquantizeprevdepth % need to save this early as can change +\newcount\@IEEEquantizemultiple +\newbox\@IEEEquantizeboxA + + +\def\@IEEEquantizevspace{\@ifnextchar [{\@IEEEquantizevspaceuseoutdimenregtrue\@@IEEEquantizevspace}{\@IEEEquantizevspaceuseoutdimenregfalse\@@IEEEquantizevspace[]}} + + +\long\def\@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% #1 optional output dimen register +% #2 object +\edef\@IEEEquantizeoutdimenreg{#1}\relax +% allow for object specifications that contain parameters +\@IEEEtrantmptoksA={#2}\relax +\long\edef\@IEEEquantizeobject{\the\@IEEEtrantmptoksA}\relax +\@ifnextchar [{\@@@IEEEquantizevspace}{\@@@IEEEquantizevspace[\relax]}} + +\long\def\@@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% [#1] optional object decl, is \relax if not given by user +% #2 top baselineskip +% allow for object decl specifications that have parameters +\@IEEEtrantmptoksA={#1}\relax +\long\edef\@IEEEquantizeobjectdecl{\the\@IEEEtrantmptoksA}\relax +\edef\@IEEEquantizetopbaselineskip{#2}\ivIEEEquantizevspace} + +% acquire optional argument set and store +% [offset][prevdepth][lineskip limit][lineskip] +\def\ivIEEEquantizevspace{\@ifnextchar [{\@vIEEEquantizevspace}{\@vIEEEquantizevspace[0pt]}} +\def\@vIEEEquantizevspace[#1]{\edef\@IEEEquantizeoffset{#1}\@ifnextchar [{\@viIEEEquantizevspace}{\@viIEEEquantizevspace[\prevdepth]}} +\def\@viIEEEquantizevspace[#1]{\@IEEEquantizeprevdepth=#1\relax\@ifnextchar [{\@viiIEEEquantizevspace}{\@viiIEEEquantizevspace[\lineskiplimit]}} +\def\@viiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskiplimit{#1}\@ifnextchar [{\@viiiIEEEquantizevspace}{\@viiiIEEEquantizevspace[\lineskip]}} +\def\@viiiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskip{#1}\@ixIEEEquantizevspace} + +% main routine +\def\@ixIEEEquantizevspace#1#2#3{\relax +\edef\@IEEEquantizeunitheight{#1}\relax +\edef\@IEEEquantizenomvspace{#2}\relax +\edef\@IEEEquantizeminvspace{#3}\relax +% \@IEEEquantizeoutdimenreg +% \@IEEEquantizeobject +% \@IEEEquantizeobjectdecl +% \@IEEEquantizetopbaselineskip +% \@IEEEquantizeoffset +% \@IEEEquantizeprevdepth +% \@IEEEquantizelineskiplimit +% \@IEEEquantizelineskip +% \@IEEEquantizeunitheight +% \@IEEEquantizenomvspace +% \@IEEEquantizeminvspace +% get overall height of object +\setbox\@IEEEquantizeboxA\vbox{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightA\ht\@IEEEquantizeboxA\relax +% get height of first line of object +\setbox\@IEEEquantizeboxA\vtop{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightB\ht\@IEEEquantizeboxA\relax +\ifdim\@IEEEquantizeprevdepth>-1000pt\relax % prevdepth > -1000pf means full baselineskip\lineskip rules in effect +% lineskip spacing rule takes effect if height of top line > baselineskip - prevdepth - lineskiplimit, +% otherwise the baselineskip rule is in effect and the height of the first line does not matter at all. +\@IEEEquantizeheightC=\@IEEEquantizetopbaselineskip\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizelineskiplimit\relax % this works even though \@IEEEquantizelineskiplimit is a macro because TeX allows --10pt notation +\ifdim\@IEEEquantizeheightB>\@IEEEquantizeheightC\relax +% lineskip spacing rule is in effect i.e., the object is going to be shifted down relative to the +% baselineskip set position by its top line height (already a part of the total height) + prevdepth + lineskip - baselineskip +\advance\@IEEEquantizeheightA\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightA\@IEEEquantizelineskip\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line <= \@IEEEquantizetopbaselineskip - \@IEEEquantizeprevdepth - \@IEEEquantizelineskiplimit +% standard baselineskip rules are in effect, so don't consider height of first line +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +% +\else % prevdepth <= -1000pt, simplier \topskip type rules in effect +\ifdim\@IEEEquantizeheightB>\@IEEEquantizetopbaselineskip +% height of top line (already included in the total height) in excess of +% baselineskip is the amount it will be downshifted +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line is irrelevant, remove it +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +\fi % prevdepth <= -1000pt +% +% adjust height for any manual offset +\advance\@IEEEquantizeheightA\@IEEEquantizeoffset\relax +% add in nominal spacer +\advance\@IEEEquantizeheightA\@IEEEquantizenomvspace\relax +% check for nonzero unitheight +\@IEEEquantizeheightB=\@IEEEquantizeunitheight\relax +\ifnum\@IEEEquantizeheightB=0\relax +\@IEEEclspkgerror{IEEEquantizevspace unit height cannot be zero. Assuming 10pt.}% +{Division by zero is not allowed.} +\@IEEEquantizeheightB=10pt\relax +\fi +% get integer number of lines +\@IEEEquantizemultiple=\@IEEEquantizeheightA\relax +\divide\@IEEEquantizemultiple\@IEEEquantizeheightB\relax +% set A to contain the excess height over the \@IEEEquantizemultiple of lines +% A = height - multiple*unitheight +\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\multiply\@IEEEquantizeheightC\@IEEEquantizemultiple\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightC\relax +% set B to contain the height short of \@IEEEquantizemultiple+1 of lines +% B = unitheight - A +\advance\@IEEEquantizeheightB-\@IEEEquantizeheightA\relax +% choose A or B based on which is closer +\@IEEEquantizeheightC\@IEEEquantizenomvspace\relax +\ifdim\@IEEEquantizeheightA<\@IEEEquantizeheightB\relax +% C = nomvspace - A, go with lower +\advance\@IEEEquantizeheightC-\@IEEEquantizeheightA\relax +\else +% C = nomvspace + B, go with upper +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% if violate lower bound, use next integer bound +\ifdim\@IEEEquantizeheightC<\@IEEEquantizeminvspace\relax +% A + B = unitheight +\advance\@IEEEquantizeheightC\@IEEEquantizeheightA\relax +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% export object and spacer outside of group +\global\let\@IEEEquantizeobjectout\@IEEEquantizeobject\relax +\global\@IEEEquantizeheightC\@IEEEquantizeheightC\relax +\endgroup +\if@IEEEquantizevspaceuseoutdimenreg +\@IEEEquantizeoutdimenreg=\@IEEEquantizeheightC\relax +\else +\@IEEEquantizeobjectout\relax +\vskip\@IEEEquantizeheightC\relax +\fi} + + +% user command to disable all global assignments, possible use within object decl +\def\IEEEquantizedisableglobal{\let\global\relax +\let\gdef\def +\let\xdef\edef} +% user command to allow for the disabling of \thanks and other commands, possible use within object decl +\def\IEEEquantizedisabletitlecmds{\long\def\thanks##1{\relax}\relax +\long\def\IEEEcompsocitemizethanks##1{\relax}\def\newpage{\relax}} + + + + + +% V1.6 +% we allow the user access to the last part of the title area +% useful in emergencies such as when a different spacing is needed +% This text is NOT compensated for in the dynamic sizer. +\let\@IEEEaftertitletext=\relax +\long\def\IEEEaftertitletext#1{\def\@IEEEaftertitletext{#1}} + + +% V1.7 provide a way for users to enter abstract and keywords +% into the onecolumn title are. This text is compensated for +% in the dynamic sizer. +\let\@IEEEtitleabstractindextext=\relax +\long\def\IEEEtitleabstractindextext#1{\def\@IEEEtitleabstractindextext{#1}} + +% V1.7 provide a way for users to get the \@IEEEtitleabstractindextext if +% not in compsoc or transmag journal mode - this way abstract and keywords +% can still be placed in their conventional position if not in those modes. +\def\IEEEdisplaynontitleabstractindextext{% +% display for all conference formats +\ifCLASSOPTIONconference\@IEEEtitleabstractindextext\relax +\else% non-conferences + % V1.8a display for all technotes + \ifCLASSOPTIONtechnote\@IEEEtitleabstractindextext\relax + % V1.8a add diamond line after abstract and index terms for compsoc technotes + \@IEEEcompsoconly{\noindent\hfill\IEEEcompsocdiamondline\hfill\hbox{}\par}\relax + \else % non-conferences and non-technotes + \ifCLASSOPTIONcompsoc% display if not compsoc and not transmag + \else + \ifCLASSOPTIONtransmag + \else% not compsoc journal nor transmag journal + \@IEEEtitleabstractindextext\relax + \fi + \fi + \fi +\fi} + + +% command to allow alteration of baselinestretch, but only if the current +% baselineskip is unity. Used to tweak the compsoc abstract and keywords line spacing. +\def\@IEEEtweakunitybaselinestretch#1{{\def\baselinestretch{1}\selectfont +\global\@tempskipa\baselineskip}\ifnum\@tempskipa=\baselineskip% +\def\baselinestretch{#1}\selectfont\fi\relax} + + +% abstract and keywords are in \small, except +% for 9pt docs in which they are in \footnotesize +% Because 9pt docs use an 8pt footnotesize, \small +% becomes a rather awkward 8.5pt +\def\@IEEEabskeysecsize{\small} +\ifx\CLASSOPTIONpt\@IEEEptsizenine + \def\@IEEEabskeysecsize{\footnotesize} +\fi + +% compsoc journals use \footnotesize, compsoc conferences use normalsize +\@IEEEcompsoconly{\def\@IEEEabskeysecsize{\footnotesize}} +\@IEEEcompsocconfonly{\def\@IEEEabskeysecsize{\small}} + + +% V1.6 have abstract and keywords strip leading spaces, pars and newlines +% so that spacing is more tightly controlled. +\def\abstract{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +% V1.6 The IEEE wants only 1 pica from end of abstract to introduction heading when in +% conference mode (the heading already has this much above it) +\def\endabstract{\relax\ifCLASSOPTIONconference\vspace{0ex}\else\vspace{1.34ex}\fi\par\if@twocolumn\else\endquotation\fi + \normalfont\normalsize} + +\def\IEEEkeywords{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\def\endIEEEkeywords{\relax\ifCLASSOPTIONtechnote\vspace{1.34ex}\else\vspace{0.67ex}\fi + \par\if@twocolumn\else\endquotation\fi% + \normalfont\normalsize} + +% V1.7 compsoc keywords index terms +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\noindent\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \else% compsoc not conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\noindent\textbf{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textbf{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \fi +\fi + +% V1.8 transmag keywords index terms +% no abstract name, use indentation +\ifCLASSOPTIONtransmag +\def\abstract{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\bfseries\indent + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize + \textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} + +\def\IEEEkeywords{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\vspace{1\baselineskip}\bfseries\indent\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\vspace{1\baselineskip}\centering\@IEEEabskeysecsize + \textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\fi + + + +% gobbles all leading \, \\ and \par, upon finding first token that +% is not a \ , \\ or a \par, it ceases and returns that token +% +% used to strip leading \, \\ and \par from the input +% so that such things in the beginning of an environment will not +% affect the formatting of the text +\long\def\@IEEEgobbleleadPARNLSP#1{\let\@IEEEswallowthistoken=0% +\let\@IEEEgobbleleadPARNLSPtoken#1% +\let\@IEEEgobbleleadPARtoken=\par% +\let\@IEEEgobbleleadNLtoken=\\% +\let\@IEEEgobbleleadSPtoken=\ % +\def\@IEEEgobbleleadSPMACRO{\ }% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadPARtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadNLtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPtoken% +\let\@IEEEswallowthistoken=1% +\fi% +% a control space will come in as a macro +% when it is the last one on a line +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPMACRO% +\let\@IEEEswallowthistoken=1% +\fi% +% if we have to swallow this token, do so and taste the next one +% else spit it out and stop gobbling +\ifx\@IEEEswallowthistoken 1\let\@IEEEnextgobbleleadPARNLSP=\@IEEEgobbleleadPARNLSP\else% +\let\@IEEEnextgobbleleadPARNLSP=#1\fi% +\@IEEEnextgobbleleadPARNLSP}% + + + + +% TITLING OF SECTIONS +\def\@IEEEsectpunct{:\ \,} % Punctuation after run-in section heading (headings which are + % part of the paragraphs), need little bit more than a single space + % spacing from section number to title +% compsoc conferences use regular period/space punctuation +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +\def\@IEEEsectpunct{.\ } +\fi\fi + + +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 0.5em\relax} + +\ifCLASSOPTIONcompsoc +% compsoc journals need extra spacing +\ifCLASSOPTIONconference\else +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 1em\relax} +\fi\fi + +%v1.7 put {} after #6 to allow for some types of user font control +%and use \@@par rather than \par +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + % load section label and spacer into \@svsec + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi% + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@% tempskipa determines whether is treated as a high + \begingroup #6{\relax% or low level heading + \noindent % subsections are NOT indented + % print top level headings. \@svsec is label, #8 is heading title + % The IEEE does not block indent the section title text, it flows like normal + {\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\@@par}}% + \endgroup + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}% + \else % printout low level headings + % svsechd seems to swallow the trailing space, protect it with \mbox{} + % got rid of sectionmark stuff + \def\@svsechd{#6{\hskip #3\relax\@svsec #8\@IEEEsectpunct\mbox{}}% + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}}% + \fi%skip down + \@xsect{#5}} + + +% section* handler +%v1.7 put {} after #4 to allow for some types of user font control +%and use \@@par rather than \par +\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + %\begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup + % The IEEE does not block indent the section title text, it flows like normal + \begingroup \noindent #4{\relax{\hskip #1}{\interlinepenalty \@M #5\@@par}}\endgroup + % svsechd swallows the trailing space, protect it with \mbox{} + \else \def\@svsechd{#4{\hskip #1\relax #5\@IEEEsectpunct\mbox{}}}\fi + \@xsect{#3}} + + +%% SECTION heading spacing and font +%% +% arguments are: #1 - sectiontype name +% (for \@sect) #2 - section level +% #3 - section heading indent +% #4 - top separation (absolute value used, neg indicates not to indent main text) +% If negative, make stretch parts negative too! +% #5 - (absolute value used) positive: bottom separation after heading, +% negative: amount to indent main text after heading +% Both #4 and #5 negative means to indent main text and use negative top separation +% #6 - font control +% You've got to have \normalfont\normalsize in the font specs below to prevent +% trouble when you do something like: +% \section{Note}{\ttfamily TT-TEXT} is known to ... +% The IEEE sometimes REALLY stretches the area before a section +% heading by up to about 0.5in. However, it may not be a good +% idea to let LaTeX have quite this much rubber. +\ifCLASSOPTIONconference% +% The IEEE wants section heading spacing to decrease for conference mode +\def\section{\@startsection{section}{1}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\else % for journals +\def\section{\@startsection{section}{1}{\z@}{3.0ex plus 1.5ex minus 1.5ex}% V1.6 3.0ex from 3.5ex +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\fi + +% for both journals and conferences +% decided to put in a little rubber above the section, might help somebody +\def\subsubsection{\@startsection{subsubsection}{3}{\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% + + +% compsoc +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +% compsoc conference +\def\section{\@startsection{section}{1}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\large\bfseries}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\sublargesize\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{0ex}{\normalfont\normalsize\bfseries}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize}}% +\else% compsoc journals +% use negative top separation as compsoc journals do not indent paragraphs after section titles +\def\section{\@startsection{section}{1}{\z@}{-3.5ex plus -2ex minus -1.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\sublargesize\sffamily\bfseries\scshape}}% +% Note that subsection and smaller may not be correct for the Computer Society, +% I have to look up an example. +\def\subsection{\@startsection{subsection}{2}{\z@}{-3.5ex plus -1.5ex minus -1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\sffamily\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex plus -1ex minus -1ex}% +{0.5ex plus 0.5ex minus 0ex}{\normalfont\normalsize\sffamily\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{-0ex plus -0.1ex minus -0.1ex}% +{0ex}{\normalfont\normalsize}}% +\fi\fi + +% transmag +\ifCLASSOPTIONtransmag +\def\subsection{\@startsection{subsection}{2}{0.75\parindent}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\def\subsubsection{\@startsection{subsubsection}{3}{1.25\parindent}{0.1ex plus 0.1ex minus 0.1ex}% +{0.1ex}{\normalfont\normalsize\itshape}}% +\fi + + +% V1.8a provide for a raised line Introduction section for use with Computer +% Society papers. We have to remove any spacing glue after the section +% heading and then remove the blank line for the new paragraph after it. +% LaTeX's section handler alters \everypar and we need to propogate those +% changes outside of the \parbox lest there be spacing problems at the top +% of the next section. +\def\IEEEraisesectionheading#1{\noindent\raisebox{1.5\baselineskip}[0pt][0pt]{\parbox[b]{\columnwidth}{#1\unskip\global\everypar=\everypar}}\vspace{-1\baselineskip}\vspace{-\parskip}\par} + + + +%% ENVIRONMENTS +% "box" symbols at end of proofs +\def\IEEEQEDclosed{\mbox{\rule[0pt]{1.3ex}{1.3ex}}} % for a filled box +% V1.6 some journals use an open box instead that will just fit around a closed one +\def\IEEEQEDopen{{\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{0.2pt}\fbox{\rule[0pt]{0pt}{1.3ex}\rule[0pt]{1.3ex}{0pt}}}} +\ifCLASSOPTIONcompsoc +\def\IEEEQED{\IEEEQEDopen} % default to open for compsoc +\else +\def\IEEEQED{\IEEEQEDclosed} % otherwise default to closed +\fi + +%V1.8 flag to indicate if QED symbol is to be shown +\newif\if@IEEEQEDshow \@IEEEQEDshowtrue +\def\IEEEproofindentspace{2\parindent}% V1.8 allow user to change indentation amount if desired +% v1.7 name change to avoid namespace collision with amsthm. Also add support +% for an optional argument. +\def\IEEEproof{\@ifnextchar[{\@IEEEproof}{\@IEEEproof[\IEEEproofname]}} +\def\@IEEEproof[#1]{\@IEEEQEDshowtrue\par\noindent\hspace{\IEEEproofindentspace}{\itshape #1: }} +\def\endIEEEproof{\if@IEEEQEDshow\hspace*{\fill}\nobreakspace\IEEEQED\fi\par} +% qedhere for equation environments, similar to AMS \qedhere +\def\IEEEQEDhereeqn{\global\@IEEEQEDshowfalse\eqno\let\eqno\relax\let\leqno\relax + \let\veqno\relax\hbox{\IEEEQED}} +% IEEE style qedhere for IEEEeqnarray and other environments +\def\IEEEQEDhere{\global\@IEEEQEDshowfalse\IEEEQED} +% command to disable QED at end of IEEEproof +\def\IEEEQEDoff{\global\@IEEEQEDshowfalse} + + +%\itemindent is set to \z@ by list, so define new temporary variable +\newdimen\@IEEEtmpitemindent + +\ifCLASSOPTIONcompsoc +% V1.8a compsoc uses bold theorem titles, a period instead of a colon, vertical spacing, and hanging indentation +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax + \topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip + \rmfamily\trivlist\hangindent\parindent% + \item[]\textit{\bfseries\noindent #1\ #2.} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax +\topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip +\rmfamily\trivlist\hangindent\parindent% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\bfseries\noindent #1\ #2\ (#3).} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist\vskip 0.25\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip} +\else +% +% noncompsoc +% +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily\trivlist% + \item[]\textit{\indent #1\ #2:} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily \trivlist% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\indent #1\ #2\ (#3):} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist} +\fi + + + +% V1.6 +% display command for the section the theorem is in - so that \thesection +% is not used as this will be in Roman numerals when we want arabic. +% LaTeX2e uses \def\@thmcounter#1{\noexpand\arabic{#1}} for the theorem number +% (second part) display and \def\@thmcountersep{.} as a separator. +% V1.7 intercept calls to the section counter and reroute to \@IEEEthmcounterinsection +% to allow \appendix(ices} to override as needed. +% +% special handler for sections, allows appendix(ices) to override +\gdef\@IEEEthmcounterinsection#1{\arabic{#1}} +% string macro +\edef\@IEEEstringsection{section} + +% redefine the #1#2[#3] form of newtheorem to use a hook to \@IEEEthmcounterinsection +% if section in_counter is used +\def\@xnthm#1#2[#3]{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@newctr{#1}[#3]% + \edef\@IEEEstringtmp{#3} + \ifx\@IEEEstringtmp\@IEEEstringsection + \expandafter\xdef\csname the#1\endcsname{% + \noexpand\@IEEEthmcounterinsection{#3}\@thmcountersep + \@thmcounter{#1}}% + \else + \expandafter\xdef\csname the#1\endcsname{% + \expandafter\noexpand\csname the#3\endcsname \@thmcountersep + \@thmcounter{#1}}% + \fi + \global\@namedef{#1}{\@thm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}}} + + + +%% SET UP THE DEFAULT PAGESTYLE +\pagestyle{headings} +\pagenumbering{arabic} + +% normally the page counter starts at 1 +\setcounter{page}{1} +% however, for peerreview the cover sheet is page 0 or page -1 +% (for duplex printing) +\ifCLASSOPTIONpeerreview + \if@twoside + \setcounter{page}{-1} + \else + \setcounter{page}{0} + \fi +\fi + +% standard book class behavior - let bottom line float up and down as +% needed when single sided +\ifCLASSOPTIONtwoside\else\raggedbottom\fi +% if two column - turn on twocolumn, allow word spacings to stretch more and +% enforce a rigid position for the last lines +\ifCLASSOPTIONtwocolumn +% the peer review option delays invoking twocolumn + \ifCLASSOPTIONpeerreview\else + \twocolumn + \fi +\sloppy +\flushbottom +\fi + + + + +% \APPENDIX and \APPENDICES definitions + +% This is the \@ifmtarg command from the LaTeX ifmtarg package +% by Peter Wilson (CUA) and Donald Arseneau +% \@ifmtarg is used to determine if an argument to a command +% is present or not. +% For instance: +% \@ifmtarg{#1}{\typeout{empty}}{\typeout{has something}} +% \@ifmtarg is used with our redefined \section command if +% \appendices is invoked. +% The command \section will behave slightly differently depending +% on whether the user specifies a title: +% \section{My appendix title} +% or not: +% \section{} +% This way, we can eliminate the blank lines where the title +% would be, and the unneeded : after Appendix in the table of +% contents +\begingroup +\catcode`\Q=3 +\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} +\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4} +\endgroup +% end of \@ifmtarg defs + + +% V1.7 +% command that allows the one time saving of the original definition +% of section to \@IEEEappendixsavesection for \appendix or \appendices +% we don't save \section here as it may be redefined later by other +% packages (hyperref.sty, etc.) +\def\@IEEEsaveoriginalsectiononce{\let\@IEEEappendixsavesection\section +\let\@IEEEsaveoriginalsectiononce\relax} + +% neat trick to grab and process the argument from \section{argument} +% we process differently if the user invoked \section{} with no +% argument (title) +% note we reroute the call to the old \section* +\def\@IEEEprocessthesectionargument#1{% +\@ifmtarg{#1}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection}}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis\\* #1}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection: #1}}} + +% we use this if the user calls \section{} after +% \appendix-- which has no meaning. So, we ignore the +% command and its argument. Then, warn the user. +\def\@IEEEdestroythesectionargument#1{\typeout{** WARNING: Ignoring useless +\protect\section\space in Appendix (line \the\inputlineno).}} + + +% remember \thesection forms will be displayed in \ref calls +% and in the Table of Contents. +% The \sectiondis form is used in the actual heading itself + +% appendix command for one single appendix +% normally has no heading. However, if you want a +% heading, you can do so via the optional argument: +% \appendix[Optional Heading] +\def\appendix{\relax} +\renewcommand{\appendix}[1][]{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.A}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \gdef\thesection{A}% + \gdef\thesectiondis{}% + \gdef\thesubsection{\Alph{subsection}}% + \gdef\@IEEEthmcounterinsection##1{A} + \refstepcounter{section}% update the \ref counter + \@ifmtarg{#1}{\@IEEEappendixsavesection*{\appendixname}% + \addcontentsline{toc}{section}{\appendixname}}{% + \@IEEEappendixsavesection*{\appendixname\nobreakspace\\* #1}% + \addcontentsline{toc}{section}{\appendixname: #1}}% + % redefine \section command for appendix + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% + \@IEEEdestroythesectionargument}}% throw out the argument + % of the normal form +} + + + +% appendices command for multiple appendices +% user then calls \section with an argument (possibly empty) to +% declare the individual appendices +\def\appendices{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.\Alph{section}}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{-1}% we want \refstepcounter to use section 0 + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \ifCLASSOPTIONromanappendices% + \gdef\thesection{\Roman{section}}% + \gdef\thesectiondis{\Roman{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Roman{section}.}}% + \gdef\@IEEEthmcounterinsection##1{A\arabic{##1}} + \else% + \gdef\thesection{\Alph{section}}% + \gdef\thesectiondis{\Alph{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Alph{section}.}}% + \gdef\@IEEEthmcounterinsection##1{\Alph{##1}} + \fi% + \refstepcounter{section}% update the \ref counter + \setcounter{section}{0}% NEXT \section will be the FIRST appendix + % redefine \section command for appendices + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% process the *-form + \refstepcounter{section}% or is a new section so, + \@IEEEprocessthesectionargument}}% process the argument + % of the normal form +} + + + +% V1.7 compoc uses nonbold drop cap and small caps word style +\ifCLASSOPTIONcompsoc + \def\IEEEPARstartFONTSTYLE{\mdseries} + \def\IEEEPARstartWORDFONTSTYLE{\scshape} + \def\IEEEPARstartWORDCAPSTYLE{\relax} +\fi +% +% +% \IEEEPARstart +% Definition for the big two line drop cap letter at the beginning of the +% first paragraph of journal papers. The first argument is the first letter +% of the first word, the second argument is the remaining letters of the +% first word which will be rendered in upper case. +% In V1.6 this has been completely rewritten to: +% +% 1. no longer have problems when the user begins an environment +% within the paragraph that uses \IEEEPARstart. +% 2. auto-detect and use the current font family +% 3. revise handling of the space at the end of the first word so that +% interword glue will now work as normal. +% 4. produce correctly aligned edges for the (two) indented lines. +% +% We generalize things via control macros - playing with these is fun too. +% +% V1.7 added more control macros to make it easy for IEEEtrantools.sty users +% to change the font style. +% +% the number of lines that are indented to clear it +% may need to increase if using decenders +\providecommand{\IEEEPARstartDROPLINES}{2} +% minimum number of lines left on a page to allow a \@IEEEPARstart +% Does not take into consideration rubber shrink, so it tends to +% be overly cautious +\providecommand{\IEEEPARstartMINPAGELINES}{2} +% V1.7 the height of the drop cap is adjusted to match the height of this text +% in the current font (when \IEEEPARstart is called). +\providecommand{\IEEEPARstartHEIGHTTEXT}{T} +% the depth the letter is lowered below the baseline +% the height (and size) of the letter is determined by the sum +% of this value and the height of the \IEEEPARstartHEIGHTTEXT in the current +% font. It is a good idea to set this value in terms of the baselineskip +% so that it can respond to changes therein. +\providecommand{\IEEEPARstartDROPDEPTH}{1.1\baselineskip} +% V1.7 the font the drop cap will be rendered in, +% can take zero or one argument. +\providecommand{\IEEEPARstartFONTSTYLE}{\bfseries} +% V1.7 any additional, non-font related commands needed to modify +% the drop cap letter, can take zero or one argument. +\providecommand{\IEEEPARstartCAPSTYLE}{\MakeUppercase} +% V1.7 the font that will be used to render the rest of the word, +% can take zero or one argument. +\providecommand{\IEEEPARstartWORDFONTSTYLE}{\relax} +% V1.7 any additional, non-font related commands needed to modify +% the rest of the word, can take zero or one argument. +\providecommand{\IEEEPARstartWORDCAPSTYLE}{\MakeUppercase} +% This is the horizontal separation distance from the drop letter to the main text. +% Lengths that depend on the font (e.g., ex, em, etc.) will be referenced +% to the font that is active when \IEEEPARstart is called. +\providecommand{\IEEEPARstartSEP}{0.15em} +% V1.7 horizontal offset applied to the left of the drop cap. +\providecommand{\IEEEPARstartHOFFSET}{0em} +% V1.7 Italic correction command applied at the end of the drop cap. +\providecommand{\IEEEPARstartITLCORRECT}{\/} + +% width of the letter output, set globally. Can be used in \IEEEPARstartSEP +% or \IEEEPARstartHOFFSET, but not the height lengths. +\newdimen\IEEEPARstartletwidth +\IEEEPARstartletwidth 0pt\relax + +% definition of \IEEEPARstart +% THIS IS A CONTROLLED SPACING AREA, DO NOT ALLOW SPACES WITHIN THESE LINES +% +% The token \@IEEEPARstartfont will be globally defined after the first use +% of \IEEEPARstart and will be a font command which creates the big letter +% The first argument is the first letter of the first word and the second +% argument is the rest of the first word(s). +\def\IEEEPARstart#1#2{\par{% +% if this page does not have enough space, break it and lets start +% on a new one +\@IEEEtranneedspace{\IEEEPARstartMINPAGELINES\baselineskip}{\relax}% +% V1.7 move this up here in case user uses \textbf for \IEEEPARstartFONTSTYLE +% which uses command \leavevmode which causes an unwanted \indent to be issued +\noindent +% calculate the desired height of the big letter +% it extends from the top of \IEEEPARstartHEIGHTTEXT in the current font +% down to \IEEEPARstartDROPDEPTH below the current baseline +\settoheight{\@IEEEtrantmpdimenA}{\IEEEPARstartHEIGHTTEXT}% +\addtolength{\@IEEEtrantmpdimenA}{\IEEEPARstartDROPDEPTH}% +% extract the name of the current font in bold +% and place it in \@IEEEPARstartFONTNAME +\def\@IEEEPARstartGETFIRSTWORD##1 ##2\relax{##1}% +{\IEEEPARstartFONTSTYLE{\selectfont\edef\@IEEEPARstartFONTNAMESPACE{\fontname\font\space}% +\xdef\@IEEEPARstartFONTNAME{\expandafter\@IEEEPARstartGETFIRSTWORD\@IEEEPARstartFONTNAMESPACE\relax}}}% +% define a font based on this name with a point size equal to the desired +% height of the drop letter +\font\@IEEEPARstartsubfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenA\relax% +% save this value as a counter (integer) value (sp points) +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA% +% now get the height of the actual letter produced by this font size +\settoheight{\@IEEEtrantmpdimenB}{\@IEEEPARstartsubfont\IEEEPARstartCAPSTYLE{#1}}% +% If something bogus happens like the first argument is empty or the +% current font is strange, do not allow a zero height. +\ifdim\@IEEEtrantmpdimenB=0pt\relax% +\typeout{** WARNING: IEEEPARstart drop letter has zero height! (line \the\inputlineno)}% +\typeout{ Forcing the drop letter font size to 10pt.}% +\@IEEEtrantmpdimenB=10pt% +\fi% +% and store it as a counter +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenB% +% Since a font size doesn't exactly correspond to the height of the capital +% letters in that font, the actual height of the letter, \@IEEEtrantmpcountB, +% will be less than that desired, \@IEEEtrantmpcountA +% we need to raise the font size, \@IEEEtrantmpdimenA +% by \@IEEEtrantmpcountA / \@IEEEtrantmpcountB +% But, TeX doesn't have floating point division, so we have to use integer +% division. Hence the use of the counters. +% We need to reduce the denominator so that the loss of the remainder will +% have minimal affect on the accuracy of the result +\divide\@IEEEtrantmpcountB by 200% +\divide\@IEEEtrantmpcountA by \@IEEEtrantmpcountB% +% Then reequalize things when we use TeX's ability to multiply by +% floating point values +\@IEEEtrantmpdimenB=0.005\@IEEEtrantmpdimenA% +\multiply\@IEEEtrantmpdimenB by \@IEEEtrantmpcountA% +% \@IEEEPARstartfont is globaly set to the calculated font of the big letter +% We need to carry this out of the local calculation area to to create the +% big letter. +\global\font\@IEEEPARstartfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenB% +% Now set \@IEEEtrantmpdimenA to the width of the big letter +% We need to carry this out of the local calculation area to set the +% hanging indent +\settowidth{\global\@IEEEtrantmpdimenA}{\@IEEEPARstartfont +\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}}}% +% end of the isolated calculation environment +\global\IEEEPARstartletwidth\@IEEEtrantmpdimenA\relax% +% add in the extra clearance we want +\advance\@IEEEtrantmpdimenA by \IEEEPARstartSEP\relax% +% add in the optional offset +\advance\@IEEEtrantmpdimenA by \IEEEPARstartHOFFSET\relax% +% V1.7 don't allow negative offsets to produce negative hanging indents +\@IEEEtrantmpdimenB\@IEEEtrantmpdimenA +\ifnum\@IEEEtrantmpdimenB < 0 \@IEEEtrantmpdimenB 0pt\fi +% \@IEEEtrantmpdimenA has the width of the big letter plus the +% separation space and \@IEEEPARstartfont is the font we need to use +% Now, we make the letter and issue the hanging indent command +% The letter is placed in a box of zero width and height so that other +% text won't be displaced by it. +\hangindent\@IEEEtrantmpdimenB\hangafter=-\IEEEPARstartDROPLINES% +\makebox[0pt][l]{\hspace{-\@IEEEtrantmpdimenA}% +\raisebox{-\IEEEPARstartDROPDEPTH}[0pt][0pt]{\hspace{\IEEEPARstartHOFFSET}% +\@IEEEPARstartfont\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}% +\hspace{\IEEEPARstartSEP}}}% +{\IEEEPARstartWORDFONTSTYLE{\IEEEPARstartWORDCAPSTYLE{\selectfont#2}}}} + + + + +% determines if the space remaining on a given page is equal to or greater +% than the specified space of argument one +% if not, execute argument two (only if the remaining space is greater than zero) +% and issue a \newpage +% +% example: \@IEEEtranneedspace{2in}{\vfill} +% +% Does not take into consideration rubber shrinkage, so it tends to +% be overly cautious +% Based on an example posted by Donald Arseneau +% Note this macro uses \@IEEEtrantmpdimenB internally for calculations, +% so DO NOT PASS \@IEEEtrantmpdimenB to this routine +% if you need a dimen register, import with \@IEEEtrantmpdimenA instead +\def\@IEEEtranneedspace#1#2{\penalty-100\begingroup%shield temp variable +\@IEEEtrantmpdimenB\pagegoal\advance\@IEEEtrantmpdimenB-\pagetotal% space left +\ifdim #1>\@IEEEtrantmpdimenB\relax% not enough space left +\ifdim\@IEEEtrantmpdimenB>\z@\relax #2\fi% +\newpage% +\fi\endgroup} + + + +% IEEEbiography ENVIRONMENT +% Allows user to enter biography leaving place for picture (adapts to font size) +% As of V1.5, a new optional argument allows you to have a real graphic! +% V1.5 and later also fixes the "colliding biographies" which could happen when a +% biography's text was shorter than the space for the photo. +% MDS 7/2001 +% V1.6 prevent multiple biographies from making multiple TOC entries +\newif\if@IEEEbiographyTOCentrynotmade +\global\@IEEEbiographyTOCentrynotmadetrue + +% biography counter so hyperref can jump directly to the biographies +% and not just the previous section +\newcounter{IEEEbiography} +\setcounter{IEEEbiography}{0} + +% photo area size +\def\@IEEEBIOphotowidth{1.0in} % width of the biography photo area +\def\@IEEEBIOphotodepth{1.25in} % depth (height) of the biography photo area +% area cleared for photo +\def\@IEEEBIOhangwidth{1.14in} % width cleared for the biography photo area +\def\@IEEEBIOhangdepth{1.25in} % depth cleared for the biography photo area + % actual depth will be a multiple of + % \baselineskip, rounded up +\def\@IEEEBIOskipN{4\baselineskip}% nominal value of the vskip above the biography + +\newenvironment{IEEEbiography}[2][]{\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize% +\unitlength 1in\parskip=0pt\par\parindent 1em\interlinepenalty500% +% we need enough space to support the hanging indent +% the nominal value of the spacer +% and one extra line for good measure +\@IEEEtrantmpdimenA=\@IEEEBIOhangdepth% +\advance\@IEEEtrantmpdimenA by \@IEEEBIOskipN% +\advance\@IEEEtrantmpdimenA by 1\baselineskip% +% if this page does not have enough space, break it and lets start +% with a new one +\@IEEEtranneedspace{\@IEEEtrantmpdimenA}{\relax}% +% nominal spacer can strech, not shrink use 1fil so user can out stretch with \vfill +\vskip \@IEEEBIOskipN plus 1fil minus 0\baselineskip% +% the default box for where the photo goes +\def\@IEEEtempbiographybox{{\setlength{\fboxsep}{0pt}\framebox{% +\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}\centering PLACE\\ PHOTO\\ HERE \end{minipage}}}}% +% +% detect if the optional argument was supplied, this requires the +% \@ifmtarg command as defined in the appendix section above +% and if so, override the default box with what they want +\@ifmtarg{#1}{\relax}{\def\@IEEEtempbiographybox{\mbox{\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}% +\centering% +#1% +\end{minipage}}}}% end if optional argument supplied +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#2}% +% V1.6 properly handle if a new paragraph should occur while the +% hanging indent is still active. Do this by redefining \par so +% that it will not start a new paragraph. (But it will appear to the +% user as if it did.) Also, strip any leading pars, newlines, or spaces. +\let\@IEEEBIOORGparCMD=\par% save the original \par command +\edef\par{\hfil\break\indent}% the new \par will not be a "real" \par +\settoheight{\@IEEEtrantmpdimenA}{\@IEEEtempbiographybox}% get height of biography box +\@IEEEtrantmpdimenB=\@IEEEBIOhangdepth% +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenB% countA has the hang depth +\divide\@IEEEtrantmpcountA by \baselineskip% calculates lines needed to produce the hang depth +\advance\@IEEEtrantmpcountA by 1% ensure we overestimate +% set the hanging indent +\hangindent\@IEEEBIOhangwidth% +\hangafter-\@IEEEtrantmpcountA% +% reference the top of the photo area to the top of a capital T +\settoheight{\@IEEEtrantmpdimenB}{\mbox{T}}% +% set the photo box, give it zero width and height so as not to disturb anything +\noindent\makebox[0pt][l]{\hspace{-\@IEEEBIOhangwidth}\raisebox{\@IEEEtrantmpdimenB}[0pt][0pt]{% +\raisebox{-\@IEEEBIOphotodepth}[0pt][0pt]{\@IEEEtempbiographybox}}}% +% now place the author name and begin the bio text +\noindent\textbf{#2\ }\@IEEEgobbleleadPARNLSP}{\relax\let\par=\@IEEEBIOORGparCMD\par% +% 7/2001 V1.5 detect when the biography text is shorter than the photo area +% and pad the unused area - preventing a collision from the next biography entry +% MDS +\ifnum \prevgraf <\@IEEEtrantmpcountA\relax% detect when the biography text is shorter than the photo + \advance\@IEEEtrantmpcountA by -\prevgraf% calculate how many lines we need to pad + \advance\@IEEEtrantmpcountA by -1\relax% we compensate for the fact that we indented an extra line + \@IEEEtrantmpdimenA=\baselineskip% calculate the length of the padding + \multiply\@IEEEtrantmpdimenA by \@IEEEtrantmpcountA% + \noindent\rule{0pt}{\@IEEEtrantmpdimenA}% insert an invisible support strut +\fi% +\par\normalfont} + + + +% V1.6 +% added biography without a photo environment +\newenvironment{IEEEbiographynophoto}[1]{% +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#1}% +\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize\interlinepenalty500% +\vskip 4\baselineskip plus 1fil minus 0\baselineskip% +\parskip=0pt\par% +\noindent\textbf{#1\ }\@IEEEgobbleleadPARNLSP}{\relax\par\normalfont} + + +% provide the user with some old font commands +% got this from article.cls +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} + + +% SPECIAL PAPER NOTICE COMMANDS +% +% holds the special notice text +\def\@IEEEspecialpapernotice{\relax} + +% for special papers, like invited papers, the user can do: +% \IEEEspecialpapernotice{(Invited Paper)} before \maketitle +\def\IEEEspecialpapernotice#1{\ifCLASSOPTIONconference% +\def\@IEEEspecialpapernotice{{\sublargesize\textit{#1}\vspace*{1em}}}% +\else% +\def\@IEEEspecialpapernotice{{\\*[1.5ex]\sublargesize\textit{#1}}\vspace*{-2ex}}% +\fi} + + + + +% PUBLISHER ID COMMANDS +% to insert a publisher's ID footer +% V1.6 \IEEEpubid has been changed so that the change in page size and style +% occurs in \maketitle. \IEEEpubid must now be issued prior to \maketitle +% use \IEEEpubidadjcol as before - in the second column of the title page +% These changes allow \maketitle to take the reduced page height into +% consideration when dynamically setting the space between the author +% names and the maintext. +% +% the amount the main text is pulled up to make room for the +% publisher's ID footer +% The IEEE uses about 1.3\baselineskip for journals, +% dynamic title spacing will clean up the fraction +\def\@IEEEpubidpullup{1.3\baselineskip} +\ifCLASSOPTIONtechnote +% for technotes it must be an integer of baselineskip as there can be no +% dynamic title spacing for two column mode technotes (the title is in the +% in first column) and we should maintain an integer number of lines in the +% second column +% There are some examples (such as older issues of "Transactions on +% Information Theory") in which the IEEE really pulls the text off the ID for +% technotes - about 0.55in (or 4\baselineskip). We'll use 2\baselineskip +% and call it even. +\def\@IEEEpubidpullup{2\baselineskip} +\fi + +% V1.7 compsoc does not use a pullup +\ifCLASSOPTIONcompsoc +\def\@IEEEpubidpullup{0pt} +\fi + +% holds the ID text +\def\@IEEEpubid{\relax} + +% flag so \maketitle can tell if \IEEEpubid was called +\newif\if@IEEEusingpubid +\global\@IEEEusingpubidfalse +% issue this command in the page to have the ID at the bottom +% V1.6 use before \maketitle +\def\IEEEpubid#1{\def\@IEEEpubid{#1}\global\@IEEEusingpubidtrue} + + +% command which will pull up (shorten) the column it is executed in +% to make room for the publisher ID. Place in the second column of +% the title page when using \IEEEpubid +% Is smart enough not to do anything when in single column text or +% if the user hasn't called \IEEEpubid +% currently needed in for the second column of a page with the +% publisher ID. If not needed in future releases, please provide this +% command and define it as \relax for backward compatibility +% v1.6b do not allow command to operate if the peer review option has been +% selected because \IEEEpubidadjcol will not be on the cover page. +% V1.7 do nothing if compsoc +\def\IEEEpubidadjcol{\ifCLASSOPTIONcompsoc\else\ifCLASSOPTIONpeerreview\else +\if@twocolumn\if@IEEEusingpubid\enlargethispage{-\@IEEEpubidpullup}\fi\fi\fi\fi} + +% Special thanks to Peter Wilson, Daniel Luecking, and the other +% gurus at comp.text.tex, for helping me to understand how best to +% implement the IEEEpubid command in LaTeX. + + + +%% Lockout some commands under various conditions + +% general purpose bit bucket +\newsavebox{\@IEEEtranrubishbin} + +% flags to prevent multiple warning messages +\newif\if@IEEEWARNthanks +\newif\if@IEEEWARNIEEEPARstart +\newif\if@IEEEWARNIEEEbiography +\newif\if@IEEEWARNIEEEbiographynophoto +\newif\if@IEEEWARNIEEEpubid +\newif\if@IEEEWARNIEEEpubidadjcol +\newif\if@IEEEWARNIEEEmembership +\newif\if@IEEEWARNIEEEaftertitletext +\@IEEEWARNthankstrue +\@IEEEWARNIEEEPARstarttrue +\@IEEEWARNIEEEbiographytrue +\@IEEEWARNIEEEbiographynophototrue +\@IEEEWARNIEEEpubidtrue +\@IEEEWARNIEEEpubidadjcoltrue +\@IEEEWARNIEEEmembershiptrue +\@IEEEWARNIEEEaftertitletexttrue + + +%% Lockout some commands when in various modes, but allow them to be restored if needed +%% +% save commands which might be locked out +% so that the user can later restore them if needed +\let\@IEEESAVECMDthanks\thanks +\let\@IEEESAVECMDIEEEPARstart\IEEEPARstart +\let\@IEEESAVECMDIEEEbiography\IEEEbiography +\let\@IEEESAVECMDendIEEEbiography\endIEEEbiography +\let\@IEEESAVECMDIEEEbiographynophoto\IEEEbiographynophoto +\let\@IEEESAVECMDendIEEEbiographynophoto\endIEEEbiographynophoto +\let\@IEEESAVECMDIEEEpubid\IEEEpubid +\let\@IEEESAVECMDIEEEpubidadjcol\IEEEpubidadjcol +\let\@IEEESAVECMDIEEEmembership\IEEEmembership +\let\@IEEESAVECMDIEEEaftertitletext\IEEEaftertitletext + + +% disable \IEEEPARstart when in draft mode +% This may have originally been done because the pre-V1.6 drop letter +% algorithm had problems with a non-unity baselinestretch +% At any rate, it seems too formal to have a drop letter in a draft +% paper. +\ifCLASSOPTIONdraftcls +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** ATTENTION: \noexpand\IEEEPARstart + is disabled in draft mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi +% and for technotes +\ifCLASSOPTIONtechnote +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out for technotes (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi + + +% lockout unneeded commands when in conference mode +\ifCLASSOPTIONconference +% when locked out, \thanks, \IEEEbiography, \IEEEbiographynophoto, \IEEEpubid, +% \IEEEmembership and \IEEEaftertitletext will all swallow their given text. +% \IEEEPARstart will output a normal character instead +% warn the user about these commands only once to prevent the console screen +% from filling up with redundant messages +\def\thanks#1{\if@IEEEWARNthanks\typeout{** WARNING: \noexpand\thanks + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNthanksfalse} +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} + + +% LaTeX treats environments and commands with optional arguments differently. +% the actual ("internal") command is stored as \\commandname +% (accessed via \csname\string\commandname\endcsname ) +% the "external" command \commandname is a macro with code to determine +% whether or not the optional argument is presented and to provide the +% default if it is absent. So, in order to save and restore such a command +% we would have to save and restore \\commandname as well. But, if LaTeX +% ever changes the way it names the internal names, the trick would break. +% Instead let us just define a new environment so that the internal +% name can be left undisturbed. +\newenvironment{@IEEEbogusbiography}[2][]{\if@IEEEWARNIEEEbiography\typeout{** WARNING: \noexpand\IEEEbiography + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographyfalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} +% and make biography point to our bogus biography +\let\IEEEbiography=\@IEEEbogusbiography +\let\endIEEEbiography=\end@IEEEbogusbiography + +\renewenvironment{IEEEbiographynophoto}[1]{\if@IEEEWARNIEEEbiographynophoto\typeout{** WARNING: \noexpand\IEEEbiographynophoto + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographynophotofalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} + +\def\IEEEpubid#1{\if@IEEEWARNIEEEpubid\typeout{** WARNING: \noexpand\IEEEpubid + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidfalse} +\def\IEEEpubidadjcol{\if@IEEEWARNIEEEpubidadjcol\typeout{** WARNING: \noexpand\IEEEpubidadjcol + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidadjcolfalse} +\def\IEEEmembership#1{\if@IEEEWARNIEEEmembership\typeout{** WARNING: \noexpand\IEEEmembership + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEmembershipfalse} +\def\IEEEaftertitletext#1{\if@IEEEWARNIEEEaftertitletext\typeout{** WARNING: \noexpand\IEEEaftertitletext + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEaftertitletextfalse} +\fi + + +% provide a way to restore the commands that are locked out +\def\IEEEoverridecommandlockouts{% +\typeout{** ATTENTION: Overriding command lockouts (line \the\inputlineno).}% +\let\thanks\@IEEESAVECMDthanks% +\let\IEEEPARstart\@IEEESAVECMDIEEEPARstart% +\let\IEEEbiography\@IEEESAVECMDIEEEbiography% +\let\endIEEEbiography\@IEEESAVECMDendIEEEbiography% +\let\IEEEbiographynophoto\@IEEESAVECMDIEEEbiographynophoto% +\let\endIEEEbiographynophoto\@IEEESAVECMDendIEEEbiographynophoto% +\let\IEEEpubid\@IEEESAVECMDIEEEpubid% +\let\IEEEpubidadjcol\@IEEESAVECMDIEEEpubidadjcol% +\let\IEEEmembership\@IEEESAVECMDIEEEmembership% +\let\IEEEaftertitletext\@IEEESAVECMDIEEEaftertitletext} + + + +% need a backslash character for typeout output +{\catcode`\|=0 \catcode`\\=12 +|xdef|@IEEEbackslash{\}} + + +% hook to allow easy disabling of all legacy warnings +\def\@IEEElegacywarn#1#2{\typeout{** ATTENTION: \@IEEEbackslash #1 is deprecated (line \the\inputlineno). +Use \@IEEEbackslash #2 instead.}} + + +% provide some legacy IEEEtran commands +\def\IEEEcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEcompsoctitleabstractindextext}{IEEEtitleabstractindextext}\IEEEtitleabstractindextext} +\def\IEEEdisplaynotcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEdisplaynotcompsoctitleabstractindextext}{IEEEdisplaynontitleabstractindextext}\IEEEdisplaynontitleabstractindextext} +% provide some legacy IEEEtran environments + + +% V1.8a no more support for these legacy commands +%\def\authorblockA{\@IEEElegacywarn{authorblockA}{IEEEauthorblockA}\IEEEauthorblockA} +%\def\authorblockN{\@IEEElegacywarn{authorblockN}{IEEEauthorblockN}\IEEEauthorblockN} +%\def\authorrefmark{\@IEEElegacywarn{authorrefmark}{IEEEauthorrefmark}\IEEEauthorrefmark} +%\def\PARstart{\@IEEElegacywarn{PARstart}{IEEEPARstart}\IEEEPARstart} +%\def\pubid{\@IEEElegacywarn{pubid}{IEEEpubid}\IEEEpubid} +%\def\pubidadjcol{\@IEEElegacywarn{pubidadjcol}{IEEEpubidadjcol}\IEEEpubidadjcol} +%\def\specialpapernotice{\@IEEElegacywarn{specialpapernotice}{IEEEspecialpapernotice}\IEEEspecialpapernotice} +% and environments +%\def\keywords{\@IEEElegacywarn{keywords}{IEEEkeywords}\IEEEkeywords} +%\def\endkeywords{\endIEEEkeywords} +% V1.8 no more support for legacy IED list commands +%\let\labelindent\IEEElabelindent +%\def\calcleftmargin{\@IEEElegacywarn{calcleftmargin}{IEEEcalcleftmargin}\IEEEcalcleftmargin} +%\def\setlabelwidth{\@IEEElegacywarn{setlabelwidth}{IEEEsetlabelwidth}\IEEEsetlabelwidth} +%\def\usemathlabelsep{\@IEEElegacywarn{usemathlabelsep}{IEEEusemathlabelsep}\IEEEusemathlabelsep} +%\def\iedlabeljustifyc{\@IEEElegacywarn{iedlabeljustifyc}{IEEEiedlabeljustifyc}\IEEEiedlabeljustifyc} +%\def\iedlabeljustifyl{\@IEEElegacywarn{iedlabeljustifyl}{IEEEiedlabeljustifyl}\IEEEiedlabeljustifyl} +%\def\iedlabeljustifyr{\@IEEElegacywarn{iedlabeljustifyr}{IEEEiedlabeljustifyr}\IEEEiedlabeljustifyr} +% V1.8 no more support for QED and proof stuff +%\def\QED{\@IEEElegacywarn{QED}{IEEEQED}\IEEEQED} +%\def\QEDclosed{\@IEEElegacywarn{QEDclosed}{IEEEQEDclosed}\IEEEQEDclosed} +%\def\QEDopen{\@IEEElegacywarn{QEDopen}{IEEEQEDopen}\IEEEQEDopen} +%\AtBeginDocument{\def\proof{\@IEEElegacywarn{proof}{IEEEproof}\IEEEproof}\def\endproof{\endIEEEproof}} +% V1.8 no longer support biography or biographynophoto +%\def\biography{\@IEEElegacywarn{biography}{IEEEbiography}\IEEEbiography} +%\def\biographynophoto{\@IEEElegacywarn{biographynophoto}{IEEEbiographynophoto}\IEEEbiographynophoto} +%\def\endbiography{\endIEEEbiography} +%\def\endbiographynophoto{\endIEEEbiographynophoto} +% V1.7 and later no longer supports \overrideIEEEmargins +%\def\overrideIEEEmargins{% +%\typeout{** WARNING: \string\overrideIEEEmargins \space no longer supported (line \the\inputlineno).}% +%\typeout{** Use the \string\CLASSINPUTinnersidemargin, \string\CLASSINPUToutersidemargin \space controls instead.}} + +\endinput + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of IEEEtran.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%% +% That's all folks! + diff --git a/docs/paper/Makefile b/docs/paper/Makefile new file mode 100644 index 0000000..b8d0e54 --- /dev/null +++ b/docs/paper/Makefile @@ -0,0 +1,23 @@ +# make - build main.pdf (full pdflatex/bibtex/pdflatex/pdflatex pass) +# make clean - remove intermediate build files, keep main.pdf +# make distclean - also remove main.pdf + +MAIN := main + +.PHONY: all clean distclean + +all: $(MAIN).pdf + +$(MAIN).pdf: $(MAIN).tex refs.bib + pdflatex -interaction=nonstopmode -halt-on-error $(MAIN).tex + bibtex $(MAIN) + pdflatex -interaction=nonstopmode -halt-on-error $(MAIN).tex + pdflatex -interaction=nonstopmode -halt-on-error $(MAIN).tex + $(MAKE) clean + +clean: + rm -f $(MAIN).aux $(MAIN).log $(MAIN).out $(MAIN).bbl $(MAIN).blg \ + missfont.log build.log $(MAIN).synctex.gz $(MAIN).fdb_latexmk $(MAIN).fls + +distclean: clean + rm -f $(MAIN).pdf diff --git a/docs/paper/figures/assets/car_blue.png b/docs/paper/figures/assets/car_blue.png new file mode 100644 index 0000000..efdd7e2 Binary files /dev/null and b/docs/paper/figures/assets/car_blue.png differ diff --git a/docs/paper/figures/assets/car_red.png b/docs/paper/figures/assets/car_red.png new file mode 100644 index 0000000..21bd596 Binary files /dev/null and b/docs/paper/figures/assets/car_red.png differ diff --git a/docs/paper/figures/assets/prepare_car_icons.jl b/docs/paper/figures/assets/prepare_car_icons.jl new file mode 100644 index 0000000..1fb9312 --- /dev/null +++ b/docs/paper/figures/assets/prepare_car_icons.jl @@ -0,0 +1,48 @@ +""" One-time asset prep: crop the red and blue top-down car icons out of the reference +sheet the user provided, make the white background transparent, and orient each so its +front points in +x once loaded through CairoMakie's `image!` (which maps array dim 1 +directly to the x-axis, with NO row flip — the opposite of how normal image +viewers/`Read` display an array, row-1-at-top). Concretely: the raw crop already has +dim 1 = the car's length axis (it's portrait in the source sheet, nose at the low-index/ +top end) and dim 2 = width, so no permutedims/rotation is needed at all — only +`reverse(; dims=1)`, to flip nose-at-low-index to nose-at-high-index (= +x = rightward). +This was confirmed empirically (see conversation): `rotr90` looks correct in a plain PNG +viewer but renders vertically-squashed/wrong through `image!`; plain `reverse(dims=1)` +is the one that's actually correct for this Makie recipe. + +Run once with: julia --project=benchmark docs/paper/figures/assets/prepare_car_icons.jl +Output: car_blue.png, car_red.png (RGBA) in this directory — NOTE these are oriented for +`image!` consumption, so opening them in a plain image viewer will show the car rotated +90° from how it appears in the final figure. +""" + +using FileIO +using ColorTypes: RGBA + +const SRC = "/Users/dfk/.claude/image-cache/da90c4c1-406e-4d1e-8865-ff90d07be5d4/1.jpeg" +const PAD = 6 +# (col_lo, col_hi) for each of the 6 cars in the sheet, row extent shared across all. +const ROWS = (67 - PAD, 297 + PAD) +const CARS = ( + red = (534 - PAD, 632 + PAD), + blue = (655 - PAD, 761 + PAD), +) + +img = FileIO.load(SRC) + +function to_transparent(crop) + map(crop) do px + whiteness = (Float64(px.r) + Float64(px.g) + Float64(px.b)) / 3 + alpha = clamp((0.96 - whiteness) / 0.06, 0.0, 1.0) + RGBA(px.r, px.g, px.b, alpha) + end +end + +for (name, (c0, c1)) in pairs(CARS) + crop = img[ROWS[1]:ROWS[2], c0:c1] + rgba = to_transparent(crop) + oriented = reverse(rgba; dims = 1) # nose (was low row index) -> high index = +x + outpath = joinpath(@__DIR__, "car_$(name).png") + save(outpath, oriented) + @info "Wrote $outpath" size(oriented) +end diff --git a/docs/paper/figures/gpu_vs_cpu.jl b/docs/paper/figures/gpu_vs_cpu.jl new file mode 100644 index 0000000..53e0f38 --- /dev/null +++ b/docs/paper/figures/gpu_vs_cpu.jl @@ -0,0 +1,125 @@ +""" Generates the GPU-vs-CPU figure (§VII-D, fig:gpu): two panels, both plotting the same +quantity (CPU/GPU throughput ratio = CPU total time / GPU total time; >1 means GPU faster, +<1 means CPU faster). Left: vs. batch size B at the base per-instance size. Right: vs. +per-instance size at fixed B=1024 -- QP's n_x and the game's horizon T live on different +scales, so the right panel uses a twin x-axis (QP on bottom, game on top) sharing the +same y-axis, rather than conflating two different units on one axis. + +All values are median-of-N from benchmark/results/per_rep.csv (see +verify_paper_numbers.jl's `median_reps` for the same pattern) -- N ranges from 5 (the +larger problem sizes / long horizons, added in commit 79f12df) to 30 (the base +configs). The game side uses warm_start=true, matching the paper's choice to restrict +the game comparison to the warm-started regime (§VII-D). + +Each curve is shown with a shaded band: a CONSERVATIVE envelope +[min(CPU)/max(GPU), max(CPU)/min(GPU)] over the N repeated trials, not a statistical +confidence interval on the ratio itself (CPU and GPU reps are independent, unpaired +repeated trials of the same fixed computation, so there is no natural per-rep pairing +to bootstrap a tighter interval from). This is deliberately the widest reasonable band +given the two marginals; the true variability in the ratio is likely somewhat smaller. + +Run with: julia --project=benchmark docs/paper/figures/gpu_vs_cpu.jl +Output: docs/paper/figures/gpu_vs_cpu.pdf +""" + +using Statistics: median +using CairoMakie +using CairoMakie: rich, subscript + +const RESULTS = normpath(joinpath(@__DIR__, "..", "..", "..", "benchmark", "results")) + +function readcsv(path) + lines = readlines(path) + header = [Symbol(replace(h, "/" => "_")) for h in split(lines[1], ",")] + rows = NamedTuple[] + for line in lines[2:end] + isempty(line) && continue + fields = split(line, ",") + vals = map(fields) do f + isempty(f) && return missing + v = tryparse(Float64, f) + v === nothing ? String(f) : v + end + push!(rows, NamedTuple{Tuple(header)}(Tuple(vals))) + end + rows +end +filt(rows; kw...) = filter(r -> all(getproperty(r, k) == v for (k, v) in pairs(kw)), rows) + +pr = readcsv(joinpath(RESULTS, "per_rep.csv")) + +"Conservative [lo, med, hi] envelope for the CPU/GPU total-time ratio over N repeated trials." +function speedup_stats(; kw...) + cpu = filt(pr; device = "cpu", kw...) + gpu = filt(pr; device = "gpu", kw...) + (isempty(cpu) || isempty(gpu)) && return (; lo = NaN, med = NaN, hi = NaN) + cpu_t = getproperty.(cpu, :total_time_s) + gpu_t = getproperty.(gpu, :total_time_s) + (; + lo = minimum(cpu_t) / maximum(gpu_t), + med = median(cpu_t) / median(gpu_t), + hi = maximum(cpu_t) / minimum(gpu_t), + ) +end + +"Draw a shaded min/max band plus the median line+markers for one series." +function plot_series!(ax, xs, stats; color) + band!(ax, xs, getproperty.(stats, :lo), getproperty.(stats, :hi); color = (color, 0.2)) + lines!(ax, xs, getproperty.(stats, :med); color, linewidth = 2) + scatter!(ax, xs, getproperty.(stats, :med); color, markersize = 10) +end + +fig = Figure(; size = (900, 380)) + +# ---- Left: vs. batch size B, at base per-instance size (p32i16 / T10) -------------- +axL = Axis( + fig[1, 1]; + xlabel = "batch size B", ylabel = "CPU/GPU throughput ratio", + xscale = log10, +) +hlines!(axL, [1]; color = :black, linestyle = :dash, linewidth = 1) + +qp_B = [64.0, 256.0, 1024.0, 4096.0, 16384.0] +qp_stats_B = [speedup_stats(; problem = "qp", size = "p32i16", solver = "batched", warm_start = "false", num_samples = B) for B in qp_B] +plot_series!(axL, qp_B, qp_stats_B; color = :steelblue) + +game_B = [64.0, 256.0, 1024.0, 4096.0] +game_stats_B = [speedup_stats(; problem = "game", size = "T10", solver = "batched", warm_start = "false", num_samples = B) for B in game_B] +plot_series!(axL, game_B, game_stats_B; color = :firebrick) + +# Manual legend entries (plot_series! doesn't tag `label`s, since the band shouldn't get one). +Legend( + fig[1, 1], [LineElement(; color = :steelblue), LineElement(; color = :firebrick)], + ["Random QP", "Trajectory game"]; tellwidth = false, tellheight = false, halign = :left, valign = :top, margin = (10, 10, 10, 10), +) + +# ---- Right: vs. per-instance size at fixed B = 1024 (twin x-axis) ----------------- +axR = Axis( + fig[1, 2]; + xlabel = rich("QP primal dimension ", "n", subscript("x")), +) +axR_top = Axis(fig[1, 2]; xaxisposition = :top, xlabel = "trajectory-game horizon T") +hidespines!(axR_top) +hideydecorations!(axR_top) +linkyaxes!(axR, axR_top) +hlines!(axR, [1]; color = :black, linestyle = :dash, linewidth = 1) + +qp_nx = [32.0, 64.0, 128.0] +qp_sizes = ["p32i16", "p64i32", "p128i64"] +qp_stats_nx = [speedup_stats(; problem = "qp", size = sz, solver = "batched", warm_start = "false", num_samples = 1024.0) for sz in qp_sizes] +plot_series!(axR, qp_nx, qp_stats_nx; color = :steelblue) +xlims!(axR, 16, 144) + +game_T = [10.0, 20.0, 30.0, 40.0, 50.0] +game_sizes = ["T10", "T20", "T30", "T40", "T50"] +game_stats_T = [speedup_stats(; problem = "game", size = sz, solver = "batched", warm_start = "true", num_samples = 1024.0) for sz in game_sizes] +plot_series!(axR_top, game_T, game_stats_T; color = :firebrick) +xlims!(axR_top, 5, 55) + +outpath = joinpath(@__DIR__, "gpu_vs_cpu.pdf") +save(outpath, fig) +@info "Wrote $outpath" +@info "left QP" qp_B qp_stats_B +@info "left game" game_B game_stats_B +@info "right QP" qp_nx qp_stats_nx +@info "right game" game_T game_stats_T diff --git a/docs/paper/figures/gpu_vs_cpu.pdf b/docs/paper/figures/gpu_vs_cpu.pdf new file mode 100644 index 0000000..f27ece6 Binary files /dev/null and b/docs/paper/figures/gpu_vs_cpu.pdf differ diff --git a/docs/paper/figures/teaser_schematic.jl b/docs/paper/figures/teaser_schematic.jl new file mode 100644 index 0000000..8f5f0ff --- /dev/null +++ b/docs/paper/figures/teaser_schematic.jl @@ -0,0 +1,155 @@ +""" Generates Fig. 1(a): a static schematic of the lane-change trajectory game. + +Solves one "hero" instance plus a fan of ~40 other random instances from the exact same +distribution benchmarked in the Experiments section (T=10, via +`benchmark/trajectory_game_benchmark.jl`'s `generate_random_parameter`), and plots every +solved trajectory: the fan faintly in the background, the hero instance bold in front. + +Run with: julia --project=benchmark docs/paper/figures/teaser_schematic.jl +Output: docs/paper/figures/teaser_schematic.pdf +""" + +const REPO = normpath(joinpath(@__DIR__, "..", "..", "..")) +include(joinpath(REPO, "benchmark", "SolverBenchmarks.jl")) +using .SolverBenchmarks +const B = SolverBenchmarks +const Utils = B.TrajectoryGameBenchmarkUtils + +using MixedComplementarityProblems: MixedComplementarityProblems +const MCP = MixedComplementarityProblems +using BlockArrays: mortar +using TrajectoryGamesBase: unstack_trajectory +using CairoMakie +using FileIO: FileIO +import Random + +# Car icons cropped from the user-provided reference sheet (see assets/prepare_car_icons.jl +# for how these were made and oriented specifically for `image!`'s axis convention). +const CAR_IMAGES = ( + steelblue = FileIO.load(joinpath(@__DIR__, "assets", "car_blue.png")), + firebrick = FileIO.load(joinpath(@__DIR__, "assets", "car_red.png")), +) + +const HORIZON = 20 # longer than the T=10 benchmarked in Experiments — purely illustrative, + # chosen to show more of the merge interaction; see the warm-start note + # below for why a longer horizon needs one to stay reliable. +const N_FAN = 40 +const MAX_ATTEMPTS = 300 +const SEED = 7 + +(; environment, lane_centers) = Utils.setup_road_environment() +game = Utils.setup_trajectory_game(; environment) +parametric_game = Utils.build_parametric_game(; game, horizon = HORIZON, params_per_player = 1) + +rng = Random.MersenneTwister(SEED) + +const END_DIMS = cumsum(parametric_game.dims.x) +const NX = parametric_game.mcp.unconstrained_dimension + +# Zero-input-rollout warm start (matches `SolverBenchmarks.generate_initial_guess` and +# `examples/utils.jl`'s `solve_trajectory_game!`): a cold (all-zero) start becomes +# unreliable as the horizon grows, since it ignores each instance's actual initial +# position/velocity entirely. Reuses the same batched helper with a single column. +function warm_start(θ) + traj = vec(Utils.batched_zero_input_trajectory(; game, horizon = HORIZON, Θ_host = reshape(θ, :, 1))) + vcat(traj, zeros(NX - length(traj))) +end + +# NOTE: `MixedComplementarityProblems.solve(::ParametricGame, θ)` hardcodes +# `regularize_linear_solve = :internal`, which the benchmark's own comment +# (benchmark/batched_benchmark.jl) warns is "insufficient and diverges" for trajectory +# games carrying an internal η. The Experiments section's near-0-failure numbers +# (Table I: 1024/1024 solved) use `:identity` against the raw mcp instead, so we +# replicate the ParametricGame-level per-player unpacking (game.jl) by hand here to +# match that, rather than calling through the wrapper with its worse default. +function solve_positions(θ) + sol = MCP.solve( + MCP.InteriorPoint(), parametric_game.mcp, θ; + tol = 1e-4, regularize_linear_solve = :identity, x₀ = warm_start(θ), + ) + sol.status != :solved && return nothing + primals = map(1:length(END_DIMS)) do ii + (ii == 1) ? sol.x[1:END_DIMS[ii]] : sol.x[(END_DIMS[ii - 1] + 1):END_DIMS[ii]] + end + trajs = unstack_trajectory(Utils.unpack_trajectory(mortar(primals); dynamics = game.dynamics)) + map(trajs) do τ + pts = [(x[1], x[2]) for x in τ.xs] + pts + end +end + +solved_positions = [] +n_attempts = 0 +while length(solved_positions) < N_FAN + 1 && n_attempts < MAX_ATTEMPTS + global n_attempts += 1 + θ = B.generate_random_parameter(B.TrajectoryGameBenchmark(); rng, horizon = HORIZON) + positions = solve_positions(θ) + isnothing(positions) || push!(solved_positions, positions) +end +length(solved_positions) < N_FAN + 1 && + @warn "only $(length(solved_positions))/$(N_FAN + 1) instances solved within $MAX_ATTEMPTS attempts" +@info "$(length(solved_positions))/$n_attempts attempts solved" + +hero = first(solved_positions) +fan = solved_positions[2:end] + +lane_width = 2.0 +left_edge = first(lane_centers) - 0.5lane_width +right_edge = last(lane_centers) + 0.5lane_width + +# Rotate the whole scene 90° clockwise so cars drive left-to-right: plot (distance +# along road, lateral position) instead of (lateral position, distance along road). +# Mirroring the lateral coordinate about the road's centerline — rather than negating +# it — is algebraically equivalent to the rotation for a symmetric road, but keeps +# axis ticks in the original positive range instead of going negative; it also leaves +# the road-boundary/divider values unchanged (they're symmetric about that centerline). +mirror_lateral(px) = left_edge + right_edge - px +rotate(pt) = (pt[2], mirror_lateral(pt[1])) + +all_pts = [pt for traj in solved_positions for pts in traj for pt in pts] +along_road = [p[2] for p in all_pts] +margin = 1.0 +road_lo, road_hi = minimum(along_road) - margin, maximum(along_road) + margin + +"""Place a car icon (already oriented to point in +x by assets/prepare_car_icons.jl) at +`pos`, `car_length` long (m), preserving that image's own aspect ratio for its width.""" +function car_image!(ax, pos; img, car_length = 1.6) + cx, cy = pos + aspect_ratio = size(img, 1) / size(img, 2) # (length px) / (width px) + hl = car_length / 2 + hw = car_length / aspect_ratio / 2 + image!(ax, (cx - hl) .. (cx + hl), (cy - hw) .. (cy + hw), img) +end + +fig = Figure(; size = (620, 350)) +ax = Axis( + fig[1, 1]; + xlabel = "distance along road (m)", + ylabel = "lateral position (m)", + aspect = (road_hi - road_lo) / (right_edge - left_edge), +) +xlims!(ax, road_lo, road_hi) +ylims!(ax, left_edge - 0.5, right_edge + 0.5) + +# Road: solid outer boundaries, dashed internal lane divider(s) (now horizontal). +hlines!(ax, [left_edge, right_edge]; color = :black, linewidth = 2) +for k in 1:(length(lane_centers) - 1) + divider = (lane_centers[k] + lane_centers[k + 1]) / 2 + hlines!(ax, [divider]; color = :gray, linestyle = :dash, linewidth = 1) +end + +player_colors = (:steelblue, :firebrick) + +# Faint fan first (background), hero on top. +for traj in fan, (ii, pts) in enumerate(traj) + lines!(ax, rotate.(pts); color = (player_colors[ii], 0.12), linewidth = 1.5) +end +for (ii, pts) in enumerate(hero) + rotated = rotate.(pts) + lines!(ax, rotated; color = player_colors[ii], linewidth = 3) + car_image!(ax, rotated[1]; img = CAR_IMAGES[player_colors[ii]]) +end + +outpath = joinpath(@__DIR__, "teaser_schematic.pdf") +save(outpath, fig) +@info "Wrote $outpath ($(length(solved_positions))/$(N_FAN + 1) instances solved and plotted)" diff --git a/docs/paper/figures/teaser_schematic.pdf b/docs/paper/figures/teaser_schematic.pdf new file mode 100644 index 0000000..082d259 Binary files /dev/null and b/docs/paper/figures/teaser_schematic.pdf differ diff --git a/docs/paper/figures/teaser_throughput.jl b/docs/paper/figures/teaser_throughput.jl new file mode 100644 index 0000000..a818490 --- /dev/null +++ b/docs/paper/figures/teaser_throughput.jl @@ -0,0 +1,81 @@ +""" Generates Fig. 1(b): total wall-clock to clear a batch of trajectory-game instances, +PATH (sequential) vs. our CPU-multithreaded and GPU batched solvers, vs. batch size. + +Uses the SAME statistic policy as benchmark/results/scripts/verify_paper_numbers.jl: +median over whatever repeated trials were actually collected in +benchmark/results/per_rep.csv (10 reps for the batched CPU/GPU points; PATH has only +1-3 reps at each size, so its "median" is over however many exist there — labeled on +the plot). + +Run with: julia --project=benchmark docs/paper/figures/teaser_throughput.jl +Output: docs/paper/figures/teaser_throughput.pdf +""" + +using Statistics: median +using CairoMakie + +const RESULTS = normpath(joinpath(@__DIR__, "..", "..", "..", "benchmark", "results")) + +function readcsv(path) + lines = readlines(path) + header = [Symbol(replace(h, "/" => "_")) for h in split(lines[1], ",")] + rows = NamedTuple[] + for line in lines[2:end] + isempty(line) && continue + fields = split(line, ",") + vals = map(fields) do f + isempty(f) && return missing + v = tryparse(Float64, f) + v === nothing ? String(f) : v + end + push!(rows, NamedTuple{Tuple(header)}(Tuple(vals))) + end + rows +end + +matches(r, kw) = all(getproperty(r, k) == v for (k, v) in pairs(kw)) +filt(rows; kw...) = filter(r -> matches(r, kw), rows) + +pr = readcsv(joinpath(RESULTS, "per_rep.csv")) + +function median_time(; kw...) + rs = filt(pr; kw...) + isempty(rs) && return (; n = 0, median = NaN) + (; n = length(rs), median = median(getproperty.(rs, :total_time_s))) +end + +const SIZES = [64.0, 256.0, 1024.0, 4096.0] + +series = Dict( + "PATH" => [median_time(; problem = "game", size = "T10", solver = "path", warm_start = "false", num_samples = B) for B in SIZES], + "CPU (batched)" => [median_time(; problem = "game", size = "T10", solver = "batched", device = "cpu", warm_start = "false", num_samples = B) for B in SIZES], + "GPU (batched)" => [median_time(; problem = "game", size = "T10", solver = "batched", device = "gpu", warm_start = "false", num_samples = B) for B in SIZES], +) + +for (label, pts) in series, (B, p) in zip(SIZES, pts) + @info "$label B=$(Int(B)): median of $(p.n) reps = $(round(p.median, digits=4))s" +end + +fig = Figure(; size = (620, 250)) +ax = Axis( + fig[1, 1]; + xlabel = "batch size B", + ylabel = "total wall-clock time (s)", + xscale = log2, + yscale = log10, + xticks = (SIZES, string.(Int.(SIZES))), +) + +colors = Dict("PATH" => :gray30, "CPU (batched)" => :steelblue, "GPU (batched)" => :firebrick) +markers = Dict("PATH" => :circle, "CPU (batched)" => :rect, "GPU (batched)" => :utriangle) + +for label in ("PATH", "CPU (batched)", "GPU (batched)") + ys = [p.median for p in series[label]] + lines!(ax, SIZES, ys; color = colors[label], label, linewidth = 2) + scatter!(ax, SIZES, ys; color = colors[label], marker = markers[label], markersize = 12) +end +axislegend(ax; position = :rb) + +outpath = joinpath(@__DIR__, "teaser_throughput.pdf") +save(outpath, fig) +@info "Wrote $outpath" diff --git a/docs/paper/figures/teaser_throughput.pdf b/docs/paper/figures/teaser_throughput.pdf new file mode 100644 index 0000000..410904c Binary files /dev/null and b/docs/paper/figures/teaser_throughput.pdf differ diff --git a/docs/paper/figures/thread_scaling.jl b/docs/paper/figures/thread_scaling.jl new file mode 100644 index 0000000..0cb5eee --- /dev/null +++ b/docs/paper/figures/thread_scaling.jl @@ -0,0 +1,56 @@ +""" Generates the thread-scaling figure (§VII-C, fig:threadscaling): batched-solver +throughput (instances/s) vs. CPU thread count, one curve per problem family, at a fixed +batch size of N = 1024. Reads directly from benchmark/results/thread_scaling.csv (already +one row per (problem, nthreads) — no repeated trials needed here, it's the throughput +number itself, not a wall-clock total). + +Run with: julia --project=benchmark docs/paper/figures/thread_scaling.jl +Output: docs/paper/figures/thread_scaling.pdf +""" + +using CairoMakie + +const RESULTS = normpath(joinpath(@__DIR__, "..", "..", "..", "benchmark", "results")) + +function readcsv(path) + lines = readlines(path) + header = [Symbol(replace(h, "/" => "_")) for h in split(lines[1], ",")] + rows = NamedTuple[] + for line in lines[2:end] + isempty(line) && continue + fields = split(line, ",") + vals = map(fields) do f + isempty(f) && return missing + v = tryparse(Float64, f) + v === nothing ? String(f) : v + end + push!(rows, NamedTuple{Tuple(header)}(Tuple(vals))) + end + rows +end +filt(rows; kw...) = filter(r -> all(getproperty(r, k) == v for (k, v) in pairs(kw)), rows) + +ts = readcsv(joinpath(RESULTS, "thread_scaling.csv")) + +fig = Figure(; size = (480, 360)) +ax = Axis( + fig[1, 1]; + xlabel = "CPU threads", ylabel = "throughput (instances/s)", + xscale = log2, xticks = ([1, 2, 4, 8, 16, 32], ["1", "2", "4", "8", "16", "32"]), +) +vlines!(ax, [16]; color = :gray, linestyle = :dash, linewidth = 1, label = "16 physical cores") + +colors = Dict("qp" => :steelblue, "game" => :firebrick) +labels = Dict("qp" => "Random QP", "game" => "Trajectory game") +for problem in ("qp", "game") + rs = sort(filt(ts; problem), by = r -> r.nthreads) + xs = getproperty.(rs, :nthreads) + ys = getproperty.(rs, :throughput_per_s) + lines!(ax, xs, ys; color = colors[problem], linewidth = 2, label = labels[problem]) + scatter!(ax, xs, ys; color = colors[problem], markersize = 10) +end +axislegend(ax; position = :rb) + +outpath = joinpath(@__DIR__, "thread_scaling.pdf") +save(outpath, fig) +@info "Wrote $outpath" diff --git a/docs/paper/figures/thread_scaling.pdf b/docs/paper/figures/thread_scaling.pdf new file mode 100644 index 0000000..3639ff4 Binary files /dev/null and b/docs/paper/figures/thread_scaling.pdf differ diff --git a/docs/paper/main.pdf b/docs/paper/main.pdf new file mode 100644 index 0000000..557582b Binary files /dev/null and b/docs/paper/main.pdf differ diff --git a/docs/paper/main.tex b/docs/paper/main.tex new file mode 100644 index 0000000..a893ab0 --- /dev/null +++ b/docs/paper/main.tex @@ -0,0 +1,850 @@ +\documentclass[conference]{IEEEtran} + +\usepackage{amsmath,amssymb} +\usepackage{mathtools} +\usepackage{graphicx} +\usepackage{booktabs} +\usepackage{multirow} +\usepackage{cite} +\usepackage{url} +\usepackage[vlined,linesnumbered]{algorithm2e} +\RestyleAlgo{ruled} +\usepackage{hyperref} +\usepackage{xcolor} +\usepackage{caption} +\usepackage{subcaption} +\usepackage{amsthm} +\newtheorem{remark}{Remark} +\usepackage{nicefrac} + +\usepackage[capitalize,noabbrev,nameinlink]{cleveref} +\crefformat{equation}{(#2#1#3)} +% algorithm2e has no built-in cleveref support. `algocf` is the counter for the +% algorithm float itself (i.e. "Algorithm 1") and cref works fine on it. Its +% per-line counter `AlgoLine` is NOT reliably crefable, though: cleveref's +% extended tracking grabs the wrong counter's value for labels placed on +% algorithm2e's auto-numbered lines (confirmed empirically -- every such label +% rendered as "Line 1", i.e. algocf's value, even though the plain \ref value +% in the .aux was correct). Use plain \ref (with a hand-written "line"/"lines") +% for algorithm line labels instead of \cref/\Cref. +\crefname{algocf}{algorithm}{algorithms} +\Crefname{algocf}{Algorithm}{Algorithms} +\Crefname{assumption}{Assumption}{Assumptions} +\crefrangeformat{assumption}{Assumptions~#3#1#4-#5#2#6} +\crefname{remark}{remark}{remarks} +\Crefname{remark}{Remark}{Remarks} + +% Flags a claim, number, or section that must be revisited once final benchmark +% results are in. Renders inline, in color, so it is impossible to miss in a draft +% but is meant to be resolved (never shipped) before the report is finalized. +\newcommand{\todo}[1]{\textcolor{red}{\textbf{[TODO: #1]}}} + +% A recurring, visually set-off instance of the running example (the lane-change +% trajectory game), so later sections (e.g. batched construction) can reuse the same +% box without redefining it as a new figure/table each time. +\usepackage{mdframed} +\newcommand{\contentbox}[2]{ + \begin{mdframed}[backgroundcolor=black!5,linecolor=black!60,linewidth=0.5mm] + \vspace{0.2mm} + {\bf Running example: #1.} #2 + \end{mdframed} +} + +\begin{document} + +\title{\Large \bf \texttt{MixedComplementarityProblems.jl}: A Fast, Batched, + Open-Source\\Interior Point Solver for Mixed Complementarity Problems} + +\author{ + \IEEEauthorblockN{David Fridovich-Keil} + \IEEEauthorblockA{Department of Aerospace Engineering and Engineering Mechanics\\ + The University of Texas at Austin\\ + Austin, TX, USA\\ + dfk@utexas.edu} +} + +\maketitle + + +\begin{abstract} +Mixed complementarity problems (MCPs) arise as the first-order optimality conditions of +nonlinear programs and noncooperative games, and provide a natural formulation for +multi-agent trajectory optimization problems that appear throughout robotics. The +dominant solver for problems of this form is \texttt{PATH}, which offers strong +performance on robotics problems but remains closed-source. We present \texttt{MixedComplementarityProblems.jl}, an open-source, pure +Julia implementation of an interior point method for parametric MCPs that: (i) matches +\texttt{PATH}'s reliability on standard benchmarks, (ii) natively supports +batched, parallel processing of many parameter instances, +either across CPU threads or on an NVIDIA GPU, and (iii) supports efficient +automatic differentiation of solutions with respect to problem parameters. +On a multi-agent lane-change trajectory game representative of robotics planning +problems, our CPU-multithreaded batched solver clears a batch of parametric instances + $\sim\!100\times$ faster than sequential calls to \texttt{PATH}. A GPU +backend, running the same solver implementation unmodified, also clears these batches far +faster than \texttt{PATH}, but does not outperform the multithreaded CPU on this problem; +the GPU pulls ahead only once each per-instance KKT system grows large, and we characterize +this regime dependence. We describe the solver's interior point formulation, the +abstraction that lets a single solver implementation run unmodified across dense, +batched-sparse, and single-large linear-algebra backends, and report benchmarks against +\texttt{PATH} on both randomly generated quadratic programs and trajectory games. +\end{abstract} + +\section{Introduction} +\label{sec:intro} + +Multi-agent trajectory planning problems in robotics, ranging from autonomous driving to human-robot interaction, are naturally posed as +noncooperative dynamic games, in which each agent optimizes its own trajectory subject +to the others' choices. The first-order necessary conditions of optimality for each agent in the game take the form of a +mixed complementarity problem (MCP). Solving MCPs rapidly, therefore, becomes a core computational burden for real-time decision-making in multi-agent robotics applications. + +The dominant solver for this class of problems is \texttt{PATH}~\cite{dirkse1995path}. \texttt{PATH} +is mature, reliable, and widely used; but, it is closed-source, solves one problem instance at a +time, and was not designed to support automatic differentiation of solutions with respect to problem parameters. +All three pose serious, practical limitations for use in robotics: (i) developers must have access to solver internals in order to customize to the problem at hand, (ii) scenario- and contingency-based planning (e.g., \cite{li2023scenario,peters2024contingency}) requires solving a \emph{batch} of identically-structured but differently \emph{parameterized} problems, and (iii) modern machine learning pipelines often embed optimization problem solvers as ``layers'' \cite{amos2017optnet}, and end-to-end differentiability requires us to be able to differentiate a solver's output with respect to its input parameters. + +\begin{figure}[tp] + \centering + \begin{subfigure}{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{figures/teaser_schematic.pdf} + \caption{A multi-agent trajectory game is one instance out of a batch of + parametrically-related MCPs, solved simultaneously. Here, the parameter of + the game denotes each agent's initial state.} + \end{subfigure} + \par\vspace{0.2cm} + \begin{subfigure}{0.48\textwidth} + \includegraphics[width=\linewidth]{figures/teaser_throughput.pdf} + \caption{Clearing that batch: sequential \texttt{PATH} calls versus the + proposed batched CPU/GPU solver.} + \end{subfigure} + \caption{Solving a batch of parametric trajectory-game instances (a) with + \texttt{MixedComplementarityProblems.jl}'s batched interior point solver is + (b) substantially faster than solving the same batch with sequential calls to + the existing state of the art, \texttt{PATH} \cite{dirkse1995path}.} + \label{fig:teaser} +\end{figure} + +We present \href{https://github.com/CLeARoboticsLab/MixedComplementarityProblems.jl}{\texttt{MixedComplementarityProblems.jl}}, an open-source, pure Julia solver for parametric MCPs that addresses all of these practical challenges. Concretely, we contribute: +\begin{itemize} + \item A simple and easily-customized interior point method for parametric MCPs that matches \texttt{PATH}'s + reliability on standard benchmarks, while supporting automatic differentiation of solutions with respect to problem parameters. + \item A native \emph{batched} solve mode, in which many parameter instances sharing + one MCP structure are solved simultaneously, parallelized across CPU threads or an + NVIDIA GPU. + \item An abstraction boundary that separates the + interior point loop and its linear algebra + backend, which lets a single solver implementation run unmodified across dense, + batched-sparse, and single-large-instance regimes, so that supporting a new device or + linear-algebra strategy never requires touching the solver loop itself. +\end{itemize} + +As \cref{fig:teaser} previews and \cref{sec:experiments} quantifies, on a +multi-agent lane-change trajectory game representative of robotics planning problems, +clearing a batch of parametric instances with our batched solver is roughly +$100\times$ faster than clearing the same batch with sequential calls to \texttt{PATH}. + +\section{Background: Mixed Complementarity Problems} +\label{sec:background} + +\subsection{Problem definition} +\label{sec:background:def} + +A mixed complementarity problem is specified by a map $F:\mathbb{R}^n\to\mathbb{R}^n$ +and bounds $\ell,u\in(\mathbb{R}\cup\{\pm\infty\})^n$; a solution is a vector +$z\in\mathbb{R}^n$ satisfying, for every coordinate dimension $i$, +\begin{equation} + \begin{aligned} + \ell_i < z_i < u_i &\implies F_i(z) = 0, \\ + z_i = \ell_i &\implies F_i(z) \ge 0, \\ + z_i = u_i &\implies F_i(z) \le 0. + \end{aligned} + \label{eq:mcp-box} +\end{equation} +Readers are referred to \cite{facchinei2003finite} for a complete introduction to MCPs and related problems. + +\subsection{MCPs from KKT conditions} +\label{sec:background:kkt} + +Consider a parametric nonlinear program +\begin{equation} + \min_{x} \; f(x;\theta) \quad \text{s.t.} \quad g(x; \theta) = 0,~ h(x;\theta) \ge 0, + \label{eq:nlp} +\end{equation} +with primal variables $x\in\mathbb{R}^{n_x}$, parameters $\theta$, and Lagrange +multipliers $\lambda \in \mathbb{R}^{n_\lambda}$ associated with the equality constraint $g$ and $\mu \in\mathbb{R}_{\ge 0}^{n_\mu}$ associated with the inequality constraint $h$. The first order necessary (i.e. Karush-Kuhn-Tucker, KKT) conditions of optimality for problem +\cref{eq:nlp} are +\begin{subequations} + \label{eq:primal-dual-mcp} + \begin{align} + &0 = \overbrace{\begin{bmatrix} + \nabla_x f(x;\theta) - \nabla_x g(x; \theta)^\top \lambda - \nabla_x h(x;\theta)^\top \mu\\ + g(x; \theta) + \end{bmatrix}}^{G(x,\lambda, \mu;\theta)} \\ + &0 \le \underbrace{h(x; \theta)}_{H(x;\theta)} \perp \mu \ge 0. + \end{align} +\end{subequations} + +Problem \cref{eq:primal-dual-mcp} can be converted into the form \cref{eq:mcp-box} by taking $z=(x,\lambda,\mu)$, $F = (G, H)$, $u_i = \infty$ ($\forall i$), $\ell_i = -\infty$ ($\forall i \in \{1, 2, \dots, n_x + n_\lambda\}$), and $\ell_i = 0$ ($\forall i > n_x + n_\lambda$). +Because of the natural connection between KKT conditions (e.g., arising from trajectory optimization problems in robotics) and this \emph{primal-dual} form of the MCP, it is the primary form +\texttt{MixedComplementarityProblems.jl} exposes. + +\subsection{MCPs from noncooperative games} +\label{sec:background:games} + +The construction in \cref{sec:background:kkt} extends from one decision maker to many. +Consider $N$ agents, where agent $i$ solves +\begin{subequations} +\begin{align} + &\forall i \begin{cases} + \min_{x_i} \; f_i(x_i, x_{\neg i};\theta) \\ + \text{s.t.} \quad g_i(x_i, x_{\neg i}; \theta) = 0,~ h_i(x_i,x_{\neg i};\theta) \ge 0 + \end{cases}\\ + &\text{s.t.} \quad \; g_\mathrm{sh}(x;\theta) = 0,~ h_\mathrm{sh}(x; \theta) \ge 0. +\end{align} +\end{subequations} +Here, each agent $i$ must respect its own private equality and inequality +constraints ($g_i$ and $h_i$, respectively), and also constraints +$g_\mathrm{sh}, h_\mathrm{sh}$ which are shared across agents +(e.g., pairwise collision avoidance). +Each agent $i$'s decision variable is $x_i \in \mathbb{R}^{n_{x_i}}$, and $x_{\neg i}$ denotes the other agents' +decisions so that $x= (x_i, x_{\neg i}) = (x_1,\dots,x_N)$. Writing out each agent's KKT conditions as in +\cref{eq:primal-dual-mcp} and concatenating them---with the shared constraints $g_\mathrm{sh}, h_\mathrm{sh}$ +coupling agents through shared multipliers $\lambda_\mathrm{sh}, \mu_\mathrm{sh}$---yields a single primal-dual MCP whose +solution is a generalized Nash equilibrium: a strategy profile from which no agent can +unilaterally improve its own objective \cite{facchinei2003finite}. + +Concretely, concatenate the Lagrange multipliers corresponding to equality +constraints as $\lambda \coloneqq +(\lambda_\mathrm{pr}, \lambda_\mathrm{sh})$ and those for inequality +constraints as $\mu \coloneqq (\mu_\mathrm{pr}, \mu_\mathrm{sh})$, with +private multipliers denoted $\lambda_\mathrm{pr} \coloneqq (\lambda_1,\dots,\lambda_N)$ and +$\mu_\mathrm{priv} \coloneqq (\mu_1,\dots,\mu_N)$. Each agent $i$'s Lagrangian is given by %3D +\begin{multline} + \label{eq:lagrangian} + \mathcal{L}_i(x, \lambda, \mu; \theta) \coloneqq f_i(x; \theta) - + \lambda_i^\top g_i(x; \theta) - \mu_i^\top h_i(x; \theta) - \\ + \lambda_\mathrm{sh}^\top g_\mathrm{sh}(x; \theta) - \mu_\mathrm{sh}^\top h_\mathrm{sh}(x; \theta). +\end{multline} +The $N$ agents' concatenated KKT conditions are then an +instance of \cref{eq:primal-dual-mcp}, with +\begin{equation} + \begin{aligned} + G &\coloneqq \left(\nabla_{x_1} \mathcal{L}_1, \dots, \nabla_{x_N} \mathcal{L}_N, g_1,\dots,g_N, + g_\mathrm{sh}\right), \\ + H &\coloneqq \left(h_1,\dots,h_N,h_\mathrm{sh}\right), + \end{aligned} + \label{eq:game-mcp} +\end{equation} +with $G$ and $H$ functions of $(x, \lambda, \mu)$ and parameterized by $\theta$. + +\contentbox{A lane-change trajectory game}{ + Consider the two-agent lane changing trajectory game of \cref{fig:teaser}(a). + Here, each agent's decision variable $x_i = \{s_i(t), a_i(t)\}_{t = 1}^T$ consists of a state-action + \emph{trajectory} over time horizon $T$. The private equality constraints + $g_i$ encode system dynamics $\big(s_i(t), a_i(t)\big) \to s_i(t+1)$, private + inequality constraints encode actuator limits $\|a_i(t)\| \le \bar a_i$, and + shared inequality constraints encode collision-avoidance $\|P (s_1(t) - s_2(t))\| + \ge \Delta$ (with projection matrix $P$ recovering agents' position). + Agents' objective functions $f_i$ encode lane and speed preferences, and + penalize control effort. + Parameters $\theta$ encode the agents' initial states $s_i(1)$, lane + preferences, desired speeds, actuator limits $\bar a_i$, and + collision-avoidance radius $\Delta$. + + Observe that the shared collision avoidance constraint---and any nonlinearity in agents' + dynamics---renders the feasible set nonconvex. +} + +\section{Solver Design} +\label{sec:design} + +\texttt{MixedComplementarityProblems.jl} implements an intentionally-simple +primal-dual interior point method to solve problem \cref{eq:primal-dual-mcp}. +To that end, we introduce a slack variable $w \in \mathbb{R}^{n_\mu}$ and rewrite +\cref{eq:primal-dual-mcp} in terms of $w \ge 0$ and a homotopy parameter $\rho > +0$: +\begin{equation} +\label{eq:slacked-mcp} +K_\rho(x, \lambda, \mu, z; \theta) \coloneqq \begin{bmatrix} + G(x, \lambda, \mu; \theta) \\ + H(x; \theta) - w \\ + w \odot \mu - \rho 1 +\end{bmatrix} = 0. +\end{equation} +Note that the last row of $K_\rho$ involves the elementwise product $w \odot +\mu$ and, consequently, the number of equations in $K_\rho$ is equal to +$d \coloneqq \dim(x) + \dim(\lambda) + \dim(\mu) + \dim(w)$, the total dimension of the +primal, dual, and slack variables---the per-instance KKT system size we return to when +characterizing GPU-vs-CPU scaling in \cref{sec:exp:gpu}. + +Per \cref{alg:solver}, we proceed in rounds by solving +\cref{eq:slacked-mcp} via a regularized Newton method and decaying $\rho \to 0$ +to satisfy a user-defined tolerance $\|K_0\| +\le \bar K$. +For a given value of $\rho$, the regularized Newton direction $\delta \coloneqq +(\delta_x, \delta_\lambda, \delta_\mu, \delta_w)$ solves +\begin{equation} + \label{eq:newton} + \left(\begin{bmatrix} + \nabla_x G & \nabla_\lambda G & \nabla_\mu G & 0\\ + \nabla_x H & 0 & 0 & -I \\ + 0 & 0 & \mathrm{dg}(w) & \mathrm{dg}(\mu) + \end{bmatrix} + \epsilon I\right) \delta = -K_\rho, +\end{equation} +with $\epsilon \ge 0$ a regularization parameter chosen as described below, and +$\mathrm{dg}(\cdot)$ returning a square matrix with its argument on the main diagonal +and all other entries zero. + +We implement two additional subtleties. First, on line~\ref{line:linesearch}, we conduct a +``fraction to the boundary'' linesearch to control the rate at which $w, \mu +\ge 0$ can approach $0$ (cf. \cite[\S19]{nocedal2006numerical}). At each iteration $k$, stepsizes $\alpha_k, \beta_k$ are chosen so that +\begin{equation} +\label{eq:linesearch} +\begin{aligned} + \alpha_k &= \max\big(\alpha \in [0, 1] ~:~ w + \alpha \delta_w \ge (1 - \tau) w\big)\\ + \beta_k &= \max\big(\beta \in [0, 1] ~:~ \mu + \beta \delta_\mu \ge (1 - \tau) \mu\big), +\end{aligned} +\end{equation} +where the inequalities are interpreted elementwise and $\tau \in (0, 1)$ controls the rate of decay. Linesearch +\cref{eq:linesearch} has a closed-form, exact solution, which makes it amenable +to batched computation as described in \cref{sec:batched}. + +Second, we construct an \emph{adaptive} choice of the Newton step regularization +parameter $\epsilon$ and the interior point homotopy parameter $\rho$ that aims +to control subproblem conditioning. +At the end of each inner loop (lines~\ref{line:tighten} and~\ref{line:loosen}), if the solver successfully drove $\|K_\rho\| \le +\rho$ then we \emph{tighten} $\rho$ and $\epsilon$ at a rate dependent upon the +number of Newton steps required to converge; conversely, if the inner loop fails +and $\|K_\rho\| > \rho$, we \emph{loosen} both $\rho$ and +$\epsilon$ to improve the conditioning of the next subproblem and require a less +precise solution. + +\begin{algorithm}[t] +\DontPrintSemicolon +\KwIn{initial iterate $(x,\lambda,\mu,w)$ with $\mu,w>0$; parameters $\theta$; + initial $\rho,\epsilon > 0$; tightening/loosening rates + $\underline\gamma,\bar\gamma\in(0,1)$; max.\ inner + iterations $k_\mathrm{max}$; tolerance $\bar K$} +\KwOut{$(x,\lambda,\mu,w)$ with $\|K_0(x,\lambda,\mu,w)\|\le\bar K$} +\While{$\|K_0(x,\lambda,\mu,w;\theta)\| > \bar K$}{ + $k \gets 0$\; + \Repeat{$\|K_\rho(x,\lambda,\mu,w;\theta)\|\le\rho$ or $k\ge k_\mathrm{max}$}{ + assemble $K_\rho$ \cref{eq:slacked-mcp} and solve \cref{eq:newton} for the Newton direction $\delta=(\delta_x,\delta_\lambda,\delta_\mu,\delta_w)$\; + compute step sizes $\alpha_k,\beta_k$ via the fraction-to-boundary rule \cref{eq:linesearch}\label{line:linesearch}\; + $x \gets x+\alpha_k\delta_x$,\quad $\lambda\gets\lambda+\alpha_k\delta_\lambda$,\quad + $w\gets w+\alpha_k\delta_w$,\quad $\mu\gets\mu+\beta_k\delta_\mu$\; + $k \gets k+1$\; + } + \eIf{$\|K_\rho(x,\lambda,\mu,z;\theta)\|\le\rho$}{ + $\rho \gets \rho\,(1-e^{-\underline\gamma k})$,\quad + $\epsilon \gets \epsilon\,(1-e^{-\underline\gamma k})$ + \tcp*{tighten}\label{line:tighten} + }{ + $\rho \gets \rho\,(1+e^{-\bar\gamma k})$,\quad + $\epsilon \gets \epsilon\,(1+e^{-\bar\gamma k})$ + \tcp*{loosen}\label{line:loosen} + } + $\rho \gets \min(\rho, 1)$\; +} +\Return{$(x,\lambda,\mu,z)$} +\caption{Primal-dual interior point method for \cref{eq:primal-dual-mcp}} +\label{alg:solver} +\end{algorithm} + +\section{Batched and GPU-Parallel Solving} +\label{sec:batched} + +Many applications require solving entire \emph{batches} of MCPs that share +the same symbolic structure $(G, H)$ and differ only in their parameter vector +$\theta$---for example, +\cref{fig:teaser}(a) showcases a batch of trajectory games with varying initial +conditions for the two agents. Rather than naively deploying +\cref{alg:solver} on each instance in series, we reuse the shared symbolic +structure and exploit hardware-level parallelism (both CPU multithreading and +GPU) to solve an entire batch of $B$ parametrically-related instances in a single call. + +\contentbox{A batch of lane-change games}{ + Sampling $B$ initial conditions (or lane preferences, etc.) + as in + \cref{fig:teaser}(a) yields $B$ instances of the same game, differing only + in $\theta$. Stacking them column-wise into $\Theta \in \mathbb{R}^{n_\theta \times + B}$ and calling \cref{alg:batched} solves the entire batch simultaneously, + e.g., to plan across a distribution of scenarios + \cite{li2023scenario} rather than one scenario at a time. +} + + +\subsection{A device- and strategy-agnostic solver loop} +\label{sec:batched:loop} + +For convenience, we stack the batch's parameter vectors column-wise into $\Theta \in \mathbb{R}^{n_\theta +\times B}$, so that column $b$ is instance $b$'s parameter vector $\theta_b$; +likewise, we +stack each instance's iterate into $X, \Lambda, M, W \in \mathbb{R}^{(\cdot) \times B}$. +\cref{alg:solver} is then implemented \emph{once}, against a small set of verbs---\texttt{residual!}, \texttt{jacobian!}, \texttt{factorize!}, \texttt{ldiv!}---that +consume and return plain $(\cdot) \times B$ arrays. The numeric representation of the +batched Jacobian $\nabla K_\rho$ and its factorization never leave these four verbs: they +are encapsulated inside a strategy-specific cache, so the solver's control flow is agnostic to +both \emph{where} it runs +and \emph{how} $\nabla K_\rho$ is represented and factored. We implement a +``batched sparse'' strategy: the $B$ instances share one sparsity +pattern for $\nabla K_\rho$, computed once from the symbolic $(G, H)$, and each instance +fills only its own column of the corresponding $(\mathrm{nnz} \times B)$ value +array containing only the structurally nonzero elements of $\nabla K_\rho$. + +\subsection{Adapting \cref{alg:solver} to a batch} + +Three changes distinguish the batched loop in \cref{alg:batched} from \cref{alg:solver}. First, the homotopy +and regularization parameters $\rho, \epsilon$, and the convergence check +$\|K_\rho\|$, all become length-$B$, one per instance, so that harder +problem instances +can iterate longer without penalizing easier instances in the same batch. + +Second, because linesearch \cref{eq:linesearch} has a +closed-form solution, stepsizes are computed elementwise for each instance in the batch. There is no backtracking loop and, in +particular, no per-instance synchronization between host and device. + +Third, a batch can often include easy, hard, and infeasible instances. +Therefore, after an instance exceeds a maximum number (e.g., $5$) of consecutive +outer iterations without satisfying $\|K_\rho\| \le \rho$, it is flagged as a +failure. Depending upon the hardware backend (CPU or GPU), these failures are +either skipped or retained, but kept frozen. This automatic +detection of failures prevents a handful of stalled instances from slowing down +a batch composed of many easier instances. + +\begin{algorithm}[t] +\DontPrintSemicolon +\KwIn{batch of $B$ instances $(x_b,\lambda_b,\mu_b,w_b;\theta_b)$ as in + \cref{alg:solver}, each with its own $\rho_b,\epsilon_b$; tightening/loosening + rates $\underline\gamma,\bar\gamma$; max.\ inner/outer iterations + $k_\mathrm{max}, T_\mathrm{max}$; max.\ consecutive stalled outer rounds + $T_\mathrm{stall}$; tolerance $\bar K$} +\KwOut{status$_b \in \{\texttt{solved}, \texttt{failed}\}$ and + $(x_b,\lambda_b,\mu_b,w_b)$ for $b = 1,\dots,B$} +status$_b \gets \texttt{active}$, $\mathrm{stall}_b \gets 0$ \quad $\forall b$\; +$t \gets 0$\; +\While{$t < T_\mathrm{max}$ and status$_b = \texttt{active}$ for some $b$}{ + $k \gets 0$\; + \Repeat{$\|K_{\rho_b}\| \le \rho_b$ for every active $b$, or $k \ge k_\mathrm{max}$}{ + assemble and factor $\nabla K_{\rho_b}$ and solve for $\delta_b$, for every $b$ + with status$_b = \texttt{active}$\label{line:batched-solve}\; + step active instances via fraction-to-boundary \cref{eq:linesearch}; instances + with status$_b \ne \texttt{active}$ take a zero step\; + $k \gets k + 1$\; + } + \ForEach{$b$ with status$_b = \texttt{active}$}{ + \eIf{$\|K_{\rho_b}\| \le \rho_b$}{ + \eIf{$\rho_b \le \bar K$}{ + status$_b \gets \texttt{solved}$ + }{ + tighten $\rho_b,\epsilon_b$ (as in \cref{alg:solver}); $\mathrm{stall}_b + \gets 0$ + } + }{ + loosen $\rho_b,\epsilon_b$; $\mathrm{stall}_b \gets \mathrm{stall}_b + 1$\; + } + \lIf{$\mathrm{stall}_b \ge T_\mathrm{stall}$}{status$_b \gets \texttt{failed}$} + } + $t \gets t + 1$\; +} +\Return{$\{\mathrm{status}_b, (x_b,\lambda_b,\mu_b,w_b)\}_{b=1}^B$} +\caption{Batched primal-dual interior point} +\label{alg:batched} +\end{algorithm} + +Stalled instances are not left to run: line~\ref{line:batched-solve} restricts +the (re)assembly, factorization, and solve to active instances. This prevents a handful of stalled or failed instances from consuming Newton +iterations once flagged; otherwise, they would force the entire batch to +consume the maximum iteration count. + +\subsection{Backends} + +On CPU, the shared sparsity pattern is assembled once and each instance's numeric +factorization of $\nabla K_\rho$ reuses the pivot ordering computed on the first +outer round; the $B$ instances are distributed across threads. Because each +instance's factorization is an independent per-instance sparse LU (KLU) \cite{davis2010algorithm}, skipping an +inactive instance at line~\ref{line:batched-solve} is a literal per-instance branch: an +instance with status$_b \ne \texttt{active}$ costs nothing beyond a boolean check, so +CPU throughput scales with the number of instances still active, not $B$. + +The GPU backend cannot make the same trade. It factors and solves the batch's shared +sparsity pattern with \texttt{cuDSS}'s \emph{batched} sparse solver, which processes all $B$ +instances as a single device-side call and there is no per-instance skip inside a batched +factorization. Consequently, line~\ref{line:batched-solve}'s active-instance +restriction is accepted on GPU only to maintain a uniform verb signature across backends, but +is a no-op there: every outer round factors and solves \emph{all} $B$ instances, +converged and failed ones included, and only their zero stepsize keeps the frozen +instances' $(x_b,\lambda_b,\mu_b,w_b)$ unchanged. This imposes a real cost on +GPU---one paid in exchange for offloading the whole batch to a single, highly +parallel factorization---and it is the reason $T_\mathrm{stall}$ matters more on GPU +than on CPU. + +\begin{remark} +The verb set of \cref{sec:batched:loop} is deliberately narrow in order to +readily accommodate other strategies tailored to different problem structures. +For example, a ``batched dense'' strategy could represent +$\nabla K_\rho$ densely, as a $(\cdot) \times (\cdot) \times B$ tensor, and solve it with a batched +LU factorization. +\end{remark} + +\section{Differentiable Solving} +\label{sec:differentiable} + +Embedding an MCP solve---and the games it can encode---as a differentiable layer inside a +machine learning pipeline requires differentiating the solution with respect to problem +parameters~\cite{amos2017optnet}. Because +\texttt{MixedComplementarityProblems.jl} implements a smooth, interior point method, this capability follows directly from the implicit +function theorem applied to \cref{eq:primal-dual-mcp}, at no cost to the solver design +described above. + +Let $z \coloneqq (x, \lambda, \mu, w)$ for the primal-dual-slack iterate. A solution +satisfies $K_0(z; \theta) = 0$ (i.e., \cref{eq:slacked-mcp} in the limit $\rho \to 0$); wherever +$\nabla_z K_0$ is nonsingular, differentiating with respect to $\theta$, +applying the chain rule, and rearranging gives +\begin{equation} + \label{eq:sensitivity} + \frac{\partial z}{\partial \theta} = -\left(\nabla_z K_0\right)^{-1} \nabla_\theta K_0. +\end{equation} +Crucially, $\nabla_\zeta K_0$ at a converged iterate is exactly the (unregularized) Newton +Jacobian of \cref{eq:newton} already assembled and factored at the last step of +\cref{alg:solver}. Evaluating \cref{eq:sensitivity} therefore costs one additional +$n_\theta$-column \texttt{ldiv!} against that same factorization---not a new factorization---and +extends unchanged to the batched setting, where it becomes a per-instance multi-right-hand-side +solve of shape $(\cdot) \times n_\theta \times B$ against each instance's existing factorization. + +Equation \cref{eq:sensitivity} supports both forward- and reverse-mode automatic differentiation. Forward-mode +autodifferentiation dispatches on dual number-typed $\theta$: the solver solves once at the +underlying real value and propagates dual perturbations through $\nicefrac{\partial z}{\partial +\theta}$. Reverse-mode autodifferentiation is implemented via a single +Jacobian-vector product. Both are implemented for the unbatched and batched +solvers alike, and because +$\nabla_\theta K_0$ is only needed for \cref{eq:sensitivity}, its symbolic construction is +an opt-in user choice during MCP construction, so users who do not need +gradients pay no additional compile- or run-time cost. + +As with any KKT-based sensitivity, \cref{eq:sensitivity} presumes the set of +active constraints for each problem is constant near $\theta$: where an +inequality constraint is only weakly active, the true solution map +is only Lipschitz, not differentiable, and $\nicefrac{\partial z}{\partial \theta}$ is a one-sided +approximation. This is a property of the KKT system itself, not a solver-specific limitation. + +\contentbox{Differentiating the lane-change game}{ + We validate \cref{eq:sensitivity} against central finite differences on the lane-change + game of \cref{fig:teaser}(a). Over $20$ random instances converging to $\|K_0\| \le + 10^{-4}$, differentiating a scalar function of the solution (the primal and dual + variables' squared norm) with respect to $\theta$ via forward-mode + autodifferentiation (using \texttt{ForwardDiff.jl} \cite{RevelsLubinPapamarkou2016}) agrees with a + central-difference approximation (step $10^{-6}$) to a median relative error, in the + gradient's norm, of $6 \times 10^{-9}$, and no worse than $0.1\%$ across all $20$ + instances. +} + +\section{Experiments} +\label{sec:experiments} + +We evaluate \texttt{MixedComplementarityProblems.jl} against \texttt{PATH} along the two +axes that matter for the robotics applications of \cref{sec:intro}: reliability---\emph{does the solver converge as often as \texttt{PATH}?}---and throughput---\emph{how quickly +can it clear a batch of parametrically-related instances?} Concretely, our experiments +answer four questions: +\begin{enumerate} + \item \textbf{Single-instance parity.} Solving one problem at a time, does our + interior point method match \texttt{PATH}'s reliability, and how does its per-solve + wall-clock timing compare? (\cref{sec:exp:single}) + \item \textbf{Batched throughput.} When a whole batch must be cleared, how much faster + is a single batched solve than sequential \texttt{PATH} calls? (\cref{sec:exp:throughput}) + \item \textbf{CPU thread scaling.} How does batched throughput scale with the number of + CPU threads? (\cref{sec:exp:threads}) + \item \textbf{GPU vs.\ CPU.} When does offloading the batch to a GPU beat a + many-threaded CPU, and why? (\cref{sec:exp:gpu}) +\end{enumerate} + +\subsection{Experimental setup} +\label{sec:exp:setup} + +\paragraph{Problem families} +We benchmark on two families of parametric MCPs. The first is a family of randomly +generated sparse, convex \emph{quadratic programs} (QPs) of the form $\min_x \tfrac12 +x^\top M x - \phi^\top x$ s.t.\ $Ax - b \ge 0$, with $M \succeq 0$; the parameter vector +$\theta = (M, A, b, \phi)$ is drawn at random with a controllable sparsity rate, and the +problem dimensions (numbers of primal variables $n_x$ and inequality constraints +$n_\mu$) are free hyperparameters. This family exercises the solver on a controlled range of KKT +system sizes and, because the random instances are not guaranteed to be feasible, on a realistic +mix of solvable and infeasible instances. The second family is the lane-change +\emph{trajectory game} of \cref{sec:background:games} (the running example), a two-player +generalized Nash equilibrium problem over a planning horizon $T \in \mathbb{N}$; each sampled instance +randomizes the players' initial states, so the batch spans a +distribution of scenarios exactly as a scenario-based planner would encounter +\cite{li2023scenario}. The horizon $T$ controls the per-instance KKT dimension. + +\paragraph{Baselines} +The primary baseline is \texttt{PATH}~\cite{dirkse1995path}, accessed through +\texttt{PATHSolver.jl} \cite{PATHSolver} and \texttt{ParametricMCPs.jl} \cite{ParametricMCPs}; \texttt{PATH} solves one instance +at a time on a single thread. We additionally report our own \emph{unbatched} +interior point solver (\cref{alg:solver}) as an intermediate baseline, isolating +the performance of the interior point formulation from the batching machinery. Against these, we +compare the batched interior point solver (\cref{alg:batched}) in both its CPU +(multithreaded) and GPU (\texttt{cuDSS}) configurations. + +\paragraph{Hardware and software} +All experiments use Julia 1.12.6 and run on a single workstation with an AMD Ryzen 9 7950X CPU (16 physical +cores / 32 hardware threads) and 126~GB of RAM; GPU experiments use an NVIDIA GeForce +RTX~4090 (24~GB). All timings are taken after a +separate warm-up solve to exclude compilation. Per-solve times (cf. \cref{tab:single}) are +summarized as mean~$\pm$~standard deviation over the $B$ instances of a batch; batched +throughput (cf. \cref{tab:throughput}) is the total wall-clock to clear the batch, which varies +modestly across repetitions (standard deviation under about $20\%$). Unless noted, we use a +convergence tolerance of $\bar K = 10^{-4}$ and report each batch's \emph{solved fraction} +(instances reaching $\|K_0\| \le \bar K$) and its total wall-clock time to clear all $B$ +instances. For a fair comparison, \texttt{PATH} is held to the same convergence tolerance. + +\subsection{Single-instance reliability and speed} +\label{sec:exp:single} + +Before batching, we evaluate \cref{alg:solver} against \texttt{PATH} on individual +(unbatched) problems. \cref{tab:single} reports, for each problem family, the fraction of +instances each solver converges on and its per-solve wall-clock timing, over $1024$ random +instances (QP: $n_x = 32$, $n_\mu = 16$; trajectory game: $T = 10$). +Two results stand out. First, \cref{alg:solver} is as reliable as \texttt{PATH}: +it converges on $431$ of the $1024$ QP instances to \texttt{PATH}'s $437$ (the remainder +being infeasible), and on \emph{all} $1024$ trajectory games, where \texttt{PATH} declares $28$ failures. +Second, in contrast to what one might expect against a mature, heavily optimized +solver, once its Newton system is factored with \texttt{KLU} (see below), \cref{alg:solver} +is per-solve \emph{competitive with, and often faster than}, \texttt{PATH}: its median solve +is roughly $7\times$ faster on the QP and $55\times$ faster on the trajectory game. On the +QP its \emph{mean} is nonetheless comparable to \texttt{PATH}'s: roughly half of the randomly +generated instances are infeasible, and \cref{alg:solver} iterates each to its round limit +before declaring failure, a heavy tail that inflates its own mean well above its median +(hence its large standard deviation in \cref{tab:single}). \texttt{PATH}'s solve times are +similarly bimodal, though its particular mean--median relationship is sensitive to exactly +how and when it detects infeasibility. + +The sparse linear solver used inside \cref{alg:solver} matters substantially here. +\cref{alg:solver} refactorizes the regularized Jacobian of \cref{eq:newton} at every Newton +step, always with the same sparsity pattern. \texttt{KLU} +\cite{davis2010algorithm} and \texttt{UMFPACK} \cite{davis2004algorithm} are both +standard direct solvers for sparse linear systems; \texttt{KLU}'s in-place refactorization, +which reuses the symbolic analysis and pivot ordering across steps, is $4$--$6\times$ faster +per solve than \texttt{UMFPACK} on these repeatedly refactored systems, at identical +reliability (cf. \cref{tab:single}). We therefore adopt \texttt{KLU} by default; it is also the +factorization the batched CPU backend uses (cf. \cref{sec:batched}). + +\begin{table}[t] + \centering + \begin{tabular}{llcc} + \toprule + Problem & Solver & Solved & Time (ms) \\ + \midrule + \multirow{3}{4em}{Random QP} + & \texttt{PATH} & $437/1024$ & $3.9 \pm 3.6$ \\ + & \cref{alg:solver} + \texttt{UMFPACK} & $431/1024$ & $17.7 \pm 19.6$ \\ + & \cref{alg:solver} + \texttt{KLU} & $431/1024$ & $4.7 \pm 6.3$ \\ + \midrule + \multirow{3}{4em}{Trajectory game} + & \texttt{PATH} & $996/1024$ & $45.2 \pm 22.3$ \\ + & \cref{alg:solver} + \texttt{UMFPACK} & $1024/1024$ & $5.5 \pm 4.4$ \\ + & \cref{alg:solver} + \texttt{KLU} & $1024/1024$ & $0.9 \pm 0.5$ \\ + \bottomrule + \end{tabular} + \caption{Single-instance reliability and speed: solved fraction and per-solve wall-clock + (mean~$\pm$~std) over $1024$ random instances of each family (QP: $n_x = 32$, + $n_\mu = 16$; trajectory game: $T = 10$). The infeasible QP instances make the + per-solve distribution bimodal, so for \cref{alg:solver} the mean sits well above the median (QP medians: + \texttt{PATH} $4.1$, \cref{alg:solver} + \texttt{UMFPACK} $2.5$, + \cref{alg:solver} + \texttt{KLU} $0.6$~ms).} + \label{tab:single} +\end{table} + +\subsection{Batched CPU throughput vs.\ \texttt{PATH}} +\label{sec:exp:throughput} + +The batched solver's purpose is to clear an entire batch at once. \cref{tab:throughput} +reports the total wall-clock to solve a batch of $B = 1024$ instances of each family +three ways: sequential \texttt{PATH} calls, sequential unbatched \cref{alg:solver} +calls, and via a single \cref{alg:batched} call across $32$ CPU threads. +As previewed in \cref{fig:teaser}(b), on the trajectory game the CPU-multithreaded batched +solver clears the batch roughly $100\times$ faster than sequential \texttt{PATH}; even the +\emph{unbatched} solver is already $\sim\!50\times$ faster than \texttt{PATH} here, because +its per-solve cost is so much lower (cf. \cref{tab:single}), and batching then adds a further +$\sim\!2\times$ on top. + +On the QP the batched solver is $6.8\times$ faster than \texttt{PATH}, even though the +\emph{sequential} unbatched solver is here slightly slower than \texttt{PATH} in total +(cf. \cref{tab:throughput}). This is a consequence of the infeasible instances. Roughly half of +the random QPs are infeasible, and each such instance runs all the way to +\cref{alg:solver}'s outer-iteration limit before it is declared a failure; these few +expensive solves dominate the \emph{sequential} total, even though the typical (feasible) +solve is fast, per \cref{tab:single}. The batched solver absorbs this tail, with the per-instance stall +detection of \cref{alg:batched} freezing them early so that they no longer gate +the total runtime on CPU. The +batched solver therefore clears the whole batch $6.8\times$ faster than \texttt{PATH}. + +The batched speedup comes from two compounding sources: sharing the symbolic +$(G, H)$ structure across the batch (assembled and sparsity-analyzed once), and +parallelizing the per-instance factorize/solve across threads. Comparing against the +sequential \cref{alg:solver} isolates the second effect---due purely to +parallelization---from the first: it is $9.7\times$ faster on the QP but only +$2.2\times$ faster on the +game, where each per-instance solve is already inexpensive, so there is less serial work +for threading to absorb. + +\begin{table}[t] + \centering + \begin{tabular}{llccc} + \toprule + Problem & Solver & Total time & Solved & Speedup \\ + \midrule + \multirow{3}{*}{Random QP} + & \texttt{PATH} & $3.97$~s & $437/1024$ & $1\times$ \\ + & \cref{alg:solver} & $5.61$~s & $431/1024$ & $0.7\times$ \\ + & \cref{alg:batched} & $0.58$~s & $424/1024$ & $\mathbf{6.8\times}$ \\ + \midrule + \multirow{3}{*}{Trajectory game} + & \texttt{PATH} & $46.4$~s & $996/1024$ & $1\times$ \\ + & \cref{alg:solver} & $0.97$~s & $1024/1024$ & $47.8\times$ \\ + & \cref{alg:batched} & $0.44$~s & $1024/1024$ & $\mathbf{105.5\times}$ \\ + \bottomrule + \end{tabular} + \caption{Batched throughput on CPU. Total wall-clock time and solved fraction for clearing a batch + of $B = 1024$ instances, and speedup over sequential \texttt{PATH}. Both our solvers use + the \texttt{KLU} factorization in solving \cref{eq:newton}.} + \label{tab:throughput} +\end{table} + +\begin{figure}[bp!] + \centering + \includegraphics[width=0.9\columnwidth]{figures/thread_scaling.pdf} + \caption{Batched-solver throughput vs.\ CPU thread count at a fixed batch size of $N = 1024$. + Throughput rises sublinearly with the thread count, with the gains concentrated in the first + few threads; both problem families plateau around physical-core saturation, with no further + systematic gain from simultaneous multithreading.} + \label{fig:threadscaling} +\end{figure} + +\begin{figure*}[tp!] + \centering + \includegraphics[width=0.85\textwidth]{figures/gpu_vs_cpu.pdf} + \caption{GPU (\texttt{cuDSS}) vs.\ CPU batched throughput. The GPU pulls ahead only for + large, dense per-instance systems (the QP at large $n_x$ or large $B$); on the sparse + trajectory-game systems the multithreaded CPU is faster at every horizon, because its + active-set skip factorizes only the still-active instances each step while \texttt{cuDSS} + always processes the whole batch. Shaded bands show a conservative envelope, + $[\min(\text{CPU})/\max(\text{GPU}), \max(\text{CPU})/\min(\text{GPU})]$, over $5$--$30$ + repeated trials per point.} + \label{fig:gpu} +\end{figure*} + + + +\subsection{CPU thread scaling} +\label{sec:exp:threads} + +\cref{fig:threadscaling} shows batched throughput (instances cleared per second) as a +function of the number of CPU threads, at a fixed batch size of $N = 1024$ for both problem +families. Because each instance's sparse factorization is independent (cf. \cref{sec:batched}), +throughput increases with the thread count, though sublinearly. The gains are concentrated in +the first few threads: on the QP, throughput rises from $371$ instances/s single-threaded to +$1211$ at four threads and peaks around $1500$ instances/s ($4\times$), while the trajectory +game rises from $725$ to $2486$ instances/s at four threads ($3.4\times$) and then holds near +that level. Beyond roughly the first four-to-eight threads both curves flatten: adding threads +up to and past the $16$ physical cores yields no further systematic gain, only run-to-run +noise, as simultaneous multithreading does not add useful parallelism for this factorization-bound +workload. The game sustains higher absolute throughput than the QP despite the smaller +speedup, because each game instance converges in fewer Newton iterations, whereas the QP batch +is roughly $60\%$ infeasible-by-construction instances that are more expensive to rule out. In +both cases the batched solver extracts substantial parallel throughput from commodity multicore +hardware with no device-specific code. + +\subsection{GPU vs.\ CPU: a regime-dependent crossover} +\label{sec:exp:gpu} + + + +Whether the GPU backend beats the multithreaded CPU depends on the problem regime. +Because both backends run the same solver loop behind the verb set of \cref{sec:batched}, +this comparison isolates the linear-algebra backend. We sweep two axes independently +in \cref{fig:gpu}: the batch size $B$ at fixed per-instance size (left), and the +per-instance size at fixed $B$ (right)---controlled by the number of primal variables +$n_x$ in the QP and by the horizon $T$ in the trajectory game. + +GPU outperforms batched CPU only once each per-instance KKT system is both large +\emph{and} sufficiently dense. +On the QP, the GPU backend pulls ahead as the batch grows larger (up to $1.8\times$ faster than the $32$-thread +CPU at $B = 4096$) and, more strongly, as the per-instance system grows: at $n_x = 128$ the +GPU is roughly $3\times$ faster. On the trajectory game, by contrast, the CPU is faster at +\emph{every} planning horizon we tested (median of five repetitions): at $T = 30$ +($d \approx 2000$) the GPU takes $8.0$\,s to the CPU's $4.1$\,s ($1.9\times$ slower), and at +$T = 50$ ($d \approx 3500$), $16.3$\,s to $12.7$\,s. Both backends nonetheless clear these +batches far faster than sequential \texttt{PATH}. + +On its face, these results appear counterintuitive: the trajectory game KKT systems are the \emph{largest} we solve, +yet here the GPU backend is uniformly slower than batched CPU. Two opposing effects govern +end-to-end cost, and they separate cleanly when the batched linear-algebra verbs +(\texttt{jacobian!}, \texttt{factorize!}, \texttt{ldiv!}) are timed in isolation. +\emph{Per Newton step, with the whole batch active}, the GPU's batched sparse factorization +does become cheaper than the CPU's per-thread \texttt{KLU} as each instance's Jacobian grows: +its combined assemble-and-factorize cost crosses over the CPU's at $d \approx 2500$ +($T \approx 35$) and is $\sim\!1.4\times$ cheaper by $d \approx 4900$, because \texttt{cuDSS} +amortizes its fixed launch and occupancy overhead better as the matrix grows while the CPU +factorization has no comparable fixed cost. \emph{However, a full solve does not run with the whole +batch active.} \cref{alg:batched}'s set of active instances shrinks as instances converge or are frozen, +and on the CPU each step factorizes only the still-active instances (\cref{sec:batched}), +whereas on GPU \texttt{cuDSS} always processes the entire batch. Measured at $d = 3500$, the GPU's +per-step advantage of $1.3\times$ with all $1024$ instances active inverts to an $8\times$ +\emph{disadvantage} once only $32$ remain active. Since a real solve spends most of its steps +with a small group of active instances, the CPU wins end-to-end. +The GPU therefore prevails only when each per-instance system is large enough for +\texttt{cuDSS} to win the per-step comparison \emph{and} dense enough---as in the large-$n_x$ +QP---that its factorization advantage is large; the trajectory game KKT +systems meet the first condition but not the second. + +Two further caveats bear mention. First, the fraction of solved instances in a +batch of trajectory games declines at longer +time horizons (for our specific test problem), even with warm starting ($92\%$ at $T = 30$, $57\%$ at $T = 50$), and cold starting +collapses it further, so we restrict the game comparison to the warm-started +regime and caution against over-interpretation of results on very long horizons. +Second, the fraction of solved instances in a batch of QPs changes sharply with $n_x$ ($41\% \to 96\% \to 100\%$ from +$32$ to $128$ primals), which complicates the interpretation of those timing results. + + +\section{Discussion and Future Work} +\label{sec:discussion} + +Taken together, our experiments support a simple practical message: for the parametric MCPs +that arise in multi-agent robotics, the decisive speedup comes from \emph{batching} the solve, +not from any single choice of hardware. A CPU-multithreaded batch clears a set of trajectory-game +instances roughly two orders of magnitude faster than sequential calls to \texttt{PATH} +(\cref{sec:exp:throughput}) while matching its per-instance reliability +(\cref{sec:exp:single})---and it does so on commodity hardware, with no device-specific code. +The verb-set abstraction of \cref{sec:batched} is what makes this portable: the same interior +point loop runs unmodified across both CPU and GPU backends. + +That abstraction also lets us characterize \emph{when} each device is the right choice, and the +answer is regime-dependent (cf. \cref{sec:exp:gpu}). The multithreaded CPU is the better default for +the extremely sparse KKT systems typical of receding-horizon trajectory games: its +active instance logic factorizes only the still-active instances each Newton step, whereas \texttt{cuDSS} +always processes the whole batch. The GPU outperforms only once each per-instance system is both +large and dense enough for its batched factorization to win the per-step +comparison outright---e.g., the +large-$n_x$ QP. Future work should close this gap by +making the GPU-batched factorization aware of the set of active instances, e.g.\ compacting the +active instances before each \texttt{cuDSS} call so that GPU per-step cost, like the CPU's, falls +as the number of active instances shrinks; cf. \cite{viljoen2026scaling}, which +implements a similar design (but for nonlinear programs rather than mixed +complementarity problems). + +Several other limitations temper these conclusions and motivate further work. Our reliability and timing +comparisons use two problem families---randomly generated QPs and a single lane-change trajectory +game---and, on the trajectory game, the fraction of solved instances declines at long horizons even with warm +starting (cf. \cref{sec:exp:gpu}). A broader benchmark suite would improve the +prescriptive quality of our evaluations, and a more +sophisticated interior point implementation is needed to improve robustness. Quantifying the +wall-clock cost of differentiating through a batched solve (\cref{sec:differentiable}) at the +scale required by large learned pipelines, and integrating it end-to-end into such a +pipeline~\cite{amos2017optnet}, remains important future work. Finally, +integrating the batched solver into a deployed receding-horizon planner would test the +warm-started, real-time regime that these throughput numbers are meant to serve. + +\bibliographystyle{IEEEtran} +\bibliography{refs} + +\end{document} diff --git a/docs/paper/refs.bib b/docs/paper/refs.bib new file mode 100644 index 0000000..2321af2 --- /dev/null +++ b/docs/paper/refs.bib @@ -0,0 +1,106 @@ +@book{facchinei2003finite, + title={Finite-dimensional variational inequalities and complementarity problems}, + author={Facchinei, Francisco and Pang, Jong-Shi}, + year={2003}, + publisher={Springer} +} + +@article{davis2010algorithm, + title={Algorithm 907: KLU, a direct sparse solver for circuit simulation problems}, + author={Davis, Timothy A and Palamadai Natarajan, Ekanathan}, + journal={ACM Transactions on Mathematical Software (TOMS)}, + volume={37}, + number={3}, + pages={1--17}, + year={2010}, + publisher={ACM New York, NY, USA} +} + +@article{davis2004algorithm, + title={Algorithm 832: UMFPACK V4. 3---an unsymmetric-pattern multifrontal method}, + author={Davis, Timothy A}, + journal={ACM Transactions on Mathematical Software (TOMS)}, + volume={30}, + number={2}, + pages={196--199}, + year={2004}, + publisher={ACM New York, NY, USA} +} + +@article{viljoen2026scaling, + title={Scaling Nonlinear Optimization: Many Problems One {GPU}}, + author={Viljoen, John and Haffner, Johanna and Tomizuka, Masayoshi and Mehr, Negar}, + journal={arXiv preprint arXiv:2606.26341}, + year={2026} +} + +@article{RevelsLubinPapamarkou2016, + title = {Forward-Mode Automatic Differentiation in {J}ulia}, + author = {{Revels}, J. and {Lubin}, M. and {Papamarkou}, T.}, + journal = {arXiv:1607.07892 [cs.MS]}, + year = {2016}, + url = {https://arxiv.org/abs/1607.07892} +} + +@software{ParametricMCPs, + author = {Peters, Lasse}, + title = {{ParametricMCPs.jl}}, + year = {2023}, + publisher = {GitHub}, + url = {https://github.com/JuliaGameTheoreticPlanning/ParametricMCPs.jl} +} + +@software{PATHSolver, + author = {Kwon, Changhyun and Dowson, Oscar and others}, + title = {{PATHSolver.jl}}, + year = {2017}, + publisher = {GitHub}, + url = {https://github.com/chkwon/PATHSolver.jl} +} + + +@book{nocedal2006numerical, + title={Numerical optimization}, + author={Nocedal, Jorge and Wright, Stephen J}, + year={2006}, + publisher={Springer} +} + +@inproceedings{amos2017optnet, + title={{OptNet}: differentiable optimization as a layer in neural networks}, + author={Amos, Brandon and Kolter, J Zico}, + booktitle={Proceedings of the 34th International Conference on Machine Learning-Volume 70}, + pages={136--145}, + year={2017} +} + +@inproceedings{li2023scenario, + title={{Scenario-Game ADMM}: A Parallelized Scenario-Based Solver for Stochastic Noncooperative Games}, + author={Li, Jingqi and Chiu, Chih Yuan and Peters, Lasse and Palafox, Fernando and Karabag, Mustafa and Alonso-Mora, Javier and Sojoudi, Somayeh and Tomlin, Claire and Fridovich-Keil, David}, + booktitle={62nd IEEE Conference on Decision and Control, CDC 2023}, + pages={8093--8099}, + year={2023}, + organization={IEEE} +} + +@article{peters2024contingency, + title={Contingency games for multi-agent interaction}, + author={Peters, Lasse and Bajcsy, Andrea and Chiu, Chih-Yuan and Fridovich-Keil, David and Laine, Forrest and Ferranti, Laura and Alonso-Mora, Javier}, + journal={IEEE Robotics and Automation Letters}, + volume={9}, + number={3}, + pages={2208--2215}, + year={2024}, + publisher={IEEE} +} + +@article{dirkse1995path, + title = {The path solver: a nommonotone stabilization scheme for mixed complementarity problems}, + author = {Dirkse, Steven P and Ferris, Michael C}, + journal = {Optimization methods and software}, + volume = {5}, + number = {2}, + pages = {123--156}, + year = {1995}, + publisher = {Taylor \& Francis}, +} diff --git a/src/MixedComplementarityProblems.jl b/src/MixedComplementarityProblems.jl index 65b7d93..472b2ce 100644 --- a/src/MixedComplementarityProblems.jl +++ b/src/MixedComplementarityProblems.jl @@ -4,7 +4,8 @@ using SparseArrays: SparseArrays using LinearAlgebra: LinearAlgebra, I, norm, eigvals using BlockArrays: BlockArray, blocklengths, blocks using SymbolicTracingUtils: SymbolicTracingUtils as SymbolicTracingUtils -using LinearSolve: LinearProblem, init, solve!, KrylovJL_GMRES, UMFPACKFactorization +using LinearSolve: + LinearProblem, init, solve!, KrylovJL_GMRES, UMFPACKFactorization, KLUFactorization using SciMLBase: SciMLBase using KernelAbstractions: KernelAbstractions, @kernel, @index using KLU: KLU diff --git a/src/solver.jl b/src/solver.jl index 93b8ef3..99a8a4d 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -49,7 +49,12 @@ function solve( loosening_rate = 0.5, min_stepsize = 1e-4, verbose = false, - linear_solve_algorithm = UMFPACKFactorization(), + # KLU (with its default `reuse_symbolic = true`) refactorizes ∇F in place across Newton + # steps, reusing the symbolic analysis and pivot ordering. Since ∇F is always sparse + # (`SparseFunction`) with a fixed pattern, this makes the per-iteration solve ~4-6× faster + # than UMFPACK per solve at identical reliability (same reason the batched CPU path uses + # KLU, cf. `src/batched_solver.jl`). Any `LinearSolve.jl` algorithm may be passed instead. + linear_solve_algorithm = KLUFactorization(), regularize_linear_solve = :identity, ) # Set up common memory.