From 42f54ec896664a3e2b961e08af32cee7e3b659bd Mon Sep 17 00:00:00 2001 From: Hans-Peter Deifel <hpd@hpdeifel.de> Date: Wed, 17 Apr 2019 13:57:05 +0200 Subject: [PATCH] Place tombstone for repo --- .gitignore | 13 - README.md | 10 +- artefakt_rebuttal.org | 397 -------- cabal.project.freeze | 147 --- dfa/bench.py | 248 ----- dfa/benchmark.org | 749 --------------- dfa/results1.png | Bin 39560 -> 0 bytes dfa/results1000.png | Bin 34262 -> 0 bytes dfa/results10000.png | Bin 28671 -> 0 bytes dfa/results2.png | Bin 39837 -> 0 bytes dfa/results2f.png | Bin 41000 -> 0 bytes optimizations/optimizations.org | 123 --- prism/bench.py | 54 -- prism/benchmark.org | 1554 ------------------------------ prism/valmari-extract-sort1.hs | 55 -- valmari_fig4/bench.py | 60 -- valmari_fig4/benchmark.org | 130 --- valmari_fig4/generate.py | 47 - wta/README.md | 11 - wta/bench.py | 392 -------- wta/benchmarks.org | 1561 ------------------------------- 21 files changed, 1 insertion(+), 5550 deletions(-) delete mode 100644 .gitignore delete mode 100644 artefakt_rebuttal.org delete mode 100644 cabal.project.freeze delete mode 100755 dfa/bench.py delete mode 100644 dfa/benchmark.org delete mode 100644 dfa/results1.png delete mode 100644 dfa/results1000.png delete mode 100644 dfa/results10000.png delete mode 100644 dfa/results2.png delete mode 100644 dfa/results2f.png delete mode 100644 optimizations/optimizations.org delete mode 100755 prism/bench.py delete mode 100644 prism/benchmark.org delete mode 100644 prism/valmari-extract-sort1.hs delete mode 100755 valmari_fig4/bench.py delete mode 100644 valmari_fig4/benchmark.org delete mode 100755 valmari_fig4/generate.py delete mode 100644 wta/README.md delete mode 100755 wta/bench.py delete mode 100644 wta/benchmarks.org diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6ba9fa5..0000000 --- a/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -auto/ -ltximg/ - -valmari_fig4/benchmark.pdf -valmari_fig4/benchmark.tex -valmari_fig4/benchmark.tmp -valmari_fig4/benchmarks.png -prism/bench/ -dfa/bench/ -*.pdf -*.tex -/dfa/bench -/wta/bench diff --git a/README.md b/README.md index d26e0bc..886bfa3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,2 @@ # Benchmarks for CoPaR - -This repository contains tooling and raw results from benchmarking -[CoPaR](https://git8.cs.fau.de/software/copar). - -This repo contains benchmarks for: - -- Deterministic Finite Automata in `dfa/` -- Adaptions of the benchmark suite of the PRISM model checker in `prism/` -- Weighted Tree Automata in `wta/` +### This repo has moved to https://gitlab.cs.fau.de/hpd/copar-benchmarks diff --git a/artefakt_rebuttal.org b/artefakt_rebuttal.org deleted file mode 100644 index 4897d28..0000000 --- a/artefakt_rebuttal.org +++ /dev/null @@ -1,397 +0,0 @@ -#+TITLE: Messungen zum Artifact-Rebuttal -#+DATE: <2018-12-07 Fr> -#+AUTHOR: Hans-Peter Deifel - -Alle Messungen bis auf das Paper wurden mit dem Artefakt-Binary durchgeführt auf -den im Artefakt mitgelieferten Dateien. - -* Ergebnisse im Paper -** DFA 10^3 - - #+NAME: paper_dfa_1000 - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 1000 | 2.4 | 0.76 | 0.36 | 1.03 | - | 2000 | 4.96 | 1.58 | 0.74 | 2.52 | - | 3000 | 7.39 | 2.11 | 1.4 | 4.33 | - | 4000 | 10.2 | 3.2 | 1.67 | 5.74 | - | 5000 | 13.06 | 4.05 | 2.1 | 7.45 | - -** DFA 10^4 - - #+NAME: paper_dfa_10000 - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 600 | 44.75 | 1.82 | 2.88 | 7.84 | - | 700 | 50.93 | 4.29 | 3.18 | 9.42 | - | 800 | 60.78 | 2.54 | 4.16 | 11.04 | - | 900 | 68.34 | 2.76 | 4.6 | 12.71 | - | 1000 | 75.79 | 3.05 | 5.21 | 14.32 | - -** PRISM - - #+NAME: paper_prism - | | t_p(s) | t_i(s) | t_r(s) | t_v(s) | - |---+--------+--------+--------+--------| - | 1 | 2.39 | 0.66 | 1.09 | 1.19 | - | 1 | 9.66 | 2.83 | 5.43 | 5.58 | - | 2 | 0.47 | 0.28 | 0.57 | 0.12 | - | 3 | 4.89 | 3.01 | 5.45 | 0.91 | - | 3 | 12.59 | 6.17 | 15.12 | 2.45 | - -* Ergebnisse am Desktop - - Desktop hat 16GB RAM. Ausgabe von =lscpu=: - - #+BEGIN_EXAMPLE - Architecture: x86_64 - CPU op-mode(s): 32-bit, 64-bit - Byte Order: Little Endian - Address sizes: 39 bits physical, 48 bits virtual - CPU(s): 4 - On-line CPU(s) list: 0-3 - Thread(s) per core: 1 - Core(s) per socket: 4 - Socket(s): 1 - NUMA node(s): 1 - Vendor ID: GenuineIntel - CPU family: 6 - Model: 94 - Model name: Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - Stepping: 3 - CPU MHz: 3203.065 - CPU max MHz: 3600,0000 - CPU min MHz: 800,0000 - BogoMIPS: 6386.00 - Virtualization: VT-x - L1d cache: 32K - L1i cache: 32K - L2 cache: 256K - L3 cache: 6144K - NUMA node0 CPU(s): 0-3 - Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp flush_l1d - #+END_EXAMPLE - -** DFA 10^3 - - #+NAME: desktop_dfa_1000 - | N | tp | ti | tr | tv | - |------+-------+------+------+------| - | 1000 | 2.56 | 0.82 | 0.37 | 1.06 | - | 2000 | 5.29 | 1.67 | 0.80 | 2.65 | - | 3000 | 7.83 | 2.32 | 1.52 | 4.24 | - | 4000 | 10.68 | 3.40 | 1.74 | 6.54 | - | 5000 | 13.66 | 4.28 | 2.22 | 7.73 | - -** DFA 10^4 - - #+NAME: desktop_dfa_10000 - | N | tp | ti | tr | tv | - |------+-------+------+------+-------| - | 600 | 46.42 | 1.86 | 3.02 | 8.64 | - | 700 | 52.50 | 4.55 | 3.32 | 10.25 | - | 800 | 62.34 | 2.52 | 4.36 | 11.53 | - | 900 | 70.08 | 2.78 | 4.92 | 13.85 | - | 1000 | 78.11 | 3.14 | 5.49 | 14.64 | - -** PRISM - - #+NAME: desktop_prism - | | tp | ti | tr | tv | - |----+-------+------+-------+------| - | 1. | 2.54 | 0.70 | 1.11 | 1.19 | - | 1. | 10.26 | 3.00 | 5.61 | 6.09 | - | 2. | 0.51 | 0.29 | 0.60 | 0.08 | - | 3. | 5.33 | 3.09 | 5.78 | 0.78 | - | 3. | 13.75 | 6.36 | 16.05 | 2.78 | - -* Ergebnisse am Laptop - - Der Laptop hat 8GB und folgendes =lscpu=: - - #+BEGIN_EXAMPLE - Architecture: x86_64 - CPU op-mode(s): 32-bit, 64-bit - Byte Order: Little Endian - Address sizes: 39 bits physical, 48 bits virtual - CPU(s): 4 - On-line CPU(s) list: 0-3 - Thread(s) per core: 1 - Core(s) per socket: 4 - Socket(s): 1 - NUMA node(s): 1 - Vendor ID: GenuineIntel - CPU family: 6 - Model: 94 - Model name: Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - Stepping: 3 - CPU MHz: 2763.879 - CPU max MHz: 3600.0000 - CPU min MHz: 800.0000 - BogoMIPS: 6386.00 - Virtualization: VT-x - L1d cache: 32K - L1i cache: 32K - L2 cache: 256K - L3 cache: 6144K - NUMA node0 CPU(s): 0-3 - Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp flush_l1d - #+END_EXAMPLE - -** DFA 10^3 - - #+NAME: laptop_dfa_1000 - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 1000 | 3.78 | 1.17 | 0.49 | 1.49 | - | 2000 | 7.95 | 2.44 | 1.03 | 3.42 | - | 3000 | 11.84 | 3.27 | 1.91 | 5.36 | - | 4000 | 16.33 | 5.04 | 2.22 | 7.43 | - | 5000 | 20.70 | 6.37 | 2.80 | 9.44 | - -** DFA 10^4 - - #+NAME: laptop_dfa_10000 - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |-----+---------+---------+---------+---------| - | 600 | 67.28 | 3.02 | 4.52 | 10.43 | - | 700 | 80.67 | 7.68 | 5.12 | 12.65 | - - Rest ging nicht wegen RAM - -** PRISM - - #+NAME: laptop_prism - | File | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 1 | 4.20 | 1.11 | 1.80 | 2.18 | - | 1 | 19.13 | 4.74 | 9.42 | 8.20 | - | 2 | 1.09 | 0.46 | 1.17 | 0.12 | - | 3 | 9.86 | 4.54 | 9.96 | 1.23 | - | 3 | 28.01 | 9.91 | 27.27 | 3.42 | - -** Faktor zw Laptop und Desktop -*** DFA 10^3 - - #+CALL: factor(a=desktop_dfa_1000, b=laptop_dfa_1000) - - #+RESULTS: - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 1000 | 1.48 | 1.43 | 1.32 | 1.41 | - | 2000 | 1.5 | 1.46 | 1.29 | 1.29 | - | 3000 | 1.51 | 1.41 | 1.26 | 1.26 | - | 4000 | 1.53 | 1.48 | 1.28 | 1.14 | - | 5000 | 1.52 | 1.49 | 1.26 | 1.22 | - -*** DFA 10^4 - - #+CALL: factor(a=desktop_dfa_10000, b=laptop_dfa_10000) - - #+RESULTS: - | N | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |-----+---------+---------+---------+---------| - | 600 | 1.45 | 1.62 | 1.5 | 1.21 | - | 700 | 1.54 | 1.69 | 1.54 | 1.23 | - -*** PRISM - - #+CALL: factor(a=desktop_prism, b=laptop_prism) - - #+RESULTS: - | File | t_p (s) | t_i (s) | t_r (s) | t_v (s) | - |------+---------+---------+---------+---------| - | 1 | 1.65 | 1.59 | 1.62 | 1.83 | - | 1 | 1.86 | 1.58 | 1.68 | 1.35 | - | 2 | 2.14 | 1.59 | 1.95 | 1.5 | - | 3 | 1.85 | 1.47 | 1.72 | 1.58 | - | 3 | 2.04 | 1.56 | 1.7 | 1.23 | - -* Ergebnisse in VM am Desktop - - VM hatte 8 von 16 GB RAM des Hostsystems - -** DFA 10^3 - - #+NAME: vm_dfa_1000 - | N | tp | ti | tr | tv | - |------+-------+------+------+------| - | 1000 | 3.33 | 0.82 | 0.39 | 1.25 | - | 2000 | 6.65 | 1.69 | 0.83 | 3.55 | - | 3000 | 10.20 | 2.29 | 1.62 | 4.97 | - | 4000 | 13.89 | 3.48 | 1.90 | 6.77 | - | 5000 | 17.31 | 4.31 | 2.34 | 9.20 | - -** DFA 10^4 - - #+NAME: vm_dfa_10000 - | N | tp | ti | tr | tv | - |-----+-------+------+------+-------| - | 600 | 82.08 | 1.94 | 3.24 | 9.65 | - | 700 | 93.74 | 4.58 | 3.55 | 11.13 | - - Mehr ging nicht wegen RAM - -** PRISM - - #+NAME: vm_prism - | | tp | ti | tr | tv | - |----+-------+------+-------+------| - | 1. | 2.63 | 0.74 | 1.21 | 1.41 | - | 1. | 10.98 | 3.20 | 6.17 | 6.34 | - | 2. | 0.55 | 0.31 | 0.65 | 0.11 | - | 3. | 5.59 | 3.22 | 6.08 | 0.86 | - | 3. | 14.46 | 6.55 | 17.19 | 2.95 | - -** Faktor zu Desktop -*** DFA 10^3 - - #+CALL: factor(a=desktop_dfa_1000, b=vm_dfa_1000) - - #+RESULTS: - | N | tp | ti | tr | tv | - |------+------+------+------+------| - | 1000 | 1.3 | 1.0 | 1.05 | 1.18 | - | 2000 | 1.26 | 1.01 | 1.04 | 1.34 | - | 3000 | 1.3 | 0.99 | 1.07 | 1.17 | - | 4000 | 1.3 | 1.02 | 1.09 | 1.04 | - | 5000 | 1.27 | 1.01 | 1.05 | 1.19 | - -*** DFA 10^4 - - #+CALL: factor(a=desktop_dfa_10000, b=vm_dfa_10000) - - #+RESULTS: - | N | tp | ti | tr | tv | - |-----+------+------+------+------| - | 600 | 1.77 | 1.04 | 1.07 | 1.12 | - | 700 | 1.79 | 1.01 | 1.07 | 1.09 | - -*** PRISM - - #+CALL: factor(a=desktop_prism, b=vm_prism) - - #+RESULTS: - | | tp | ti | tr | tv | - |---+------+------+------+------| - | 1 | 1.04 | 1.06 | 1.09 | 1.18 | - | 1 | 1.07 | 1.07 | 1.1 | 1.04 | - | 2 | 1.08 | 1.07 | 1.08 | 1.38 | - | 3 | 1.05 | 1.04 | 1.05 | 1.1 | - | 3 | 1.05 | 1.03 | 1.07 | 1.06 | - -* Ergebnisse auf Thorstens Rechner - - Der Rechner hat theoretisch 16GB, allerdings kann mein Account davon nicht - alle Nutzen (vll ca 10?). Ausgabe von =lscpu=: - - #+BEGIN_EXAMPLE - processor : 0 - vendor_id : GenuineIntel - cpu family : 6 - model : 60 - model name : Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz - stepping : 3 - microcode : 0x1c - cpu MHz : 3979.623 - cache size : 8192 KB - physical id : 0 - siblings : 8 - core id : 0 - cpu cores : 4 - apicid : 0 - initial apicid : 0 - fpu : yes - fpu_exception : yes - cpuid level : 13 - wp : yes - flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts - bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf - bogomips : 7186.95 - clflush size : 64 - cache_alignment : 64 - address sizes : 39 bits physical, 48 bits virtual - power management: - #+END_EXAMPLE - -** DFA 10^3 - - | N | t_p(s) | t_i(s) | t_r(s) | t_v(s) | - |------+--------+--------+--------+--------| - | 1000 | 2.43 | 0.81 | 0.37 | 1.02 | - | 2000 | 4.99 | 1.69 | 0.78 | 2.62 | - | 3000 | 7.36 | 2.16 | 1.42 | 4.26 | - | 4000 | 10.12 | 3.45 | 1.71 | 6.16 | - | 5000 | 12.95 | 4.42 | 2.18 | 7.77 | - -** DFA 10^4 - - | N | t_p(s) | t_i(s) | t_r(s) | t_v(s) | - |-----+--------+--------+--------+--------| - | 600 | 47.32 | 1.84 | 3.17 | 7.87 | - | 700 | 53.92 | 4.39 | 3.26 | 9.26 | - -** PRISM - - | File | t_p(s) | t_i(s) | t_r(s) | t_v(s) | - |------+--------+--------+--------+--------| - | 1 | 2.39 | 0.70 | 1.13 | 1.17 | - | 1 | 9.74 | 3.00 | 5.73 | 5.60 | - | 2 | 0.49 | 0.31 | 0.62 | 0.09 | - | 3 | 5.18 | 3.39 | 6.20 | 0.76 | - | 3 | 13.27 | 7.01 | 17.29 | 2.21 | - -* Faktoren von VM zu Thorsten -** DFA 10^3 - - | N | tp | ti | tr | tv | - |------+-----------+------------+-----------+-----------| - | 1000 | 1.3703704 | 1.0123457 | 1.0540541 | 1.2254902 | - | 2000 | 1.3326653 | 1. | 1.0641026 | 1.3549618 | - | 3000 | 1.4166667 | 1.0601852 | 1.1408451 | 1.1666667 | - | 4000 | 1.3725296 | 1.0086957 | 1.1111111 | 1.0990260 | - | 5000 | 1.3366795 | 0.97511312 | 1.0733945 | 1.1840412 | - #+TBLFM: @2$2=3.33/2.43::@2$3=0.82/0.81::@2$4=0.39/0.37::@2$5=1.25/1.02::@3$2=6.65/4.99::@3$3=1.69/1.69::@3$4=0.83/0.78::@3$5=3.55/2.62::@4$2=10.20/7.20::@4$3=2.29/2.16::@4$4=1.62/1.42::@4$5=4.97/4.26::@5$2=13.89/10.12::@5$3=3.48/3.45::@5$4=1.9/1.71::@5$5=6.77/6.16::@6$2=17.31/12.95::@6$3=4.31/4.42::@6$4=2.34/2.18::@6$5=9.20/7.77 - - D.h faktor so um 1-1.1, außer beim parsen, da konsistent 1.3. (Valmari - hat schwankend zw. 1 und 2) - -** DFA 10^4 - - | N | tp | ti | tr | tv | - |-----+-----------+-----------+-----------+-----------| - | 600 | 1.7345731 | 1.0543478 | 1.0220820 | 1.2261753 | - | 700 | 1.7385015 | 1.0432802 | 1.0889571 | 1.2019438 | - #+TBLFM: @2$2=82.08/47.32::@2$3=1.94/1.84::@2$4=3.24/3.17::@2$5=9.65/7.87::@3$2=93.74/53.92::@3$3=4.58/4.39::@3$4=3.55/3.26::@3$5=11.13/9.26 - - D.h bei ti und rt ein faktor von ca 1.05, bei tv ein faktor von 1.2 - und bei tp ein faktor von 1.7 - -** PRISM - - | | tp | ti | tr | tv | - |----+-----------+------------+------------+-----------| - | | | x | x | x | - | 1. | 1.1004184 | 1.0571429 | 1.0707965 | 1.2051282 | - | 1. | 1.1273101 | 1.0666667 | 1.0767888 | 1.1321429 | - | 2. | 1.1224490 | 1. | 1.0483871 | 1.2222222 | - | 3. | 1.0791506 | 0.94985251 | 0.98064516 | 1.1315789 | - | 3. | 1.0896760 | 0.93437946 | 0.99421631 | 1.3348416 | - #+TBLFM: @2$2=2.63/2.39::@3$2=10.98/9.74::@3$3=0.74/0.7::@3$4=1.21/1.13::@3$5=1.41/1.17::@4$2=0.55/0.49::@4$3=3.20/3.0::@4$4=6.17/5.73::@4$5=6.34/5.6::@5$2=5.59/5.18::@5$3=0.31/0.31::@5$4=0.65/0.62::@5$5=0.11/0.09::@6$2=14.46/13.27::@6$3=3.22/3.39::@6$4=6.08/6.2::@6$5=0.86/0.76::@7$3=6.55/7.01::@7$4=17.19/17.29::@7$5=2.95/2.21 - - D.h alle Faktoren eigentlich so um 1-1.1 manchmal sogar ein wenig - schneller. Valmari eher bso bei 1.2. - -* Code -** Faktor ausrechnen - - #+NAME: factor - #+BEGIN_SRC python :var a=[] :var b=[] :colnames yes :rownames yes - table = [] - for i in range(min(len(a), len(b))): - row = [] - for j in range(min(len(a[i]), len(b[i]))): - row.append(round(b[i][j] / a[i][j], 2)) - table.append(row) - return table - #+END_SRC diff --git a/cabal.project.freeze b/cabal.project.freeze deleted file mode 100644 index ef2054c..0000000 --- a/cabal.project.freeze +++ /dev/null @@ -1,147 +0,0 @@ -constraints: any.Cabal ==2.2.0.1, - any.Glob ==0.10.0, - any.HUnit ==1.6.0.0, - any.Only ==0.1, - any.QuickCheck ==2.12.6.1, - QuickCheck +templatehaskell, - any.StateVar ==1.1.1.1, - any.abstract-deque ==0.3, - abstract-deque -usecas, - any.abstract-par ==0.3.3, - any.aeson ==1.4.2.0, - aeson -bytestring-builder -cffi -developer -fast, - any.ansi-terminal ==0.8.2, - ansi-terminal -example, - any.ansi-wl-pprint ==0.6.8.2, - ansi-wl-pprint -example, - any.array ==0.5.2.0, - any.attoparsec ==0.13.2.2, - attoparsec -developer, - any.base ==4.11.1.0, - any.base-compat ==0.10.5, - any.base-compat-batteries ==0.10.5, - any.base-orphans ==0.8, - any.binary ==0.8.5.1, - any.bytestring ==0.10.8.2, - any.cabal-doctest ==1.0.6, - any.call-stack ==0.1.0, - any.case-insensitive ==1.2.0.11, - any.cassava ==0.5.1.0, - cassava -bytestring--lt-0_10_4, - any.cereal ==0.5.7.0, - cereal -bytestring-builder, - any.clock ==0.7.2, - clock -llvm, - any.code-page ==0.2, - any.colour ==2.3.4, - any.containers ==0.5.11.0, - any.contravariant ==1.5, - contravariant -safe +semigroups +statevar +tagged, - copar -release, - any.criterion ==1.5.3.0, - criterion -embed-data-files -fast, - any.criterion-measurement ==0.1.1.0, - criterion-measurement -fast, - any.data-default-class ==0.1.2.0, - any.deepseq ==1.4.3.0, - any.dense-linear-algebra ==0.1.0.0, - any.deriving-compat ==0.5.2, - deriving-compat +base-4-9 +new-functor-classes +template-haskell-2-11, - any.directory ==1.3.1.5, - any.dlist ==0.8.0.5, - any.doctest ==0.16.0.1, - any.erf ==2.0.0.0, - any.exceptions ==0.10.0, - any.extra ==1.6.14, - any.filepath ==1.4.2, - any.ghc ==8.4.4, - any.ghc-boot ==8.4.4, - any.ghc-boot-th ==8.4.4, - any.ghc-paths ==0.1.0.9, - any.ghc-prim ==0.5.2.0, - any.ghci ==8.4.4, - any.happy ==1.19.9, - happy +small_base, - any.hashable ==1.2.7.0, - hashable -examples +integer-gmp +sse2 -sse41, - any.haskell-lexer ==1.0.2, - any.hpc ==0.6.0.3, - any.hsc2hs ==0.68.3, - hsc2hs -in-ghc-tree, - any.hspec ==2.6.0, - any.hspec-core ==2.6.0, - any.hspec-discover ==2.6.0, - any.hspec-expectations ==0.8.2, - any.hspec-megaparsec ==2.0.0, - hspec-megaparsec -dev, - any.ieee754 ==0.8.0, - any.integer-gmp ==1.0.2.0, - any.integer-logarithms ==1.0.2.2, - integer-logarithms -check-bounds +integer-gmp, - any.js-flot ==0.8.3, - any.js-jquery ==3.3.1, - any.json ==0.9.3, - json -generic -mapdict -parsec -pretty +split-base, - any.math-functions ==0.3.1.0, - math-functions -system-expm1, - any.megaparsec ==7.0.4, - megaparsec -dev, - any.microlens ==0.4.10, - any.microlens-ghc ==0.4.10, - any.microlens-mtl ==0.1.11.1, - any.microlens-platform ==0.3.11, - any.microlens-th ==0.4.2.3, - microlens-th +inlining, - any.microstache ==1.0.1.1, - any.monad-par ==0.3.4.8, - monad-par -chaselev -newgeneric, - any.monad-par-extras ==0.3.3, - any.mtl ==2.2.2, - any.mwc-random ==0.14.0.0, - any.optparse-applicative ==0.14.3.0, - any.parallel ==3.2.2.0, - any.parsec ==3.1.13.0, - any.parser-combinators ==1.0.0, - parser-combinators -dev, - any.pretty ==1.1.3.6, - any.pretty-show ==1.9.5, - any.prettyprinter ==1.2.1, - prettyprinter -buildreadme, - any.prettyprinter-ansi-terminal ==1.1.1.2, - any.prettyprinter-convert-ansi-wl-pprint ==1.1, - any.primitive ==0.6.4.0, - any.process ==1.6.3.0, - any.quickcheck-io ==0.2.0, - any.random ==1.1, - any.rts ==1.0, - any.scientific ==0.3.6.2, - scientific -bytestring-builder -integer-simple, - any.setenv ==0.1.1.3, - any.statistics ==0.15.0.0, - any.stm ==2.4.5.1, - any.syb ==0.7, - any.tagged ==0.8.6, - tagged +deepseq +transformers, - any.template-haskell ==2.13.0.0, - any.terminfo ==0.4.1.1, - any.text ==1.2.3.1, - any.text-short ==0.1.2, - text-short -asserts, - any.tf-random ==0.5, - any.th-abstraction ==0.2.10.0, - any.time ==1.8.0.2, - any.time-locale-compat ==0.1.1.5, - time-locale-compat -old-locale, - any.transformers ==0.5.5.0, - any.transformers-compat ==0.6.2, - transformers-compat -five +five-three -four +generic-deriving +mtl -three -two, - any.unix ==2.7.2.2, - any.unordered-containers ==0.2.9.0, - unordered-containers -debug, - any.uuid-types ==1.0.3, - any.vector ==0.12.0.2, - vector +boundschecks -internalchecks -unsafechecks -wall, - any.vector-algorithms ==0.8.0.1, - vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks, - any.vector-binary-instances ==0.2.5.1, - any.vector-th-unbox ==0.2.1.6 diff --git a/dfa/bench.py b/dfa/bench.py deleted file mode 100755 index daf6651..0000000 --- a/dfa/bench.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python - -import sys -import json -import subprocess -import os -import re -import numpy as np -import scipy.stats as st -import argparse - -samples = 10 - - -def usage(msg): - print("Usage: %s %s" % (sys.argv[0], msg)) - sys.exit(1) - - -def filename(ext, n, m, i, f): - if f is None: - return "bench/dfa_%d_%d_%d.%s" % (n, m, i, ext) - else: - return "bench/dfa_%d_%d_%d_f%d.%s" % (n, m, i, f, ext) - - -def coalg_file(n, m, i, f): - return filename("coalgebra", n, m, i, f) - - -def valmari_file(n, m, i, f): - return filename("valmari", n, m, i, f) - - -def dot_file(n, m, i, f): - return filename("dot", n, m, i, f) - - -def generate(args): - generator = args.generator - n = args.n - m = args.m - dot = args.dot - final = args.final - - os.makedirs("bench", exist_ok=True) - - for i in range(0, samples): - if os.path.exists(coalg_file(n, m, i, final)): - continue - cmd = [generator, str(n), str(m), - ("copar:%s" % coalg_file(n, m, i, final)), - ("valmari:%s" % valmari_file(n, m, i, final))] - if dot: - cmd.append("dot:%s" % dot_file(n, m, i, final)) - if final is not None: - cmd.append("--final") - cmd.append(str(final)) - subprocess.run(cmd) - - -def run_one(copar, valmari, n, m, i, final, noopt, nofunctrans): - # Run copar on it - copar_args = [copar, 'refine', '--stats-json', coalg_file(n, m, i, final)] - - if noopt: - copar_args.append("--disable-optimizations") - - if nofunctrans: - copar_args.append("--no-functor-transforms") - - out = subprocess.run(copar_args, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE) - stats = json.loads(out.stderr.decode('utf-8')) - - # Run valmari on it - valmari_open_file = open(valmari_file(n, m, i, final)) - out = subprocess.run(['perf', 'stat', valmari], - stdin=valmari_open_file, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env={'LC_ALL': 'C'}) - valmari_time = re.search(r'(\d+.\d+)\W+seconds time elapsed', - out.stderr.decode('utf-8'))[1] - valmari_states = re.search(r'\d+', out.stdout.decode('utf-8'))[0] - - stats['n'] = int(n) - stats['m'] = int(m) - stats['i'] = int(i) - stats['valmari-time'] = valmari_time - stats['valmari-states'] = valmari_states - - return stats - - -def confidence(vals): - """Compute the 95% confidence intervall (CI) for the mean with the student -distribution. - -Returns a tuple of (mean, lower, upper), where lower and upper are the bounds -of the CI""" - - # For a larger sample size (> 30), we could also use the normal - # distribution. - # - # This code is taken from - # https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data/34474255#34474255 - - mean = np.mean(vals) - ci = st.t.interval(0.95, len(vals)-1, loc=np.mean(vals), - scale=st.sem(vals)) - - return (mean, ci[0], ci[1]) - - -def stddev(vals): - """Compute the mean and standard deviation intervall on a sample. - -This uses the corrected sample standard deviation.""" - - # see also: - # https://en.wikipedia.org/wiki/Standard_deviation#Corrected_sample_standard_deviation - mean = np.mean(vals) - std = np.std(vals, ddof=1) - - return (mean, std) - - -def print_row(d, stddev): - values = [ - d['n'], - d['m'], - d['i'], - d['states'], - d['edges'], - d['initial-partition-size'], - d['final-partition-size'], - d['explicit-final-partition-size'], - d['size1-skipped'] - ] - - for k in ['overall-duration', 'parse-duration', 'algorithm-duration', - 'initialize-duration', 'refine-duration', 'valmari-time']: - values.append(d[k]) - if stddev: - values.append(d[k + '-stddev']) - - values.append(d['valmari-states']) - - print('\t'.join(str(x) for x in values)) - - -def run(args): - copar = args.copar - valmari = args.valmari - n = args.n - m = args.m - final = args.final - noopt = args.noopt - nofunctrans = args.nofunctrans - sample_count = samples if args.samples is None else args.samples - - results = [run_one(copar, valmari, n, m, i, final, noopt, nofunctrans) - for i in range(0, sample_count)] - - # Do some sanity checks on the samles - if len(results) != sample_count: - pass - - def allequal(lst, key): - return all(x[key] == lst[0][key] for x in lst) - - equal_keys = ['n', 'm', 'states', 'edges', 'initial-partition-size'] - - for k in equal_keys: - if not allequal(results, k): - raise(Exception("Samples don't match for key '%s'" % k)) - - def confidencekey(vals, k): - return confidence(list(float(x[k]) for x in vals)) - - def stddevkey(vals, k): - return stddev(list(float(x[k]) for x in vals)) - - combined = results[0].copy() - combined['i'] = sample_count - - for k in ['overall-duration', 'parse-duration', 'initialize-duration', - 'refine-duration', 'algorithm-duration', 'valmari-time']: - ci = stddevkey(results, k) - combined[k] = str(ci[0]) - combined[k + '-stddev'] = str(ci[1]) - - if args.indiv: - for res in results: - print_row(res, stddev=False) - else: - print_row(combined, stddev=args.stddev) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - subparsers = parser.add_subparsers(required=True) - - gen_parser = subparsers.add_parser('generate') - gen_parser.add_argument('generator') - gen_parser.add_argument('n', type=int) - gen_parser.add_argument('m', type=int) - gen_parser.add_argument('--dot', action='store_true') - gen_parser.add_argument('--final', type=int, - help="Percentage of final states", - metavar="PERCENT") - gen_parser.set_defaults(func=generate) - - run_parser = subparsers.add_parser('run') - run_parser.add_argument('copar') - run_parser.add_argument('valmari') - run_parser.add_argument('n', type=int) - run_parser.add_argument('m', type=int) - run_parser.add_argument('--indiv', action='store_true', - help="report individual samples") - run_parser.add_argument('--stddev', action='store_true', - help="report stddev for timings") - run_parser.add_argument('--final', type=int, - help="Percentage of final states", - metavar="PERCENT") - run_parser.add_argument('--noopt', action='store_true', - help="run copar without --disable-optimizations") - run_parser.add_argument('--nofunctrans', action='store_true', - help="run copar without --no-functor-transforms") - run_parser.add_argument('--samples', type=int, - help="number of samples to run") - run_parser.set_defaults(func=run) - - args = parser.parse_args() - args.func(args) - - # if len(sys.argv) < 2: - # usage("generate|run ARGUMENTS..") - # sys.exit(1) - - # if sys.argv[1] == "generate": - # generate(sys.argv[2:]) - # elif sys.argv[1] == "run": - # run(sys.argv[2:]) - # else: - # usage("generate|run ARGUMENTS..") diff --git a/dfa/benchmark.org b/dfa/benchmark.org deleted file mode 100644 index 10f9f65..0000000 --- a/dfa/benchmark.org +++ /dev/null @@ -1,749 +0,0 @@ -#+TITLE: Random DFAs -#+LATEX_HEADER: \usepackage[a4paper,margin=1in,landscape]{geometry} - -* Generating the benchmarks - - Our generator accepts two parameters: - - - n :: Number of states - - m :: Size of the input alphabet - - Generating the output file for n=10000 and m=10000 already almost eats up all - 16GB of RAM, so we can't go any higher than that. - - #+BEGIN_SRC sh :results output silent - for n in 10 20 30 40 50 60 70 80 90 100 200 300 400 500 600 700 800 900 1000 2000 3000 4000 5000 10000; do - for m in 10 100 1000 10000; do - python bench.py generate ../../copar/bin/random-dfa $n $m - done - done - #+END_SRC - -* Executing the benchmarks - -The fields in the following table are: - -- N :: Number of states of the automaton -- M :: Size of the input alphabet of the automaton -- i :: Number of sample for individual benchmark or sample count for aggregated - values. -- States :: Number of states of the coalgebra -- Edges :: Number of edges in the coalgebra -- I :: Size of initial partition -- Q :: Size of final partition -- Qs1 :: Size of final partition restricted to sort 1 -- t :: Overall time for CoPaR in seconds -- tp :: Time to parse the input in seconds -- ta :: Overall time to execute the refinement algorithm -- ti :: Time for the initialization procedure -- tr :: Time for the actual partition refinement -- tv :: Overall time for Valmari in seconds -- Qv :: Size of final partition that valmari's tool computes - -For aggregated benchmarks, each timing result also has an additional column with -the standard derivation of the samples - -Important correctness checks are: - -- The number of states should be the same in the coalgebra and automaton -- The number of edges in the coalgebra should be $n*m$ -- The size of the initial partition must be 2 -- The size of the final partition should be the same as for valmari - -** Plotting Code - -The following python code can plot the tables below and produce an inline image -into this document. - - -#+NAME: plot -#+BEGIN_SRC python :results file :exports results :var data="" :var filename="" -import matplotlib.pyplot as plt - -'''Turn the table data into x and y data''' -x = [a[0] for a in data] -t = [a[9] for a in data] -t_s = [a[10] for a in data] -tp = [a[11] for a in data] -tp_s = [a[12] for a in data] -ta = [a[13] for a in data] -ta_s = [a[14] for a in data] -ti = [a[15] for a in data] -ti_s = [a[16] for a in data] -tr = [a[17] for a in data] -tr_s = [a[18] for a in data] -tv = [a[19] for a in data] -tv_s = [a[20] for a in data] - -''' Plot the x and y data''' -plt.errorbar(x, t, yerr=t_s, label="t") -plt.errorbar(x, tp, yerr=tp_s, label="tp") -plt.errorbar(x, ta, yerr=ta_s, label="ta") -plt.errorbar(x, tr, yerr=tr_s, label="tr") -plt.errorbar(x, ti, yerr=ti_s, label="ti") -plt.errorbar(x, tv, yerr=tv_s, label="tv") - -''' Set the x and y labels on the graph ''' -plt.xlabel("Number of states") -plt.ylabel("Seconds") - -''' Create the legend ''' -plt.legend(loc="upper left") - -''' Save the PNG file ''' -plt.savefig(filename) - -''' Return the PNG file path to OrgMode ''' -return(filename) -#+END_SRC - -** TODO Test - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opt" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 10 10 --indiv -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opt | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|----+----+---+--------+-------+---+----+------+-----+-------------+-------------+-------------+------------+------------+-------------+-----| -| 10 | 10 | 0 | 10 | 100 | 2 | 10 | 10 | 83 | 0.001046352 | 0.00092647 | 8.813e-05 | 2.5603e-05 | 4.8467e-05 | 0.0013978 | 10 | -| 10 | 10 | 1 | 10 | 100 | 2 | 10 | 10 | 81 | 0.001332556 | 0.00117165 | 0.000121423 | 4.205e-05 | 6.1448e-05 | 0.001185295 | 10 | -| 10 | 10 | 2 | 10 | 100 | 2 | 10 | 10 | 86 | 0.001131453 | 0.001002346 | 9.7326e-05 | 2.4585e-05 | 5.9035e-05 | 0.001117232 | 10 | -| 10 | 10 | 3 | 10 | 100 | 2 | 10 | 10 | 76 | 0.001090468 | 0.000967138 | 9.1729e-05 | 2.4952e-05 | 5.2869e-05 | 0.001147177 | 10 | -| 10 | 10 | 4 | 10 | 100 | 2 | 10 | 10 | 70 | 0.001085314 | 0.000961097 | 9.1407e-05 | 2.6115e-05 | 5.0625e-05 | 0.001228354 | 10 | -| 10 | 10 | 5 | 10 | 100 | 2 | 10 | 10 | 77 | 0.001098224 | 0.000950174 | 9.715e-05 | 2.6022e-05 | 5.0376e-05 | 0.001149149 | 10 | -| 10 | 10 | 6 | 10 | 100 | 2 | 10 | 10 | 75 | 0.001075821 | 0.000940202 | 0.000101156 | 2.7531e-05 | 5.9542e-05 | 0.001141678 | 10 | -| 10 | 10 | 7 | 10 | 100 | 2 | 10 | 10 | 81 | 0.001051644 | 0.000930808 | 8.7346e-05 | 2.6147e-05 | 4.7219e-05 | 0.001227956 | 10 | -| 10 | 10 | 8 | 10 | 100 | 2 | 10 | 10 | 78 | 0.001059422 | 0.000935757 | 9.0775e-05 | 2.6297e-05 | 4.999e-05 | 0.001297999 | 10 | -| 10 | 10 | 9 | 10 | 100 | 2 | 10 | 10 | 79 | 0.001121328 | 0.000993801 | 9.2128e-05 | 2.6818e-05 | 5.0163e-05 | 0.001188937 | 10 | - -** For m = 1: -*** Generating some benchmarks - -#+begin_src sh :results output silent -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000 200000 200000 210000 220000 230000 240000 250000 260000 270000 280000 290000 300000; do - python bench.py generate ../../copar/bin/random-dfa $n 1 -done -#+end_src - -*** And running them - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000 200000 210000 220000 230000 240000 250000 260000 270000 280000 290000 300000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 1 --stddev --nofunctrans -done -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|--------+---+----+--------+--------+---+--------+--------+-------+--------------------+---------------------+--------------------+----------------------+--------------------+---------------------+---------------------+-----------------------+--------------------+---------------------+---------------------+-----------------------+--------| -| 100000 | 1 | 10 | 100000 | 100000 | 2 | 65489 | 65489 | 8071 | 3.9017160891999993 | 0.05725542243446023 | 1.7041072878999999 | 0.007666172923625777 | 1.9023876757 | 0.06490987848505304 | 0.2628267297 | 0.003272320490714361 | 1.5989905591 | 0.0658406983383148 | 0.13759999169999998 | 0.0065012827508490615 | 65489 | -| 110000 | 1 | 10 | 110000 | 110000 | 2 | 72513 | 72513 | 9297 | 4.313956430299999 | 0.0763833477465056 | 1.949160167 | 0.009027583663742882 | 2.1389264483 | 0.08096080778904134 | 0.30003091430000006 | 0.00510612940724545 | 1.7878511580999998 | 0.08900092769490782 | 0.1531381338 | 0.006417484978214387 | 72513 | -| 120000 | 1 | 10 | 120000 | 120000 | 2 | 78444 | 78444 | 9790 | 4.8029536083 | 0.11912637839624582 | 2.1499455626999997 | 0.015364837081170035 | 2.3896450291 | 0.12655058491231658 | 0.3351564949 | 0.005116840454431979 | 1.9936482227999999 | 0.12438977802181102 | 0.1976445005 | 0.06662102777240582 | 78444 | -| 130000 | 1 | 10 | 130000 | 130000 | 2 | 85315 | 85315 | 10567 | 5.2303333725000005 | 0.14216674785304523 | 2.3350624718999997 | 0.015434810994377981 | 2.5886367938 | 0.1231368250495237 | 0.3720805978 | 0.004435277321512478 | 2.1608228643000005 | 0.12243514299040262 | 0.20366009489999998 | 0.009002729886375587 | 85315 | -| 140000 | 1 | 10 | 140000 | 140000 | 2 | 91961 | 91961 | 11636 | 5.7241506135 | 0.18089497938779125 | 2.5227946168999997 | 0.04041226205771596 | 2.8734782348 | 0.19157855600495133 | 0.37903946050000004 | 0.0055335089050379035 | 2.4276934805000003 | 0.194103518528028 | 0.2238437406 | 0.009396875043746323 | 91961 | -| 150000 | 1 | 10 | 150000 | 150000 | 2 | 98627 | 98627 | 11706 | 6.187801929800001 | 0.14064425090177476 | 2.6582514965 | 0.009003423452304189 | 3.1697628569000003 | 0.13611337872223803 | 0.2999485256 | 0.004355764391675269 | 2.6839304120999996 | 0.1374033748576153 | 0.2515853332 | 0.014174216184394798 | 98627 | -| 160000 | 1 | 10 | 160000 | 160000 | 2 | 104809 | 104809 | 12764 | 6.7382136996 | 0.15245636348209132 | 2.8366039933 | 0.015161039687297094 | 3.3935111766000006 | 0.15093821038539926 | 0.46547556329999995 | 0.006831967314617837 | 2.8632204123999996 | 0.1490646566678644 | 0.2813251122 | 0.011347243669986634 | 104809 | -| 170000 | 1 | 10 | 170000 | 170000 | 2 | 111232 | 111232 | 14138 | 7.2908625285 | 0.10604295432427215 | 3.09530805 | 0.03603531460563363 | 3.7597713653 | 0.12118258888916565 | 0.5004929244 | 0.006790266960715258 | 3.1806287245999996 | 0.10781123989114733 | 0.3073801929 | 0.013086131717466363 | 111232 | -| 180000 | 1 | 10 | 180000 | 180000 | 2 | 118197 | 118197 | 14269 | 7.7940563974 | 0.2543156188997473 | 3.2715667038 | 0.009360892657020248 | 4.092677974399999 | 0.2619800187273766 | 0.525093342 | 0.007190986044884863 | 3.4845772176000005 | 0.2651429743565608 | 0.3501228732 | 0.016837178135142662 | 118197 | -| 190000 | 1 | 10 | 190000 | 190000 | 2 | 123893 | 123893 | 14728 | 8.269414321400001 | 0.19220873052742554 | 3.4378605475 | 0.020742001772012533 | 4.3756709237 | 0.1867233205842528 | 0.5445772935000001 | 0.02997447405159672 | 3.7418600049 | 0.16409710010971268 | 0.3724915993 | 0.016211865333268422 | 123893 | -| 200000 | 1 | 10 | 200000 | 200000 | 2 | 131252 | 131252 | 16562 | 8.7204120381 | 0.260072753804474 | 3.6344360476 | 0.016315930797572084 | 4.6021848058999995 | 0.24376077112686112 | 0.5754112171 | 0.00753933981008275 | 3.9305835423 | 0.2554540636025266 | 0.4100586315 | 0.018201735614278045 | 131252 | -| 210000 | 1 | 10 | 210000 | 210000 | 2 | 137501 | 137501 | 17008 | 9.2838852824 | 0.2636020019857964 | 3.8083384965000002 | 0.00953027592476456 | 4.9315308102 | 0.24319350760405056 | 0.5869515222999999 | 0.005476529581826432 | 4.2464882237 | 0.24324445568951442 | 0.441084476 | 0.023085429113395166 | 137501 | -| 220000 | 1 | 10 | 220000 | 220000 | 2 | 144061 | 144061 | 17847 | 9.770356903799998 | 0.3423008046584935 | 4.0041314226 | 0.01303346631043801 | 5.2126720673 | 0.3285456949555346 | 0.6358050346999999 | 0.003022973889400297 | 4.469972052800001 | 0.3372079781421167 | 0.466137511 | 0.02001933439908453 | 144061 | -| 230000 | 1 | 10 | 230000 | 230000 | 2 | 150310 | 150310 | 17731 | 10.437322718299999 | 0.22941617352716984 | 4.2013492154 | 0.05899131321541619 | 5.627988751199999 | 0.2635210887153482 | 0.6455574729 | 0.007678134687488006 | 4.868182401100001 | 0.25893084670217076 | 0.5156026173 | 0.022520583055545204 | 150310 | -| 240000 | 1 | 10 | 240000 | 240000 | 2 | 157139 | 157139 | 18612 | 11.053093357799998 | 0.33411355973433937 | 4.3785478234 | 0.025313675755905325 | 6.043547060300001 | 0.3334691533111559 | 0.6885990058 | 0.004772154958912903 | 5.235913457100001 | 0.3284099648007952 | 0.5510596194 | 0.024897984793143372 | 157139 | -| 250000 | 1 | 10 | 250000 | 250000 | 2 | 164155 | 164155 | 20499 | 11.5662374633 | 0.2625704687079291 | 4.5883679078 | 0.014908850614635781 | 6.3090031014 | 0.25471836122993463 | 0.7311154823999999 | 0.00533183466125695 | 5.459369843300001 | 0.2558493631410093 | 0.6040049302 | 0.009586109716559724 | 164155 | -| 260000 | 1 | 10 | 260000 | 260000 | 2 | 170681 | 170681 | 20415 | 11.6456015015 | 0.511989377271459 | 4.7059698737 | 0.12513626926548418 | 6.2599540109 | 0.4130910662631789 | 0.6555105109 | 0.10337670349981325 | 5.4029216802 | 0.3887658337407677 | 0.6083744114 | 0.034852307242699845 | 170681 | -| 270000 | 1 | 10 | 270000 | 270000 | 2 | 177419 | 177419 | 22189 | 12.120666825499999 | 0.3737239336482957 | 4.8034746198 | 0.01835509221979868 | 6.633201435299999 | 0.35387444814978264 | 0.7363434314 | 0.0031265120905228346 | 5.767584987699999 | 0.34512662981485487 | 0.6364424622 | 0.027411122932964365 | 177419 | -| 280000 | 1 | 10 | 280000 | 280000 | 2 | 183598 | 183598 | 23254 | 12.940827799400001 | 0.3948481113814338 | 4.965828097099999 | 0.02554346533283756 | 7.025901951100001 | 0.37191392383248734 | 0.8191934889999999 | 0.007455230101518104 | 6.0883975169 | 0.3627755680944626 | 0.6621498792 | 0.033948444495518634 | 183598 | -| 290000 | 1 | 10 | 290000 | 290000 | 2 | 190044 | 190044 | 22976 | 13.3304674734 | 0.36445051870292144 | 5.1312368327 | 0.013064971257863454 | 7.2310452817 | 0.36289207727580786 | 0.8502582112999999 | 0.0037351564859896816 | 6.2581376613 | 0.3563549113115732 | 0.7004045213 | 0.024056932759703036 | 190044 | -| 300000 | 1 | 10 | 300000 | 300000 | 2 | 197133 | 197133 | 23844 | 14.146797660499999 | 0.31595827791135156 | 5.2838587488 | 0.018411110755737675 | 7.897829865599999 | 0.3353595236408498 | 0.8807967731999999 | 0.002439527016899235 | 6.8851801584 | 0.34025879458180663 | 0.7427352719 | 0.030209104626308197 | 197133 | - - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000 200000 210000 220000 230000 240000 250000 260000 270000 280000 290000 300000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 1 --stddev -done -#+end_src - -#+NAME: results1 -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|--------+---+----+--------+--------+---+--------+--------+-------+--------------------+---------------------+--------------------+-----------------------+--------------------+----------------------+---------------------+-----------------------+--------------------+---------------------+---------------------+-----------------------+--------| -| 100000 | 1 | 10 | 100000 | 100000 | 2 | 65489 | 65489 | 8071 | 3.1723742583 | 0.06415135633353668 | 1.0352353053 | 0.008941562892079086 | 1.9350310748 | 0.059410960798478435 | 0.32343377709999993 | 0.006503732380012458 | 1.4825559133 | 0.06182975711003514 | 0.13457228840000002 | 0.0061834340026262645 | 65489 | -| 110000 | 1 | 10 | 110000 | 110000 | 2 | 72513 | 72513 | 9297 | 3.6060606505000004 | 0.07120835312896302 | 1.1337366444 | 0.0066497616379870466 | 2.1326008449 | 0.06899518842479228 | 0.37291921390000005 | 0.009062006583398122 | 1.7116194235999997 | 0.07486105411993155 | 0.1531423643 | 0.009425071171266949 | 72513 | -| 120000 | 1 | 10 | 120000 | 120000 | 2 | 78444 | 78444 | 9790 | 3.9819581869000005 | 0.08295924676715061 | 1.2491448927 | 0.008382980979176068 | 2.3497672478 | 0.08960022035531837 | 0.4194873646 | 0.008112127594262736 | 1.8800125135999999 | 0.09098119072406534 | 0.1770516467 | 0.007224653623244186 | 78444 | -| 130000 | 1 | 10 | 130000 | 130000 | 2 | 85315 | 85315 | 10567 | 4.4078494884 | 0.11759337156384515 | 1.3737832236999998 | 0.009853487052357706 | 2.5904541815999997 | 0.12985226650810058 | 0.4653538676 | 0.009431514691067346 | 2.0676565862000005 | 0.12518907212331976 | 0.1988111277 | 0.004361050542692717 | 85315 | -| 140000 | 1 | 10 | 140000 | 140000 | 2 | 91961 | 91961 | 11636 | 4.8345211587 | 0.18598447828239828 | 1.4702093769999998 | 0.00526703848044785 | 2.8969718773000004 | 0.18768478695801893 | 0.522174264 | 0.046844514809917 | 2.3171949742000004 | 0.231287985327397 | 0.22347404060000003 | 0.01314437739599008 | 91961 | -| 150000 | 1 | 10 | 150000 | 150000 | 2 | 98627 | 98627 | 11706 | 5.1577071244 | 0.10743990008037858 | 1.6936769373 | 0.03179318810342249 | 3.1119092698 | 0.11610573189464778 | 0.5696047548000001 | 0.010090814422831586 | 2.4752281476 | 0.11124271004914135 | 0.24985176729999997 | 0.012456361594495972 | 98627 | -| 160000 | 1 | 10 | 160000 | 160000 | 2 | 104809 | 104809 | 12764 | 5.4344598328 | 0.14671501495323758 | 1.7836474614 | 0.009964746328457117 | 3.2475654382999997 | 0.13978295339543426 | 0.5652916232 | 0.002392113968621664 | 2.609053951 | 0.1398729333907138 | 0.2762560884 | 0.006841057884760942 | 104809 | -| 170000 | 1 | 10 | 170000 | 170000 | 2 | 111232 | 111232 | 14138 | 6.245343322000001 | 0.12009578467332085 | 1.8606334966999998 | 0.02741443041452057 | 3.7771725017 | 0.11137133528898206 | 0.6416360163999999 | 0.01595195544619899 | 3.0529216406 | 0.11120009895874813 | 0.3069283973 | 0.010424249298240946 | 111232 | -| 180000 | 1 | 10 | 180000 | 180000 | 2 | 118197 | 118197 | 14269 | 6.6310759754 | 0.2253434734039179 | 1.9310191868 | 0.01289471358647633 | 4.0831294374 | 0.23827453971489956 | 0.6716207292 | 0.016394009117171423 | 3.3307862904000003 | 0.24442357796736197 | 0.3474492079 | 0.013999878438761125 | 118197 | -| 190000 | 1 | 10 | 190000 | 190000 | 2 | 123893 | 123893 | 14728 | 7.0231597877 | 0.09399855550806477 | 2.2149782845 | 0.013126799196048424 | 4.356570219499999 | 0.09521435695870631 | 0.7373797438 | 0.0575174924076721 | 3.5380053205000004 | 0.10378347745460388 | 0.37080809929999997 | 0.01290979756291998 | 123893 | -| 200000 | 1 | 10 | 200000 | 200000 | 2 | 131252 | 131252 | 16562 | 7.522432313 | 0.2633420321550606 | 2.3628339816 | 0.039989943606690156 | 4.6675009988 | 0.2132461130121612 | 0.7622307122 | 0.009604337545853697 | 3.8178427712 | 0.21696400809832647 | 0.4085155762 | 0.017721784682142964 | 131252 | -| 210000 | 1 | 10 | 210000 | 210000 | 2 | 137501 | 137501 | 17008 | 7.9078188707 | 0.22101361497446462 | 2.4432533651999995 | 0.015650174443881663 | 4.9470993974 | 0.22727214564348047 | 0.9518358890000002 | 0.015518576165034272 | 3.9050474077000006 | 0.22542975036092622 | 0.44033106270000005 | 0.01727193852812063 | 137501 | -| 220000 | 1 | 10 | 220000 | 220000 | 2 | 144061 | 144061 | 17847 | 8.4310485219 | 0.2898905581083682 | 2.5987084524 | 0.009502650210868985 | 5.2729674842000005 | 0.27919121144959574 | 0.8455970423 | 0.01824497086380857 | 4.327157211800001 | 0.28910724973041124 | 0.46449658029999996 | 0.01736415985291904 | 144061 | -| 230000 | 1 | 10 | 230000 | 230000 | 2 | 150310 | 150310 | 17731 | 8.6320747989 | 0.33668340920034806 | 2.6197801442000004 | 0.05256162205418141 | 5.4315238363 | 0.2747458205147567 | 0.9960376444 | 0.028735197336432615 | 4.336221116799999 | 0.25835249305193325 | 0.5015617587 | 0.021268906232720087 | 150310 | -| 240000 | 1 | 10 | 240000 | 240000 | 2 | 157139 | 157139 | 18612 | 9.009050490400002 | 0.3128766363819569 | 2.7155297847 | 0.023178125088956805 | 5.700408186600001 | 0.2879543985300683 | 1.0367297358000003 | 0.013734694710037488 | 4.5622825022 | 0.2876871470532377 | 0.5279500610000001 | 0.02206413574130229 | 157139 | -| 250000 | 1 | 10 | 250000 | 250000 | 2 | 164155 | 164155 | 20499 | 9.4270514669 | 0.23225929149256214 | 2.8463226528 | 0.01506100528301562 | 5.951184781199999 | 0.2039882530457369 | 0.9299208275999999 | 0.057306714844376085 | 4.9170371191 | 0.18694913347225156 | 0.5725323586 | 0.012914493862261942 | 164155 | -| 260000 | 1 | 10 | 260000 | 260000 | 2 | 170681 | 170681 | 20415 | 9.6284610064 | 0.27863865455263176 | 2.9354543054 | 0.011552204060273432 | 6.042820605099999 | 0.26088610696446574 | 1.0819876318000001 | 0.013253391610787106 | 4.8494240756 | 0.2592568608766787 | 0.5946690359 | 0.03364498517483961 | 170681 | -| 270000 | 1 | 10 | 270000 | 270000 | 2 | 177419 | 177419 | 22189 | 10.3441837675 | 0.34038473596017615 | 3.0790200003 | 0.04722014457879415 | 6.5974961401000005 | 0.30192774188595645 | 1.1574601788999999 | 0.014557294361249015 | 5.3245052121 | 0.30141106044101496 | 0.6368050635000001 | 0.028727929151588963 | 177419 | -| 280000 | 1 | 10 | 280000 | 280000 | 2 | 183598 | 183598 | 23254 | 10.591835607099998 | 0.35271658898500896 | 3.1467475046 | 0.02026936342148749 | 6.7210618943 | 0.3420285354390056 | 1.0249986697 | 0.005550453719610728 | 5.566262730699999 | 0.3325643977911153 | 0.6547289464999999 | 0.034210139168846056 | 183598 | -| 290000 | 1 | 10 | 290000 | 290000 | 2 | 190044 | 190044 | 22976 | 10.8875411057 | 0.3231777853754279 | 3.2379748348 | 0.015718810790019754 | 6.9012326078 | 0.3570489487250581 | 1.0157828841 | 0.0067663978067151525 | 5.745269477999999 | 0.34550046535345835 | 0.6994596174 | 0.020991553070787917 | 190044 | -| 300000 | 1 | 10 | 300000 | 300000 | 2 | 197133 | 197133 | 23844 | 11.6383832293 | 0.32088026618713805 | 3.3229065135 | 0.028968215816625995 | 7.5626338512 | 0.2829614452296093 | 0.9824864115 | 0.13146291683857875 | 6.3761597855 | 0.2835986824686698 | 0.74688904 | 0.030483611878687856 | 197133 | - - -**** How many of those models are minimal - -Thorsten asks how many of those models are already minimal, because the thesis -currently reads "very few". - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000 200000 210000 220000 230000 240000 250000 260000 270000 280000 290000 300000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 1 --indiv -done -#+end_src - -#+NAME: results1indiv -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|--------+---+---+--------+--------+---+--------+--------+-------+--------------+-------------+-------------+-------------+-------------+-------------+--------| -| 100000 | 1 | 0 | 100000 | 100000 | 2 | 65489 | 65489 | 8071 | 3.090418942 | 1.029257521 | 1.861948383 | 0.328673706 | 1.392791488 | 0.134144684 | 65489 | -| 100000 | 1 | 1 | 100000 | 100000 | 2 | 65912 | 65912 | 8413 | 3.108938053 | 1.010879236 | 1.898772498 | 0.324852464 | 1.448839488 | 0.128740365 | 65912 | -| 100000 | 1 | 2 | 100000 | 100000 | 2 | 65551 | 65551 | 8087 | 3.226284016 | 1.002811598 | 2.024931788 | 0.332001372 | 1.567582393 | 0.131146099 | 65551 | -| 100000 | 1 | 3 | 100000 | 100000 | 2 | 65473 | 65473 | 7919 | 3.051887477 | 1.009408854 | 1.845523985 | 0.323038515 | 1.381551998 | 0.135409477 | 65473 | -| 100000 | 1 | 4 | 100000 | 100000 | 2 | 65668 | 65668 | 8130 | 3.131196133 | 1.004897268 | 1.92738016 | 0.321685576 | 1.482568015 | 0.136392373 | 65668 | -| 100000 | 1 | 5 | 100000 | 100000 | 2 | 65857 | 65857 | 8264 | 3.138151577 | 1.019564955 | 1.917969114 | 0.330225925 | 1.463897169 | 0.133613369 | 65857 | -| 100000 | 1 | 6 | 100000 | 100000 | 2 | 65709 | 65709 | 8190 | 3.125807861 | 1.012800151 | 1.914870332 | 0.32505943 | 1.464654751 | 0.134245446 | 65709 | -| 100000 | 1 | 7 | 100000 | 100000 | 2 | 65777 | 65777 | 8199 | 3.103733509 | 1.006876374 | 1.898138763 | 0.322296575 | 1.452699306 | 0.136855992 | 65777 | -| 100000 | 1 | 8 | 100000 | 100000 | 2 | 65443 | 65443 | 7867 | 3.089412709 | 1.003632113 | 1.887783014 | 0.331641437 | 1.430431613 | 0.134312071 | 65443 | -| 100000 | 1 | 9 | 100000 | 100000 | 2 | 65551 | 65551 | 8353 | 3.175007591 | 1.007407203 | 1.966208791 | 0.323649855 | 1.519172145 | 0.133161502 | 65551 | -| 110000 | 1 | 0 | 110000 | 110000 | 2 | 72513 | 72513 | 9297 | 3.583623638 | 1.115609103 | 2.135438479 | 0.382718716 | 1.709379538 | 0.156874112 | 72513 | -| 110000 | 1 | 1 | 110000 | 110000 | 2 | 72154 | 72154 | 9232 | 3.627570506 | 1.103570537 | 2.189885346 | 0.36544056 | 1.781507161 | 0.144085569 | 72154 | -| 110000 | 1 | 2 | 110000 | 110000 | 2 | 71771 | 71771 | 9054 | 3.562237099 | 1.105080032 | 2.123648638 | 0.364379437 | 1.716464571 | 0.154521312 | 71771 | -| 110000 | 1 | 3 | 110000 | 110000 | 2 | 72036 | 72036 | 9000 | 3.465402602 | 1.104175201 | 2.028329005 | 0.382252627 | 1.582947338 | 0.148894505 | 72036 | -| 110000 | 1 | 4 | 110000 | 110000 | 2 | 71937 | 71937 | 8951 | 3.558752008 | 1.105804525 | 2.120581865 | 0.37868275 | 1.698635252 | 0.144977146 | 71937 | -| 110000 | 1 | 5 | 110000 | 110000 | 2 | 71792 | 71792 | 9055 | 3.603305467 | 1.103168135 | 2.161728608 | 0.366633907 | 1.751642064 | 0.153111461 | 71792 | -| 110000 | 1 | 6 | 110000 | 110000 | 2 | 71770 | 71770 | 8890 | 3.600811378 | 1.109044686 | 2.157865917 | 0.382314179 | 1.732870663 | 0.14781034 | 71770 | -| 110000 | 1 | 7 | 110000 | 110000 | 2 | 71872 | 71872 | 9105 | 3.526468424 | 1.115787775 | 2.078221198 | 0.38139662 | 1.654133087 | 0.143199962 | 71872 | -| 110000 | 1 | 8 | 110000 | 110000 | 2 | 71821 | 71821 | 9209 | 3.554558287 | 1.106931016 | 2.101587211 | 0.380784721 | 1.677697086 | 0.156406139 | 71821 | -| 110000 | 1 | 9 | 110000 | 110000 | 2 | 71886 | 71886 | 8496 | 3.4223644 | 1.113231918 | 1.978985167 | 0.374148003 | 1.540877846 | 0.150616037 | 71886 | -| 120000 | 1 | 0 | 120000 | 120000 | 2 | 78444 | 78444 | 9790 | 4.044083052 | 1.22089555 | 2.44686854 | 0.424892606 | 1.975084357 | 0.173854233 | 78444 | -| 120000 | 1 | 1 | 120000 | 120000 | 2 | 79064 | 79064 | 9263 | 3.710149224 | 1.214804905 | 2.097213639 | 0.40627247 | 1.643010328 | 0.16670665 | 79064 | -| 120000 | 1 | 2 | 120000 | 120000 | 2 | 78524 | 78524 | 9654 | 3.938946788 | 1.217641276 | 2.346316501 | 0.425755958 | 1.87338334 | 0.17600581 | 78524 | -| 120000 | 1 | 3 | 120000 | 120000 | 2 | 78399 | 78399 | 9588 | 3.971771578 | 1.228776231 | 2.369599418 | 0.407793587 | 1.91415154 | 0.173603882 | 78399 | -| 120000 | 1 | 4 | 120000 | 120000 | 2 | 78746 | 78746 | 9978 | 3.988636977 | 1.229441895 | 2.375189285 | 0.428107565 | 1.899082552 | 0.169995152 | 78746 | -| 120000 | 1 | 5 | 120000 | 120000 | 2 | 78615 | 78615 | 9663 | 3.938008292 | 1.232103189 | 2.328706998 | 0.428644184 | 1.852547968 | 0.169057935 | 78615 | -| 120000 | 1 | 6 | 120000 | 120000 | 2 | 78527 | 78527 | 9645 | 3.970203162 | 1.22990592 | 2.361789463 | 0.428056652 | 1.886277794 | 0.175214768 | 78527 | -| 120000 | 1 | 7 | 120000 | 120000 | 2 | 78774 | 78774 | 9675 | 3.953384523 | 1.229521193 | 2.346187673 | 0.427421114 | 1.87109108 | 0.174559227 | 78774 | -| 120000 | 1 | 8 | 120000 | 120000 | 2 | 78247 | 78247 | 9857 | 3.981651613 | 1.233029007 | 2.372190025 | 0.426377975 | 1.898751486 | 0.181812051 | 78247 | -| 120000 | 1 | 9 | 120000 | 120000 | 2 | 78928 | 78928 | 9693 | 3.829601322 | 1.218223075 | 2.234109856 | 0.424610468 | 1.739492118 | 0.163196799 | 78928 | -| 130000 | 1 | 0 | 130000 | 130000 | 2 | 85315 | 85315 | 10567 | 4.496630254 | 1.350185864 | 2.725690284 | 0.463947662 | 2.209744665 | 0.197830476 | 85315 | -| 130000 | 1 | 1 | 130000 | 130000 | 2 | 85142 | 85142 | 10403 | 4.342937024 | 1.337201086 | 2.560209662 | 0.46648121 | 2.041729717 | 0.188478467 | 85142 | -| 130000 | 1 | 2 | 130000 | 130000 | 2 | 84925 | 84925 | 10388 | 4.340346355 | 1.343248689 | 2.549159688 | 0.470840552 | 2.026643502 | 0.196708577 | 84925 | -| 130000 | 1 | 3 | 130000 | 130000 | 2 | 85122 | 85122 | 10224 | 4.325072141 | 1.346636564 | 2.532176279 | 0.465016216 | 2.015463288 | 0.192874629 | 85122 | -| 130000 | 1 | 4 | 130000 | 130000 | 2 | 84972 | 84972 | 10050 | 4.157620772 | 1.345743388 | 2.364910478 | 0.468773206 | 1.844103122 | 0.200949646 | 84972 | -| 130000 | 1 | 5 | 130000 | 130000 | 2 | 84995 | 84995 | 10729 | 4.445922674 | 1.341322827 | 2.681902811 | 0.468660831 | 2.140002118 | 0.226240593 | 84995 | -| 130000 | 1 | 6 | 130000 | 130000 | 2 | 85356 | 85356 | 9815 | 4.14208991 | 1.34305509 | 2.354709522 | 0.470155475 | 1.832324281 | 0.196692155 | 85356 | -| 130000 | 1 | 7 | 130000 | 130000 | 2 | 84961 | 84961 | 10513 | 4.406610962 | 1.328715031 | 2.649823902 | 0.465283683 | 2.108863585 | 0.195631672 | 84961 | -| 130000 | 1 | 8 | 130000 | 130000 | 2 | 85019 | 85019 | 10795 | 4.34992193 | 1.351010514 | 2.553603859 | 0.468264295 | 2.033701538 | 0.190065701 | 85019 | -| 130000 | 1 | 9 | 130000 | 130000 | 2 | 85572 | 85572 | 10741 | 4.341899661 | 1.34878337 | 2.545454159 | 0.467400417 | 2.026376139 | 0.197790981 | 85572 | -| 140000 | 1 | 0 | 140000 | 140000 | 2 | 91961 | 91961 | 11636 | 4.785633961 | 1.429755155 | 2.908650967 | 0.508993845 | 2.344014886 | 0.224317586 | 91961 | -| 140000 | 1 | 1 | 140000 | 140000 | 2 | 92261 | 92261 | 11446 | 4.869175696 | 1.440850625 | 2.969629031 | 0.490015676 | 2.423266125 | 0.214010397 | 92261 | -| 140000 | 1 | 2 | 140000 | 140000 | 2 | 91700 | 91700 | 10883 | 4.525186491 | 1.429946253 | 2.623965743 | 0.589262975 | 1.979096417 | 0.21107713 | 91700 | -| 140000 | 1 | 3 | 140000 | 140000 | 2 | 91529 | 91529 | 10873 | 4.763031452 | 1.43469886 | 2.867981765 | 0.488977323 | 2.322682854 | 0.21543578 | 91529 | -| 140000 | 1 | 4 | 140000 | 140000 | 2 | 91629 | 91629 | 11305 | 4.786165978 | 1.427493488 | 2.900078154 | 0.57321664 | 2.245201199 | 0.23427863 | 91629 | -| 140000 | 1 | 5 | 140000 | 140000 | 2 | 91880 | 91880 | 11470 | 4.83428426 | 1.429748273 | 2.944194491 | 0.49067493 | 2.397151544 | 0.220462138 | 91880 | -| 140000 | 1 | 6 | 140000 | 140000 | 2 | 91604 | 91604 | 11166 | 4.638033401 | 1.43262339 | 2.717577346 | 0.565435414 | 2.095427687 | 0.219351165 | 91604 | -| 140000 | 1 | 7 | 140000 | 140000 | 2 | 91511 | 91511 | 10132 | 4.494097405 | 1.436518961 | 2.586711282 | 0.612464606 | 1.916895669 | 0.228088975 | 91511 | -| 140000 | 1 | 8 | 140000 | 140000 | 2 | 92066 | 92066 | 11696 | 5.005829102 | 1.515282813 | 3.040166054 | 0.519872847 | 2.463503272 | 0.221593645 | 92066 | -| 140000 | 1 | 9 | 140000 | 140000 | 2 | 91879 | 91879 | 11445 | 4.873020022 | 1.432733643 | 2.977947848 | 0.488562877 | 2.432931357 | 0.225284717 | 91879 | -| 150000 | 1 | 0 | 150000 | 150000 | 2 | 98627 | 98627 | 11706 | 4.87874908 | 1.6648079 | 2.871211159 | 0.557953727 | 2.246941746 | 0.232801971 | 98627 | -| 150000 | 1 | 1 | 150000 | 150000 | 2 | 98261 | 98261 | 11998 | 5.053498174 | 1.638635224 | 3.073569116 | 0.566411168 | 2.441170162 | 0.260842737 | 98261 | -| 150000 | 1 | 2 | 150000 | 150000 | 2 | 98235 | 98235 | 12071 | 5.020194853 | 1.652143113 | 3.024943915 | 0.564898091 | 2.394127067 | 0.249948478 | 98235 | -| 150000 | 1 | 3 | 150000 | 150000 | 2 | 98312 | 98312 | 11705 | 4.993322009 | 1.639803476 | 3.005850198 | 0.559600904 | 2.381452894 | 0.250668565 | 98312 | -| 150000 | 1 | 4 | 150000 | 150000 | 2 | 98743 | 98743 | 12062 | 5.027550332 | 1.634849775 | 3.048277529 | 0.560757771 | 2.42163756 | 0.244345537 | 98743 | -| 150000 | 1 | 5 | 150000 | 150000 | 2 | 98223 | 98223 | 12114 | 5.122875915 | 1.643787445 | 3.137857417 | 0.563333104 | 2.508676615 | 0.235187336 | 98223 | -| 150000 | 1 | 6 | 150000 | 150000 | 2 | 98058 | 98058 | 12112 | 5.029908619 | 1.641798555 | 3.048464151 | 0.566356261 | 2.415904032 | 0.251638182 | 98058 | -| 150000 | 1 | 7 | 150000 | 150000 | 2 | 98210 | 98210 | 11960 | 5.082807396 | 1.623055534 | 3.118177094 | 0.563246208 | 2.488820486 | 0.244642605 | 98210 | -| 150000 | 1 | 8 | 150000 | 150000 | 2 | 97960 | 97960 | 11597 | 4.832574492 | 1.634116768 | 2.859206384 | 0.563952597 | 2.228513891 | 0.245505624 | 97960 | -| 150000 | 1 | 9 | 150000 | 150000 | 2 | 98422 | 98422 | 12311 | 5.254205812 | 1.641570462 | 3.241477264 | 0.561048378 | 2.614893926 | 0.25921745 | 98422 | -| 160000 | 1 | 0 | 160000 | 160000 | 2 | 104809 | 104809 | 12764 | 5.440070645 | 1.738349582 | 3.29496342 | 0.573287414 | 2.650413678 | 0.272580126 | 104809 | -| 160000 | 1 | 1 | 160000 | 160000 | 2 | 104736 | 104736 | 12041 | 5.164445291 | 1.740211137 | 3.046503543 | 0.554132548 | 2.420454444 | 0.270962312 | 104736 | -| 160000 | 1 | 2 | 160000 | 160000 | 2 | 105357 | 105357 | 13124 | 5.419971635 | 1.745238982 | 3.263228991 | 0.556133519 | 2.634783843 | 0.274127138 | 105357 | -| 160000 | 1 | 3 | 160000 | 160000 | 2 | 105082 | 105082 | 12438 | 5.229333287 | 1.747621002 | 3.107000357 | 0.558363145 | 2.47616425 | 0.263994342 | 105082 | -| 160000 | 1 | 4 | 160000 | 160000 | 2 | 105268 | 105268 | 12063 | 5.082048681 | 1.74809226 | 2.960825826 | 0.555949584 | 2.331742656 | 0.263435602 | 105268 | -| 160000 | 1 | 5 | 160000 | 160000 | 2 | 104256 | 104256 | 12487 | 5.422671634 | 1.746827086 | 3.271733078 | 0.557495636 | 2.643176684 | 0.267293552 | 104256 | -| 160000 | 1 | 6 | 160000 | 160000 | 2 | 104686 | 104686 | 12465 | 5.23858361 | 1.735106293 | 3.08249264 | 0.558101199 | 2.453024637 | 0.271405331 | 104686 | -| 160000 | 1 | 7 | 160000 | 160000 | 2 | 105070 | 105070 | 12893 | 5.425021324 | 1.74997715 | 3.271989538 | 0.55255752 | 2.647834339 | 0.286615979 | 105070 | -| 160000 | 1 | 8 | 160000 | 160000 | 2 | 104067 | 104067 | 12612 | 5.466025941 | 1.72077701 | 3.344051429 | 0.552210851 | 2.719644446 | 0.278253136 | 104067 | -| 160000 | 1 | 9 | 160000 | 160000 | 2 | 104683 | 104683 | 12955 | 5.445543346 | 1.736855611 | 3.302319902 | 0.552927518 | 2.678168574 | 0.27573911 | 104683 | -| 170000 | 1 | 0 | 170000 | 170000 | 2 | 111232 | 111232 | 14138 | 6.168860346 | 1.794201456 | 3.79426348 | 0.646182461 | 3.050866849 | 0.316425533 | 111232 | -| 170000 | 1 | 1 | 170000 | 170000 | 2 | 111515 | 111515 | 14069 | 6.291022894 | 1.806047037 | 3.901511142 | 0.649299151 | 3.184940069 | 0.312489109 | 111515 | -| 170000 | 1 | 2 | 170000 | 170000 | 2 | 111410 | 111410 | 13322 | 6.065010338 | 1.820236643 | 3.625553865 | 0.646420322 | 2.91112181 | 0.286363926 | 111410 | -| 170000 | 1 | 3 | 170000 | 170000 | 2 | 111530 | 111530 | 13559 | 6.083466882 | 1.79696291 | 3.702714542 | 0.650556016 | 2.953389729 | 0.315408512 | 111530 | -| 170000 | 1 | 4 | 170000 | 170000 | 2 | 111153 | 111153 | 13532 | 6.034167436 | 1.799491065 | 3.622846207 | 0.629077068 | 2.926017228 | 0.313858897 | 111153 | -| 170000 | 1 | 5 | 170000 | 170000 | 2 | 111203 | 111203 | 13432 | 6.016587597 | 1.799698199 | 3.602595388 | 0.649027157 | 2.885823847 | 0.29558384 | 111203 | -| 170000 | 1 | 6 | 170000 | 170000 | 2 | 111830 | 111830 | 13548 | 6.081547831 | 1.803101912 | 3.692775572 | 0.647747248 | 2.947152311 | 0.306056469 | 111830 | -| 170000 | 1 | 7 | 170000 | 170000 | 2 | 111722 | 111722 | 14225 | 6.118880544 | 1.801466529 | 3.731702997 | 0.650617257 | 2.981227424 | 0.302745422 | 111722 | -| 170000 | 1 | 8 | 170000 | 170000 | 2 | 111333 | 111333 | 13460 | 5.951473301 | 1.798359163 | 3.536319187 | 0.626822294 | 2.841167646 | 0.293359484 | 111333 | -| 170000 | 1 | 9 | 170000 | 170000 | 2 | 111104 | 111104 | 14024 | 6.322780834 | 1.803281674 | 3.937282214 | 0.648205194 | 3.221344806 | 0.308468407 | 111104 | -| 180000 | 1 | 0 | 180000 | 180000 | 2 | 118197 | 118197 | 14269 | 6.399882746 | 1.887676568 | 3.909145115 | 0.688854581 | 3.115447653 | 0.337145292 | 118197 | -| 180000 | 1 | 1 | 180000 | 180000 | 2 | 117899 | 117899 | 15008 | 6.59193564 | 1.904407536 | 4.08653053 | 0.665274738 | 3.346812896 | 0.371029427 | 117899 | -| 180000 | 1 | 2 | 180000 | 180000 | 2 | 117666 | 117666 | 13561 | 6.180263714 | 1.885404815 | 3.646186864 | 0.654902445 | 2.917396039 | 0.322655201 | 117666 | -| 180000 | 1 | 3 | 180000 | 180000 | 2 | 118429 | 118429 | 14730 | 6.683809119 | 1.887848416 | 4.181829556 | 0.65788037 | 3.450755587 | 0.33928549 | 118429 | -| 180000 | 1 | 4 | 180000 | 180000 | 2 | 117919 | 117919 | 14765 | 6.645367305 | 1.883886051 | 4.160680592 | 0.691621936 | 3.396849828 | 0.330699572 | 117919 | -| 180000 | 1 | 5 | 180000 | 180000 | 2 | 117831 | 117831 | 14368 | 6.570270358 | 1.899077345 | 4.07657936 | 0.688312904 | 3.316043289 | 0.362467943 | 117831 | -| 180000 | 1 | 6 | 180000 | 180000 | 2 | 118164 | 118164 | 14146 | 6.253575237 | 1.880088227 | 3.760370092 | 0.662409327 | 2.991572834 | 0.334099838 | 118164 | -| 180000 | 1 | 7 | 180000 | 180000 | 2 | 118052 | 118052 | 14371 | 6.445557412 | 1.878072219 | 3.955840363 | 0.687813284 | 3.196005552 | 0.347213376 | 118052 | -| 180000 | 1 | 8 | 180000 | 180000 | 2 | 118236 | 118236 | 14815 | 6.889289486 | 1.907757451 | 4.385984832 | 0.679527108 | 3.633801247 | 0.349703641 | 118236 | -| 180000 | 1 | 9 | 180000 | 180000 | 2 | 118382 | 118382 | 14925 | 6.736632409 | 1.891914072 | 4.247302756 | 0.68559706 | 3.489265896 | 0.334848585 | 118382 | -| 190000 | 1 | 0 | 190000 | 190000 | 2 | 123893 | 123893 | 14728 | 6.900986764 | 2.161582434 | 4.286226596 | 0.734762604 | 3.472067038 | 0.353948463 | 123893 | -| 190000 | 1 | 1 | 190000 | 190000 | 2 | 124576 | 124576 | 15159 | 6.898488004 | 2.174624047 | 4.27912098 | 0.700296369 | 3.498568863 | 0.35830138 | 124576 | -| 190000 | 1 | 2 | 190000 | 190000 | 2 | 125003 | 125003 | 15028 | 6.710198557 | 2.160130688 | 4.099515534 | 0.730724067 | 3.290501527 | 0.34505851 | 125003 | -| 190000 | 1 | 3 | 190000 | 190000 | 2 | 124525 | 124525 | 15349 | 7.034451859 | 2.17570743 | 4.4134223 | 0.714822027 | 3.618546002 | 0.351501335 | 124525 | -| 190000 | 1 | 4 | 190000 | 190000 | 2 | 124747 | 124747 | 15192 | 7.002408049 | 2.172273501 | 4.385477998 | 0.716428478 | 3.590030986 | 0.349493967 | 124747 | -| 190000 | 1 | 5 | 190000 | 190000 | 2 | 124560 | 124560 | 15457 | 7.05067543 | 2.157656357 | 4.436947595 | 0.847961622 | 3.506773273 | 0.371769263 | 124560 | -| 190000 | 1 | 6 | 190000 | 190000 | 2 | 124538 | 124538 | 15810 | 6.994375326 | 2.178560202 | 4.37305179 | 0.833612472 | 3.459327275 | 0.374734634 | 124538 | -| 190000 | 1 | 7 | 190000 | 190000 | 2 | 124769 | 124769 | 15347 | 6.859897755 | 2.172018642 | 4.242157485 | 0.715965149 | 3.445706969 | 0.385739932 | 124769 | -| 190000 | 1 | 8 | 190000 | 190000 | 2 | 124494 | 124494 | 15160 | 6.925273713 | 2.15971988 | 4.322267457 | 0.716420296 | 3.526599735 | 0.384269638 | 124494 | -| 190000 | 1 | 9 | 190000 | 190000 | 2 | 124557 | 124557 | 15285 | 6.897091465 | 2.18135559 | 4.271128314 | 0.718135681 | 3.472719135 | 0.35732001 | 124557 | -| 200000 | 1 | 0 | 200000 | 200000 | 2 | 131252 | 131252 | 16562 | 7.501766674 | 2.290347737 | 4.733828831 | 0.777096111 | 3.87381184 | 0.424507374 | 131252 | -| 200000 | 1 | 1 | 200000 | 200000 | 2 | 130414 | 130414 | 15929 | 7.314470042 | 2.300023248 | 4.546142615 | 0.74427866 | 3.719243714 | 0.428758608 | 130414 | -| 200000 | 1 | 2 | 200000 | 200000 | 2 | 130472 | 130472 | 15645 | 7.532480312 | 2.412615713 | 4.6471952 | 0.793080252 | 3.769570721 | 0.411414107 | 130472 | -| 200000 | 1 | 3 | 200000 | 200000 | 2 | 131201 | 131201 | 16704 | 7.921693365 | 2.28837716 | 5.120909431 | 0.763193167 | 4.274570419 | 0.379625197 | 131201 | -| 200000 | 1 | 4 | 200000 | 200000 | 2 | 130338 | 130338 | 16019 | 7.333021768 | 2.302058129 | 4.547763537 | 0.777164588 | 3.689658429 | 0.401041409 | 130338 | -| 200000 | 1 | 5 | 200000 | 200000 | 2 | 131308 | 131308 | 16144 | 7.461368238 | 2.329180847 | 4.645205799 | 0.777043676 | 3.785984536 | 0.434666287 | 131308 | -| 200000 | 1 | 6 | 200000 | 200000 | 2 | 130142 | 130142 | 15625 | 7.263421771 | 2.297130478 | 4.488145182 | 0.775779486 | 3.630773898 | 0.385860234 | 130142 | -| 200000 | 1 | 7 | 200000 | 200000 | 2 | 130897 | 130897 | 15694 | 7.089368287 | 2.294700687 | 4.323368884 | 0.761099811 | 3.442399339 | 0.402031887 | 130897 | -| 200000 | 1 | 8 | 200000 | 200000 | 2 | 131111 | 131111 | 15630 | 7.153170481 | 2.296633907 | 4.375205575 | 0.758395281 | 3.536094842 | 0.406151482 | 131111 | -| 200000 | 1 | 9 | 200000 | 200000 | 2 | 131658 | 131658 | 15813 | 7.345773525 | 2.290669569 | 4.585029803 | 0.761367922 | 3.740556123 | 0.384697184 | 131658 | -| 210000 | 1 | 0 | 210000 | 210000 | 2 | 137501 | 137501 | 17008 | 8.041410976 | 2.403339336 | 5.123146016 | 0.942056976 | 4.091394929 | 0.409698156 | 137501 | -| 210000 | 1 | 1 | 210000 | 210000 | 2 | 137135 | 137135 | 15957 | 7.741675231 | 2.396214712 | 4.837474255 | 0.943700366 | 3.803742428 | 0.421952086 | 137135 | -| 210000 | 1 | 2 | 210000 | 210000 | 2 | 137287 | 137287 | 15418 | 7.212113427 | 2.377236587 | 4.291066239 | 0.940134423 | 3.261723983 | 0.424028043 | 137287 | -| 210000 | 1 | 3 | 210000 | 210000 | 2 | 137678 | 137678 | 16996 | 7.852423325 | 2.400356141 | 4.948782914 | 0.944696767 | 3.914108096 | 0.435767402 | 137678 | -| 210000 | 1 | 4 | 210000 | 210000 | 2 | 137689 | 137689 | 16467 | 7.706523853 | 2.408438126 | 4.788697876 | 0.948561505 | 3.749344946 | 0.414052643 | 137689 | -| 210000 | 1 | 5 | 210000 | 210000 | 2 | 137048 | 137048 | 16582 | 7.944378905 | 2.402098191 | 5.03439182 | 0.951142524 | 3.995750467 | 0.426074004 | 137048 | -| 210000 | 1 | 6 | 210000 | 210000 | 2 | 137675 | 137675 | 17013 | 7.872924876 | 2.393076388 | 4.97605133 | 0.947243336 | 3.939171511 | 0.456742565 | 137675 | -| 210000 | 1 | 7 | 210000 | 210000 | 2 | 137782 | 137782 | 17222 | 7.851843478 | 2.386854521 | 4.953363162 | 0.942257674 | 3.922594883 | 0.472598536 | 137782 | -| 210000 | 1 | 8 | 210000 | 210000 | 2 | 137457 | 137457 | 17269 | 7.941092926 | 2.400592639 | 5.019741544 | 0.96243323 | 3.969171412 | 0.456810118 | 137457 | -| 210000 | 1 | 9 | 210000 | 210000 | 2 | 137666 | 137666 | 16679 | 7.65857879 | 2.381422353 | 4.777175065 | 0.940556494 | 3.748671504 | 0.421552087 | 137666 | -| 220000 | 1 | 0 | 220000 | 220000 | 2 | 144061 | 144061 | 17847 | 8.669095907 | 2.545385024 | 5.537661442 | 0.861795041 | 4.581711535 | 0.434233353 | 144061 | -| 220000 | 1 | 1 | 220000 | 220000 | 2 | 143962 | 143962 | 17924 | 8.318288059 | 2.512176282 | 5.279486794 | 0.841207079 | 4.343627504 | 0.478695353 | 143962 | -| 220000 | 1 | 2 | 220000 | 220000 | 2 | 144022 | 144022 | 17751 | 8.578085453 | 2.518105343 | 5.476536271 | 0.858895534 | 4.525636131 | 0.453601706 | 144022 | -| 220000 | 1 | 3 | 220000 | 220000 | 2 | 143831 | 143831 | 16007 | 7.698838517 | 2.524429064 | 4.629894943 | 0.858350426 | 3.63611909 | 0.457531583 | 143831 | -| 220000 | 1 | 4 | 220000 | 220000 | 2 | 144524 | 144524 | 17382 | 8.273610384 | 2.527772666 | 5.206568723 | 0.858430052 | 4.254333768 | 0.446028672 | 144524 | -| 220000 | 1 | 5 | 220000 | 220000 | 2 | 144219 | 144219 | 16792 | 8.064943676 | 2.535638022 | 4.988759882 | 0.864193856 | 4.030824969 | 0.465423993 | 144219 | -| 220000 | 1 | 6 | 220000 | 220000 | 2 | 144053 | 144053 | 17449 | 8.342951384 | 2.528450286 | 5.273498833 | 0.863906134 | 4.315790117 | 0.458714232 | 144053 | -| 220000 | 1 | 7 | 220000 | 220000 | 2 | 143664 | 143664 | 17853 | 8.604525287 | 2.54432029 | 5.478018839 | 0.863750754 | 4.519996727 | 0.489311152 | 143664 | -| 220000 | 1 | 8 | 220000 | 220000 | 2 | 144603 | 144603 | 17247 | 8.038770401 | 2.531384236 | 4.969336395 | 0.859721024 | 4.016490586 | 0.438631087 | 144603 | -| 220000 | 1 | 9 | 220000 | 220000 | 2 | 144014 | 144014 | 17534 | 8.253180489 | 2.533094252 | 5.189130014 | 0.845358612 | 4.248644903 | 0.450726977 | 144014 | -| 230000 | 1 | 0 | 230000 | 230000 | 2 | 150310 | 150310 | 17731 | 8.310385661 | 2.627288746 | 5.126576882 | 1.012838289 | 4.012415445 | 0.472023176 | 150310 | -| 230000 | 1 | 1 | 230000 | 230000 | 2 | 150614 | 150614 | 18286 | 8.850914286 | 2.653181854 | 5.555712184 | 1.032394359 | 4.424215084 | 0.534918245 | 150614 | -| 230000 | 1 | 2 | 230000 | 230000 | 2 | 150045 | 150045 | 18470 | 8.901776764 | 2.651087917 | 5.642981332 | 1.018398605 | 4.523348677 | 0.480107241 | 150045 | -| 230000 | 1 | 3 | 230000 | 230000 | 2 | 151151 | 151151 | 19032 | 9.161537892 | 2.624767484 | 5.925766944 | 1.026628763 | 4.79818448 | 0.492935426 | 151151 | -| 230000 | 1 | 4 | 230000 | 230000 | 2 | 150433 | 150433 | 19473 | 8.893856489 | 2.639158704 | 5.644482115 | 1.021033059 | 4.522405807 | 0.519523569 | 150433 | -| 230000 | 1 | 5 | 230000 | 230000 | 2 | 151042 | 151042 | 19176 | 8.874304794 | 2.615782409 | 5.642420608 | 1.027906535 | 4.515114968 | 0.499868164 | 151042 | -| 230000 | 1 | 6 | 230000 | 230000 | 2 | 150671 | 150671 | 17738 | 8.430467737 | 2.616624791 | 5.258739268 | 1.017196006 | 4.139772202 | 0.513665986 | 150671 | -| 230000 | 1 | 7 | 230000 | 230000 | 2 | 150828 | 150828 | 18530 | 8.680881471 | 2.624730177 | 5.495091539 | 1.055239464 | 4.339090618 | 0.525135532 | 150828 | -| 230000 | 1 | 8 | 230000 | 230000 | 2 | 150549 | 150549 | 18563 | 8.976734652 | 2.6574307 | 5.692591009 | 1.028878404 | 4.563868735 | 0.498219728 | 150549 | -| 230000 | 1 | 9 | 230000 | 230000 | 2 | 151016 | 151016 | 18035 | 8.559480359 | 2.616094984 | 5.383410728 | 1.019994484 | 4.261937361 | 0.5079374 | 151016 | -| 240000 | 1 | 0 | 240000 | 240000 | 2 | 157139 | 157139 | 18612 | 8.815972912 | 2.74773998 | 5.48311889 | 1.087140152 | 4.292111659 | 0.57189365 | 157139 | -| 240000 | 1 | 1 | 240000 | 240000 | 2 | 157608 | 157608 | 19252 | 9.157400044 | 2.771516517 | 5.792792991 | 1.104238642 | 4.585645223 | 0.540382115 | 157608 | -| 240000 | 1 | 2 | 240000 | 240000 | 2 | 157646 | 157646 | 20024 | 9.781766985 | 2.770280889 | 6.365296777 | 1.103147254 | 5.156231439 | 0.531953967 | 157646 | -| 240000 | 1 | 3 | 240000 | 240000 | 2 | 156622 | 156622 | 19369 | 9.367733297 | 2.758797231 | 6.017452665 | 1.094654537 | 4.817963485 | 0.549178664 | 156622 | -| 240000 | 1 | 4 | 240000 | 240000 | 2 | 157345 | 157345 | 19699 | 9.758490449 | 2.770374206 | 6.338868771 | 1.120063219 | 5.115686793 | 0.522267916 | 157345 | -| 240000 | 1 | 5 | 240000 | 240000 | 2 | 157221 | 157221 | 19449 | 9.15696264 | 2.770948598 | 5.783570148 | 1.110696326 | 4.569368463 | 0.553962177 | 157221 | -| 240000 | 1 | 6 | 240000 | 240000 | 2 | 156929 | 156929 | 19481 | 9.33711475 | 2.758312879 | 5.992392294 | 1.085176846 | 4.802884048 | 0.561701544 | 156929 | -| 240000 | 1 | 7 | 240000 | 240000 | 2 | 157431 | 157431 | 19737 | 9.480237235 | 2.740959893 | 6.092215797 | 1.084837778 | 4.902966712 | 0.502511967 | 157431 | -| 240000 | 1 | 8 | 240000 | 240000 | 2 | 157398 | 157398 | 19422 | 9.343251503 | 2.725190387 | 6.000660595 | 1.073390483 | 4.825764661 | 0.532866407 | 157398 | -| 240000 | 1 | 9 | 240000 | 240000 | 2 | 157057 | 157057 | 18490 | 8.582717593 | 2.703775099 | 5.302892817 | 1.056925038 | 4.144808802 | 0.536938491 | 157057 | -| 250000 | 1 | 0 | 250000 | 250000 | 2 | 164155 | 164155 | 20499 | 9.60557815 | 2.822196904 | 6.136753035 | 0.934586401 | 5.096747938 | 0.570337366 | 164155 | -| 250000 | 1 | 1 | 250000 | 250000 | 2 | 163799 | 163799 | 20090 | 9.765207872 | 2.822791811 | 6.28078652 | 0.9555997 | 5.221866039 | 0.5819578 | 163799 | -| 250000 | 1 | 2 | 250000 | 250000 | 2 | 163795 | 163795 | 19435 | 9.122273726 | 2.817267273 | 5.690582319 | 0.955516537 | 4.630858254 | 0.574494614 | 163795 | -| 250000 | 1 | 3 | 250000 | 250000 | 2 | 163882 | 163882 | 20565 | 9.733671852 | 2.83933094 | 6.230632543 | 1.104118097 | 5.022094244 | 0.546038473 | 163882 | -| 250000 | 1 | 4 | 250000 | 250000 | 2 | 163488 | 163488 | 19736 | 9.42577444 | 2.827970226 | 6.003941266 | 0.950475659 | 4.946863585 | 0.579136603 | 163488 | -| 250000 | 1 | 5 | 250000 | 250000 | 2 | 163040 | 163040 | 20113 | 9.585754001 | 2.825224281 | 6.101184877 | 0.949185342 | 5.048083201 | 0.573078765 | 163040 | -| 250000 | 1 | 6 | 250000 | 250000 | 2 | 164270 | 164270 | 19386 | 9.19282763 | 2.840616946 | 5.751106153 | 0.942298045 | 4.702955477 | 0.572438797 | 164270 | -| 250000 | 1 | 7 | 250000 | 250000 | 2 | 163551 | 163551 | 19810 | 9.267103056 | 2.833960096 | 5.830650066 | 0.948962675 | 4.778918365 | 0.549960572 | 163551 | -| 250000 | 1 | 8 | 250000 | 250000 | 2 | 163657 | 163657 | 20139 | 9.437199933 | 2.807412327 | 5.96740992 | 0.929643275 | 4.933262311 | 0.58148418 | 163657 | -| 250000 | 1 | 9 | 250000 | 250000 | 2 | 164412 | 164412 | 20005 | 9.573767442 | 2.835445074 | 6.092619835 | 0.929378761 | 5.057647231 | 0.571809639 | 164412 | -| 260000 | 1 | 0 | 260000 | 260000 | 2 | 170681 | 170681 | 20415 | 9.4548144 | 2.930642649 | 5.889017916 | 1.105724873 | 4.671796122 | 0.550283763 | 170681 | -| 260000 | 1 | 1 | 260000 | 260000 | 2 | 169673 | 169673 | 20584 | 9.590741172 | 2.915821966 | 6.051150871 | 1.078916389 | 4.858871158 | 0.606429393 | 169673 | -| 260000 | 1 | 2 | 260000 | 260000 | 2 | 169714 | 169714 | 20638 | 9.866056656 | 2.910540007 | 6.279885217 | 1.092830522 | 5.074247433 | 0.617775182 | 169714 | -| 260000 | 1 | 3 | 260000 | 260000 | 2 | 170275 | 170275 | 20738 | 9.97812243 | 2.915090305 | 6.389943714 | 1.094404504 | 5.182674507 | 0.55613254 | 170275 | -| 260000 | 1 | 4 | 260000 | 260000 | 2 | 170569 | 170569 | 20990 | 9.789765173 | 2.911049224 | 6.195948999 | 1.086773541 | 4.996391502 | 0.641643796 | 170569 | -| 260000 | 1 | 5 | 260000 | 260000 | 2 | 170612 | 170612 | 19707 | 9.111092709 | 2.911439929 | 5.577325876 | 1.076905109 | 4.388617693 | 0.562255785 | 170612 | -| 260000 | 1 | 6 | 260000 | 260000 | 2 | 170532 | 170532 | 21402 | 9.908742138 | 2.90222627 | 6.324748882 | 1.102120351 | 5.112509739 | 0.597304417 | 170532 | -| 260000 | 1 | 7 | 260000 | 260000 | 2 | 170002 | 170002 | 19791 | 9.437899396 | 2.910546682 | 5.894809996 | 1.101619829 | 4.681988044 | 0.626214093 | 170002 | -| 260000 | 1 | 8 | 260000 | 260000 | 2 | 170169 | 170169 | 20431 | 9.857592193 | 2.906946936 | 6.27132285 | 1.09868213 | 5.061145086 | 0.586025964 | 170169 | -| 260000 | 1 | 9 | 260000 | 260000 | 2 | 170493 | 170493 | 20194 | 9.385833214 | 2.908785965 | 5.846454599 | 1.10610514 | 4.629300513 | 0.581113361 | 170493 | -| 270000 | 1 | 0 | 270000 | 270000 | 2 | 177419 | 177419 | 22189 | 10.689381872 | 3.080717335 | 6.89093731 | 1.194186556 | 5.580800268 | 0.59785875 | 177419 | -| 270000 | 1 | 1 | 270000 | 270000 | 2 | 176846 | 176846 | 21447 | 10.299967542 | 3.019579518 | 6.634314668 | 1.167149517 | 5.352308427 | 0.644087616 | 176846 | -| 270000 | 1 | 2 | 270000 | 270000 | 2 | 177200 | 177200 | 21096 | 9.852972777 | 3.037923152 | 6.166210003 | 1.173188819 | 4.876581258 | 0.592539765 | 177200 | -| 270000 | 1 | 3 | 270000 | 270000 | 2 | 176612 | 176612 | 21777 | 10.282605222 | 3.041046279 | 6.591089515 | 1.14796408 | 5.327337908 | 0.612531435 | 176612 | -| 270000 | 1 | 4 | 270000 | 270000 | 2 | 177296 | 177296 | 20837 | 9.776640558 | 3.038335321 | 6.087881823 | 1.17535362 | 4.795954983 | 0.638223713 | 177296 | -| 270000 | 1 | 5 | 270000 | 270000 | 2 | 176611 | 176611 | 21444 | 10.500645576 | 3.053852266 | 6.740246334 | 1.146873701 | 5.477494592 | 0.63675463 | 176611 | -| 270000 | 1 | 6 | 270000 | 270000 | 2 | 176888 | 176888 | 22016 | 10.538372465 | 3.070766221 | 6.815931971 | 1.210888556 | 5.481491521 | 0.640227132 | 176888 | -| 270000 | 1 | 7 | 270000 | 270000 | 2 | 176571 | 176571 | 21891 | 10.765028727 | 3.033038125 | 7.032778841 | 1.189691099 | 5.726028081 | 0.628098181 | 176571 | -| 270000 | 1 | 8 | 270000 | 270000 | 2 | 176523 | 176523 | 22648 | 10.795500125 | 3.035613661 | 7.061060684 | 1.165833564 | 5.780602599 | 0.671489039 | 176523 | -| 270000 | 1 | 9 | 270000 | 270000 | 2 | 176549 | 176549 | 21041 | 10.198250889 | 3.030090479 | 6.522306993 | 1.16941795 | 5.238104309 | 0.651520711 | 176549 | -| 280000 | 1 | 0 | 280000 | 280000 | 2 | 183598 | 183598 | 23254 | 10.707345637 | 3.12594362 | 6.846144329 | 1.042242054 | 5.676629961 | 0.678939611 | 183598 | -| 280000 | 1 | 1 | 280000 | 280000 | 2 | 183411 | 183411 | 22220 | 10.565084738 | 3.109234517 | 6.717684789 | 1.029231563 | 5.564469962 | 0.693535243 | 183411 | -| 280000 | 1 | 2 | 280000 | 280000 | 2 | 184056 | 184056 | 23451 | 11.091024335 | 3.096977688 | 7.312582168 | 1.037470722 | 6.102368581 | 0.613608554 | 184056 | -| 280000 | 1 | 3 | 280000 | 280000 | 2 | 183148 | 183148 | 22543 | 10.541255626 | 3.101419148 | 6.695550284 | 1.020266867 | 5.549581829 | 0.688000785 | 183148 | -| 280000 | 1 | 4 | 280000 | 280000 | 2 | 183020 | 183020 | 22790 | 10.563007126 | 3.103572056 | 6.725438094 | 1.02641916 | 5.572920965 | 0.659520079 | 183020 | -| 280000 | 1 | 5 | 280000 | 280000 | 2 | 183175 | 183175 | 22252 | 10.74211594 | 3.127961086 | 6.869822513 | 1.032502365 | 5.711579782 | 0.61829214 | 183175 | -| 280000 | 1 | 6 | 280000 | 280000 | 2 | 183674 | 183674 | 22445 | 10.846812933 | 3.130509433 | 6.966774772 | 1.03071281 | 5.813079371 | 0.643883661 | 183674 | -| 280000 | 1 | 7 | 280000 | 280000 | 2 | 183458 | 183458 | 22356 | 10.558548553 | 3.099913925 | 6.726646702 | 1.035148717 | 5.565872566 | 0.614459156 | 183458 | -| 280000 | 1 | 8 | 280000 | 280000 | 2 | 183022 | 183022 | 20824 | 9.800448926 | 3.122052285 | 5.98520867 | 1.040402131 | 4.820086203 | 0.626547431 | 183022 | -| 280000 | 1 | 9 | 280000 | 280000 | 2 | 183171 | 183171 | 22565 | 10.545346725 | 3.131769483 | 6.66417774 | 1.041565284 | 5.497697244 | 0.68598763 | 183171 | -| 290000 | 1 | 0 | 290000 | 290000 | 2 | 190044 | 190044 | 22976 | 10.92077822 | 3.214080215 | 6.934844505 | 1.014736808 | 5.790384 | 0.691925568 | 190044 | -| 290000 | 1 | 1 | 290000 | 290000 | 2 | 189806 | 189806 | 23292 | 10.843386214 | 3.215425947 | 6.852131514 | 1.021619776 | 5.697462828 | 0.703619281 | 189806 | -| 290000 | 1 | 2 | 290000 | 290000 | 2 | 190197 | 190197 | 22354 | 10.397205167 | 3.226330292 | 6.393833166 | 1.012785386 | 5.251509419 | 0.733568292 | 190197 | -| 290000 | 1 | 3 | 290000 | 290000 | 2 | 190324 | 190324 | 23564 | 11.441253374 | 3.220414777 | 7.508093618 | 1.027947969 | 6.347256823 | 0.664929487 | 190324 | -| 290000 | 1 | 4 | 290000 | 290000 | 2 | 190272 | 190272 | 22463 | 10.536742866 | 3.218774317 | 6.551271321 | 1.028759609 | 5.390552493 | 0.700022212 | 190272 | -| 290000 | 1 | 5 | 290000 | 290000 | 2 | 190136 | 190136 | 23381 | 11.236277163 | 3.206357594 | 7.31621001 | 1.024936209 | 6.111820107 | 0.691577028 | 190136 | -| 290000 | 1 | 6 | 290000 | 290000 | 2 | 190678 | 190678 | 23072 | 10.9148769 | 3.223648571 | 6.924738285 | 1.030530888 | 5.761589518 | 0.711657323 | 190678 | -| 290000 | 1 | 7 | 290000 | 290000 | 2 | 190946 | 190946 | 22889 | 10.56511376 | 3.227557879 | 6.560143815 | 1.021750427 | 5.407384 | 0.690981759 | 190946 | -| 290000 | 1 | 8 | 290000 | 290000 | 2 | 190053 | 190053 | 23433 | 10.908398565 | 3.209551958 | 6.929929038 | 1.01080225 | 5.787722801 | 0.707466444 | 190053 | -| 290000 | 1 | 9 | 290000 | 290000 | 2 | 189700 | 189700 | 23564 | 11.167754785 | 3.198865208 | 7.264370827 | 1.024548376 | 6.059374361 | 0.658562025 | 189700 | -| 300000 | 1 | 0 | 300000 | 300000 | 2 | 197133 | 197133 | 23844 | 11.290930841 | 3.292479571 | 7.254842007 | 0.739282109 | 6.051628224 | 0.684718157 | 197133 | -| 300000 | 1 | 1 | 300000 | 300000 | 2 | 196650 | 196650 | 24747 | 11.747530758 | 3.266119091 | 7.742190827 | 1.050865719 | 6.551144967 | 0.728950319 | 196650 | -| 300000 | 1 | 2 | 300000 | 300000 | 2 | 196403 | 196403 | 24759 | 12.062785334 | 3.295742322 | 7.946142871 | 0.738346077 | 6.751236901 | 0.74227076 | 196403 | -| 300000 | 1 | 3 | 300000 | 300000 | 2 | 196270 | 196270 | 24044 | 11.276732836 | 3.303501308 | 7.234669539 | 1.049454402 | 6.043991894 | 0.74733691 | 196270 | -| 300000 | 1 | 4 | 300000 | 300000 | 2 | 196354 | 196354 | 24166 | 11.519037176 | 3.292506598 | 7.472094511 | 1.049057767 | 6.282284293 | 0.781757696 | 196354 | -| 300000 | 1 | 5 | 300000 | 300000 | 2 | 196996 | 196996 | 24758 | 11.517524274 | 3.285781745 | 7.486309733 | 1.05492982 | 6.289337414 | 0.76825964 | 196996 | -| 300000 | 1 | 6 | 300000 | 300000 | 2 | 197385 | 197385 | 24911 | 12.271921845 | 3.408291823 | 8.101506133 | 1.096258241 | 6.864540233 | 0.727420201 | 197385 | -| 300000 | 1 | 7 | 300000 | 300000 | 2 | 196983 | 196983 | 24370 | 11.700670367 | 3.284961744 | 7.659590979 | 1.046525693 | 6.472569943 | 0.710060576 | 196983 | -| 300000 | 1 | 8 | 300000 | 300000 | 2 | 196764 | 196764 | 23885 | 11.355408019 | 3.28628696 | 7.327721993 | 1.052316196 | 6.135234582 | 0.773097422 | 196764 | -| 300000 | 1 | 9 | 300000 | 300000 | 2 | 196322 | 196322 | 24157 | 11.656118582 | 3.275123115 | 7.642015947 | 1.04603912 | 6.454546005 | 0.724228232 | 196322 | - -#+begin_src python :var data=results1indiv -return (all(x[3] != x[6] for x in data), data[0][3], data[0][6]) -#+end_src - -#+RESULTS: -| True | 100000 | 65489 | - -=> /no/ model was minimal - -*** And plotting - -#+CALL: plot(results1, "results1.png") - -#+RESULTS: -[[file:results1.png]] - -** For m = 2 -*** Generating some benchmarks - -#+begin_src sh :results output silent -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py generate ../../copar/bin/random-dfa $n 2 -done -#+end_src - -*** And running them - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "σ" "tp (s)" "σ" "ta (s)" "σ" "ti (s)" "σ" "tr (s)" "σ" "tv (s)" "σ" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 2 --stddev -done -#+end_src - -#+NAME: results2 -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | σ | tp (s) | σ | ta (s) | σ | ti (s) | σ | tr (s) | σ | tv (s) | σ | Qv | -|--------+---+----+--------+--------+---+--------+--------+--------+--------------------+----------------------+--------------------+----------------------+--------------------+----------------------+---------------------+----------------------+--------------------+---------------------+---------------------+----------------------+--------| -| 100000 | 2 | 10 | 100000 | 200000 | 2 | 100000 | 100000 | 176835 | 3.4030988053 | 0.047125905819625266 | 1.4113720969999999 | 0.020157652579552755 | 1.7480437949999998 | 0.030617105080139137 | 0.4651039364 | 0.004331701728800437 | 1.2271866079 | 0.02960202148844354 | 0.2616005265 | 0.004401878111343841 | 100000 | -| 110000 | 2 | 10 | 110000 | 220000 | 2 | 110000 | 110000 | 198390 | 3.9692688889000003 | 0.0370434112058736 | 1.5157029322 | 0.02116665725333869 | 2.0486332889999996 | 0.040191720781762134 | 0.4946425016 | 0.013523587264140786 | 1.4991156887000003 | 0.03442819266484039 | 0.30168761980000003 | 0.007153435060528811 | 110000 | -| 120000 | 2 | 10 | 120000 | 240000 | 2 | 119999 | 119999 | 211802 | 4.3143812377 | 0.028623553516576524 | 1.7607175563 | 0.01395808199964705 | 2.2709801406 | 0.019540291251429913 | 0.6559281311999998 | 0.016807148943218927 | 1.5497294746999999 | 0.0211686298572404 | 0.3521036861 | 0.010123212916930498 | 119999 | -| 130000 | 2 | 10 | 130000 | 260000 | 2 | 130000 | 130000 | 233351 | 4.711098789299999 | 0.07164931362575287 | 1.8374207242 | 0.015974690038318053 | 2.5580884159 | 0.07464571058990088 | 0.45663371779999995 | 0.06532202237008912 | 1.8270874564 | 0.05325031657468783 | 0.3873578492 | 0.00808873090733974 | 130000 | -| 140000 | 2 | 10 | 140000 | 280000 | 2 | 140000 | 140000 | 255450 | 5.126386760700001 | 0.07043815136254557 | 1.9956747868 | 0.018427064561353488 | 2.7867161994 | 0.073077457235916 | 0.49504377580000003 | 0.0638811650849501 | 1.9893636328 | 0.06274443335469422 | 0.4376762827999999 | 0.0092923256658709 | 140000 | -| 150000 | 2 | 10 | 150000 | 300000 | 2 | 149999 | 149999 | 268773 | 5.552826151500001 | 0.06095217378481222 | 2.1609233121 | 0.026029046999351532 | 3.0173265741 | 0.05415723778561011 | 0.5094614781 | 0.007915398330318239 | 2.1829203786999996 | 0.0632789354781126 | 0.48105161770000004 | 0.004698776514825223 | 149999 | -| 160000 | 2 | 10 | 160000 | 320000 | 2 | 160000 | 160000 | 287497 | 6.0156567696000005 | 0.1014958200025798 | 2.3278508021 | 0.030676236665497392 | 3.2862890981 | 0.08842134639178673 | 0.5667389131 | 0.061818697661962456 | 2.3874675003 | 0.06963184602365943 | 0.530804924 | 0.008374295955608495 | 160000 | -| 170000 | 2 | 10 | 170000 | 340000 | 2 | 170000 | 170000 | 305026 | 6.4638692547000005 | 0.06069976545804155 | 2.4802088854 | 0.01090849282529911 | 3.5534037927 | 0.05792099698647397 | 0.5959597545000002 | 0.008029045672763618 | 2.5980215775 | 0.05470590971316728 | 0.5807772137 | 0.008923135110179324 | 170000 | -| 180000 | 2 | 10 | 180000 | 360000 | 2 | 180000 | 180000 | 318552 | 7.0769255199 | 0.06648812882039208 | 2.6026580344 | 0.021088489126152892 | 3.8877335147000003 | 0.13692635138399228 | 0.8762553760999999 | 0.019006836766069967 | 2.8003821182 | 0.06175237500886775 | 0.6318085971 | 0.008747586811742026 | 180000 | -| 190000 | 2 | 10 | 190000 | 380000 | 2 | 190000 | 190000 | 336100 | 7.471944982100001 | 0.1193043264263505 | 2.7358027763 | 0.030596172663756225 | 4.172442589299999 | 0.14609929644360664 | 0.9283796991 | 0.021647195894253953 | 2.9708602129999995 | 0.09071021481473823 | 0.6796285844 | 0.014169458167688257 | 190000 | - -*** Plot - -#+CALL: plot(results2, "results2.png") - -#+RESULTS: -[[file:results2.png]] - -** For m = 2 and 10% finality -*** Generating some benchmarks - -#+begin_src sh :results output silent -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py generate --final 10 ../../copar/bin/random-dfa $n 2 -done -#+end_src - -*** And running them - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 2 --stddev --final 10 -done -#+end_src - -#+NAME: results2f -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|--------+---+----+--------+--------+---+--------+--------+--------+--------------------+----------------------+--------------------+----------------------+--------------------+----------------------+---------------------+----------------------+--------------------+----------------------+---------------------+-----------------------+--------| -| 100000 | 2 | 10 | 100000 | 200000 | 2 | 100000 | 100000 | 160352 | 3.0936953513 | 0.015467818313428423 | 1.4124696133 | 0.005943672222068957 | 1.4574320088000001 | 0.017000822749439697 | 0.42203191440000004 | 0.004520660260577265 | 0.9797939001000001 | 0.018105061634433976 | 0.2695312297 | 0.0069361300204224706 | 100000 | -| 110000 | 2 | 10 | 110000 | 220000 | 2 | 109999 | 109999 | 176657 | 3.5784416617 | 0.01508095774483378 | 1.5098241521 | 0.004227983506536663 | 1.6316288086 | 0.012239722621501683 | 0.4385282887 | 0.006495824492836184 | 1.1376198136 | 0.014767401631046848 | 0.31170653470000004 | 0.006848544046025738 | 109999 | -| 120000 | 2 | 10 | 120000 | 240000 | 2 | 119999 | 119999 | 191218 | 3.9010189149000007 | 0.021209169527059025 | 1.7667944406 | 0.008668441762979982 | 1.8386231196 | 0.02984760040605402 | 0.5990321109 | 0.014804404733360246 | 1.1508279068 | 0.021326970463733233 | 0.3524312471 | 0.004316307776005543 | 119999 | -| 130000 | 2 | 10 | 130000 | 260000 | 2 | 130000 | 130000 | 208170 | 4.2108411467 | 0.030429870784823763 | 1.8758927709999997 | 0.014720813295526257 | 2.0216873166 | 0.02944166619615172 | 0.5635494682000001 | 0.006692369051929955 | 1.3816380033999998 | 0.029729760194715515 | 0.3983277031 | 0.0024183986266932186 | 130000 | -| 140000 | 2 | 10 | 140000 | 280000 | 2 | 139999 | 139999 | 225471 | 4.6525796292 | 0.08226665976530252 | 2.0223978788 | 0.02782859024824926 | 2.2457517173 | 0.06419042143691525 | 0.43292923410000006 | 0.07437008468651318 | 1.5179340291999999 | 0.028571780925593183 | 0.4464015892 | 0.008337702174814625 | 139999 | -| 150000 | 2 | 10 | 150000 | 300000 | 2 | 150000 | 150000 | 240331 | 4.9966277785 | 0.05561432863860171 | 2.1685035476999994 | 0.011273739740092388 | 2.4161792503 | 0.05218254165871221 | 0.4491742889 | 0.04435758243758258 | 1.6487869333999998 | 0.03158639366001329 | 0.4903136348 | 0.0035377975274226065 | 150000 | -| 160000 | 2 | 10 | 160000 | 320000 | 2 | 159999 | 159999 | 256952 | 5.355174741499999 | 0.01181544267095224 | 2.3217772239000003 | 0.009423441961012942 | 2.5912845906 | 0.009615174702699738 | 0.4742331759000001 | 0.00567499301007789 | 1.774249567 | 0.00497004110981295 | 0.5373223992 | 0.006688940145895668 | 159999 | -| 170000 | 2 | 10 | 170000 | 340000 | 2 | 169999 | 169999 | 273299 | 5.757032531199999 | 0.02661150144562761 | 2.4794814604999997 | 0.012372017151358293 | 2.8041343125 | 0.015352615509927985 | 0.5093437867 | 0.005037497584885556 | 1.9293367177999996 | 0.009725668899383278 | 0.58678976 | 0.006087850747350132 | 169999 | -| 180000 | 2 | 10 | 180000 | 360000 | 2 | 180000 | 180000 | 289908 | 6.1609400376 | 0.03188833978682093 | 2.6309119938999994 | 0.00791867193670523 | 3.0293672266000002 | 0.035760581136465915 | 0.5431468218 | 0.006141095107119764 | 2.0932277568999997 | 0.0332985663387355 | 0.6429327362999999 | 0.007674756785721323 | 180000 | -| 190000 | 2 | 10 | 190000 | 380000 | 2 | 190000 | 190000 | 307527 | 6.778789601 | 0.06991943979616976 | 2.7624881334999998 | 0.010831227316887074 | 3.3906752104999995 | 0.1397668131349721 | 0.8261375824 | 0.00893049817644368 | 2.2897163365 | 0.043731496282112814 | 0.6881156208999999 | 0.012255461536873485 | 190000 | - -*** And plotting them - -#+CALL: plot(results2f, "results2f.png") - -#+RESULTS: -[[file:results2f.png]] - -** For m = 2 and 0% finality -*** Generating some benchmarks - -#+begin_src sh :results output silent -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py generate --final 0 ../../copar/bin/random-dfa $n 2 -done -#+end_src - -*** And running them - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 100000 110000 120000 130000 140000 150000 160000 170000 180000 190000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 2 --stddev --final 0 -done -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|--------+---+----+--------+--------+---+---+-----+------+--------------------+----------------------+--------------------+----------------------+--------------------+-----------------------+---------------------+-----------------------+------------------------+------------------------+---------------------+-----------------------+----| -| 100000 | 2 | 10 | 100000 | 200000 | 1 | 1 | 1 | 0 | 1.9286943634 | 0.00878107688302739 | 1.3837160297 | 0.008180649292894082 | 0.4171904952 | 0.003120493919147368 | 0.3641316149 | 0.0032160904550749985 | 1.0225800000000001e-05 | 2.1150455734517354e-07 | 0.1024724376 | 0.006073081115665208 | 1 | -| 110000 | 2 | 10 | 110000 | 220000 | 1 | 1 | 1 | 0 | 2.2182804934999996 | 0.01412802800557772 | 1.4834582776 | 0.00738948570673236 | 0.4289651487 | 0.0055944857852055704 | 0.3764284657 | 0.005279970052798764 | 1.19171e-05 | 3.2553220851058316e-06 | 0.11168206160000001 | 0.0021092801129365952 | 1 | -| 120000 | 2 | 10 | 120000 | 240000 | 1 | 1 | 1 | 0 | 2.4764642443 | 0.012935219317291618 | 1.7297758319 | 0.006418203929536284 | 0.5863125886 | 0.009762956606817539 | 0.5235213498 | 0.01025042704825142 | 1.0723899999999999e-05 | 2.6905367081267974e-07 | 0.1266497688 | 0.00756630532110257 | 1 | -| 130000 | 2 | 10 | 130000 | 260000 | 1 | 1 | 1 | 0 | 2.5684661536 | 0.006060926053458022 | 1.8325813717 | 0.004199590188170929 | 0.5551686706 | 0.0026852027358281088 | 0.4815377142 | 0.0030480000798772133 | 1.0317600000000001e-05 | 3.9572190010438157e-07 | 0.1354930515 | 0.003756031590903835 | 1 | -| 140000 | 2 | 10 | 140000 | 280000 | 1 | 1 | 1 | 0 | 2.8226806149000003 | 0.04107118493117886 | 1.9613554895 | 0.00623230387960241 | 0.6217279724999999 | 0.03774254529931291 | 0.33219782079999993 | 0.05402562365110335 | 1.21055e-05 | 3.7677216590401157e-06 | 0.1476372001 | 0.0057871447980288974 | 1 | -| 150000 | 2 | 10 | 150000 | 300000 | 1 | 1 | 1 | 0 | 3.0114131203 | 0.02544552047477694 | 2.1203642880999998 | 0.008153746807082824 | 0.6600289866 | 0.006795559380887498 | 0.347185776 | 0.006751335332853107 | 1.1084300000000002e-05 | 2.0330387245587713e-06 | 0.1582478537 | 0.004157373435323506 | 1 | -| 160000 | 2 | 10 | 160000 | 320000 | 1 | 1 | 1 | 0 | 3.2158140727999998 | 0.015839540316263775 | 2.2723906333999997 | 0.006996337136486422 | 0.7061300778999999 | 0.003739872502854762 | 0.373723791 | 0.004235039390227649 | 1.15646e-05 | 3.6649735848676696e-06 | 0.16917011399999998 | 0.0026638888864231733 | 1 | -| 170000 | 2 | 10 | 170000 | 340000 | 1 | 1 | 1 | 0 | 3.4702468513999998 | 0.0509720428289049 | 2.4451624861 | 0.029551826817010306 | 0.7609187292999999 | 0.013753158673689668 | 0.404949446 | 0.004671610869945024 | 1.05429e-05 | 2.703024848819066e-07 | 0.1830823594 | 0.006077950328655399 | 1 | -| 180000 | 2 | 10 | 180000 | 360000 | 1 | 1 | 1 | 0 | 3.650301588 | 0.014122237424641738 | 2.5787219889 | 0.011997897515023564 | 0.8084984614999999 | 0.00382175626616949 | 0.4325368038 | 0.001311000193778083 | 1.02732e-05 | 4.443144031976556e-07 | 0.19291228479999997 | 0.00398230081639267 | 1 | -| 190000 | 2 | 10 | 190000 | 380000 | 1 | 1 | 1 | 0 | 4.0598550992 | 0.03655234344413544 | 2.7205397726999996 | 0.015378199595674087 | 0.9662325937 | 0.10889493389502679 | 0.7044185453 | 0.008811645674713221 | 1.0971300000000001e-05 | 3.923952230992513e-07 | 0.20248723759999998 | 0.0030261990594331093 | 1 | - -** For m = 1000: - -#+BEGIN_SRC sh :results output silent -for n in 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000; do - python bench.py generate ../../copar/bin/random-dfa $n 1000 -done -#+END_SRC - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 1000 --stddev --nofunctrans -done -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|------+------+----+--------+---------+---+------+------+---------+-------------------+----------------------+--------------------+----------------------+--------------------+----------------------+--------------+-----------------------+---------------------+-----------------------+--------------------+----------------------+------| -| 1000 | 1000 | 10 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.9533156947 | 0.011002913439092422 | 3.1950151519 | 0.012356134887847729 | 0.7512120445 | 0.011239427555034565 | 0.3620109859 | 0.006701712453569692 | 0.3155020266 | 0.006691475865527507 | 1.0712054533999997 | 0.01653342562226392 | 1000 | -| 1100 | 1000 | 10 | 1100 | 1100000 | 2 | 1100 | 1100 | 1097961 | 4.3701553551 | 0.015494278323821673 | 3.5279982033 | 0.009613643482103808 | 0.8343428652 | 0.011940829640151796 | 0.3988682328 | 0.006982419022379785 | 0.3525587549 | 0.006717777060771679 | 1.2101320207000001 | 0.02285978749012452 | 1100 | -| 1200 | 1000 | 10 | 1200 | 1200000 | 2 | 1200 | 1200 | 1198002 | 4.7980000412 | 0.025899568868215973 | 3.8535088401000004 | 0.023463041540423543 | 0.9359110436 | 0.009696634861305436 | 0.4516177406 | 0.00894257321455952 | 0.3941434675 | 0.0032382300431677185 | 1.3848342052 | 0.03178452275534523 | 1200 | -| 1300 | 1000 | 10 | 1300 | 1300000 | 2 | 1300 | 1300 | 1297980 | 5.174526376099999 | 0.015473966022638494 | 4.1554920699 | 0.010599095389132018 | 1.0095937982999998 | 0.011678465689753345 | 0.4864740198 | 0.006749029917787903 | 0.42563662580000006 | 0.007148089005487441 | 1.5224950211 | 0.019849208114581882 | 1300 | -| 1400 | 1000 | 10 | 1400 | 1400000 | 2 | 1400 | 1400 | 1397912 | 5.5841241614 | 0.017194308572012134 | 4.48448128 | 0.012257064605230078 | 1.089672036 | 0.012331696297551112 | 0.5215628853 | 0.004909497714163821 | 0.4615644913 | 0.010132308836309516 | 1.6689043449 | 0.016312588975287756 | 1400 | -| 1500 | 1000 | 10 | 1500 | 1500000 | 2 | 1500 | 1500 | 1497965 | 5.9623769231 | 0.046782942319537155 | 4.7854645485 | 0.028274372855761787 | 1.1664068236 | 0.020009936157051142 | 0.544806253 | 0.01972441506278639 | 0.5086029899000001 | 0.004057096938679593 | 1.8024757562000002 | 0.025080828008935546 | 1500 | -| 1600 | 1000 | 10 | 1600 | 1600000 | 2 | 1600 | 1600 | 1597977 | 6.3001005989 | 0.021079788043247123 | 5.0446699955 | 0.011706946966419577 | 1.2439826050999998 | 0.012902023532078491 | 0.5636539833 | 0.010026688550342238 | 0.4158968506 | 0.009316903495588802 | 1.9512469113000002 | 0.015498110040682259 | 1600 | -| 1700 | 1000 | 10 | 1700 | 1700000 | 2 | 1700 | 1700 | 1697999 | 6.8181373291 | 0.04768740025244082 | 5.3489446795 | 0.050821897845646204 | 1.4569464741999998 | 0.011898390779945658 | 0.6821315177 | 0.0066429662291499015 | 0.4497148234 | 0.01179709122261191 | 2.1008681020999997 | 0.017493430063319576 | 1700 | -| 1800 | 1000 | 10 | 1800 | 1800000 | 2 | 1800 | 1800 | 1797969 | 7.2023435628 | 0.06276683614308662 | 5.769271290400001 | 0.02040555043753859 | 1.4207522051 | 0.04471515856236278 | 0.7175096355 | 0.020056793607776843 | 0.5715630545 | 0.021527475799908602 | 2.2076871809 | 0.03296824675743875 | 1800 | -| 1900 | 1000 | 10 | 1900 | 1900000 | 2 | 1900 | 1900 | 1898012 | 7.5665405717 | 0.06220257139169582 | 6.060004332899999 | 0.022453768686637596 | 1.4931699382999999 | 0.041532090749656074 | 0.7137491964 | 0.021448931504701424 | 0.6389280077 | 0.019773789498324538 | 2.4230123612 | 0.06387080178483137 | 1900 | -| 2000 | 1000 | 10 | 2000 | 2000000 | 2 | 2000 | 2000 | 1997904 | 8.0639794634 | 0.08248153745537908 | 6.4399256459 | 0.07693042641425599 | 1.609800233 | 0.012785432616659714 | 0.7680619713 | 0.013815734340735344 | 0.6888247968999999 | 0.00989100877264004 | 2.5814963057999996 | 0.02307845851893694 | 2000 | - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "sdt" "tp (s)" "sdtp" "ta (s)" "sdta" "ti (s)" "sdti" "tr (s)" "sdtr" "tv (s)" "sdtv" "Qv") -for n in 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000; do - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin $n 1000 --stddev -done -#+end_src - -#+NAME: results1000 -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | sdt | tp (s) | sdtp | ta (s) | sdta | ti (s) | sdti | tr (s) | sdtr | tv (s) | sdtv | Qv | -|------+------+----+--------+---------+---+------+------+---------+--------------------+-----------------------+--------------------+----------------------+--------------------+----------------------+---------------------+-----------------------+---------------------+-----------------------+--------------------+----------------------+------| -| 1000 | 1000 | 10 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.4170901261000006 | 0.0067332911363214626 | 2.4400518157 | 0.012751085512302314 | 0.9700435225999999 | 0.00970206397709066 | 0.41540584669999997 | 0.00506517945359832 | 0.4819094799 | 0.0066852566220028985 | 1.0732738749 | 0.032397918884447534 | 1000 | -| 1100 | 1000 | 10 | 1100 | 1100000 | 2 | 1100 | 1100 | 1097961 | 3.7839400801999994 | 0.02054243005075528 | 2.6923810361 | 0.01430132872516138 | 1.0838880011 | 0.012209366463486233 | 0.45925104040000003 | 0.006389879793225777 | 0.5437107408000001 | 0.007094074865848301 | 1.2343653796 | 0.046358644222388744 | 1100 | -| 1200 | 1000 | 10 | 1200 | 1200000 | 2 | 1200 | 1200 | 1198002 | 3.9745562989 | 0.02849241548298448 | 2.719424793 | 0.01675680154232307 | 1.246594623 | 0.015534617230713086 | 0.49883183249999996 | 0.00924928186737593 | 0.4107449004 | 0.009692795378012436 | 1.3924885328 | 0.045409804321302843 | 1200 | -| 1300 | 1000 | 10 | 1300 | 1300000 | 2 | 1300 | 1300 | 1297980 | 4.4492492853000005 | 0.019011021239560805 | 2.935811995 | 0.01336577945727504 | 1.4779213829 | 0.08254178277905756 | 0.5365245862000001 | 0.007709042658200236 | 0.6079340167 | 0.008997140674001144 | 1.4928702701999998 | 0.022580296655694658 | 1300 | -| 1400 | 1000 | 10 | 1400 | 1400000 | 2 | 1400 | 1400 | 1397912 | 4.753583547100002 | 0.01964103887049429 | 3.4506703865999997 | 0.017531483434986516 | 1.2932429607999998 | 0.015339050721789663 | 0.5846364146 | 0.010854382347369648 | 0.6054716699 | 0.01145623639581948 | 1.6770205635 | 0.0292648210010643 | 1400 | -| 1500 | 1000 | 10 | 1500 | 1500000 | 2 | 1500 | 1500 | 1497965 | 5.2460979974 | 0.06296848781374169 | 3.6766706373 | 0.06038250665653121 | 1.5588874043999998 | 0.01104492509639117 | 1.0406573998000002 | 0.010493977730771424 | 0.40563505910000003 | 0.006857974236933447 | 1.8193636309000003 | 0.04728729571439115 | 1500 | -| 1600 | 1000 | 10 | 1600 | 1600000 | 2 | 1600 | 1600 | 1597977 | 5.5934895831 | 0.020471690649198758 | 3.8378448388 | 0.01405062980592564 | 1.7442780326999998 | 0.016801329216519365 | 1.1766017755000002 | 0.010817165560994954 | 0.44630750559999993 | 0.010926126526067979 | 1.9773537042999998 | 0.021751180636291764 | 1600 | -| 1700 | 1000 | 10 | 1700 | 1700000 | 2 | 1700 | 1700 | 1697999 | 5.8844434041 | 0.025355074221741828 | 4.0209844924 | 0.01936016953688846 | 1.8514450776000004 | 0.01098843935670959 | 1.1342198513999997 | 0.0066834373252539206 | 0.5865765241 | 0.010631404738858001 | 2.1336306657 | 0.0248035664484013 | 1700 | -| 1800 | 1000 | 10 | 1800 | 1800000 | 2 | 1800 | 1800 | 1797969 | 6.0798966787 | 0.03714316285262671 | 4.1842880729 | 0.016958763574648844 | 1.8828436436 | 0.03186802850868568 | 0.7512876949 | 0.012112711545569563 | 0.6483303171999999 | 0.020828759639626687 | 2.2825130664999995 | 0.03591125038883075 | 1800 | -| 1900 | 1000 | 10 | 1900 | 1900000 | 2 | 1900 | 1900 | 1898012 | 6.310596887999999 | 0.09207001119016445 | 4.323571235299999 | 0.04513265558681511 | 1.9738281792999999 | 0.051358992309827774 | 0.7882479636 | 0.017551971166439598 | 0.6708881243 | 0.021509786422262756 | 2.4061289706 | 0.049279654362565456 | 1900 | -| 2000 | 1000 | 10 | 2000 | 2000000 | 2 | 2000 | 2000 | 1997904 | 6.793026988199999 | 0.0405905959258501 | 4.606611127900001 | 0.018356435490485965 | 2.1718201212 | 0.02686927001218402 | 0.8559822423 | 0.012914019713495746 | 0.7510526754999999 | 0.01756542404255711 | 2.6220723597999998 | 0.05447934428571054 | 2000 | - - -#+CALL: plot(results1000, "results1000.png") - -#+RESULTS: -[[file:results1000.png]] - -*** Quantifying the effect of the one-block optimization - -Let's test the timings with and without optimizations on one single DFA. - -**** With all optimizations -:PROPERTIES: -:ID: c21020da-1d9c-4553-bffe-478b4e35aa90 -:END: - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|------+------+---+--------+---------+---+------+------+--------+-------------+-------------+-------------+-------------+-------------+-------------+------| -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.380971816 | 2.406927892 | 0.967057876 | 0.421992475 | 0.47148897 | 1.011007518 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.371089411 | 2.388749696 | 0.975496846 | 0.415187236 | 0.489191121 | 1.040577816 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.389716249 | 2.409769645 | 0.973066032 | 0.408821936 | 0.493088452 | 1.0411288 | 1000 | - -**** Without any optimization -:PROPERTIES: -:ID: 849f9d1f-1106-4bee-8270-7b46a09f709a -:END: - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt --nofunctrans -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt --nofunctrans -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt --nofunctrans -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|------+------+---+--------+---------+---+------+------+------+--------------+-------------+--------------+-------------+--------------+-------------+------| -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 22.870625628 | 3.26410958 | 19.599263489 | 0.384769247 | 19.137524603 | 1.038918053 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 22.738491632 | 3.160893761 | 19.570250212 | 0.364611475 | 19.130150657 | 1.033282541 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 22.679763636 | 3.160448145 | 19.511865875 | 0.354412205 | 19.082196797 | 1.036891031 | 1000 | - -**** With just the functor rewrite -:PROPERTIES: -:ID: d2559cc7-c179-48cf-aaab-c7f17a29ea1a -:END: - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --noopt -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|------+------+---+--------+---------+---+------+------+------+--------------+-------------+--------------+-------------+--------------+-------------+------| -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 46.8651896 | 2.412941424 | 44.44513298 | 0.424391142 | 43.94959211 | 1.026554102 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 46.922508866 | 2.421724742 | 44.493428228 | 0.42204586 | 43.997902631 | 1.045297534 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 0 | 46.938332303 | 2.40965665 | 44.521220406 | 0.423164636 | 44.024494492 | 1.057795996 | 1000 | - -**** With just the 1-elem optimization -:PROPERTIES: -:ID: d17f77cb-9a07-4c9f-8366-533e07075e6b -:END: - -#+begin_src sh :hlines yes :colnames '("N" "M" "i" "States" "Edges" "I" "Q" "Qs1" "Opts" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --nofunctrans -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --nofunctrans -python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 1000 --indiv --samples 1 --nofunctrans -#+end_src - -#+RESULTS: -| N | M | i | States | Edges | I | Q | Qs1 | Opts | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | -|------+------+---+--------+---------+---+------+------+--------+-------------+-------------+-------------+-------------+-------------+-------------+------| -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.890574258 | 3.151214053 | 0.732321905 | 0.35274363 | 0.307295302 | 1.012714586 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.886333612 | 3.152135172 | 0.727229289 | 0.350018448 | 0.305030783 | 1.045386717 | 1000 | -| 1000 | 1000 | 0 | 1000 | 1000000 | 2 | 1000 | 1000 | 997998 | 3.886510967 | 3.146301307 | 0.733262327 | 0.354048267 | 0.306785068 | 1.033495542 | 1000 | - - -** For m = 10000 - - #+BEGIN_SRC sh :hlines yes :colnames '("N" "M" "States" "Edges" "I" "Q" "Qs1" "t (s)" "tp (s)" "ta (s)" "ti (s)" "tr (s)" "tv (s)" "Qv") - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 500 10000 - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 600 10000 - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 700 10000 - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 800 10000 - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 900 10000 - python bench.py run ../../copar/bin/copar ../../valmari_cpp/mdpmin 1000 10000 - #+END_SRC - - - #+NAME: results10000 - #+RESULTS: - | N | M | States | Edges | I | Q | Qs1 | t (s) | tp (s) | ta (s) | ti (s) | tr (s) | tv (s) | Qv | - |------+-------+--------+----------+---+------+------+--------------+--------------+-------------+-------------+-------------+--------------+------| - | 500 | 10000 | 500 | 5000000 | 2 | 500 | 500 | 42.104668963 | 37.582293662 | 4.493314329 | 1.518858584 | 2.386916363 | 6.366641481 | 500 | - | 600 | 10000 | 600 | 6000000 | 2 | 600 | 600 | 50.191903227 | 44.747513385 | 5.40920263 | 1.820207355 | 2.88154887 | 7.835340678 | 600 | - | 700 | 10000 | 700 | 7000000 | 2 | 700 | 700 | 59.318446986 | 50.925788701 | 8.350924719 | 4.28553676 | 3.176143156 | 9.419061177 | 700 | - | 800 | 10000 | 800 | 8000000 | 2 | 800 | 800 | 68.472073706 | 60.783380535 | 7.642012395 | 2.535035704 | 4.159210276 | 11.039647443 | 800 | - | 900 | 10000 | 900 | 9000000 | 2 | 900 | 900 | 76.874599881 | 68.344624307 | 8.477049112 | 2.759185939 | 4.596666911 | 12.712082944 | 900 | - | 1000 | 10000 | 1000 | 10000000 | 2 | 1000 | 1000 | 85.269853921 | 75.788964993 | 9.422514059 | 3.052157078 | 5.207201202 | 14.320693046 | 1000 | - - #+BEGIN_SRC python :results file :exports results :var data=results10000 - - import matplotlib.pyplot as plt - - '''Turn the table data into x and y data''' - x = [a[0] for a in data] - t = [a[7] for a in data] - tp = [a[8] for a in data] - tr = [a[9] for a in data] - tv = [a[10] for a in data] - - ''' Plot the x and y data''' - a, = plt.plot(x, t, label="t", marker='v') - b, = plt.plot(x, tp, label="tp", marker='o') - c, = plt.plot(x, tr, label="tr", marker='x') - d, = plt.plot(x, tv, label="tv", marker='s') - - ''' Set the x and y labels on the graph ''' - plt.xlabel("Number of states") - plt.ylabel("Seconds") - - ''' Create the legend ''' - plt.legend(handles=[a,b,c,d],loc="upper left") - - ''' Save the PNG file ''' - filename = "results10000.png" - plt.savefig(filename) - - ''' Return the PNG file path to OrgMode ''' - return(filename) - #+END_SRC - - #+RESULTS: - [[file:results10000.png]] - - -* Colophone - -#+begin_src elisp -(require 'ob-shell) -(require 'ob-python) -#+end_src - -#+RESULTS: -: ob-shell - diff --git a/dfa/results1.png b/dfa/results1.png deleted file mode 100644 index 6bbcbe38a2bd9e0c5b0b2a3400ef4e9eb5a788e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39560 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�AhJlBJ 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 diff --git a/dfa/results1000.png b/dfa/results1000.png deleted file mode 100644 index fe3f84a7e9c378cab81335ea7c583dc86bd459bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34262 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 diff --git a/dfa/results10000.png b/dfa/results10000.png deleted file mode 100644 index e8c339f63393314724beba86501cd8e66de7a7f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28671 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 X^W5_dJN24@fq}u()z4*}Q$iB}rAr-I diff --git a/dfa/results2.png b/dfa/results2.png deleted file mode 100644 index caf12c1a037683507788f6921fce50841d998965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39837 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 Vs$tW*0}Kod44$rjF6*2UngHmhh)e(g diff --git a/dfa/results2f.png b/dfa/results2f.png deleted file mode 100644 index dcf910186ff16bf53dc4e344e1d2188d74261d74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41000 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 diff --git a/optimizations/optimizations.org b/optimizations/optimizations.org deleted file mode 100644 index 73c77e9..0000000 --- a/optimizations/optimizations.org +++ /dev/null @@ -1,123 +0,0 @@ -#+TITLE: Meassuring the Impact of Optimizations - -* The Data - -#+NAME: the-data -| Benchmark | Time1 | Time2 | Time3 | Mean | Error | -|---------------+-----------+-----------+-----------+-----------+--------------| -| wlan both opt | 39.363733 | 39.464646 | 39.064738 | 39.297706 | 0.12007124 | -| wlan no opt | 62.803240 | 62.809634 | 62.884818 | 62.832564 | 0.026192118 | -| wlan func | 40.482061 | 40.554590 | 40.829683 | 40.622111 | 0.10587668 | -| wlan 1elem | 62.322413 | 62.416543 | 62.852129 | 62.530362 | 0.16316227 | -|---------------+-----------+-----------+-----------+-----------+--------------| -| fms both opt | 21.111599 | 20.959398 | 20.955570 | 21.008856 | 0.051383551 | -| fms no opt | 35.451870 | 35.385039 | 35.830079 | 35.555663 | 0.13855786 | -| fms func | 35.379264 | 35.544466 | 35.531165 | 35.484965 | 0.052989795 | -| fms 1elem | 21.331782 | 21.307057 | 21.295322 | 21.311387 | 0.010745458 | -|---------------+-----------+-----------+-----------+-----------+--------------| -| dfa both opt | 3.3809203 | 3.3856634 | 3.3604341 | 3.3756726 | 7.7412997e-3 | -| dfa no opt | 22.870626 | 22.738492 | 22.679764 | 22.762961 | 0.056439090 | -| dfa func | 46.865190 | 46.922509 | 46.938332 | 46.908677 | 0.022218095 | -| dfa 1elem | 3.8905743 | 3.8863336 | 3.8865110 | 3.8878063 | 1.3849471e-3 | -#+TBLFM: $5=vmean($2..$4)::$6=vsdev($2..$4)/sqrt(3)::@2$2..@2$4=remote(d39b3290-297b-4063-8464-a011a048eff4, @$#$11)::@4$2..@4$4=remote(eb6cd726-026c-49ec-974a-1b6285d0fabb, @$#$11)::@6$2..@6$4=remote(cdef09e0-b92a-46db-9ed5-be0cde788441, @$#$11)::@8$2..@8$4=remote(966b0dc7-cf00-4594-88ae-80332696166e, @$#$11)::@10$2..@10$4=remote(c21020da-1d9c-4553-bffe-478b4e35aa90, @$#$10)::@12$2..@12$4=remote(d2559cc7-c179-48cf-aaab-c7f17a29ea1a, @$#$10)::@3$2..@3$4=remote(408056f6-53de-4920-ba53-9308bb2fbf15, @$#$11)::@5$2..@5$4=remote(74566779-0749-4bbd-9556-80f857144793, @$#$11)::@7$2..@7$4=remote(8850d72d-8f23-495e-b3af-a06deb25be53, @$#$11)::@9$2..@9$4=remote(7e19eb5e-4009-4bc1-89a3-4e4e5c7f643e, @$#$11)::@11$2..@11$4=remote(849f9d1f-1106-4bee-8270-7b46a09f709a, @$#$10)::@13$2..@13$4=remote(d17f77cb-9a07-4c9f-8366-533e07075e6b, @$#$10) - -* Individual Tables - -These are the input for pgfplots. - -All confidence intervals are the standard error times 10. - -** No Optimizations - -| Benchmark | Time | CI | -|-----------+-----------+------------| -| wlan | 62.832564 | 0.26192118 | -| fms | 35.555663 | 1.3855786 | -| dfa | 22.762961 | 0.5643909 | -#+TBLFM: @2$2=remote(the-data, @3$5)::@2$3=10*remote(the-data, @3$6)::@3$2=remote(the-data, @7$5)::@3$3=10*remote(the-data, @7$6)::@4$2=remote(the-data, @11$5)::@4$3=10*remote(the-data, @11$6) - -** Just Functor Rewrite - -| Benchmark | Time | CI | -|-----------+-----------+------------| -| wlan | 40.622111 | 1.0587668 | -| fms | 35.484965 | 0.52989795 | -| dfa | 46.908677 | 0.22218095 | -#+TBLFM: @2$2=remote(the-data, @4$5)::@2$3=10*remote(the-data, @4$6)::@3$2=remote(the-data, @8$5)::@3$3=10*remote(the-data, @8$6)::@4$2=remote(the-data, @12$5)::@4$3=10*remote(the-data, @12$6) - -** Just one-element blocks - -| Benchmark | Time | CI | -|-----------+-----------+-------------| -| wlan | 62.530362 | 1.6316227 | -| fms | 21.311387 | 0.10745458 | -| dfa | 3.8878063 | 0.013849471 | -#+TBLFM: @2$2=remote(the-data, @5$5)::@2$3=10*remote(the-data, @5$6)::@3$2=remote(the-data, @9$5)::@3$3=10*remote(the-data, @9$6)::@4$2=remote(the-data, @13$5)::@4$3=10*remote(the-data, @13$6) - -** Both optimizations - -| Benchmark | Time | CI | -|-----------+-----------+-------------| -| wlan | 39.297706 | 1.2007124 | -| fms | 21.008856 | 0.51383551 | -| dfa | 3.3756726 | 0.077412997 | -#+TBLFM: @2$2=remote(the-data, @2$5)::@2$3=10*remote(the-data, @2$6)::@3$2=remote(the-data, @6$5)::@3$3=10*remote(the-data, @6$6)::@4$2=remote(the-data, @10$5)::@4$3=10*remote(the-data, @10$6) - -* Old stuff :ARCHIVE: -** The "skip one-element blocks" Optimization -*** The Data - -#+NAME: one-elem-data -| Benchmark | Time1 | Time2 | Time3 | Mean | Error | -|------------+-----------+-----------+-----------+-----------+--------------| -| wlan opt | 39.976493 | 39.832630 | 39.784828 | 39.864650 | 0.057598739 | -| wlan noopt | 40.482061 | 40.554590 | 40.829683 | 40.622111 | 0.10587668 | -|------------+-----------+-----------+-----------+-----------+--------------| -| fms opt | 21.126185 | 20.870302 | 20.996653 | 20.997713 | 0.073868962 | -| fms noopt | 35.581014 | 36.222743 | 36.020706 | 35.941488 | 0.18943837 | -|------------+-----------+-----------+-----------+-----------+--------------| -| dfa opt | 3.8669068 | 3.8483511 | 3.8465348 | 3.8539309 | 6.5091019e-3 | -| dfa noopt | 47.182955 | 47.271392 | 47.166293 | 47.20688 | 0.032612647 | -#+TBLFM: $6=vsdev($2..$4)/sqrt(3)::@2$2..@2$4=remote(d39b3290-297b-4063-8464-a011a048eff4, @$#$11)::@3$2..@3$4=remote(eb6cd726-026c-49ec-974a-1b6285d0fabb, @$#$11)::@4$2..@4$4=remote(cdef09e0-b92a-46db-9ed5-be0cde788441, @$#$11)::@5$2..@5$4=remote(966b0dc7-cf00-4594-88ae-80332696166e, @$#$11)::@6$2..@6$4=remote(c21020da-1d9c-4553-bffe-478b4e35aa90, @$#$10)::@7$2..@7$4=remote(d2559cc7-c179-48cf-aaab-c7f17a29ea1a, @$#$10) - -*** Making the data easier for pgfplot -**** Opt - -| Benchmark | Time | CI | -|-----------+-----------+-------------| -| wlan | 39.86465 | 0.57598739 | -| fms | 20.997713 | 0.73868962 | -| dfa | 3.8539309 | 0.065091019 | -#+TBLFM: @2$2=remote(one-elem-data, @2$5)::@2$3=10*remote(one-elem-data, @2$6)::@3$2=remote(one-elem-data, @4$5)::@3$3=10*remote(one-elem-data, @4$6)::@4$2=remote(one-elem-data, @6$5)::@4$3=10*remote(one-elem-data, @6$6) - -**** Noopt - -| Benchmark | Time | CI | -|-----------+-----------+------------| -| wlan | 40.622111 | 1.0587668 | -| fms | 35.941488 | 1.8943837 | -| dfa | 47.20688 | 0.32612647 | -#+TBLFM: @2$2=remote(one-elem-data, @3$5)::@2$3=10*remote(one-elem-data, @3$6)::@3$2=remote(one-elem-data, @5$5)::@3$3=10*remote(one-elem-data, @5$6)::@4$2=remote(one-elem-data, @7$5)::@4$3=10*remote(one-elem-data, @7$6) - -** Functor expression rewriting -*** The Data - -#+NAME: func-rewrite-data -| Benchmark | Time1 | Time2 | Time3 | Mean | Error | -|------------+-----------+-----------+-----------+-----------+--------------| -| wlan noopt | 62.322413 | 62.416543 | 62.852129 | 62.530362 | 0.16316227 | -|------------+-----------+-----------+-----------+-----------+--------------| -| fms noopt | 21.331782 | 21.307057 | 21.295322 | 21.311387 | 0.010745458 | -|------------+-----------+-----------+-----------+-----------+--------------| -| dfa noopt | 3.6995118 | 3.6943322 | 3.6743715 | 3.6894052 | 7.6641028e-3 | -#+TBLFM: $5=vmean($2..$4)::$6=vsdev($2..$4)/sqrt(3)::@2$2..@2$4=remote(74566779-0749-4bbd-9556-80f857144793, @$#$11)::@3$2..@3$4=remote(7e19eb5e-4009-4bc1-89a3-4e4e5c7f643e, @$#$11)::@4$2..@4$4=remote(d17f77cb-9a07-4c9f-8366-533e07075e6b, @$#$10) - -*** Making the data easier for pgfplot -*** Noopt - -| Benchmark | Time | CI | -|-----------+-----------+-------------| -| wlan | 62.530362 | 1.6316227 | -| fms | 21.311387 | 0.10745458 | -| dfa | 3.6894052 | 0.076641028 | -#+TBLFM: $2=remote(func-rewrite-data, @@#$5)::$3=10*remote(func-rewrite-data, @@#$6) diff --git a/prism/bench.py b/prism/bench.py deleted file mode 100755 index e903a49..0000000 --- a/prism/bench.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/python - -import subprocess -import os -import sys -import re - - -def extract_time(perf_output): - "returns the measured time from the perf output in seconds" - m = re.search(r'(\d+.\d+)\W+seconds time elapsed', str(perf_output)) - return m[1] - - -def run_copar(copar, input_file): - process = subprocess.run( - ['perf', 'stat', copar], - stdin=input_file, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE, - env={'LC_ALL': 'C'}) - - try: - process.check_returncode() - except subprocess.CalledProcessError as e: - err = os.fdopen(sys.stderr.fileno(), 'wb') - err.write(process.stderr) - err.flush() - raise e - - return extract_time(process.stderr) - - -def run_bench(copar, name, filename): - with open(filename) as model_file: - time = run_copar(copar, model_file) - - print("%s" % time) - - -def main(args): - if len(args) != 4: - print("Usage: %s EXECUTABLE MODEL_NAME MODEL_FILE" % args[0]) - sys.exit(1) - - copar_binary = args[1] - model_name = args[2] - model_file = args[3] - - run_bench(copar_binary, model_name, model_file) - - -if __name__ == "__main__": - main(sys.argv) diff --git a/prism/benchmark.org b/prism/benchmark.org deleted file mode 100644 index b625476..0000000 --- a/prism/benchmark.org +++ /dev/null @@ -1,1554 +0,0 @@ -#+TITLE: PRISM Benchmarks -#+LATEX_HEADER: \usepackage[a4paper,margin=1in,landscape]{geometry} - -* Introduction - - This uses the extensive bechmark-suite of [[https://www.prismmodelchecker.org/][PRISM]] to test correctness and - performance of our implementation. In the following, we exclusively use PRISM - version ~4.4~, available [[https://github.com/prismmodelchecker/prism/archive/v4.4.tar.gz][from github]]. - -** PRISM - - PRISM supports the following model types: - - - mdp :: Markov Decision Process - - dtmc :: Discrete-time Markov chain - - ctmc :: Continuous-time Markov chain - - pta :: Extension to MDPs with real-time behaviour - - We can translate those into category theoretic functors: - - | Model type | Functor | - |------------+---------| - | mdp | $P(DX)$ | - | ctmc | $DX$ | - | dtmc | $R^X$ | - | pta | TODO | - - An initial partition $I$ can be represented by pairing the functor with $I$: - $I\times FX$. - - PRISM has a directory called ~prism-examples~, from which we can extract - quite a few models for our benchmarks. - -** Models - - From the examples shipped with PRISM, we can use the following models. - Columns in this tables are defined as follows: - - - Name :: Descriptive name - - Model file :: PRISM model file, relative to the ~prism-examples~ directory. - - Model type :: Model type, as defined above - - Constants :: Constant that need to be defined in the model. These can be - used to parameterise benchmarks. - - #+NAME: models - | Name | Model file | Model type | Constants | - |------------------------+--------------------------------------------+------------+-----------------------------| - | [[Bounded Retransmission Protocol][brp]] | brp/brp.pm | dtmc | N, MAX | - | [[Cell in Wireless Communication Network][cell]] | cell/cell.sm | ctmc | N | - | [[Dependable Cluster][cluster]] | cluster/cluster.sm | ctmc | N, T | - | [[Shared coin protocol][coin]] | consensus/coinN.nm | mdp | N, K, k | - | [[IEEE 802.3 CSMA/CD][csma]] | csma/csmaN_K.nm | mdp | N, K, k | - | [[Dice][dice]] | dice/dice.pm | dtmc | | - | [[Dice][two_dice_knuth]] | dice/two_dice_knuth.pm | dtmc | | - | [[Dice][two_dice]] | dice/two_dice.nm | mdp | | - | [[Dining cryptographers][dining_crypt]] | dining_crypt/dining_cryptN.nm | mdp | N, k | - | [[Embedded Control System][embedded]] | embedded/embedded.sm | ctmc | MAX_COUNT, T | - | [[Firewire][firewire_abst_firewire]] | firewire/abst/firewire.nm | mdp | delay, fast | - | [[Firewire][firewire_abst_deadline]] | firewire/abst/deadline.nm | mdp | deadline, delay, fast | - | [[Firewire][firewire_impl_firewire]] | firewire/impl/firewire.nm | mdp | delay, fast | - | [[Firewire][firewire_impl_deadline]] | firewire/impl/deadline.nm | mdp | deadline, delay, fast | - | [[Flexible Manufacturing System][fms]] | fms/fms.sm | ctmc | n | - | [[Kanban][kanban]] | kanban/kanban.sm | ctmc | t | - | [[id:fcc30abf-3473-429b-ade2-0900e6825042][leader_sync]] | leader/synchronous/leaderN_K.pm | dtmc | L | - | [[id:e6b7cd19-fdf8-4c34-8a16-5429102fe2b6][leader_async]] | leader/asynchronous/leaderN.nm | mdp | N, K | - | [[id:2fc0e60e-721b-47b7-9606-dfb32118fe47][nacl]] | molecules/nacl.sm | ctmc | N1, N2, T, i | - | [[id:2fc0e60e-721b-47b7-9606-dfb32118fe47][knacl]] | molecules/knacl.sm | ctmc | N1, N2, N3, T, i | - | [[id:2fc0e60e-721b-47b7-9606-dfb32118fe47][mc]] | molecules/mc.sm | ctmc | N1, N2, T, i | - | [[id:e8ac9d4d-0ed9-4cc2-85ea-359a5261442c][mutual]] | mutual/mutualN.nm | mdp | N | - | [[id:8f53a247-e80e-4b29-b0e9-34bd29aa91ff][peer2peer]] | peer2peer/peer2peerN_K.sm | ctmc | N, K, T | - | [[id:eb035abb-aa5a-4edd-a193-605fbfb386d5][phil_original]] | phil/original/philN.nm | mdp | N | - | [[id:2d736b3d-a5c8-4485-9065-0724cd79efcd][phil_nofair]] | phil/nofair/phil-nofairN.nm | mdp | K | - | [[id:7e4f230d-5ee9-4d00-84bd-1b2a936e2fee][poll]] | polling/pollN.sm | ctmc | T | - | [[id:754e893c-474b-4a3b-a870-7bb69d4c4a0b][rabin]] | rabin/rabinN.nm | mdp | N | - | [[id:94785b23-df89-4daa-a615-ba97a16661a0][beauquier]] | self-stabilisation/beauquier/beauquierN.nm | mdp | N, K, k | - | [[id:ab8fc607-28eb-4618-9369-20353be3b7ec][herman]] | self-stabilisation/herman/hermanN.pm | dtmc | N, K, k | - | [[id:c6c91d7d-0c6e-41ff-8610-7f1cd020393d][israeli-jalfon]] | self-stabilisation/israeli-jalfon/ijN.nm | mdp | N, K, k | - | [[id:f4d75ba1-5bd9-427f-846a-c233037887d8][tandem]] | tandem/tandem.sm | ctmc | T, c | - | [[id:c808971a-8c52-41c3-8de0-42aebe332be5][wlan]] | wlan/wlanK.nm | mdp | TRANS_TIME_MAX, k, K | - | [[id:c808971a-8c52-41c3-8de0-42aebe332be5][wlan_collide]] | wlan/wlanK_collide.nm | mdp | COL, TRANS_TIME_MAX, k, K | - | [[id:c808971a-8c52-41c3-8de0-42aebe332be5][wlan_time_bounded]] | wlan/wlanK_time_bounded.nm | mdp | TRANS_TIME_MAX, DEADLINE, K | - | [[id:e8a80143-4f49-4109-8f58-950514ada685][zeroconf]] | zeroconf/zeroconf.nm | mdp | N, K, err, reset | - | [[id:e8a80143-4f49-4109-8f58-950514ada685][zeroconf_time_bounded]] | zeroconf/zeroconf_time_bounded.nm | mdp | N, K, T, bound, reset | - - We have to import this table into python for later reference: - - #+BEGIN_SRC python :session :var models_table=models :results value silent - import re - models = [] - for t in models_table: - models.append({'name': re.sub(r"\[\[.*\]\[(.*)\]\]", r"\1", t[0]), 'path': t[1], 'type': t[2], 'constants': t[3]}) - #+END_SRC - -** Tooling - - We will use python to translate models and generate benchmark results. - - #+BEGIN_SRC python :session :results output silent :eval never-export - import os - import subprocess - import json - import re - #+END_SRC - - The following environment definitions probably need to be adapted for - different systems: - - #+BEGIN_SRC python :session :results value silent :eval never-export - config = {'prism_cmd': '../../prism-4.4/prism/bin/prism', - 'prism_examples': '../../prism-4.4/prism-examples', - 'copar_cmd': '../../copar/bin/copar', - 'prism_converter_cmd': '../../copar/bin/prism-converter', - } - #+END_SRC - - We need to define a few python functions and variables to use later: - - #+BEGIN_SRC python :session :results output silent :eval never-export - def const_assignment_to_dict(const_assignment): - clist = const_assignment.strip().split(',') - if '' in clist: - clist.remove('') - d = {} - for assignment in clist: - x = assignment.split('=', 1) - d[x[0]] = x[1] - return d - - def replace_consts_in_path(path, const_assignment): - "returns the unassigned constants" - const_dict = const_assignment_to_dict(const_assignment) - new_const_assignment = "" - for key, value in const_dict.items(): - upkey = key.upper() - if upkey in path: - path = path.replace(upkey, value, 1) - else: - new_const_assignment += "%s=%s," % (key,value) - return (path, new_const_assignment.rstrip(',')) - - def const_base_path(path, const_assignments): - return "bench/%s_%s" % (path, const_assignments) \ - if const_assignments else ("bench/%s" % path) - - def export_model_impl(path, const_assignments): - path_with_consts = const_base_path(path, const_assignments) - tra_file = "%s.tra" % path_with_consts - sta_file = "%s.sta" % path_with_consts - if os.path.isfile(tra_file): - return - os.makedirs(os.path.dirname(tra_file), exist_ok=True) - model_path = "%s/%s" % (config['prism_examples'], path) - subprocess.run([config['prism_cmd'], - '-exporttrans', tra_file, - '-exportstates', sta_file, - '-const', const_assignments, - model_path]) - - def find_model(name): - for m in models: - if m['name'] == name: - return m - raise Exception("Model %s not found" % name) - - def export_model(name, const_assignments): - m = find_model(name) - path, const_assignments = replace_consts_in_path(m['path'], const_assignments) - return export_model_impl(path, const_assignments) - - def convert_model(name, const_assignments, initial_partition): - model = find_model(name) - path, const_assignments = replace_consts_in_path(model['path'], const_assignments) - path_with_consts = const_base_path(path, const_assignments) - tra_file = "%s.tra" % path_with_consts - sta_file = "%s.sta" % path_with_consts - coalgebra_file = path_with_consts + ".coalgebra" - if os.path.isfile(coalgebra_file): - return - if initial_partition: - subprocess.run([config['prism_converter_cmd'], '--model-type', - model['type'], '--states-file', sta_file, - "--partition-on-variables", initial_partition, - tra_file, coalgebra_file]) - else: - subprocess.run([config['prism_converter_cmd'], '--model-type', - model['type'], '--states-file', sta_file, - tra_file, coalgebra_file]) - - def partition_model(name, const_assignments, disableopts, nofunctrans): - model = find_model(name) - path, const_assignments = replace_consts_in_path(model['path'], const_assignments) - path_with_consts = const_base_path(path, const_assignments) - coalgebra_file = path_with_consts + ".coalgebra" - cmd = [config['copar_cmd'], 'refine', '--stats-json', coalgebra_file] - if disableopts: - cmd.append('--disable-optimizations') - if nofunctrans: - cmd.append('--no-functor-transforms') - out = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE) - print(out.stderr.decode('utf-8')) - return json.loads(out.stderr.decode('utf-8')) - - def run_all(model, const_assignments, initial_partition, disableopts, nofunctrans): - export_model(model, const_assignments) - convert_model(model, const_assignments, initial_partition) - return partition_model(model, const_assignments, disableopts, nofunctrans) - #+END_SRC - -** Valmari's Implementation - - We also compare the running time of our implementation against a direct - implementation of markov chain lumping that also supports MDPs. This is - expected to be a lot faster since it's written in hand optimized C++ and - specialized for its use case instead of being generic like ours. - - First, we need to define where the executable for this implementation is: - - #+BEGIN_SRC python :session :eval never-export :results output silent - config['valmari_cmd'] = '../../valmari_cpp/mdpmin' - #+END_SRC - - And then some python to generate input files and run it. - - #+BEGIN_SRC python :session :eval never-export :results output silent - def convert_model_valmari(name, const_assignments, initial_partition): - model = find_model(name) - path, const_assignments = replace_consts_in_path(model['path'], const_assignments) - path_with_consts = const_base_path(path, const_assignments) - tra_file = "%s.tra" % path_with_consts - sta_file = "%s.sta" % path_with_consts - output_file = path_with_consts + ".valmari" - if os.path.isfile(output_file): - return - if initial_partition: - subprocess.run([config['prism_converter_cmd'], - '--model-type', model['type'], - '--output-format', 'valmari', - '--states-file', sta_file, - "--partition-on-variables", initial_partition, - tra_file, output_file]) - else: - subprocess.run([config['prism_converter_cmd'], - '--model-type', model['type'], - '--output-format', 'valmari', - '--states-file', sta_file, - tra_file, output_file]) - - def run_valmari(name, const_assignments): - model = find_model(name) - path, const_assignments = replace_consts_in_path(model['path'], const_assignments) - path_with_consts = const_base_path(path, const_assignments) - valmari_file = open(path_with_consts + ".valmari") - perf = subprocess.Popen(['perf', 'stat', config['valmari_cmd']], - stdin=valmari_file, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, env={'LC_ALL': 'C'}) - sort1 = subprocess.run(['runhaskell', 'valmari-extract-sort1.hs', model['type']], - stdin=perf.stdout, stdout=subprocess.PIPE) - (_, out) = perf.communicate() - m = re.search(r'(\d+.\d+)\W+seconds time elapsed', out.decode('utf-8')) - return (m[1], sort1.stdout.decode('utf-8').strip()) - - def run_all_valmari(name, const_assignments, initial_partition): - convert_model_valmari(name, const_assignments, initial_partition) - return run_valmari(name, const_assignments) - #+END_SRC - -** Running Benchmarks - -#+BEGIN_SRC python :session :eval never-export :results output silent :exports none -def run_benchmark(model, const_assignments, initial_partition, disableopts, nofunctrans): - stats = run_all(model, const_assignments, initial_partition, disableopts, nofunctrans) - valmari = run_all_valmari(model, const_assignments, initial_partition) - return [model, const_assignments, initial_partition, - stats['states'], - stats['edges'], - stats['explicit-states'], - stats['initial-partition-size'], - stats['final-partition-size'], - stats['explicit-final-partition-size'], - stats['size1-skipped'], - stats['overall-duration'], - stats['parse-duration'], - stats['initialize-duration'], - stats['refine-duration'], - stats['algorithm-duration'], - valmari[0], - valmari[1]] -#+END_SRC - -#+NAME: bench -#+BEGIN_SRC python :session :eval no-export :var table="" :colnames no :hlines yes - [['Model', 'Consts', 'Partition', "States", "Edges", "Sort 0", "I", "Q", 'Q_0', 'Opts', 't(s)', 't_p(s)', 't_i(s)', 't_r(s)', 't_a(s)', 't_valmari(s)', 'Q_0v'], None] + \ - list(map(lambda t: run_benchmark(t[0], t[1], t[2], False, False), table[2:])) -#+END_SRC - -#+NAME: bench_noopt -#+BEGIN_SRC python :session :eval no-export :var table="" :colnames no :hlines yes - [['Model', 'Consts', 'Partition', "States", "Edges", "Sort 0", "I", "Q", 'Q_0', 'Opts', 't(s)', 't_p(s)', 't_i(s)', 't_r(s)', 't_a(s)', 't_valmari(s)', 'Q_0v'], None] + \ - list(map(lambda t: run_benchmark(t[0], t[1], t[2], True, False), table[2:])) -#+END_SRC - -#+NAME: bench_nofunctrans -#+BEGIN_SRC python :session :eval no-export :var table="" :colnames no :hlines yes - [['Model', 'Consts', 'Partition', "States", "Edges", "Sort 0", "I", "Q", 'Q_0', 'Opts', 't(s)', 't_p(s)', 't_i(s)', 't_r(s)', 't_a(s)', 't_valmari(s)', 'Q_0v'], None] + \ - list(map(lambda t: run_benchmark(t[0], t[1], t[2], False, True), table[2:])) -#+END_SRC - -#+NAME: bench_sloooow -#+BEGIN_SRC python :session :eval no-export :var table="" :colnames no :hlines yes - [['Model', 'Consts', 'Partition', "States", "Edges", "Sort 0", "I", "Q", 'Q_0', 'Opts', 't(s)', 't_p(s)', 't_i(s)', 't_r(s)', 't_a(s)', 't_valmari(s)', 'Q_0v'], None] + \ - list(map(lambda t: run_benchmark(t[0], t[1], t[2], True, True), table[2:])) -#+END_SRC - -* Benchmarks -** Bounded Retransmission Protocol - - #+BEGIN_QUOTE - This case study is based on the bounded retransmission protocol (BRP) [HSV94], a variant of the alternating bit protocol. - - Its parameters are: - - N = number of chunks in a file - MAX = maximum number of retransmissions - - For more information, see: http://www.prismmodelchecker.org/casestudies/brp.php - #+END_QUOTE - - Benchmarks: - - #+NAME: brp_benchmarks - | Model | Constants | Partition | - |-------+------------+-----------| - | brp | N=16,MAX=2 | s | - | brp | N=16,MAX=3 | s | - | brp | N=16,MAX=4 | s | - | brp | N=16,MAX=5 | s | - | brp | N=32,MAX=2 | s | - | brp | N=32,MAX=3 | s | - | brp | N=32,MAX=4 | s | - | brp | N=32,MAX=5 | s | - | brp | N=64,MAX=2 | s | - | brp | N=64,MAX=3 | s | - | brp | N=64,MAX=4 | s | - | brp | N=64,MAX=5 | s | - - Results: - - #+CALL: bench(brp_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+------------+-----------+--------+-------+--------+---+------+------+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | brp | N=16,MAX=2 | s | 677 | 867 | 677 | 7 | 329 | 329 | 52 | 0.0096711520 | 0.0055319890 | 0.0013735710 | 0.0018519030 | 0.0033773790 | 0.002082710 | NA | - | brp | N=16,MAX=3 | s | 886 | 1155 | 886 | 7 | 442 | 442 | 88 | 0.0116424020 | 0.0063141920 | 0.0018566350 | 0.0022196060 | 0.0044309990 | 0.002534837 | NA | - | brp | N=16,MAX=4 | s | 1095 | 1443 | 1095 | 7 | 555 | 555 | 120 | 0.0156490230 | 0.0087450750 | 0.0019053060 | 0.0034745740 | 0.0057855190 | 0.002608192 | NA | - | brp | N=16,MAX=5 | s | 1304 | 1731 | 1304 | 7 | 668 | 668 | 152 | 0.0187181940 | 0.0099388020 | 0.0030763620 | 0.0035504570 | 0.0071181880 | 0.002846267 | NA | - | brp | N=32,MAX=2 | s | 1349 | 1731 | 1349 | 7 | 649 | 649 | 100 | 0.0187313390 | 0.0102275120 | 0.0032966890 | 0.0031392650 | 0.0066961280 | 0.002826721 | NA | - | brp | N=32,MAX=3 | s | 1766 | 2307 | 1766 | 7 | 874 | 874 | 167 | 0.0253537910 | 0.0125933750 | 0.0034613680 | 0.0057390080 | 0.0095412560 | 0.003196347 | NA | - | brp | N=32,MAX=4 | s | 2183 | 2883 | 2183 | 7 | 1099 | 1099 | 233 | 0.0329036780 | 0.0169290770 | 0.0044749150 | 0.0082289000 | 0.0133349350 | 0.003782915 | NA | - | brp | N=32,MAX=5 | s | 2600 | 3459 | 2600 | 7 | 1324 | 1324 | 295 | 0.0408756860 | 0.0207791250 | 0.0071231710 | 0.0096075050 | 0.0175274810 | 0.004091965 | NA | - | brp | N=64,MAX=2 | s | 2693 | 3459 | 2693 | 7 | 1289 | 1289 | 196 | 0.0379403510 | 0.0196948050 | 0.0067873590 | 0.0079025110 | 0.0157109670 | 0.004156036 | NA | - | brp | N=64,MAX=3 | s | 3526 | 4611 | 3526 | 7 | 1738 | 1738 | 328 | 0.0551088630 | 0.0282033910 | 0.0077104360 | 0.0135217460 | 0.0224298520 | 0.004877520 | NA | - | brp | N=64,MAX=4 | s | 4359 | 5763 | 4359 | 7 | 2187 | 2187 | 456 | 0.0679899860 | 0.0338266070 | 0.0121471660 | 0.0163239430 | 0.0298915000 | 0.005788835 | NA | - | brp | N=64,MAX=5 | s | 5192 | 6915 | 5192 | 7 | 2636 | 2636 | 583 | 0.0840906920 | 0.0399630440 | 0.0158103130 | 0.0209396970 | 0.0387673500 | 0.116052312 | NA | - -** Cell in Wireless Communication Network - - #+BEGIN_QUOTE - This case study is based on a single cell in a wireless communication network. It is taken from [HMPT00]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/cell.php - #+END_QUOTE - - Benchmarks: - - There is only a single state variable ~s~. If we base our initial partition - on that, we distinguish all states immediately. - - #+NAME: cell_benchmarks - | Model | Constants | Partition | - |-------+-------------+-----------| - | cell | N=50,T=0.5 | | - | cell | N=100,T=0.5 | | - | cell | N=200,T=0.5 | | - | cell | N=300,T=0.5 | | - | cell | N=400,T=0.5 | | - | cell | N=500,T=0.5 | | - - Results: - - #+CALL: bench(cell_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+-------------+-----------+--------+-------+--------+-----+-----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | cell | N=50,T=0.5 | | 51 | 100 | 51 | 50 | 51 | 51 | 98 | 0.0011218680 | 0.0009294180 | 0.0000494130 | 0.0000435180 | 0.0001277970 | 0.001563127 | NA | - | cell | N=100,T=0.5 | | 101 | 200 | 101 | 80 | 101 | 101 | 178 | 0.0015188440 | 0.0010590700 | 0.0003003410 | 0.0000425270 | 0.0003747630 | 0.001673470 | NA | - | cell | N=200,T=0.5 | | 201 | 400 | 201 | 160 | 201 | 201 | 358 | 0.0021876160 | 0.0016676340 | 0.0002400200 | 0.0000813670 | 0.0003676030 | 0.001733180 | NA | - | cell | N=300,T=0.5 | | 301 | 600 | 301 | 251 | 301 | 301 | 549 | 0.0029263770 | 0.0021101180 | 0.0003710050 | 0.0000992930 | 0.0005347260 | 0.002071309 | NA | - | cell | N=400,T=0.5 | | 401 | 800 | 401 | 351 | 401 | 401 | 749 | 0.0042151170 | 0.0030344660 | 0.0005944010 | 0.0001019410 | 0.0008068710 | 0.002196061 | NA | - | cell | N=500,T=0.5 | | 501 | 1000 | 501 | 451 | 501 | 501 | 949 | 0.0043326070 | 0.0029545140 | 0.0007268790 | 0.0001279380 | 0.0009650510 | 0.002397520 | NA | - -** Dependable Cluster - - #+BEGIN_QUOTE - This case study is based on a dependable cluster of workstations, taken from [HHK00]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/cluster.php - #+END_QUOTE - - Benchmarks: - - #+NAME: cluster_benchmarks - | Model | Constants | Partition | - |---------+-----------+-----------| - | cluster | N=4,T=10 | | - | cluster | N=8,T=10 | | - | cluster | N=16,T=10 | | - | cluster | N=32,T=10 | | - - Results: - - #+CALL: bench(cluster_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |---------+-----------+-----------+--------+--------+--------+------+-------+-------+-------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | cluster | N=4,T=10 | | 820 | 3616 | 820 | 227 | 565 | 565 | 1058 | 0.0133275730 | 0.0077306660 | 0.0021054550 | 0.0023376670 | 0.0046840240 | 0.003796554 | NA | - | cluster | N=8,T=10 | | 2772 | 12832 | 2772 | 453 | 1917 | 1917 | 3867 | 0.0482514870 | 0.0252573650 | 0.0067393290 | 0.0122252760 | 0.0203239000 | 0.008798572 | NA | - | cluster | N=16,T=10 | | 10132 | 48160 | 10132 | 953 | 7021 | 7021 | 15796 | 0.2476780700 | 0.1366680710 | 0.0286580230 | 0.0623478880 | 0.0968610530 | 0.163654355 | NA | - | cluster | N=32,T=10 | | 38676 | 186400 | 38676 | 2062 | 26829 | 26829 | 66228 | 0.9490274650 | 0.4146188670 | 0.1122056580 | 0.3070002710 | 0.4420124300 | 0.157405829 | NA | - -** Shared coin protocol - - #+BEGIN_QUOTE - This case study is based on the shared coin protocol from the randomised consensus algorithm of Aspnes and Herlihy [AH90]. - For more information, see: http://www.prismmodelchecker.org/casestudies/consensus_prism.php - #+END_QUOTE - - We could only test up to coin4, as coin6 already uses all available RAM to - convert the model. - - Benchmarks: - - #+NAME: consensus_benchmarks - | Model | Constants | Partition | - |-------+--------------+-----------------| - | coin | N=2,K=2,k=10 | pc1,pc2 | - | coin | N=2,K=4,k=10 | pc1,pc2 | - | coin | N=4,K=2,k=10 | pc1,pc2,pc3,pc4 | - | coin | N=4,K=4,k=10 | pc1,pc2,pc3,pc4 | - - Results: - - #+CALL: bench(consensus_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+--------------+-----------------+--------+--------+--------+-----+-------+-------+------+--------------+--------------+--------------+--------------+--------------+--------------+-------| - | coin | N=2,K=2,k=10 | pc1,pc2 | 672 | 892 | 272 | 18 | 231 | 95 | 4 | 0.0087244350 | 0.0045174220 | 0.0013927310 | 0.0020353580 | 0.0035664660 | 0.001915857 | 95 | - | coin | N=2,K=4,k=10 | pc1,pc2 | 1312 | 1756 | 528 | 18 | 439 | 183 | 4 | 0.0168299880 | 0.0088780660 | 0.0027004320 | 0.0039363490 | 0.0071328000 | 0.002738838 | 183 | - | coin | N=4,K=2,k=10 | pc1,pc2,pc3,pc4 | 83200 | 135776 | 22656 | 260 | 18522 | 5392 | 48 | 1.9382094360 | 0.6608932970 | 0.5348946720 | 0.5962997930 | 1.1876570350 | 0.113754275 | 5392 | - | coin | N=4,K=4,k=10 | pc1,pc2,pc3,pc4 | 158976 | 260192 | 43136 | 260 | 35482 | 10352 | 48 | 3.8120987810 | 1.2882729670 | 0.9272679960 | 1.3343738850 | 2.3771375450 | 0.200260367 | 10352 | - -** IEEE 802.3 CSMA/CD - - #+BEGIN_QUOTE - This case study concerns the IEEE 802.3 CSMA/CD (Carrier Sense, Multiple Access with Collision Detection) protocol - - model files csmaN_K.nm - property file: csma.pctl - - where N is the number of stations and K is the maximum backoff - - For more information on the probabilistic timed automata see: http://www.prismmodelchecker.org/casestudies/csma.php - - The PRISM model uses the integer semantics given in [KNPS06]. - #+END_QUOTE - - Benchmarks: - - We partition on the state of the bus ~b~. - - #+NAME: csma_benchmarks - | Model | Constants | Partition | - |-------+-------------+-----------| - | csma | N=2,K=2,k=1 | b | - | csma | N=2,K=4,k=1 | b | - | csma | N=2,K=6,k=1 | b | - | csma | N=3,K=2,k=1 | b | - | csma | N=4,K=2,k=1 | b | - - Results: - - #+CALL: bench(csma_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+-------------+-----------+---------+---------+--------+---+-------+------+------+---------------+---------------+--------------+---------------+---------------+--------------+------| - | csma | N=2,K=2,k=1 | b | 2092 | 2336 | 1038 | 5 | 470 | 233 | 19 | 0.0271229570 | 0.0134353980 | 0.0055199520 | 0.0059881320 | 0.0120362210 | 0.003081025 | 233 | - | csma | N=2,K=4,k=1 | b | 15946 | 18582 | 7958 | 5 | 1992 | 997 | 109 | 0.2394990420 | 0.1079331770 | 0.0432150540 | 0.0709119940 | 0.1202429350 | 0.013782941 | 997 | - | csma | N=2,K=6,k=1 | b | 133506 | 159860 | 66718 | 5 | 14829 | 7436 | 487 | 2.9227050260 | 0.9680199220 | 0.5949931450 | 0.9674891040 | 1.6568496520 | 0.128931912 | 7436 | - | csma | N=3,K=2,k=1 | b | 75306 | 94318 | 36850 | 6 | 4686 | 2281 | 20 | 1.3873632270 | 0.5463126360 | 0.2537259070 | 0.4778206100 | 0.7738012150 | 0.090490568 | 2281 | - | csma | N=4,K=2,k=1 | b | 1587466 | 2152572 | 761962 | 7 | 21024 | 9830 | 27 | 50.1628253620 | 16.9687094990 | 7.5975967340 | 21.3369999780 | 31.0321613660 | 2.081963159 | 9830 | - -** Dice - - This models a 6-sided dice using fair coins. Partitioning on ~s~ (internal - model state) collapses final dice results and distinguishes all other states. - Partitioning on ~d~ (the dice result) distinguishes all states, which just - shows that no internal state is redundant. - - Benchmarks: - - #+NAME: dice_benchmarks - | Model | Constants | Partition | - |----------------+-----------+-----------| - | dice | | s | - | two_dice_knuth | | s | - | two_dice | | s1,s2 | - - Results: - - #+CALL: bench(dice_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |----------------+--------+-----------+--------+-------+--------+----+-----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | dice | | s | 13 | 20 | 13 | 8 | 8 | 8 | 8 | 0.0006871810 | 0.0005694540 | 0.0000342090 | 0.0000119660 | 0.0000621000 | 0.001404938 | NA | - | two_dice_knuth | | s | 45 | 79 | 45 | 35 | 35 | 35 | 35 | 0.0011354970 | 0.0009655350 | 0.0000685430 | 0.0000131480 | 0.0000985090 | 0.001483642 | NA | - | two_dice | | s1,s2 | 423 | 690 | 169 | 66 | 160 | 64 | 203 | 0.0050796840 | 0.0033219290 | 0.0006923820 | 0.0005149300 | 0.0014069710 | 0.001946452 | 64 | - -** Dining cryptographers - - #+BEGIN_QUOTE - This case study is based on the well known dining cryptographers problem [Cha88]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/dining_crypt.php - #+END_QUOTE - - Benchmarks: - - #+NAME: dining_crypt_benchmarks - | Model | Constants | Partition | - |--------------+-----------+-----------| - | dining_crypt | N=3 | pay | - | dining_crypt | N=4 | pay | - | dining_crypt | N=5 | pay | - | dining_crypt | N=6 | pay | - | dining_crypt | N=7 | pay | - - Results: - - #+CALL: bench(dining_crypt_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------------+--------+-----------+---------+---------+--------+----+------+------+------+---------------+---------------+---------------+---------------+---------------+--------------+------| - | dining_crypt | N=3 | pay | 1000 | 1396 | 380 | 7 | 96 | 36 | 16 | 0.0115788870 | 0.0065676890 | 0.0026811490 | 0.0015388800 | 0.0044264420 | 0.002342207 | 36 | - | dining_crypt | N=4 | pay | 6705 | 10260 | 2165 | 9 | 335 | 115 | 55 | 0.0942949780 | 0.0439388580 | 0.0230355970 | 0.0213027110 | 0.0471209270 | 0.006517673 | 115 | - | dining_crypt | N=5 | pay | 42552 | 69474 | 11850 | 11 | 1014 | 318 | 84 | 0.8393567260 | 0.3363783460 | 0.2121007970 | 0.2415892790 | 0.4793911600 | 0.040772024 | 318 | - | dining_crypt | N=6 | pay | 258349 | 442106 | 63063 | 13 | 2842 | 805 | 119 | 5.7126363640 | 2.0802571770 | 1.1695632410 | 1.7726151170 | 3.4571072280 | 0.260343728 | 805 | - | dining_crypt | N=7 | pay | 1514800 | 2685512 | 328760 | 15 | 7536 | 1928 | 160 | 42.2796849430 | 14.7078751920 | 11.5979644660 | 12.3266122930 | 26.0055200610 | 1.656931802 | 1928 | - -** Embedded Control System - - #+BEGIN_QUOTE - This case study models a simple embedded system, as described in [KNP04c]. - It is closely based on the example of [MCT94]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/embedded.php - #+END_QUOTE - - This uses the model [[/embedded.sm/]] - - Benchmarks: - - #+NAME: embedded_benchmarks - | Model | Constants | Partition | - |----------+--------------------+-----------| - | embedded | MAX_COUNT=2,T=12 | i,a,m | - | embedded | MAX_COUNT=2,T=14 | i,a,m | - | embedded | MAX_COUNT=2,T=0 | i,a,m | - | embedded | MAX_COUNT=60,T=0 | i,a,m | - | embedded | MAX_COUNT=70,T=0 | i,a,m | - | embedded | MAX_COUNT=100,T=0 | i,a,m | - | embedded | MAX_COUNT=500,T=0 | i,a,m | - | embedded | MAX_COUNT=1000,T=0 | i,a,m | - - Results: - - #+CALL: bench(embedded_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |----------+--------------------+-----------+--------+---------+--------+-----+-------+-------+--------+---------------+---------------+--------------+---------------+---------------+--------------+------| - | embedded | MAX_COUNT=2,T=12 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 725 | 0.1000065050 | 0.0548361140 | 0.0136441340 | 0.0261467390 | 0.0421925780 | 0.013208914 | NA | - | embedded | MAX_COUNT=2,T=14 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 725 | 0.0972915520 | 0.0517521910 | 0.0137723260 | 0.0263733620 | 0.0425782980 | 0.013174102 | NA | - | embedded | MAX_COUNT=2,T=0 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 725 | 0.0966324330 | 0.0512371760 | 0.0136189920 | 0.0262566010 | 0.0423206290 | 0.013252364 | NA | - | embedded | MAX_COUNT=60,T=0 | i,a,m | 52488 | 221525 | 52488 | 157 | 5556 | 5556 | 9948 | 1.8095733020 | 0.8240218270 | 0.3609584160 | 0.4951166810 | 0.9139563520 | 0.197722292 | NA | - | embedded | MAX_COUNT=70,T=0 | i,a,m | 60938 | 257195 | 60938 | 157 | 6416 | 6416 | 11548 | 2.1071708480 | 0.9535734410 | 0.4265075780 | 0.5761428870 | 1.0710210680 | 0.220429190 | NA | - | embedded | MAX_COUNT=100,T=0 | i,a,m | 86288 | 364205 | 86288 | 157 | 8996 | 8996 | 16348 | 3.0536448800 | 1.3787377890 | 0.4321661420 | 0.8209543500 | 1.5314433370 | 0.311546032 | NA | - | embedded | MAX_COUNT=500,T=0 | i,a,m | 424288 | 1791005 | 424288 | 157 | 43396 | 43396 | 80348 | 18.8280785360 | 7.4157094000 | 3.7931441200 | 5.0072190250 | 9.4383797080 | 1.605090640 | NA | - | embedded | MAX_COUNT=1000,T=0 | i,a,m | 846788 | 3574505 | 846788 | 157 | 86396 | 86396 | 160348 | 39.3540056840 | 17.4606916590 | 7.9101838110 | 10.6530826300 | 20.0306799400 | 3.271844717 | NA | - - - The same results without 1-elem-optimization: - - #+CALL: bench_noopt(embedded_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |----------+--------------------+-----------+--------+---------+--------+-----+-------+-------+------+---------------+---------------+--------------+---------------+---------------+--------------+------| - | embedded | MAX_COUNT=2,T=12 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 0 | 0.1001943700 | 0.0524606130 | 0.0135043360 | 0.0274145950 | 0.0432767850 | 0.013087436 | NA | - | embedded | MAX_COUNT=2,T=14 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 0 | 0.0996656840 | 0.0515371400 | 0.0137546470 | 0.0275381250 | 0.0436520370 | 0.013195463 | NA | - | embedded | MAX_COUNT=2,T=0 | i,a,m | 3478 | 14639 | 3478 | 157 | 568 | 568 | 0 | 0.0994936990 | 0.0515434150 | 0.0137538940 | 0.0273789150 | 0.0434910870 | 0.013170084 | NA | - | embedded | MAX_COUNT=60,T=0 | i,a,m | 52488 | 221525 | 52488 | 157 | 5556 | 5556 | 0 | 1.8221398340 | 0.8219622070 | 0.3597875990 | 0.5115648390 | 0.9292901920 | 0.190747923 | NA | - | embedded | MAX_COUNT=70,T=0 | i,a,m | 60938 | 257195 | 60938 | 157 | 6416 | 6416 | 0 | 2.1222394910 | 0.9547011360 | 0.4222102910 | 0.5932027720 | 1.0840538490 | 0.227079494 | NA | - | embedded | MAX_COUNT=100,T=0 | i,a,m | 86288 | 364205 | 86288 | 157 | 8996 | 8996 | 0 | 3.0582449950 | 1.3704334160 | 0.4266735130 | 0.8404935300 | 1.5447937590 | 0.310357914 | NA | - | embedded | MAX_COUNT=500,T=0 | i,a,m | 424288 | 1791005 | 424288 | 157 | 43396 | 43396 | 0 | 18.8984776070 | 7.3305746790 | 3.7833043010 | 5.1593155550 | 9.5775605760 | 1.609142877 | NA | - | embedded | MAX_COUNT=1000,T=0 | i,a,m | 846788 | 3574505 | 846788 | 157 | 86396 | 86396 | 0 | 39.2988154120 | 17.3241690020 | 7.8508650210 | 10.8467155700 | 20.1387386290 | 3.390845831 | NA | - -** Firewire - - #+BEGIN_QUOTE - This case study concerns the Tree Identify Protocol of the IEEE 1394 High Performance Serial Bus (called ``FireWire''). - - These are MDP models, manually constructed from probabilistic timed automaton (PTA) models, - using the "digital clocks" semantics [KNPS06]. You can also find the PTA models, in the directory ../pta/firewire. - - We consider the following probabilistic timed automata models of the root contention part of the - tree identify protocol, which are based on probabilistic I/O automata models presented in [SV99]. - - impl: which consists of the parallel composition of two nodes (Node1 and Node2), - and two communication channels (Wire12 for messages from Node1 to Node2, - and Wire21 for messages from Node2 to Node1) and corresponds to the - system Impl of [SV99]. - - abst: which is represented by a single probabilistic timed automaton and is an abstraction of Impl - based on the the probabilistic I/O automaton I1 of [SV99]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/firewire.php - #+END_QUOTE - - Benchmarks: - - For the "abst" benchmarks, we partition on the local state state of the - protocol ~s~. For the "impl" benchmarks we partition on the local state of - wire 12 ~w12~. - - #+NAME: firewire_benchmarks - | Model | Constants | Partition | - |------------------------+--------------------------------+-----------| - | firewire_abst_firewire | delay=36,fast=0.5 | s | - | firewire_abst_firewire | delay=3,fast=0.2:0.1:0.8 | s | - | firewire_abst_firewire | delay=36,fast=0.2:0.1:0.8 | s | - | firewire_abst_deadline | deadline=200,delay=36,fast=0.5 | s | - | firewire_abst_deadline | deadline=300,delay=36,fast=0.5 | s | - | firewire_abst_deadline | deadline=400,delay=36,fast=0.5 | s | - | firewire_abst_deadline | deadline=500,delay=36,fast=0.5 | s | - | firewire_abst_deadline | deadline=600,delay=36,fast=0.5 | s | - | firewire_impl_firewire | delay=36,fast=0.5 | w12 | - | firewire_impl_firewire | delay=3,fast=0.2:0.1:0.8 | w12 | - | firewire_impl_firewire | delay=36,fast=0.2:0.1:0.8 | w12 | - | firewire_impl_deadline | deadline=200,delay=3,fast=0.5 | w12 | - | firewire_impl_deadline | deadline=300,delay=3,fast=0.5 | w12 | - | firewire_impl_deadline | deadline=400,delay=3,fast=0.5 | w12 | - - Results: - - #+CALL: bench(firewire_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |------------------------+--------------------------------+-----------+---------+---------+--------+----+--------+--------+--------+---------------+--------------+--------------+---------------+---------------+--------------+--------| - | firewire_abst_firewire | delay=36,fast=0.5 | s | 1965 | 2600 | 776 | 13 | 1623 | 776 | 183 | 0.0252118430 | 0.0121053230 | 0.0057877890 | 0.0053013720 | 0.0119495800 | 0.003340243 | 776 | - | firewire_abst_firewire | delay=3,fast=0.2:0.1:0.8 | s | 1305 | 1412 | 611 | 13 | 1227 | 611 | 50 | 0.0151854790 | 0.0077784750 | 0.0025718150 | 0.0036091760 | 0.0065828230 | 0.002662910 | 611 | - | firewire_abst_firewire | delay=36,fast=0.2:0.1:0.8 | s | 1965 | 2600 | 776 | 13 | 1623 | 776 | 183 | 0.0241420600 | 0.0113885000 | 0.0054158060 | 0.0052211330 | 0.0116302240 | 0.003275894 | 776 | - | firewire_abst_deadline | deadline=200,delay=36,fast=0.5 | s | 163757 | 209250 | 67901 | 15 | 35260 | 15848 | 5929 | 3.8682574500 | 1.3507531240 | 1.0458554720 | 1.1846375430 | 2.3532160650 | 0.176546731 | 15848 | - | firewire_abst_deadline | deadline=300,delay=36,fast=0.5 | s | 351965 | 458048 | 142810 | 15 | 136910 | 63708 | 25835 | 9.1705285110 | 2.9618801350 | 2.0662920860 | 3.3795052140 | 5.7368827450 | 0.492995413 | 63708 | - | firewire_abst_deadline | deadline=400,delay=36,fast=0.5 | s | 548465 | 718048 | 220410 | 15 | 231876 | 107370 | 63243 | 14.5446419200 | 4.6610660740 | 3.1752422440 | 5.4435062210 | 9.0879450400 | 0.816190931 | 107370 | - | firewire_abst_deadline | deadline=500,delay=36,fast=0.5 | s | 744965 | 978048 | 298010 | 15 | 327376 | 151270 | 94043 | 19.9813400310 | 6.4153091910 | 4.2919166960 | 7.5645346800 | 12.4521966490 | 1.263053838 | 151270 | - | firewire_abst_deadline | deadline=600,delay=36,fast=0.5 | s | 941465 | 1238048 | 375610 | 15 | 422876 | 195170 | 124843 | 27.0856920960 | 8.6422967040 | 5.7980549930 | 10.2229868990 | 16.8033036870 | 1.517745482 | 195170 | - | firewire_impl_firewire | delay=36,fast=0.5 | w12 | 691024 | 960548 | 212268 | 8 | 131382 | 62836 | 29632 | 20.3819706330 | 5.7341866800 | 3.7580567140 | 9.4194338870 | 13.8074737560 | 0.968866380 | 62836 | - | firewire_impl_firewire | delay=3,fast=0.2:0.1:0.8 | w12 | 9612 | 11104 | 4093 | 8 | 7362 | 3631 | 553 | 0.1694758160 | 0.0870325480 | 0.0294502430 | 0.0417651470 | 0.0745785150 | 0.123132247 | 3631 | - | firewire_impl_firewire | delay=36,fast=0.2:0.1:0.8 | w12 | 691024 | 960548 | 212268 | 8 | 131382 | 62836 | 29633 | 20.3538908920 | 5.7030014760 | 3.7557613730 | 9.4185034920 | 13.8091226960 | 0.965448462 | 62836 | - | firewire_impl_deadline | deadline=200,delay=3,fast=0.5 | w12 | 192016 | 224278 | 80980 | 8 | 4021 | 1967 | 264 | 3.4042976910 | 1.5151843100 | 0.9815302800 | 0.6092578520 | 1.7277678430 | 0.151578484 | 1967 | - | firewire_impl_deadline | deadline=300,delay=3,fast=0.5 | w12 | 497567 | 572016 | 213805 | 8 | 10432 | 5133 | 100 | 9.8533852310 | 4.2797769220 | 2.3338217920 | 2.4103991290 | 5.0971449630 | 0.407009032 | 5133 | - | firewire_impl_deadline | deadline=400,delay=3,fast=0.5 | w12 | 1020411 | 1180934 | 434364 | 8 | 240169 | 118151 | 16363 | 22.1560649610 | 8.7138424910 | 4.8081857930 | 6.3958608920 | 12.0307396340 | 1.105685453 | 118151 | - -** Flexible Manufacturing System - - #+BEGIN_QUOTE - This case study is based on the flexible manufacturing system of [CT93]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/fms.php - #+END_QUOTE - - Bechmarks: - - We don't need an explicit initial partition, because the instrinsic partition - of the coalgebra already leads to a maximally fine final partition. - - #+NAME: fms_benchmarks - | Model | Constants | Partition | - |-------+-----------+-----------| - | fms | n=1 | | - | fms | n=2 | | - | fms | n=3 | | - | fms | n=4 | | - | fms | n=5 | | - | fms | n=6 | | - - Results: - - #+CALL: bench(fms_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+--------+-----------+--------+---------+--------+------+--------+--------+---------+---------------+--------------+--------------+--------------+--------------+--------------+------| - | fms | n=1 | | 54 | 155 | 54 | 27 | 54 | 54 | 144 | 0.0011190190 | 0.0009196850 | 0.0000526740 | 0.0000540440 | 0.0001321580 | 0.001270014 | NA | - | fms | n=2 | | 810 | 3699 | 810 | 129 | 810 | 810 | 3607 | 0.0114879660 | 0.0074573830 | 0.0018583150 | 0.0011231400 | 0.0032124940 | 0.004057395 | NA | - | fms | n=3 | | 6520 | 37394 | 6520 | 376 | 6520 | 6520 | 38537 | 0.1230228560 | 0.0727707760 | 0.0205872780 | 0.0166235890 | 0.0409569130 | 0.163422677 | NA | - | fms | n=4 | | 35910 | 237120 | 35910 | 815 | 35910 | 35910 | 248896 | 0.8787897430 | 0.4779690720 | 0.1196028640 | 0.1624789370 | 0.3375174170 | 0.213602261 | NA | - | fms | n=5 | | 152712 | 1111482 | 152712 | 1299 | 152712 | 152712 | 1163734 | 4.9372687240 | 2.4584752490 | 0.6822492420 | 1.1002566890 | 2.0805720360 | 1.214758409 | NA | - | fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 21.3837698990 | 9.9432312680 | 2.9128952850 | 5.5583560150 | 9.6761859970 | 5.843124489 | NA | - - -*** Comparing with and without optimization - -We run a single benchmark multiple times. Once with and once without optimizations. - -#+NAME: fms_benchmark_single -| Model | Constants | Partition | -|-------+-----------+-----------| -| fms | n=6 | | -| fms | n=6 | | -| fms | n=6 | | - -**** With both optimizations -:PROPERTIES: -:ID: cdef09e0-b92a-46db-9ed5-be0cde788441 -:END: - -#+CALL: bench(fms_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------+--------+-----------+--------+---------+--------+------+--------+--------+---------+---------------+--------------+--------------+--------------+--------------+--------------+------| -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 21.1115990510 | 9.8550286160 | 2.8687953810 | 5.4316401000 | 9.5064537000 | 5.708263962 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 20.9593982310 | 9.7634182720 | 2.8666464320 | 5.4096516480 | 9.4901079220 | 5.613742001 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 20.9555704890 | 9.7799698680 | 2.8857570390 | 5.4510723400 | 9.5017096000 | 5.685050507 | NA | - -**** Without any optimization -:PROPERTIES: -:ID: 8850d72d-8f23-495e-b3af-a06deb25be53 -:END: - -#+CALL: bench_sloooow(fms_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------+--------+-----------+--------+---------+--------+------+--------+--------+------+---------------+--------------+--------------+---------------+---------------+--------------+------| -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.4518703620 | 9.9894868350 | 2.9299455570 | 19.7603050700 | 23.8772346850 | 5.701320777 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.3850394920 | 9.8971921010 | 2.9127417480 | 19.7676467020 | 23.8871916030 | 5.798974060 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.8300788970 | 9.9196566430 | 2.9461043890 | 20.1929301170 | 24.3299005100 | 5.656880994 | NA | - -**** With just functor rewrites -:PROPERTIES: -:ID: 966b0dc7-cf00-4594-88ae-80332696166e -:END: - -#+CALL: bench_noopt(fms_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------+--------+-----------+--------+---------+--------+------+--------+--------+------+---------------+--------------+--------------+---------------+---------------+--------------+------| -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.3792636600 | 9.8840455080 | 2.9389656800 | 19.7589163770 | 23.9099881210 | 5.741194174 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.5444664040 | 9.9008855000 | 2.9221486960 | 19.9320237960 | 24.0572613560 | 5.697179509 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 0 | 35.5311650510 | 9.9824189200 | 2.9167611140 | 19.8211857990 | 23.9367806740 | 5.675679034 | NA | - -**** With just 1-elem optimization -:PROPERTIES: -:ID: 7e19eb5e-4009-4bc1-89a3-4e4e5c7f643e -:END: - -#+CALL: bench_nofunctrans(fms_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------+--------+-----------+--------+---------+--------+------+--------+--------+---------+---------------+--------------+--------------+--------------+--------------+--------------+------| -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 21.3317819830 | 9.9422740590 | 2.9165776070 | 5.5338563370 | 9.6616926620 | 5.676567183 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 21.3070570780 | 9.9521240360 | 2.9318476720 | 5.5074560910 | 9.6391451150 | 5.714505330 | NA | -| fms | n=6 | | 537768 | 4205670 | 537768 | 1766 | 537768 | 537768 | 4369694 | 21.2953219580 | 9.9278855310 | 2.8900129830 | 5.5345639560 | 9.6430584370 | 5.873457181 | NA | - -** Kanban - - #+BEGIN_QUOTE - This case study is based on the Kanban flexible manufacturing system of [CT96]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/kanban.php - #+END_QUOTE - - Benchmarks: - - No need for an explicit partition, the coalgebra itself partitions pretty well. - - #+NAME: kanban_benchmarks - | Model | Constants | Partition | - |--------+-----------+-----------| - | kanban | t=1 | | - | kanban | t=2 | | - | kanban | t=3 | | - | kanban | t=4 | | - - Results: - - #+CALL: bench(kanban_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------+--------+-----------+--------+---------+--------+-----+--------+--------+---------+---------------+--------------+--------------+--------------+---------------+--------------+------| - | kanban | t=1 | | 160 | 616 | 160 | 63 | 160 | 160 | 584 | 0.0035293670 | 0.0027577500 | 0.0002127660 | 0.0002967780 | 0.0005807870 | 0.001957585 | NA | - | kanban | t=2 | | 4600 | 28120 | 4600 | 138 | 4600 | 4600 | 31996 | 0.0845046560 | 0.0525366560 | 0.0133163970 | 0.0102044590 | 0.0263515370 | 0.151409559 | NA | - | kanban | t=3 | | 58400 | 446400 | 58400 | 188 | 58400 | 58400 | 484533 | 1.8091822700 | 0.8656578580 | 0.2273689800 | 0.4913825500 | 0.8316374780 | 0.379954446 | NA | - | kanban | t=4 | | 454475 | 3979850 | 454475 | 205 | 454475 | 454475 | 4145639 | 20.6806881570 | 9.0696400970 | 2.5312314400 | 7.1832748850 | 10.2826909110 | 5.079570712 | NA | - -** Leader Election Protocol -*** Synchronous -:PROPERTIES: -:ID: fcc30abf-3473-429b-ade2-0900e6825042 -:END: - - #+BEGIN_QUOTE - This case study is based on the synchronous leader election protocol of Itai & Rodeh [IR90]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/synchronous_leader.php - #+END_QUOTE - - Benchmarks: - - We initially partition on the respective local states of all processes. - - #+NAME: leader_sync_benchmarks - | Model | Constants | Partition | - |-------------+-------------+----------------| - | leader_sync | N=3,K=2,L=1 | s1,s2,s3 | - | leader_sync | N=3,K=3,L=1 | s1,s2,s3 | - | leader_sync | N=3,K=4,L=1 | s1,s2,s3 | - | leader_sync | N=4,K=2,L=1 | s1,s2,s3,s4 | - | leader_sync | N=4,K=3,L=1 | s1,s2,s3,s4 | - | leader_sync | N=4,K=4,L=1 | s1,s2,s3,s4 | - | leader_sync | N=5,K=2,L=1 | s1,s2,s3,s4,s5 | - | leader_sync | N=5,K=3,L=1 | s1,s2,s3,s4,s5 | - | leader_sync | N=5,K=4,L=1 | s1,s2,s3,s4,s5 | - - Results: - - #+CALL: bench(leader_sync_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------------+-------------+----------------+--------+-------+--------+---+----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | leader_sync | N=3,K=2,L=1 | s1,s2,s3 | 26 | 33 | 26 | 4 | 8 | 8 | 3 | 0.0011261370 | 0.0008873720 | 0.0000668850 | 0.0000975260 | 0.0001830760 | 0.001425685 | NA | - | leader_sync | N=3,K=3,L=1 | s1,s2,s3 | 69 | 95 | 69 | 4 | 8 | 8 | 4 | 0.0015097720 | 0.0010825010 | 0.0000699380 | 0.0000615120 | 0.0001584650 | 0.001376350 | NA | - | leader_sync | N=3,K=4,L=1 | s1,s2,s3 | 147 | 210 | 147 | 4 | 8 | 8 | 5 | 0.0022074270 | 0.0018903660 | 0.0001109040 | 0.0000890860 | 0.0002318850 | 0.001483183 | NA | - | leader_sync | N=4,K=2,L=1 | s1,s2,s3,s4 | 61 | 76 | 61 | 4 | 10 | 10 | 9 | 0.0012056580 | 0.0010085850 | 0.0000633110 | 0.0000579530 | 0.0001401530 | 0.001605176 | NA | - | leader_sync | N=4,K=3,L=1 | s1,s2,s3,s4 | 274 | 354 | 274 | 4 | 10 | 10 | 22 | 0.0031891820 | 0.0024679180 | 0.0003274110 | 0.0001492080 | 0.0005299830 | 0.001830196 | NA | - | leader_sync | N=4,K=4,L=1 | s1,s2,s3,s4 | 812 | 1067 | 812 | 4 | 10 | 10 | 41 | 0.0086410250 | 0.0058045520 | 0.0011613200 | 0.0005618120 | 0.0021124430 | 0.002080188 | NA | - | leader_sync | N=5,K=2,L=1 | s1,s2,s3,s4,s5 | 141 | 172 | 141 | 4 | 12 | 12 | 11 | 0.0020531090 | 0.0016603120 | 0.0001839930 | 0.0000896080 | 0.0003088410 | 0.001703827 | NA | - | leader_sync | N=5,K=3,L=1 | s1,s2,s3,s4,s5 | 1050 | 1292 | 1050 | 4 | 12 | 12 | 64 | 0.0118074260 | 0.0079930730 | 0.0012989110 | 0.0007590220 | 0.0027172380 | 0.002489031 | NA | - | leader_sync | N=5,K=4,L=1 | s1,s2,s3,s4,s5 | 4244 | 5267 | 4244 | 4 | 12 | 12 | 125 | 0.0492064960 | 0.0303649000 | 0.0077673220 | 0.0064060210 | 0.0154437500 | 0.004702621 | NA | - -*** Asynchronous -:PROPERTIES: -:ID: e6b7cd19-fdf8-4c34-8a16-5429102fe2b6 -:END: - - #+BEGIN_QUOTE - This case study is based on the asynchronous leader election protocol of Itai & Rodeh [IR90]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/asynchronous_leader.php - #+END_QUOTE - - Benchmarks: - - We initially partition on the respective local states of all processes. - - #+NAME: leader_async_benchmarks - | Model | Constants | Partition | - |--------------+-----------+----------------| - | leader_async | N=3,K=1 | s1,s2,s3 | - | leader_async | N=4,K=1 | s1,s2,s3,s4 | - | leader_async | N=5,K=1 | s1,s2,s3,s4,s5 | - - Results: - - #+CALL: bench(leader_async_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------------+---------+----------------+--------+--------+--------+-----+-------+------+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | leader_async | N=3,K=1 | s1,s2,s3 | 937 | 1227 | 364 | 57 | 385 | 171 | 100 | 0.0114401660 | 0.0059803830 | 0.0026568900 | 0.0018486450 | 0.0047440420 | 0.002268829 | 171 | - | leader_async | N=4,K=1 | s1,s2,s3,s4 | 9424 | 13396 | 3172 | 221 | 2974 | 1169 | 724 | 0.1549121930 | 0.0635229990 | 0.0411555370 | 0.0399712740 | 0.0853628400 | 0.009218520 | 1169 | - | leader_async | N=5,K=1 | s1,s2,s3,s4,s5 | 92284 | 139350 | 27299 | 868 | 22626 | 7948 | 5064 | 1.9666992650 | 0.7098582570 | 0.5072619060 | 0.5892218320 | 1.1746346370 | 0.121196583 | 7948 | - -** Molecules -:PROPERTIES: -:ID: 2fc0e60e-721b-47b7-9606-dfb32118fe47 -:END: - - #+BEGIN_QUOTE - This case study models several simple molecular reactions: - - - Na + Cl <-> Na+ + Cl- - - K + Na + 2Cl <-> K+ + Na- + 2Cl- - - Mg + 2Cl <-> Mg+2 + 2Cl- - - These are taken from Ehud Shapiro's lecture notes on Biomolecular Processes as Concurrent Computation [Sha]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/molecules.php - #+END_QUOTE - - Benchmarks: - - We partition on the current number of ~Na~ or ~Mg~ atoms at the current - state. - - #+NAME: molecules_benchmarks - | Model | Constants | Partition | - |-------+---------------------------------------+-----------| - | nacl | N1=10,N2=10,T=0:0.001:0.006,i=4 | na | - | nacl | N1=10,N2=10,T=0:0.001:0.006,i=0 | na | - | nacl | N1=10,N2=10,T=0,i=0 | na | - | knacl | N1=10,N2=10,N3=10,T=0:0.001:0.006,i=4 | na | - | knacl | N1=10,N2=10,N3=10,T=0:0.001:0.006,i=0 | na | - | knacl | N1=10,N2=10,N3=10,T=0,i=0 | na | - | mc | N1=10,N2=10,T=0:0.001:0.006,i=4 | mg | - | mc | N1=10,N2=10,T=0:0.001:0.006,i=0 | mg | - | mc | N1=10,N2=10,T=0i=0 | mg | - - Results: - - #+CALL: bench(molecules_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+---------------------------------------+-----------+--------+-------+--------+----+----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | nacl | N1=10,N2=10,T=0:0.001:0.006,i=4 | na | 11 | 20 | 11 | 11 | 11 | 11 | 19 | 0.0006936910 | 0.0005806090 | 0.0000383150 | 0.0000131620 | 0.0000692840 | 0.001467669 | NA | - | nacl | N1=10,N2=10,T=0:0.001:0.006,i=0 | na | 11 | 20 | 11 | 11 | 11 | 11 | 19 | 0.0007232610 | 0.0006209010 | 0.0000312240 | 0.0000126100 | 0.0000607890 | 0.001385457 | NA | - | nacl | N1=10,N2=10,T=0,i=0 | na | 11 | 20 | 11 | 11 | 11 | 11 | 19 | 0.0008047070 | 0.0006996310 | 0.0000318730 | 0.0000132890 | 0.0000628290 | 0.001539412 | NA | - | knacl | N1=10,N2=10,N3=10,T=0:0.001:0.006,i=4 | na | 66 | 220 | 66 | 66 | 66 | 66 | 218 | 0.0018716320 | 0.0016524530 | 0.0000806560 | 0.0000363960 | 0.0001412880 | 0.001596522 | NA | - | knacl | N1=10,N2=10,N3=10,T=0:0.001:0.006,i=0 | na | 66 | 220 | 66 | 66 | 66 | 66 | 218 | 0.0024822640 | 0.0022006060 | 0.0001195270 | 0.0000290760 | 0.0001879910 | 0.001583101 | NA | - | knacl | N1=10,N2=10,N3=10,T=0,i=0 | na | 66 | 220 | 66 | 66 | 66 | 66 | 218 | 0.0018328980 | 0.0016366420 | 0.0000831910 | 0.0000205740 | 0.0001278490 | 0.001707427 | NA | - | mc | N1=10,N2=10,T=0:0.001:0.006,i=4 | mg | 36 | 110 | 36 | 36 | 36 | 36 | 109 | 0.0011844780 | 0.0010416150 | 0.0000503610 | 0.0000144850 | 0.0000809270 | 0.001584403 | NA | - | mc | N1=10,N2=10,T=0:0.001:0.006,i=0 | mg | 36 | 110 | 36 | 36 | 36 | 36 | 109 | 0.0011972170 | 0.0010458730 | 0.0000496930 | 0.0000144850 | 0.0000803150 | 0.001653878 | NA | - | mc | N1=10,N2=10,T=0i=0 | mg | 36 | 110 | 36 | 36 | 36 | 36 | 109 | 0.0011372140 | 0.0009994990 | 0.0000512750 | 0.0000140010 | 0.0000815090 | 0.001643996 | NA | - -** Mutual Exclusion -:PROPERTIES: -:ID: e8ac9d4d-0ed9-4cc2-85ea-359a5261442c -:END: - - #+BEGIN_QUOTE - This case study is based on Pnueli and Zuck's [PZ86] probabilistic symmetric - solution to the n-process mutual exclusion problem. - - For reference, these are the local states of each process: - | No: | No: | Description: | State: | - |-----+-----+--------------------------+--------------| - | 0 | 0 | idle | uninterested | - | 1 | 1 | trying | uninterested | - | 2 | 2 | trying | enter | - | 3 | 3 | trying | enter | - | 4 | 7 | trying | high | - | 5 | 8 | trying | high | - | 6 | 9 | trying | tie | - | 7 | 10 | trying | low | - | 8 | 11 | trying | low | - | 9 | 12 | trying | tie | - | 10 | 13 | in critical section | high | - | 11 | 14 | in critical section | high | - | 12 | 15 | in critical section | high | - | 13 | 17 | in critical section | high | - | 14 | 18 | leaving critical section | admit | - | 15 | 19 | leaving critical section | admit | - - For more information, see: http://www.prismmodelchecker.org/casestudies/mutual.php - #+END_QUOTE - - I don't include ~mutual8~ and ~mutual10~ here, since ~mutual8~ already - produced an 11 GB transaction file, which my computer doesn't have the memory - to even convert to CoPaR's input format. - - We partition on the state of the first process. - - Benchmarks: - - #+NAME: mutual_benchmarks - | Model | Constants | Partition | - |--------+-----------+-----------| - | mutual | N=3 | p1 | - | mutual | N=4 | p1 | - | mutual | N=5 | p1 | - - Results: - - #+CALL: bench(mutual_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------+--------+-----------+---------+---------+--------+----+---------+--------+---------+---------------+---------------+---------------+---------------+---------------+--------------+--------| - | mutual | N=3 | p1 | 10636 | 16992 | 2368 | 22 | 7978 | 2220 | 5921 | 0.2019455650 | 0.0703412350 | 0.0424574750 | 0.0769162890 | 0.1238906080 | 0.113024788 | 2220 | - | mutual | N=4 | p1 | 157184 | 266576 | 27600 | 24 | 118224 | 26682 | 103462 | 4.3537811680 | 1.1411224410 | 0.7291466170 | 2.0216322970 | 3.0423430190 | 0.278805850 | 26682 | - | mutual | N=5 | p1 | 2130240 | 3751600 | 308800 | 26 | 1604356 | 303608 | 1483271 | 85.9962595640 | 19.3640643730 | 16.7449184410 | 42.2897042540 | 62.1227017060 | 4.923615233 | 303608 | - -** Peer-to-Peer Protocol -:PROPERTIES: -:ID: 8f53a247-e80e-4b29-b0e9-34bd29aa91ff -:END: - - #+BEGIN_QUOTE - This case study models a very simple peer-to-peer protocol, loosely based on BitTorrent. - - For more information, see: http://www.prismmodelchecker.org/casestudies/peer2peer.php - #+END_QUOTE - - Benchmarks: - - The initial partition is derived from the current download process of client1. - - #+NAME: peer2peer_benchmarks - | Model | Constants | Partition | - |-----------+---------------+-----------------| - | peer2peer | N=4,K=4,T=1.1 | b11,b12,b13,b14 | - | peer2peer | N=5,K=4,T=1.1 | b11,b12,b13,b14 | - - Results: - - #+CALL: bench(peer2peer_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-----------+---------------+-----------------+---------+----------+---------+-----+------+------+------+---------------+---------------+---------------+---------------+---------------+--------------+------| - | peer2peer | N=4,K=4,T=1.1 | b11,b12,b13,b14 | 65536 | 524289 | 65536 | 143 | 2595 | 2595 | 1423 | 3.7316735590 | 1.6372802810 | 0.6629852480 | 1.1867859750 | 1.9638201450 | 0.261887081 | NA | - | peer2peer | N=5,K=4,T=1.1 | b11,b12,b13,b14 | 1048576 | 10485761 | 1048576 | 416 | 4575 | 4575 | 1738 | 89.1275273410 | 37.1055019560 | 16.3894437490 | 30.2417840130 | 49.5512363070 | 5.953450908 | NA | - -** PEPA - - #+BEGIN_QUOTE - These examples are adapted from those on the PEPA webpage: - - http://www.dcs.ed.ac.uk/pepa/examples.html - #+END_QUOTE - - We can't use this currently, as the model isn't in the normal PRISM language - and requires the special flag ~-importpepa~ to use it. Our python currenlty - doesn't support that. - -** Dining Philosophers -*** Original -:PROPERTIES: -:ID: eb035abb-aa5a-4edd-a193-605fbfb386d5 -:END: - - #+BEGIN_QUOTE - This case study is based on Lehmann and Rabin's solution to the well known dining philosophers problem [LR81]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/phil.php - #+END_QUOTE - - Benchmarks: - - For the initial partition, we differentiate on the current state of the first - philosopher. - - Although the ~auto~ file goes to ~N=9~, the memory usage of CoPaR on ~N=6~ is - already over the limit of my system (16GB). - - #+NAME: phil_original_benchmarks - | Model | Constants | Partition | - |---------------+-----------+-----------| - | phil_original | N=3 | p1 | - | phil_original | N=4 | p1 | - | phil_original | N=5 | p1 | - - Results: - - #+CALL: bench(phil_original_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |---------------+--------+-----------+--------+---------+--------+----+--------+-------+--------+---------------+--------------+--------------+---------------+---------------+--------------+-------| - | phil_original | N=3 | p1 | 4298 | 7038 | 956 | 18 | 3476 | 956 | 2918 | 0.0850968110 | 0.0385582620 | 0.0139462220 | 0.0284026650 | 0.0442237230 | 0.006178703 | 956 | - | phil_original | N=4 | p1 | 53440 | 92656 | 9440 | 20 | 42227 | 9440 | 40917 | 1.3897395050 | 0.3895630360 | 0.3158503200 | 0.5947657080 | 0.9424930210 | 0.141154620 | 9440 | - | phil_original | N=5 | p1 | 635298 | 1141830 | 93068 | 22 | 494654 | 93068 | 528298 | 23.2253278090 | 5.6642915180 | 4.6927226990 | 11.3302278460 | 16.7053319470 | 1.346441694 | 93068 | - -*** No Fair -:PROPERTIES: -:ID: 2d736b3d-a5c8-4485-9065-0724cd79efcd -:END: - - #+BEGIN_QUOTE - This case study is based on Lehmann and Rabin's solution to the well known - dining philosophers problem [LR81]. It considers the version presented in - [DFP04] which removes the need to consider 'fairness' assumptions on the - scheduling mechanism. - - For more information, see: http://www.prismmodelchecker.org/casestudies/phil.php - #+END_QUOTE - - As above, the initial partition is determined by the state of the first - philosopher. - - Benchmarks: - - #+NAME: phil_nofair_benchmarks - | Model | Constants | Partition | - |-------------+-----------+-----------| - | phil_nofair | N=3,K=1 | p1 | - | phil_nofair | N=4,K=1 | p1 | - - Results: - - #+CALL: bench(phil_nofair_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------------+---------+-----------+--------+-------+--------+----+-------+------+-------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | phil_nofair | N=3,K=1 | p1 | 3650 | 5742 | 956 | 16 | 3023 | 956 | 2683 | 0.0592746560 | 0.0248430880 | 0.0122072230 | 0.0180669160 | 0.0312848240 | 0.005367682 | 956 | - | phil_nofair | N=4,K=1 | p1 | 44904 | 75584 | 9440 | 18 | 36509 | 9440 | 38332 | 1.1399154410 | 0.3453988980 | 0.2401662920 | 0.4899106610 | 0.7572538220 | 0.113009046 | 9440 | - -** Cyclic Server Polling -:PROPERTIES: -:ID: 7e4f230d-5ee9-4d00-84bd-1b2a936e2fee -:END: - - #+BEGIN_QUOTE - This case study is based on a cyclic server polling system, taken from [IT90]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/polling.php - #+END_QUOTE - - Benchmarks: - - The initial partition is determined by the current station. - - #+NAME: poll_benchmarks - | Model | Constants | Partition | - |-------+-----------+-----------| - | poll | N=2,T=50 | s | - | poll | N=3,T=50 | s | - | poll | N=4,T=50 | s | - | poll | N=5,T=50 | s | - | poll | N=6,T=50 | s | - | poll | N=7,T=50 | s | - | poll | N=8,T=50 | s | - | poll | N=9,T=50 | s | - - Results: - - #+CALL: bench(poll_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+----------+-----------+--------+-------+--------+-----+------+------+-------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | poll | N=2,T=50 | s | 12 | 22 | 12 | 10 | 12 | 12 | 18 | 0.0008483950 | 0.0006841860 | 0.0000355220 | 0.0000492120 | 0.0001176020 | 0.001614123 | NA | - | poll | N=3,T=50 | s | 36 | 84 | 36 | 21 | 36 | 36 | 59 | 0.0011711260 | 0.0009708210 | 0.0000515500 | 0.0000792950 | 0.0001463870 | 0.001475102 | NA | - | poll | N=4,T=50 | s | 96 | 272 | 96 | 36 | 96 | 96 | 189 | 0.0022220210 | 0.0017541980 | 0.0002040780 | 0.0001504100 | 0.0003847900 | 0.001608076 | NA | - | poll | N=5,T=50 | s | 240 | 800 | 240 | 69 | 240 | 240 | 636 | 0.0050187920 | 0.0034426060 | 0.0005370600 | 0.0006597340 | 0.0012748220 | 0.002082991 | NA | - | poll | N=6,T=50 | s | 576 | 2208 | 576 | 78 | 576 | 576 | 1427 | 0.0134682950 | 0.0085022040 | 0.0014425170 | 0.0023570030 | 0.0044400710 | 0.003906478 | NA | - | poll | N=7,T=50 | s | 1344 | 5824 | 1344 | 117 | 1344 | 1344 | 4380 | 0.0438199740 | 0.0261821490 | 0.0060602420 | 0.0088203580 | 0.0156700730 | 0.146802595 | NA | - | poll | N=8,T=50 | s | 3072 | 14848 | 3072 | 136 | 3072 | 3072 | 10300 | 0.0971086310 | 0.0464659790 | 0.0170125600 | 0.0280937530 | 0.0469848680 | 0.149056317 | NA | - | poll | N=9,T=50 | s | 6912 | 36864 | 6912 | 171 | 6912 | 6912 | 26212 | 0.2728167060 | 0.1187546460 | 0.0438468550 | 0.0901830570 | 0.1413547160 | 0.174681553 | NA | - -** Mutual Exclusion à la Rabin -:PROPERTIES: -:ID: 754e893c-474b-4a3b-a870-7bb69d4c4a0b -:END: - - #+BEGIN_QUOTE - This case study is based on Rabin's solution to the well known mutual exclusion problem [Rab82]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/rabin.php - #+END_QUOTE - - Benchmarks: - - We partition on the state of the first process initially. - - Unfortunately, we can only test N upto 4, since the size of the transaction - file for N=5 is already 5 GB. - - #+NAME: rabin_benchmarks - | Model | Constants | Partition | - |-------+-----------+-----------| - | rabin | N=3 | p1 | - | rabin | N=4 | p1 | - - #+CALL: bench(rabin_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------+--------+-----------+---------+---------+--------+---+--------+--------+------+---------------+---------------+---------------+---------------+---------------+--------------+--------| - | rabin | N=3 | p1 | 73402 | 183438 | 27766 | 6 | 11348 | 6389 | 0 | 2.2583024290 | 0.7124565070 | 0.3522928110 | 1.0694487250 | 1.4813627410 | 0.130309093 | 6389 | - | rabin | N=4 | p1 | 1839572 | 4808224 | 668836 | 7 | 240744 | 126402 | 0 | 90.3695585910 | 25.3093680120 | 11.9820889700 | 46.3475014590 | 61.5265400030 | 4.535178263 | 126402 | - -** Self Stabilisation -*** Beauquier -:PROPERTIES: -:ID: 94785b23-df89-4daa-a615-ba97a16661a0 -:END: - - #+BEGIN_QUOTE - This case study is based on Beauquier, Gradinariu and Johnen's self-stabilising algorithm [BGJ99]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/self-stabilisation.php - #+END_QUOTE - - Benchmarks: - - We partition on the state of the first process. - - #+NAME: beauquier_benchmarks - | Model | Constants | Partition | - |-----------+-------------------+-----------| - | beauquier | N=3,K=0,k=0 | d1,p1 | - | beauquier | N=3,K=0,k=1:2:3 | d1,p1 | - | beauquier | N=3,K=1:1:100,k=3 | d1,p1 | - - Results: - - #+CALL: bench(beauquier_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-----------+-------------------+-----------+--------+-------+--------+---+-----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | beauquier | N=3,K=0,k=0 | d1,p1 | 160 | 240 | 64 | 7 | 156 | 64 | 70 | 0.0054042780 | 0.0043894410 | 0.0003494090 | 0.0004709010 | 0.0008911640 | 0.001732362 | 64 | - | beauquier | N=3,K=0,k=1:2:3 | d1,p1 | 160 | 240 | 64 | 7 | 156 | 64 | 70 | 0.0026586000 | 0.0018153220 | 0.0002680470 | 0.0004496140 | 0.0007550450 | 0.001701858 | 64 | - | beauquier | N=3,K=1:1:100,k=3 | d1,p1 | 160 | 240 | 64 | 7 | 156 | 64 | 70 | 0.0026884210 | 0.0018925630 | 0.0002718390 | 0.0004044380 | 0.0007133480 | 0.001542218 | 64 | - -*** Herman -:PROPERTIES: -:ID: ab8fc607-28eb-4618-9369-20353be3b7ec -:END: - - #+BEGIN_QUOTE - This case study is based on Herman's self-stabilising algorithm [Her90]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/self-stabilisation.php - #+END_QUOTE - - Benchmarks: - - We partition on the state of the first process. - - #+NAME: herman_benchmarks - | Model | Constants | Partition | - |--------+--------------------+-----------| - | herman | N=11,K=0,k=0 | x1 | - | herman | N=13,K=0,k=0 | x1 | - | herman | N=15,K=0,k=0 | x1 | - - Results: - - #+CALL: bench(herman_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------+--------------+-----------+--------+----------+--------+---+-------+-------+----------+---------------+---------------+--------------+---------------+---------------+--------------+------| - | herman | N=11,K=0,k=0 | x1 | 2048 | 177148 | 2048 | 4 | 2048 | 2048 | 271341 | 0.5366140250 | 0.3206644650 | 0.0822131960 | 0.1083287110 | 0.2124922160 | 0.159943487 | NA | - | herman | N=13,K=0,k=0 | x1 | 8192 | 1594324 | 8192 | 4 | 8192 | 8192 | 2146545 | 4.8963375250 | 2.7911046460 | 0.3606212620 | 1.1401700670 | 2.0782951680 | 1.317832894 | NA | - | herman | N=15,K=0,k=0 | x1 | 32768 | 14348908 | 32768 | 4 | 32768 | 32768 | 24579335 | 49.8407456710 | 32.0083210790 | 3.4641624420 | 12.3775878660 | 17.6873562750 | 15.226739963 | NA | - -*** Israeli and Jalfon -:PROPERTIES: -:ID: c6c91d7d-0c6e-41ff-8610-7f1cd020393d -:END: - - #+BEGIN_QUOTE - This case study is based on Israeli and Jalfon's self-stabilising algorithm [IJ90]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/self-stabilisation.php - #+END_QUOTE - - Benchmarks: - - We partition on the state of the first process: - - #+NAME: ij_benchmarks - | Model | Constants | Partition | - |----------------+-------------------+-----------| - | israeli-jalfon | N=3,K=0,k=0 | q1 | - | israeli-jalfon | N=3,K=0,k=1:1:3 | q1 | - | israeli-jalfon | N=3,K=1:1:100,k=0 | q1 | - - Results: - - #+CALL: bench(ij_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |----------------+-------------------+-----------+--------+-------+--------+---+----+-----+------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | israeli-jalfon | N=3,K=0,k=0 | q1 | 19 | 33 | 7 | 5 | 14 | 5 | 9 | 0.0012083740 | 0.0010020590 | 0.0000514580 | 0.0000869100 | 0.0001614120 | 0.001514328 | 5 | - | israeli-jalfon | N=3,K=0,k=1:1:3 | q1 | 19 | 33 | 7 | 5 | 14 | 5 | 9 | 0.0009209260 | 0.0007316150 | 0.0000577930 | 0.0000717430 | 0.0001501250 | 0.001682336 | 5 | - | israeli-jalfon | N=3,K=1:1:100,k=0 | q1 | 19 | 33 | 7 | 5 | 14 | 5 | 9 | 0.0009256730 | 0.0007310420 | 0.0000577220 | 0.0000682320 | 0.0001451640 | 0.001568259 | 5 | - -** Tandem Queueing Network -:PROPERTIES: -:ID: f4d75ba1-5bd9-427f-846a-c233037887d8 -:END: - - #+BEGIN_QUOTE - This case study is based on a simple tandem queueing network, taken from [HMKS99]. - - For more information, see: http://www.prismmodelchecker.org/casestudies/tandem.php - #+END_QUOTE - - Benchmarks: - - We partition on the current utilization of the first queue. - - #+NAME: tandem_benchmarks - | Model | Constants | Partition | - |--------+-----------+-----------| - | tandem | T=1,c=3 | sc | - | tandem | T=1,c=7 | sc | - | tandem | T=1,c=15 | sc | - | tandem | T=1,c=31 | sc | - | tandem | T=1,c=63 | sc | - | tandem | T=1,c=127 | sc | - | tandem | T=1,c=255 | sc | - - Results: - - #+CALL: bench(tandem_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |--------+-----------+-----------+--------+--------+--------+------+--------+--------+--------+--------------+--------------+--------------+--------------+--------------+--------------+------| - | tandem | T=1,c=3 | sc | 28 | 71 | 28 | 14 | 28 | 28 | 67 | 0.0012204660 | 0.0010410840 | 0.0000436570 | 0.0000566860 | 0.0001147310 | 0.001533843 | NA | - | tandem | T=1,c=7 | sc | 120 | 363 | 120 | 30 | 120 | 120 | 306 | 0.0028063490 | 0.0021379790 | 0.0002532330 | 0.0002302300 | 0.0005184930 | 0.002015983 | NA | - | tandem | T=1,c=15 | sc | 496 | 1619 | 496 | 62 | 496 | 496 | 1331 | 0.0098958290 | 0.0055752370 | 0.0018006410 | 0.0017059840 | 0.0038092730 | 0.003074152 | NA | - | tandem | T=1,c=31 | sc | 2016 | 6819 | 2016 | 126 | 2016 | 2016 | 5251 | 0.0469872290 | 0.0229718530 | 0.0080544630 | 0.0129506950 | 0.0220459930 | 0.153096167 | NA | - | tandem | T=1,c=63 | sc | 8128 | 27971 | 8128 | 254 | 8128 | 8128 | 20771 | 0.2275481120 | 0.1098518430 | 0.0420433780 | 0.0568686420 | 0.1060195480 | 0.157777373 | NA | - | tandem | T=1,c=127 | sc | 32640 | 113283 | 32640 | 510 | 32640 | 32640 | 82531 | 0.9978470040 | 0.4330151870 | 0.1334547820 | 0.2972327800 | 0.5115283170 | 0.161372538 | NA | - | tandem | T=1,c=255 | sc | 130816 | 455939 | 130816 | 1022 | 130816 | 130816 | 328931 | 4.8591040570 | 2.0670770960 | 0.9269812650 | 1.3728879970 | 2.4489077610 | 0.444020561 | NA | - -** WLAN -:PROPERTIES: -:ID: c808971a-8c52-41c3-8de0-42aebe332be5 -:END: - - #+BEGIN_QUOTE - This case study concerns the IEEE 802.11 Wireless LAN - - We consider the scenario where two stations trying to send packets simultaneously. - - The PRISM model is taken from [KNS02a] using the integer semantics given in [KNS06]. In the model one time unit - corresponds to 50\mu s and to ensure integer bounds, where neccessary, scaling lower bound constraints down and - upper bound constraints up to sensure a sound abstraction. - - For more information on the probabilistic timed automata see: http://www.prismmodelchecker.org/casestudies/wlan.php - #+END_QUOTE - - Benchmarks: - - We initially partition on the state of the medium: Are messages being sent - and are they transmitted correctly or garbled. - - #+NAME: wlan_benchmarks - | Model | Constants | Partition | - |-------------------+------------------------------------+-----------| - | wlan | TRANS_TIME_MAX=10,k=2,K=0 | c1,c2 | - | wlan | TRANS_TIME_MAX=10,k=2,K=1 | c1,c2 | - | wlan | TRANS_TIME_MAX=10,k=2,K=2 | c1,c2 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=0 | c1,c2 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=2 | c1,c2 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=3 | c1,c2 | - | wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | - | wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | - - Results: - - #+CALL: bench(wlan_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-------------------+------------------------------------+-----------+---------+---------+--------+---+--------+--------+--------+---------------+---------------+--------------+---------------+---------------+--------------+--------| - | wlan | TRANS_TIME_MAX=10,k=2,K=0 | c1,c2 | 65462 | 94146 | 28480 | 9 | 49602 | 21869 | 24891 | 1.4907680020 | 0.5026076160 | 0.2945986770 | 0.5831547880 | 0.9162903700 | 0.163609992 | 21869 | - | wlan | TRANS_TIME_MAX=10,k=2,K=1 | c1,c2 | 65462 | 94146 | 28480 | 9 | 49602 | 21869 | 24891 | 1.4916662260 | 0.5080859340 | 0.2890311160 | 0.5838870710 | 0.9118207740 | 0.126401342 | 21869 | - | wlan | TRANS_TIME_MAX=10,k=2,K=2 | c1,c2 | 65462 | 94146 | 28480 | 9 | 49602 | 21869 | 24891 | 1.4926573050 | 0.5059405690 | 0.2887227640 | 0.5868386100 | 0.9145294070 | 0.142771426 | 21869 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=0 | c1,c2 | 65718 | 94452 | 28598 | 9 | 49602 | 21869 | 24886 | 1.5141671190 | 0.5187767530 | 0.2933001550 | 0.5922487230 | 0.9221007800 | 0.152518883 | 21869 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=2 | c1,c2 | 65718 | 94452 | 28598 | 9 | 49602 | 21869 | 24886 | 1.4856360770 | 0.5008109760 | 0.2896682780 | 0.5805601160 | 0.9068050890 | 0.141182039 | 21869 | - | wlan_collide | COL=2,TRANS_TIME_MAX=10,k=2,K=3 | c1,c2 | 65718 | 94452 | 28598 | 9 | 49602 | 21869 | 24886 | 1.4843975830 | 0.4955192090 | 0.2967677220 | 0.5828330410 | 0.9159187970 | 0.154033264 | 21869 | - | wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 103088 | 15.3710302540 | 5.1540280990 | 3.1144350580 | 5.6189957580 | 9.2669057860 | 0.937634369 | 107865 | - | wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 271999 | 39.7515383150 | 13.3537814010 | 6.1222019780 | 16.2128002410 | 23.8991977920 | 2.543385720 | 243325 | - -*** Comparing the 1-elem optimization - -We run a single benchmark multiple times. Once with and once without optimizations. - -#+NAME: wlan_benchmark_single -| Model | Constants | Partition | -|-------------------+------------------------------------+-----------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | - - -**** With optimizations -:PROPERTIES: -:ID: a61de2c3-45be-4184-b947-7ddcc41d451f -:END: - -#+CALL: bench(wlan_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+--------+--------+--------+---+--------+--------+--------+---------------+--------------+--------------+--------------+--------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 103088 | 15.0906499200 | 5.1550493690 | 2.9967487970 | 5.4691189410 | 8.9839650110 | 0.906231199 | 107865 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 103088 | 15.0476778900 | 5.1313616310 | 3.0210706480 | 5.4530511170 | 8.9922491330 | 0.921986645 | 107865 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 103088 | 15.1975878580 | 5.1788464490 | 3.0373609690 | 5.5238989600 | 9.0837889770 | 0.913164837 | 107865 | - -**** Without optimizations -:PROPERTIES: -:ID: 82a6bf0c-547c-4e84-baa1-98c53379d7f3 -:END: - -#+CALL: bench_noopt(wlan_benchmark_single) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+--------+--------+--------+---+--------+--------+------+---------------+--------------+--------------+--------------+--------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 0 | 15.3893624460 | 5.1767105960 | 3.0413877800 | 5.7070144040 | 9.2869304960 | 0.919612983 | 107865 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 0 | 15.3638788430 | 5.1630418130 | 3.0081672330 | 5.7031240120 | 9.2438828940 | 0.895646868 | 107865 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=0 | c1,c2 | 582327 | 771088 | 248503 | 9 | 236170 | 107865 | 0 | 15.2745021350 | 5.1306704560 | 3.0418000640 | 5.6621348040 | 9.2231714690 | 0.988643949 | 107865 | - -*** Comparing the optimizations - -This time with a different benchmark - -#+NAME: wlan_benchmark_single2 -| Model | Constants | Partition | -|-------------------+------------------------------------+-----------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | - - -**** With both optimizations -:PROPERTIES: -:ID: d39b3290-297b-4063-8464-a011a048eff4 -:END: - -#+CALL: bench(wlan_benchmark_single2) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+---------+---------+--------+---+--------+--------+--------+---------------+---------------+--------------+---------------+---------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 271999 | 39.3637329540 | 13.2453896050 | 6.0643303750 | 16.0121625480 | 23.5999972580 | 2.532994467 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 271999 | 39.4646461980 | 13.0936489980 | 6.0869881880 | 16.2522690080 | 23.8950358450 | 2.475905320 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 271999 | 39.0647377280 | 13.0970151140 | 6.0643634280 | 15.9493142430 | 23.5259992150 | 2.651193004 | 243325 | - -**** Without any optimization -:PROPERTIES: -:ID: 408056f6-53de-4920-ba53-9308bb2fbf15 -:END: - -#+CALL: bench_sloooow(wlan_benchmark_single2) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+---------+---------+--------+----+---------+--------+------+---------------+---------------+--------------+---------------+---------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 0 | 62.8032399420 | 24.0298961220 | 8.0328573550 | 23.0904043580 | 33.8712151930 | 2.533598832 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 0 | 62.8096335930 | 23.9130181410 | 8.0323240210 | 23.1153711080 | 33.9856103020 | 2.672804745 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 0 | 62.8848181530 | 24.0303139130 | 8.0121181690 | 23.1079646660 | 33.9319790150 | 2.528242842 | 243325 | - -**** With only functor rewrite -:PROPERTIES: -:ID: eb6cd726-026c-49ec-974a-1b6285d0fabb -:END: - -#+CALL: bench_noopt(wlan_benchmark_single2) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+---------+---------+--------+---+--------+--------+------+---------------+---------------+--------------+---------------+---------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 0 | 40.4820614570 | 13.3353128550 | 6.1625531160 | 16.9365448810 | 24.6478678180 | 2.697483848 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 0 | 40.5545896510 | 13.4405492660 | 6.1304969200 | 16.8959012700 | 24.5962440200 | 2.516830279 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 1408676 | 1963522 | 607727 | 9 | 543056 | 243325 | 0 | 40.8296828650 | 13.4560628920 | 6.1831625030 | 17.1048950840 | 24.8651696430 | 2.539904578 | 243325 | - -**** With only 1-elem optimization -:PROPERTIES: -:ID: 74566779-0749-4bbd-9556-80f857144793 -:END: - -#+CALL: bench_nofunctrans(wlan_benchmark_single2) - -#+RESULTS: -| Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | -|-------------------+------------------------------------+-----------+---------+---------+--------+----+---------+--------+--------+---------------+---------------+--------------+---------------+---------------+--------------+--------| -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 272066 | 62.3224133500 | 24.0014545030 | 8.0163584000 | 22.5763681410 | 33.3185527870 | 2.538228830 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 272066 | 62.4165430840 | 23.9578211250 | 8.0180667980 | 22.6588742730 | 33.4171848350 | 2.526273353 | 243325 | -| wlan_time_bounded | TRANS_TIME_MAX=10,DEADLINE=100,K=1 | c1,c2 | 2817352 | 3372198 | 607727 | 11 | 1038591 | 243325 | 272066 | 62.8521293030 | 23.9960135000 | 8.1913510000 | 22.7039631120 | 33.7983183080 | 2.539817679 | 243325 | - -** Zeroconf -:PROPERTIES: -:ID: e8a80143-4f49-4109-8f58-950514ada685 -:END: - - #+BEGIN_QUOTE - This case study concerns the IPv4 Zeroconf Protocol [CAG02] - - We consider the probabilistic timed automata models presented in [KNPS06] using - the integer semantics also presented in the paper. - - For more information, see: http://www.prismmodelchecker.org/casestudies/zeroconf.php - - ===================================================================================== - - PARAMETERS - - - reset :: reset is true/false dependent on whether the reset/norest model is to be analysed - - loss :: probability of message (0.1, 0.01, 0.001 and 0) - - K :: number of probes (4 in standard) 1:1:8 - - N :: number of concrete hosts, e.g. 20 or 1000 for small/large network - - err :: error cost from 1e+6 to 1e+12 - - bound :: time bound from 0:50 (then set T to be 1+maximum value of bound in experiment) - #+END_QUOTE - - Benchmarks: - - We partition on part of the current state of the environment. - - #+NAME: zeroconf_benchmarks - | Model | Constants | Partition | - |-----------------------+--------------------------------------+-----------| - | zeroconf | N=1000,K=4,err=0,reset=true | n,n0,n1,b | - | zeroconf | N=1000,K=4,err=0,reset=false | n,n0,n1,b | - | zeroconf_time_bounded | N=1000,K=1,T=11,bound=10,reset=true | n,n0,n1,b | - | zeroconf_time_bounded | N=1000,K=1,T=11,bound=10,reset=false | n,n0,n1,b | - - Results: - - #+CALL: bench(zeroconf_benchmarks) - - #+RESULTS: - | Model | Consts | Partition | States | Edges | Sort 0 | I | Q | Q_0 | Opts | t(s) | t_p(s) | t_i(s) | t_r(s) | t_a(s) | t_valmari(s) | Q_0v | - |-----------------------+--------------------------------------+-----------+--------+---------+--------+------+--------+--------+--------+---------------+--------------+--------------+--------------+---------------+--------------+--------| - | zeroconf | N=1000,K=4,err=0,reset=true | n,n0,n1,b | 2443 | 2968 | 1088 | 16 | 1206 | 580 | 179 | 0.0358108630 | 0.0167680330 | 0.0057826350 | 0.0103080610 | 0.0170235500 | 0.003827381 | 578 | - | zeroconf | N=1000,K=4,err=0,reset=false | n,n0,n1,b | 876995 | 1281359 | 307768 | 1722 | 435509 | 194292 | 195033 | 23.5491846280 | 7.4090193180 | 4.6009392190 | 8.3819097560 | 14.8418591750 | 1.670716063 | 194290 | - | zeroconf_time_bounded | N=1000,K=1,T=11,bound=10,reset=true | n,n0,n1,b | 9523 | 11992 | 4214 | 17 | 4375 | 2102 | 1140 | 0.1552350690 | 0.0627752380 | 0.0336032210 | 0.0461910700 | 0.0833916190 | 0.125739644 | 2102 | - | zeroconf_time_bounded | N=1000,K=1,T=11,bound=10,reset=false | n,n0,n1,b | 37160 | 51852 | 14834 | 59 | 16412 | 7525 | 6791 | 0.8208913870 | 0.2498574720 | 0.1718957150 | 0.3022022560 | 0.4914674350 | 0.122138130 | 7525 | diff --git a/prism/valmari-extract-sort1.hs b/prism/valmari-extract-sort1.hs deleted file mode 100644 index c12caeb..0000000 --- a/prism/valmari-extract-sort1.hs +++ /dev/null @@ -1,55 +0,0 @@ --- Usage: --- --- mdpmin < input.valmari | runhaskell valmari-extract-sort1.hs mdp --- --- This is a small script that extracts the size of sort 1 from the output of --- the valmari tool for MDPs. - - --- This exploits the fact that the valmari implementation prints a list of final --- blocks that are descendants of a corresponding initial block. Since all --- states that are _not_ in sort 1 share one block initially, we just have to --- count the final blocks that origin form all other initial blocks. --- --- This is particularly easy, since valmari omits the first block from the in- --- and output. Since the first block is the block of non-sort-1 states in our --- input, we just have to count all the states in all blocks printed in the --- outpu. - - -module Main where - -import System.Environment - --- | Expects the output of valmaris tool, already tokenized on whitespace and --- returns the number of final blocks that are in sort 1. --- --- --- The input format is essentially: --- --- MC ::= <sizes> <l_transitions> <w_transitions> <blocks> --- <sizes> ::= num_states num_choices num_l_trans num_w_trans num_blocks --- <l_transitions> ::= <l_transition>* --- <l_transition> ::= source choice target --- <w_transitions> ::= <w_transition>* --- <w_transition> ::= source weight target --- <blocks> ::= <block>* --- <block> ::= state* 0 - -extractSort1 :: [String] -> Int -extractSort1 (_ : _ : numLTrans' : numWTrans' : _ : rest) = - let numTrans = read numLTrans' + read numWTrans' - blocks = drop (numTrans * 3) rest -- Drop all the 'from' 'label' 'to' triples - in length (filter (/= "0") blocks) - - -main :: IO () -main = do - args <- getArgs - case args of - ["mdp"] -> do - sort1 <- (extractSort1 . words) <$> getContents - print sort1 - _ -> do - _ <- getContents -- Ignore input if not an mdp - putStrLn "NA" diff --git a/valmari_fig4/bench.py b/valmari_fig4/bench.py deleted file mode 100755 index 75d8402..0000000 --- a/valmari_fig4/bench.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/python - -import sys -import tempfile -import subprocess -import re -import os - - -def generate_model(output_file, h): - subprocess.run(["./generate.py", str(h)], stdout=output_file) - - -def extract_time(perf_output): - "returns the measured time from the perf output in seconds" - m = re.search(r'(\d+.\d+)\W+seconds time elapsed', str(perf_output)) - return m[1] - - -def run_copar(copar, input_file): - process = subprocess.run( - ['perf', 'stat', copar], - stdin=input_file, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE, - env={'LC_ALL': 'C'}) - - try: - process.check_returncode() - except subprocess.CalledProcessError as e: - err = os.fdopen(sys.stderr.fileno(), 'wb') - err.write(process.stderr) - err.flush() - raise e - - return extract_time(process.stderr) - - -def run_bench(copar, h): - model_file = tempfile.TemporaryFile() - generate_model(model_file, h) - model_file.seek(0) - time = run_copar(copar, model_file) - - print("%d %s" % (h, time)) - - -def main(args): - if len(args) != 3: - print("Usage: %s EXECUTABLE h" % args[0]) - sys.exit(1) - - copar_binary = args[1] - h = int(args[2]) - - run_bench(copar_binary, h) - - -if __name__ == "__main__": - main(sys.argv) diff --git a/valmari_fig4/benchmark.org b/valmari_fig4/benchmark.org deleted file mode 100644 index b644a3d..0000000 --- a/valmari_fig4/benchmark.org +++ /dev/null @@ -1,130 +0,0 @@ -#+TITLE: Figure 4 from Valmari & Franceschinis - -* Introduction - - This benchmark implements figure 4 from [fn:1]. It is intended to show that - the runtime complexity is indeed $O(m \log n)$ and not $O(m \log^2 n)$. - -* Benchmarking - - First, we generate the model from figure 4 for each $h$ and measure the time - to partition it. - - Replace ~../../copar/bin/copar~ by the path to the tested program and Beware: - evaluating the following snippet can take a while. - - #+BEGIN_SRC sh :exports both :eval no-export - echo h "time(s)" - for h in {4..20}; do - ./bench.py ../../copar/bin/copar $h - done - #+END_SRC - - #+NAME: benchresults - #+RESULTS: - | h | time(s) | - | 4 | 0.002862292 | - | 5 | 0.00316286 | - | 6 | 0.004661828 | - | 7 | 0.007075351 | - | 8 | 0.013313165 | - | 9 | 0.025658629 | - | 10 | 0.055067783 | - | 11 | 0.117350064 | - | 12 | 0.24884803 | - | 13 | 0.541005227 | - | 14 | 1.120708321 | - | 15 | 2.469870281 | - | 16 | 5.183162128 | - | 17 | 10.774933357 | - | 18 | 22.683064288 | - | 19 | 49.498858156 | - | 20 | 109.218546203 | - -* Interpretation - - We now try to fit the data onto possible curves using the Python library - /SciPy/. - - We first need to import a few python modules. - - #+BEGIN_SRC python :session :results none - import numpy as np - import matplotlib.pyplot as plt - from scipy.optimize import curve_fit - #+END_SRC - -** Possible functions to fit - - Here are the functions that our data could fit. As mentioned above, the - complexity should be $n \log n$ and not $n \log^2 n$. - - - The good function, implementing $n \log n$: - - #+BEGIN_SRC python :session :results none - def func_good(x, a, b): - return a * x * np.log(x) + b - #+END_SRC - - - The bad function, implementing $n \log^2 n$: - - #+BEGIN_SRC python :session :results none - def func_bad(x, a, b): - return a * x * (np.log(x)**2) + b - #+END_SRC - -** Trying to fit the data - - Let's first import the data we generated earlier into python. A model for $h$ - has $n = 2^h$ states one transition per state. - - #+BEGIN_SRC python :session :var data=benchresults :results none - xdata = np.array([2**a[0] for a in data[1:]]) - ydata = np.array([a[1] for a in data[1:]]) - #+END_SRC - - And let SciPy do its magic to calculate the fitting coefficients with the - ~curve_fit~ function for both ~func_good~ and ~func_bad~. - - #+BEGIN_SRC python :session :exports both - popt_good, pcov_good = curve_fit(func_good, xdata, ydata) - popt_bad, pcov_bad = curve_fit(func_bad, xdata, ydata) - [("", "a", "b"), - ("good", popt_good[0], popt_good[1]), - ("bad", popt_bad[0], popt_bad[1]) - ] - #+END_SRC - - #+RESULTS: - | | a | b | - | good | 7.4470666850016445e-06 | -0.21839458264866904 | - | bad | 5.417012783955984e-07 | 0.2258533257706899 | - -** Plot - - Finally, plot the real data and the fitted curves: - - #+BEGIN_SRC python :session :results file :exports both - plt.clf() - plt.xlabel("n") - plt.ylabel("time(s)") - - plt.plot(xdata, func_good(xdata, *popt_good), label='good') - plt.plot(xdata, func_bad(xdata, *popt_bad), label='bad') - plt.plot(xdata, ydata, 'o', label='measurement', fillstyle='none') - - plt.legend() - - #plt.show() - filename = "benchmarks.png" - plt.savefig(filename, dpi=150) - filename - #+END_SRC - - #+RESULTS: - [[file:benchmarks.png]] - - -* Footnotes - -[fn:1] Valmari and Franceschinis: Simple O(m log n) Time Markov Chain Lumping diff --git a/valmari_fig4/generate.py b/valmari_fig4/generate.py deleted file mode 100755 index ea1f2bd..0000000 --- a/valmari_fig4/generate.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python - -import sys - - -def gen_functor(): - print("3x(PX)\n") - - -def gen_state(block, column, row): - print("s_%d_%d: (%s, {s_%d_0})" % (column, row, block, column+1)) - - -def gen_final_state(h): - print("s_%d_0: (2, {s_%d_0})" % (h+1, h+1)) - - -def gen_n_states(block, column, n): - for row in range(0, n): - gen_state(block, column, row) - - -def gen_column(h, column): - if column == 0: - gen_n_states("0", column, 2**h) - else: - gen_n_states("1", column, 2**(column-1)) - - -def gen_all(h): - gen_functor() - gen_final_state(h) - for column in reversed(range(0, h+1)): - gen_column(h, column) - - -def main(args): - if len(args) != 2: - print("Usage: %s h" % args[0]) - sys.exit(1) - - h = int(args[1]) - gen_all(h) - - -if __name__ == "__main__": - main(sys.argv) diff --git a/wta/README.md b/wta/README.md deleted file mode 100644 index 9f79db9..0000000 --- a/wta/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Benchmarks for Weighted Tree Automata - -The benchmarks in this directory are contained in an interactive Emacs org-mode -file `benchmarks.org` that contains the commands used to generated the results -as well as the results themselves. - -Unfortunately, Gitlab's rendering of org-mode markup is poor and hides the -actual results, so this file is best viewed in a text editor (e.g. Emacs) or -[pre-rendered as PDF][1]. - -[1]: https://git8.cs.fau.de/software/copar-benchmarks/wikis/uploads/053845133bb13efa9bef4e6cc96743ba/benchmarks.pdf diff --git a/wta/bench.py b/wta/bench.py deleted file mode 100755 index 2060322..0000000 --- a/wta/bench.py +++ /dev/null @@ -1,392 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import sys -import subprocess -import json -import numpy as np -import scipy.stats as st - -samples = 5 - - -def from_maybe(default, x): - return default if x is None else x - - -# Edge Spec should be ("transitions", str) or ("zero-frequency", str) -def coalg_file(states, monoid, symbols, edge_spec, different_values, i): - if edge_spec[0] == "transitions": - return "bench/wta_%s_%s_t%s_%s_%s_%d" % (monoid, symbols, edge_spec[1], - from_maybe("", different_values), states, i) - else: - return "bench/wta_%s_%s_%s_%s_%s_%d" % (monoid, symbols, edge_spec[1], - from_maybe("", different_values), states, i) - - -def check_zerotrans(args): - if args.zero_frequency: - edge_spec = ("zero-frequency", args.zero_frequency) - elif args.transitions: - edge_spec = ("transitions", args.transitions) - elif args.out_degree: - edge_spec = ("transitions", args.out_degree) # HACK - else: - print("One of --zero-frequency and --transitions must be provided") - sys.exit(1) - - args.edge_spec = edge_spec - - -def generate(args): - check_zerotrans(args) - - if args.out_degree: - args.edge_spec = ("transitions", str(int(args.out_degree)*int(args.states))) - - generator = args.generator - states = args.states - monoid = args.monoid - symbols = args.symbols - different_values = args.different_values - edge_spec = args.edge_spec - - os.makedirs("bench", exist_ok=True) - - for i in range(0, samples): - f = coalg_file(states, monoid, symbols, edge_spec, different_values, - i) + ".coalgebra" - - if os.path.exists(f): - continue - - cmd = [generator, "--states", states, "--monoid", monoid, "--symbols", symbols] - cmd += ["--" + edge_spec[0], edge_spec[1]] - if not (different_values is None): - cmd += ["--different-values", different_values] - - subprocess.run(cmd, stdout=open(f, "w+")) - - -def run_one(args, i): - copar = args.copar - states = args.states - monoid = args.monoid - symbols = args.symbols - different_values = args.different_values - edge_spec = args.edge_spec - - f = coalg_file(states, monoid, symbols, edge_spec, different_values, i) + ".coalgebra" - - copar_args = [copar, 'refine', '--stats-json', f] - - try: - out = subprocess.run( - copar_args, - stdout=subprocess.DEVNULL, - stderr=subprocess.PIPE, - check=True) - except subprocess.CalledProcessError as e: - print("error: %s" % e.stderr.decode('utf-8')) - raise - - stats = json.loads(out.stderr.decode('utf-8')) - - stats['monoid'] = monoid - stats['symbols'] = symbols - stats['edge-spec'] = str(edge_spec) - stats['mon-values'] = from_maybe("", different_values) - stats['i'] = i - - return stats - - -def run_one_simple(args, i): - copar = args.copar - states = args.states - monoid = args.monoid - symbols = args.symbols - edge_spec = args.edge_spec - different_values= args.different_values - - f = coalg_file(states, monoid, symbols, edge_spec, different_values, i) + ".coalgebra" - - copar_args = [copar, 'refine', f] - - subprocess.run( - copar_args, - stdout=subprocess.DEVNULL, - check=True) - - -def confidence(vals): - """Compute the 95% confidence intervall (CI) for the mean with the student -distribution. - -Returns a tuple of (mean, lower, upper), where lower and upper are the bounds -of the CI""" - - # For a larger sample size (> 30), we could also use the normal - # distribution. - # - # This code is taken from - # https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data/34474255#34474255 - - mean = np.mean(vals) - ci = st.t.interval( - 0.95, len(vals) - 1, loc=np.mean(vals), scale=st.sem(vals)) - - return (mean, ci[0], ci[1]) - - -def stddev(vals): - """Compute the mean and standard deviation intervall on a sample. - -This uses the corrected sample standard deviation.""" - - # see also: - # https://en.wikipedia.org/wiki/Standard_deviation#Corrected_sample_standard_deviation - mean = np.mean(vals) - std = np.std(vals, ddof=1) - - return (mean, std) - - -def print_row(d, header, stddev): - keys = [ - 'i', 'states', 'edges', 'initial-partition-size', - 'final-partition-size', 'explicit-final-partition-size', - 'size1-skipped' - ] - - for k in [ - 'overall-duration', 'parse-duration', 'algorithm-duration', - 'initialize-duration', 'refine-duration' - ]: - keys.append(k) - if stddev: - keys.append(k + '-stddev') - - values = [d[k] for k in keys] - - if header: - print('\t'.join(keys)) - else: - print('\t'.join(str(x) for x in values)) - - -def run(args): - check_zerotrans(args) - if args.out_degree: - args.edge_spec = ("transitions", str(int(args.out_degree)*int(args.states))) - - results = [run_one(args, i) for i in range(0, samples)] - - def confidencekey(vals, k): - return confidence(list(float(x[k]) for x in vals)) - - def stddevkey(vals, k): - return stddev(list(float(x[k]) for x in vals)) - - combined = results[0].copy() - combined['i'] = samples - - for k in [ - 'overall-duration', 'parse-duration', 'initialize-duration', - 'refine-duration', 'algorithm-duration' - ]: - ci = stddevkey(results, k) - combined[k] = str(ci[0]) - combined[k + '-stddev'] = str(ci[1]) - - if args.indiv: - if args.header: - print_row(combined, True, stddev=False) - for res in results: - print_row(res, False, stddev=False) - else: - if args.header: - print_row(combined, True, stddev=args.stddev) - print_row(combined, False, stddev=args.stddev) - - -def test(args, states): - print("Trying %d..." % states) - - args.states = str(states) - if args.out_degree: - args.transitions = str(states * int(args.out_degree)) - - generate(args) - - for i in range(0, samples): - try: - run_one_simple(args, i) - except subprocess.CalledProcessError: - return False - - return True - - -def find_bad(args, good): - states = good*2 - - if test(args, states): - return find_bad(args, states) - else: - return (good, states) - - -def bisect_states(args): - check_zerotrans(args) - - global samples - samples = 1 - - states = args.start_states - - good = args.good or 0 - bad = args.bad - - if bad is None: - if good and states < good: - states = good+1 - - if test(args, states): - (good, bad) = find_bad(args, states) - else: - bad = states - - while good+1 < bad: - states = good + (bad-good)//2 - if test(args, states): - good = states - else: - bad = states - - print("First bad state count: %d" % bad) - - -def test_trans(args, transitions): - print("Trying %d..." % transitions) - - args.transitions = str(transitions) - - generate(args) - - for i in range(0, samples): - try: - run_one_simple(args, i) - except subprocess.CalledProcessError: - return False - - return True - - -def find_bad_trans(args, good): - transitions = good*2 - - if test_trans(args, transitions): - return find_bad(args, transitions) - else: - return (good, transitions) - - -def bisect_trans(args): - # Hacks and hacks and hacks - args.zero_frequency = None - args.out_degree = None - - transitions = args.start_transitions - - global samples - samples = 1 - - good = args.good or 0 - bad = args.bad - - if bad is None: - if good and transitions < good: - transitions = good+1 - - if test_trans(args, transitions): - (good, bad) = find_bad_trans(args, transitions) - else: - bad = transitions - - while good+1 < bad: - transitions = good + (bad-good)//2 - if test_trans(args, transitions): - good = transitions - else: - bad = transitions - - print("First bad transition count: %d" % bad) - - -def main(): - parser = argparse.ArgumentParser() - subparsers = parser.add_subparsers(required=True) - - gen_parser = subparsers.add_parser('generate') - gen_parser.add_argument('generator') - gen_parser.add_argument('--states', required=True) - gen_parser.add_argument('--monoid', required=True) - gen_parser.add_argument('--symbols', required=True) - gen_parser.add_argument('--zero-frequency') - gen_parser.add_argument('--transitions') - gen_parser.add_argument('--out-degree') - gen_parser.add_argument('--different-values') - gen_parser.set_defaults(func=generate) - - run_parser = subparsers.add_parser('run') - run_parser.add_argument('copar') - run_parser.add_argument('--states', required=True) - run_parser.add_argument('--monoid', required=True) - run_parser.add_argument('--symbols', required=True) - run_parser.add_argument('--zero-frequency') - run_parser.add_argument('--transitions') - run_parser.add_argument('--out-degree') - run_parser.add_argument('--different-values') - run_parser.add_argument( - '--stddev', action='store_true', help="report stddev for timings") - run_parser.add_argument( - '--indiv', action='store_true', help="report individual samples") - run_parser.add_argument( - '--header', action='store_true', help="Print header row for table") - run_parser.set_defaults(func=run) - - bisect_parser = subparsers.add_parser('bisect') - bisect_parser.add_argument('generator') - bisect_parser.add_argument('copar') - bisect_parser.add_argument('--monoid', required=True) - bisect_parser.add_argument('--symbols', required=True) - bisect_parser.add_argument('--zero-frequency') - bisect_parser.add_argument('--transitions') - bisect_parser.add_argument('--out-degree') - bisect_parser.add_argument('--different-values') - bisect_parser.add_argument('--start-states', type=int, default=50) - bisect_parser.add_argument('--good', type=int) - bisect_parser.add_argument('--bad', type=int) - - bisect_parser.set_defaults(func=bisect_states) - - bisect_trans_parser = subparsers.add_parser('bisect-trans') - bisect_trans_parser.add_argument('generator') - bisect_trans_parser.add_argument('copar') - bisect_trans_parser.add_argument('--monoid', required=True) - bisect_trans_parser.add_argument('--symbols', required=True) - bisect_trans_parser.add_argument('--different-values') - bisect_trans_parser.add_argument('--states', required=True) - bisect_trans_parser.add_argument('--start-transitions', type=int, default=100) - bisect_trans_parser.add_argument('--good', type=int) - bisect_trans_parser.add_argument('--bad', type=int) - bisect_trans_parser.set_defaults(func=bisect_trans) - - args = parser.parse_args() - args.func(args) - - -if __name__ == "__main__": - main() diff --git a/wta/benchmarks.org b/wta/benchmarks.org deleted file mode 100644 index a72b8a1..0000000 --- a/wta/benchmarks.org +++ /dev/null @@ -1,1561 +0,0 @@ -#+TITLE: Benchmarks for Weighted Tree Automata -#+PROPERTY: header-args :exports both :eval never-export -#+LATEX_HEADER: \usepackage[paperheight=30cm,paperwidth=40cm,margin=0.5cm]{geometry} - -* What fits in 16GB RAM - -Finding the number of states that copar can solve in 16GB RAM for a few -different types of WTAs. - -** Powerset -*** GHC 8.6.4 with symbols 0,8 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 0,8 --zero-frequency 0.7 --good 1400 --bad 1600 --start-states 1500 -#+END_SRC - -#+RESULTS: -: Trying 1500... -: Trying 1450... -: Trying 1475... -: Trying 1487... -: Trying 1481... -: Trying 1478... -: Trying 1479... -: First bad state count: 1479 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_0,8_0.7_1478* -#+END_SRC - -#+RESULTS: -: 82M bench/wta_powerset_0,8_0.7_1478_0.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_1.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_2.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_3.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_4.coalgebra - -*** GHC 8.4.4 with symbols 0,8 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 0,8 --zero-frequency 0.7 --start-states 1000 -#+END_SRC - -#+RESULTS: -: Trying 1000... -: Trying 2000... -: Trying 1500... -: Trying 1250... -: Trying 1375... -: Trying 1437... -: Trying 1468... -: Trying 1484... -: Trying 1476... -: Trying 1480... -: Trying 1478... -: Trying 1479... -: First bad state count: 1479 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_0,8_0.7_1478* -#+END_SRC - -#+RESULTS: -: 82M bench/wta_powerset_0,8_0.7_1478_0.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_1.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_2.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_3.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_4.coalgebra - -**** Automaton size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,8 --zero-frequency 0.7 --states 1478 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,8 --zero-frequency 0.7 --states 1478 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5243856 | 10484756 | 10 | 18 | 2 | 0 | 115.339077581 | 34.439478263 | 79.458232767 | 27.712258503 | 37.668249537 | -| 1 | 5245405 | 10487854 | 10 | 18 | 2 | 0 | 114.001430765 | 34.477874858 | 78.07613373 | 27.764347556 | 37.074617863 | -| 2 | 5243549 | 10484142 | 10 | 18 | 2 | 0 | 114.862812706 | 34.668409012 | 78.756016051 | 27.741448159 | 37.09480403 | -| 3 | 5241660 | 10480364 | 10 | 18 | 2 | 0 | 114.228588077 | 34.362576104 | 78.424601434 | 27.648526393 | 37.043127108 | -| 4 | 5243032 | 10483108 | 10 | 18 | 2 | 0 | 114.692551901 | 34.827430372 | 78.414037199 | 27.723198479 | 38.276163878 | - -*** GHC 8.4.4 with symbols 1,0,4 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 1,0,4 --zero-frequency 0.7 -#+END_SRC - -#+RESULTS: -: Trying 50... -: Trying 100... -: Trying 200... -: Trying 150... -: Trying 175... -: Trying 162... -: Trying 156... -: Trying 153... -: Trying 151... -: Trying 152... -: First bad state count: 152 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_1,0,4_0.7_152* -#+END_SRC - -#+RESULTS: -: 83M bench/wta_powerset_1,0,4_0.7_152_0.coalgebra -: 83M bench/wta_powerset_1,0,4_0.7_152_1.coalgebra -: 83M bench/wta_powerset_1,0,4_0.7_152_2.coalgebra -: 83M bench/wta_powerset_1,0,4_0.7_152_3.coalgebra -: 83M bench/wta_powerset_1,0,4_0.7_152_4.coalgebra - -**** Automaton Size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 1,0,4 --zero-frequency 0.7 --states 151 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 1,0,4 --zero-frequency 0.7 --states 151 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4131380 | 12393591 | 7 | 69 | 4 | 0 | 92.530296805 | 32.925871573 | 58.292789973 | 13.413784138 | 32.25285307 | -| 1 | 4131667 | 12394466 | 7 | 69 | 4 | 0 | 104.072447103 | 32.6810851 | 70.054731043 | 22.601698388 | 34.657530397 | -| 2 | 4130798 | 12391837 | 7 | 69 | 4 | 0 | 104.65358267 | 32.641475967 | 70.686110886 | 22.881971907 | 34.580390995 | -| 3 | 4131273 | 12393268 | 7 | 69 | 4 | 0 | 104.436764929 | 33.010643372 | 70.097279338 | 22.722527765 | 34.948100296 | -| 4 | 4131755 | 12394730 | 7 | 69 | 4 | 0 | 103.940596569 | 32.874641172 | 69.748179673 | 22.561661198 | 34.530464508 | - -*** GHC 8.4.4 with symbols 4,3,2 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 4,3,2 --zero-frequency 0.7 -#+END_SRC - -#+RESULTS: -: Trying 50... -: Trying 100... -: Trying 200... -: Trying 150... -: Trying 175... -: Trying 187... -: Trying 193... -: Trying 190... -: Trying 191... -: First bad state count: 191 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_4,3,2_0.7_190* -#+END_SRC - -#+RESULTS: -: 83M bench/wta_powerset_4,3,2_0.7_190_0.coalgebra -: 83M bench/wta_powerset_4,3,2_0.7_190_1.coalgebra -: 83M bench/wta_powerset_4,3,2_0.7_190_2.coalgebra -: 83M bench/wta_powerset_4,3,2_0.7_190_3.coalgebra -: 83M bench/wta_powerset_4,3,2_0.7_190_4.coalgebra - -**** Automaton Size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 4,3,2 --zero-frequency 0.7 --states 190 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 4,3,2 --zero-frequency 0.7 --states 190 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4150153 | 12416791 | 11 | 72964 | 190 | 7474719 | 141.894074912 | 32.94816078 | 104.894412823 | 19.27142335 | 73.292672481 | -| 1 | 4149881 | 12415853 | 11 | 72964 | 190 | 7374059 | 143.936708293 | 32.959668876 | 106.847647981 | 19.335579933 | 74.389142529 | -| 2 | 4147912 | 12410153 | 11 | 72964 | 190 | 7530637 | 143.039477927 | 32.922891848 | 106.049882108 | 19.238034371 | 73.786648681 | -| 3 | 4149832 | 12415896 | 11 | 72964 | 190 | 7400820 | 141.899762867 | 32.763790399 | 105.08945468 | 19.081253852 | 73.103108932 | -| 4 | 4147931 | 12410198 | 11 | 72964 | 190 | 7356721 | 142.277553489 | 33.004372363 | 105.135364747 | 19.217062907 | 72.82642293 | - -*** GHC 8.4.4 with symbols 0,0,0,0,0,3 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --start-states 2 -#+END_SRC - -#+RESULTS: -: Trying 2... -: Trying 4... -: Trying 8... -: Trying 16... -: Trying 12... -: Trying 10... -: Trying 11... -: First bad state count: 12 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_0,0,0,0,0,3_0.7_11* -#+END_SRC - -#+RESULTS: -: 47M bench/wta_powerset_0,0,0,0,0,3_0.7_11_0.coalgebra -: 47M bench/wta_powerset_0,0,0,0,0,3_0.7_11_1.coalgebra -: 47M bench/wta_powerset_0,0,0,0,0,3_0.7_11_2.coalgebra -: 47M bench/wta_powerset_0,0,0,0,0,3_0.7_11_3.coalgebra -: 47M bench/wta_powerset_0,0,0,0,0,3_0.7_11_4.coalgebra - -**** Automaton Size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 1593503 | 9560952 | 5 | 98 | 2 | 0 | 44.433319213 | 19.470309466 | 24.352231629 | 11.34834025 | 10.606600771 | -| 1 | 1594688 | 9568062 | 5 | 98 | 2 | 0 | 44.35660646 | 19.503070403 | 24.284648797 | 11.546398372 | 10.351405421 | -| 2 | 1595746 | 9574410 | 5 | 98 | 2 | 0 | 44.979436845 | 19.622696684 | 24.756055326 | 11.448256352 | 10.958179969 | -| 3 | 1594811 | 9568800 | 5 | 98 | 2 | 0 | 44.518512407 | 19.486959131 | 24.465812029 | 11.501689163 | 10.63837111 | -| 4 | 1595187 | 9571056 | 5 | 98 | 2 | 0 | 44.449440224 | 19.537019031 | 24.300846734 | 11.389487771 | 10.5363747 | - -** Z,max -*** GHC 8.4.4 with symbols 0,8 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Z,max' --symbols 0,8 --zero-frequency 0.7 -#+END_SRC - -#+RESULTS: -: Trying 50... -: Trying 100... -: Trying 200... -: Trying 400... -: Trying 800... -: Trying 1600... -: Trying 1200... -: Trying 1400... -: Trying 1500... -: Trying 1450... -: Trying 1475... -: Trying 1462... -: Trying 1456... -: Trying 1453... -: Trying 1451... -: First bad state count: 1451 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Z,max_0,8_0.7_1450* -#+END_SRC - -#+RESULTS: -: 182M bench/wta_Z,max_0,8_0.7_1450_0.coalgebra -: 182M bench/wta_Z,max_0,8_0.7_1450_1.coalgebra -: 182M bench/wta_Z,max_0,8_0.7_1450_2.coalgebra -: 182M bench/wta_Z,max_0,8_0.7_1450_3.coalgebra -: 182M bench/wta_Z,max_0,8_0.7_1450_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Z,max' --symbols 0,8 --zero-frequency 0.7 --states 1450 -python bench.py run ../../copar/bin/copar --monoid 'Z,max' --symbols 0,8 --zero-frequency 0.7 --states 1450 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5047826 | 10092752 | 1458 | 13050 | 1450 | 9457197 | 127.724360284 | 43.258927035 | 81.171137974 | 26.874901612 | 40.422676395 | -| 1 | 5047514 | 10092128 | 1458 | 13050 | 1450 | 9456756 | 125.832804664 | 42.853972016 | 79.686342664 | 26.577174808 | 39.966384527 | -| 2 | 5049772 | 10096644 | 1458 | 13050 | 1450 | 9460968 | 126.336593045 | 42.68312591 | 80.349875424 | 26.745235991 | 40.031230363 | -| 3 | 5046916 | 10090932 | 1458 | 13050 | 1450 | 9455805 | 125.95962352 | 42.526542018 | 80.176310943 | 26.550162046 | 40.227319833 | -| 4 | 5049229 | 10095558 | 1458 | 13050 | 1450 | 9460347 | 126.718920083 | 42.559013501 | 80.863052096 | 26.756405734 | 40.145229524 | - -*** GHC 8.4.4 with symbols 1,0,4 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Z,max' --symbols 1,0,4 --zero-frequency 0.7 -#+END_SRC - -#+RESULTS: -: Trying 50... -: Trying 100... -: Trying 200... -: Trying 150... -: Trying 175... -: Trying 162... -: Trying 156... -: Trying 153... -: Trying 151... -: First bad state count: 151 - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Z,max_1,0,4_0.7_150* -#+END_SRC - -**** File Size - -#+RESULTS: -: 162M bench/wta_Z,max_1,0,4_0.7_150_0.coalgebra -: 162M bench/wta_Z,max_1,0,4_0.7_150_1.coalgebra -: 162M bench/wta_Z,max_1,0,4_0.7_150_2.coalgebra -: 162M bench/wta_Z,max_1,0,4_0.7_150_3.coalgebra -: 162M bench/wta_Z,max_1,0,4_0.7_150_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Z,max' --symbols 1,0,4 --zero-frequency 0.7 --states 150 -python bench.py run ../../copar/bin/copar --monoid 'Z,max' --symbols 1,0,4 --zero-frequency 0.7 --states 150 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4051480 | 12153896 | 155 | 90151 | 150 | 7087519 | 120.395749162 | 40.871788157 | 74.90886142 | 22.238988672 | 39.72932804 | -| 1 | 4050707 | 12151583 | 155 | 90151 | 150 | 7087488 | 120.463605814 | 40.81720097 | 75.096220332 | 22.78192433 | 39.512466086 | -| 2 | 4048842 | 12145992 | 155 | 90151 | 150 | 7083654 | 120.367574362 | 40.847872293 | 74.879748499 | 22.174812232 | 39.882652278 | -| 3 | 4052208 | 12156090 | 155 | 90151 | 150 | 7090069 | 120.237306821 | 40.747046417 | 74.945644255 | 22.185753095 | 39.520022235 | -| 4 | 4048823 | 12145929 | 155 | 90151 | 150 | 7084229 | 121.046334089 | 41.206127141 | 75.236966807 | 22.108849249 | 39.746848148 | - -*** GHC 8.4.4 with symbols 4,3,2 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Z,max' --symbols 4,3,2 --zero-frequency 0.7 --start-states 100 -#+END_SRC - -#+RESULTS: -: Trying 100... -: Trying 200... -: Trying 150... -: Trying 175... -: Trying 187... -: Trying 193... -: Trying 190... -: Trying 188... -: Trying 189... -: First bad state count: 189 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Z,max_4,3,2_0.7_188* -#+END_SRC - -#+RESULTS: -: 162M bench/wta_Z,max_4,3,2_0.7_188_0.coalgebra -: 162M bench/wta_Z,max_4,3,2_0.7_188_1.coalgebra -: 162M bench/wta_Z,max_4,3,2_0.7_188_2.coalgebra -: 162M bench/wta_Z,max_4,3,2_0.7_188_3.coalgebra -: 162M bench/wta_Z,max_4,3,2_0.7_188_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Z,max' --symbols 4,3,2 --zero-frequency 0.7 --states 188 -python bench.py run ../../copar/bin/copar --monoid 'Z,max' --symbols 4,3,2 --zero-frequency 0.7 --states 188 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4020872 | 12029832 | 197 | 71444 | 188 | 6045852 | 115.942447016 | 40.75075879 | 71.271681594 | 18.625916768 | 39.91853539 | -| 1 | 4017121 | 12018620 | 197 | 71444 | 188 | 6040501 | 113.960683621 | 40.210261362 | 69.908854506 | 18.715510494 | 39.429755908 | -| 2 | 4017092 | 12018743 | 197 | 71444 | 188 | 6040038 | 114.417975118 | 40.056454421 | 70.449543532 | 18.443439893 | 39.714702929 | -| 3 | 4013171 | 12006729 | 197 | 71444 | 188 | 6034912 | 104.421419394 | 40.426583126 | 60.116296609 | 10.279226244 | 37.258447268 | -| 4 | 4018149 | 12021895 | 197 | 71444 | 188 | 6042204 | 104.595285757 | 40.484957759 | 60.29935373 | 10.313693438 | 37.315322541 | - -*** GHC 8.4.4 with symbols 0,0,0,0,0,3 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Z,max' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --start-states 6 -#+END_SRC - -#+RESULTS: -: Trying 6... -: Trying 12... -: Trying 9... -: Trying 10... -: Trying 11... -: First bad state count: 12 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Z,max_0,0,0,0,0,3_0.7_11* -#+END_SRC - -#+RESULTS: -: 79M bench/wta_Z,max_0,0,0,0,0,3_0.7_11_0.coalgebra -: 79M bench/wta_Z,max_0,0,0,0,0,3_0.7_11_1.coalgebra -: 79M bench/wta_Z,max_0,0,0,0,0,3_0.7_11_2.coalgebra -: 79M bench/wta_Z,max_0,0,0,0,0,3_0.7_11_3.coalgebra -: 79M bench/wta_Z,max_0,0,0,0,0,3_0.7_11_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Z,max' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 -python bench.py run ../../copar/bin/copar --monoid 'Z,max' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 1595450 | 9572634 | 14 | 473731 | 11 | 2679440 | 59.567674089 | 22.815217966 | 34.656233896 | 10.712862563 | 21.527223791 | -| 1 | 1596274 | 9577578 | 14 | 473599 | 11 | 2680789 | 59.667949978 | 22.964709813 | 34.595654672 | 10.671440318 | 21.504327033 | -| 2 | 1593533 | 9561132 | 14 | 473725 | 11 | 2676188 | 59.60896951 | 22.965296594 | 34.468009878 | 10.694780509 | 21.357284246 | -| 3 | 1593597 | 9561516 | 14 | 473516 | 11 | 2675256 | 59.618517937 | 22.900218752 | 34.517770264 | 10.699678956 | 21.404437124 | -| 4 | 1595682 | 9574026 | 14 | 473759 | 11 | 2679419 | 59.829033166 | 22.84743033 | 34.719394797 | 10.690592405 | 21.632768706 | - -** Word,or -*** GHC 8.4.4 with symbols 0,8 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Word,or' --symbols 0,8 --zero-frequency 0.7 --start-states 1000 -#+END_SRC - -#+RESULTS: -: Trying 1000... -: Trying 2000... -: Trying 1500... -: Trying 1250... -: Trying 1375... -: Trying 1437... -: Trying 1406... -: Trying 1421... -: Trying 1413... -: Trying 1409... -: Trying 1407... -: Trying 1408... -: First bad state count: 1409 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Word,or_0,8_0.7_1408* -#+END_SRC - -#+RESULTS: -: 164M bench/wta_Word,or_0,8_0.7_1408_0.coalgebra -: 164M bench/wta_Word,or_0,8_0.7_1408_1.coalgebra -: 165M bench/wta_Word,or_0,8_0.7_1408_2.coalgebra -: 165M bench/wta_Word,or_0,8_0.7_1408_3.coalgebra -: 165M bench/wta_Word,or_0,8_0.7_1408_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Word,or' --symbols 0,8 --zero-frequency 0.7 --states 1408 -python bench.py run ../../copar/bin/copar --monoid 'Word,or' --symbols 0,8 --zero-frequency 0.7 --states 1408 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4757493 | 9512170 | 1416 | 12672 | 1408 | 8913294 | 122.529064018 | 49.673619826 | 69.872621378 | 24.487186873 | 37.636595831 | -| 1 | 4757305 | 9511794 | 1416 | 12672 | 1408 | 8912679 | 121.871882143 | 49.468009438 | 69.396700752 | 24.548033181 | 37.526833514 | -| 2 | 4760364 | 9517912 | 1416 | 12672 | 1408 | 8918643 | 122.195401637 | 49.367139075 | 69.859922188 | 24.551202679 | 37.745627532 | -| 3 | 4760232 | 9517648 | 1416 | 12672 | 1408 | 8918564 | 121.744240716 | 49.628682967 | 69.111452032 | 24.573090085 | 37.819264634 | -| 4 | 4759753 | 9516690 | 1416 | 12672 | 1408 | 8917624 | 118.671354206 | 49.213411686 | 66.440058464 | 25.139216435 | 33.058420248 | - -*** GHC 8.4.4 with symbols 1,0,4 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Word,or' --symbols 1,0,4 --zero-frequency 0.7 --start-states 120 -#+END_SRC - -#+RESULTS: -: Trying 120... -: Trying 240... -: Trying 180... -: Trying 150... -: Trying 135... -: Trying 142... -: Trying 146... -: Trying 148... -: Trying 149... -: First bad state count: 149 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Word,or_1,0,4_0.7_148* -#+END_SRC - -#+RESULTS: -: 151M bench/wta_Word,or_1,0,4_0.7_148_0.coalgebra -: 151M bench/wta_Word,or_1,0,4_0.7_148_1.coalgebra -: 151M bench/wta_Word,or_1,0,4_0.7_148_2.coalgebra -: 151M bench/wta_Word,or_1,0,4_0.7_148_3.coalgebra -: 151M bench/wta_Word,or_1,0,4_0.7_148_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Word,or' --symbols 1,0,4 --zero-frequency 0.7 --states 148 -python bench.py run ../../copar/bin/copar --monoid 'Word,or' --symbols 1,0,4 --zero-frequency 0.7 --states 148 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3889583 | 11668189 | 153 | 87765 | 148 | 6805177 | 117.573809962 | 44.159477335 | 69.176479615 | 20.97881901 | 36.97313268 | -| 1 | 3891836 | 11675004 | 153 | 87765 | 148 | 6809318 | 118.060187599 | 44.059742822 | 69.709799716 | 20.986764025 | 37.089169403 | -| 2 | 3889498 | 11667962 | 153 | 87765 | 148 | 6805428 | 117.680086041 | 43.801892931 | 69.639925802 | 20.888711457 | 36.894495934 | -| 3 | 3890675 | 11671481 | 153 | 87765 | 148 | 6807190 | 118.213230214 | 44.026034118 | 69.934017821 | 20.807216331 | 36.920223682 | -| 4 | 3889335 | 11667465 | 153 | 87765 | 148 | 6804884 | 118.020940476 | 44.097067581 | 69.813347698 | 20.923033139 | 36.907214948 | - -*** GHC 8.4.4 with symbols 4,3,2 and zero-freq 0.7 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Word,or' --symbols 4,3,2 --zero-frequency 0.7 -#+END_SRC - -#+RESULTS: -: Trying 50... -: Trying 100... -: Trying 200... -: Trying 150... -: Trying 175... -: Trying 187... -: Trying 181... -: Trying 184... -: Trying 185... -: Trying 186... -: First bad state count: 187 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Word,or_4,3,2_0.7_186* -#+END_SRC - -#+RESULTS: -: 152M bench/wta_Word,or_4,3,2_0.7_186_0.coalgebra -: 152M bench/wta_Word,or_4,3,2_0.7_186_1.coalgebra -: 152M bench/wta_Word,or_4,3,2_0.7_186_2.coalgebra -: 152M bench/wta_Word,or_4,3,2_0.7_186_3.coalgebra -: 152M bench/wta_Word,or_4,3,2_0.7_186_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Word,or' --symbols 4,3,2 --zero-frequency 0.7 --states 186 -python bench.py run ../../copar/bin/copar --monoid 'Word,or' --symbols 4,3,2 --zero-frequency 0.7 --states 186 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3890269 | 11638838 | 195 | 69940 | 186 | 5848699 | 114.733470175 | 43.499787726 | 67.5948969 | 17.660572753 | 37.835620352 | -| 1 | 3893818 | 11649123 | 195 | 69940 | 186 | 5854005 | 114.756947419 | 43.702682275 | 67.505722972 | 17.675712966 | 37.818639736 | -| 2 | 3893265 | 11647592 | 195 | 69940 | 186 | 5854134 | 115.418354168 | 43.606980048 | 68.133828807 | 17.837028275 | 37.992011256 | -| 3 | 3892206 | 11644421 | 195 | 69940 | 186 | 5852423 | 113.998060941 | 43.769845642 | 66.618120946 | 17.720427448 | 37.714434677 | -| 4 | 3892036 | 11643814 | 195 | 69940 | 186 | 5851296 | 115.965290499 | 44.138476758 | 68.234040288 | 17.763408679 | 38.356640369 | - -*** GHC 8.4.4 with symbols 0,0,0,0,0,3 and zero-freq 0.7 -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid 'Word,or' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --start-states 6 -#+END_SRC - -#+RESULTS: -: Trying 6... -: Trying 12... -: Trying 9... -: Trying 10... -: Trying 11... -: First bad state count: 12 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_Word,or_0,0,0,0,0,3_0.7_11* -#+END_SRC - -#+RESULTS: -: 77M bench/wta_Word,or_0,0,0,0,0,3_0.7_11_0.coalgebra -: 77M bench/wta_Word,or_0,0,0,0,0,3_0.7_11_1.coalgebra -: 77M bench/wta_Word,or_0,0,0,0,0,3_0.7_11_2.coalgebra -: 77M bench/wta_Word,or_0,0,0,0,0,3_0.7_11_3.coalgebra -: 77M bench/wta_Word,or_0,0,0,0,0,3_0.7_11_4.coalgebra - -**** Automaton Size - -#+BEGIN_SRC sh -python bench.py generate ../../copar/bin/random-wta --monoid 'Word,or' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 -python bench.py run ../../copar/bin/copar --monoid 'Word,or' --symbols 0,0,0,0,0,3 --zero-frequency 0.7 --states 11 --indiv --header -#+END_SRC - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 1594413 | 9566412 | 14 | 473587 | 11 | 2676959 | 61.53939505 | 24.79942316 | 34.477272309 | 10.822832613 | 21.313535924 | -| 1 | 1596360 | 9578094 | 14 | 473404 | 11 | 2681034 | 61.147599248 | 24.824030133 | 34.101896988 | 10.793184 | 20.989457877 | -| 2 | 1595591 | 9573480 | 14 | 473700 | 11 | 2679546 | 61.459443653 | 24.801616514 | 34.389540062 | 10.893824596 | 21.133849133 | -| 3 | 1593825 | 9562884 | 14 | 473580 | 11 | 2676789 | 61.147557505 | 24.98879381 | 33.942496577 | 10.818043846 | 20.839884809 | -| 4 | 1596528 | 9579102 | 14 | 473600 | 11 | 2681048 | 61.864094058 | 24.884111862 | 34.762990208 | 10.893522867 | 21.485077775 | -* Same Question, but with limited transition count -** Powerset -*** GHC 8.4.4 with symbols 0,8 and transitions 500 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/{random-wta,copar} --monoid powerset --symbols 0,8 --transitions 5000 -#+END_SRC - -#+RESULTS: -: Trying 1000... -: Trying 2000... -: Trying 1500... -: Trying 1250... -: Trying 1375... -: Trying 1437... -: Trying 1468... -: Trying 1484... -: Trying 1476... -: Trying 1480... -: Trying 1478... -: Trying 1479... -: First bad state count: 1479 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_0,8_0.7_1478* -#+END_SRC - -#+RESULTS: -: 82M bench/wta_powerset_0,8_0.7_1478_0.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_1.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_2.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_3.coalgebra -: 82M bench/wta_powerset_0,8_0.7_1478_4.coalgebra - -**** Automaton size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,8 --zero-frequency 0.7 --states 1478 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,8 --zero-frequency 0.7 --states 1478 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5243856 | 10484756 | 10 | 18 | 2 | 0 | 115.339077581 | 34.439478263 | 79.458232767 | 27.712258503 | 37.668249537 | -| 1 | 5245405 | 10487854 | 10 | 18 | 2 | 0 | 114.001430765 | 34.477874858 | 78.07613373 | 27.764347556 | 37.074617863 | -| 2 | 5243549 | 10484142 | 10 | 18 | 2 | 0 | 114.862812706 | 34.668409012 | 78.756016051 | 27.741448159 | 37.09480403 | -| 3 | 5241660 | 10480364 | 10 | 18 | 2 | 0 | 114.228588077 | 34.362576104 | 78.424601434 | 27.648526393 | 37.043127108 | -| 4 | 5243032 | 10483108 | 10 | 18 | 2 | 0 | 114.692551901 | 34.827430372 | 78.414037199 | 27.723198479 | 38.276163878 | - -*** GHC 8.4.4 with symbols 0,8 and out-degree 1000 - -#+BEGIN_SRC sh -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,8 --out-degree 1000 --good 1000 -#+END_SRC - -#+RESULTS: -: Trying 1001... -: Trying 2002... -: Trying 4004... -: Trying 8008... -: Trying 6006... -: Trying 7007... -: Trying 7507... -: Trying 7257... -: Trying 7382... -: Trying 7444... -: Trying 7413... -: Trying 7428... -: Trying 7420... -: Trying 7416... -: Trying 7414... -: Trying 7415... -: First bad state count: 7416 - -**** File Size - -#+BEGIN_SRC sh :results output -ls -sh bench/wta_powerset_0,8_t7415000__7415* -#+END_SRC - -#+RESULTS: -: 120M bench/wta_powerset_0,8_t7415000__7415_0.coalgebra -: 120M bench/wta_powerset_0,8_t7415000__7415_1.coalgebra -: 120M bench/wta_powerset_0,8_t7415000__7415_2.coalgebra -: 120M bench/wta_powerset_0,8_t7415000__7415_3.coalgebra -: 120M bench/wta_powerset_0,8_t7415000__7415_4.coalgebra - -**** Automaton Size - -#+begin_src sh :hlines yes -python bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,8 --transitions 7415000 --states 7415 -python bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,8 --transitions 7415000 --states 7415 --indiv --header -#+end_src - -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 7422415 | 14830000 | 10 | 18 | 2 | 0 | 157.872966092 | 51.221314999 | 104.615248956 | 33.7012898 | 58.664739269 | -| 1 | 7422415 | 14830000 | 10 | 18 | 2 | 0 | 157.428380106 | 51.433510926 | 103.926494829 | 33.216537153 | 58.775334589 | -| 2 | 7422415 | 14830000 | 10 | 18 | 2 | 0 | 156.808413994 | 51.343226544 | 103.40051371 | 32.969125294 | 58.865798525 | -| 3 | 7422415 | 14830000 | 10 | 18 | 2 | 0 | 157.791363724 | 51.873644617 | 103.855838314 | 33.05713406 | 58.931293578 | -| 4 | 7422415 | 14830000 | 10 | 18 | 2 | 0 | 157.126256596 | 51.400301031 | 103.666329167 | 32.976280595 | 58.830566981 | - -* Next Try - -We now use the following parameters: - -- Signature :: 4×X^k k ∈ { 0, ..., 5 } -- GHC :: 8.4.4 - -** Powerset -*** 4xX mit out-degree 500 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 500 --good 8000 --start-states 12000 --bad 16000 -#+END_SRC - -#+RESULTS: -: Trying 12000... -: Trying 14000... -: Trying 15000... -: Trying 14500... -: Trying 14250... -: Trying 14375... -: Trying 14312... -: Trying 14281... -: Trying 14296... -: Trying 14288... -: Trying 14284... -: Trying 14282... -: First bad state count: 14282 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,4_*__14281_* | tr " ," ",." -#+END_SRC - -#+NAME: power_1_500_file -#+RESULTS: -| 118M | bench/wta_powerset_0.4_t7140500__14281_0.coalgebra | -| 118M | bench/wta_powerset_0.4_t7140500__14281_1.coalgebra | -| 118M | bench/wta_powerset_0.4_t7140500__14281_2.coalgebra | -| 118M | bench/wta_powerset_0.4_t7140500__14281_3.coalgebra | -| 118M | bench/wta_powerset_0.4_t7140500__14281_4.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,4 --out-degree 500 --states 14281 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 500 --states 14281 --indiv --header -#+END_SRC - -#+NAME: power_1_500 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 7154781 | 14281000 | 6 | 10 | 2 | 0 | 155.635043092 | 50.511676534 | 103.239235361 | 30.135940008 | 61.445316625 | -| 1 | 7154781 | 14281000 | 6 | 10 | 2 | 0 | 155.345664537 | 50.391815858 | 103.046448356 | 29.52881681 | 61.823502784 | -| 2 | 7154781 | 14281000 | 6 | 10 | 2 | 0 | 154.746389702 | 50.356318464 | 102.487287332 | 29.561887582 | 61.245616512 | -| 3 | 7154781 | 14281000 | 6 | 10 | 2 | 0 | 156.681042711 | 50.477922803 | 104.306181251 | 30.132009036 | 62.231759233 | -| 4 | 7154781 | 14281000 | 6 | 10 | 2 | 0 | 156.206931801 | 50.552217812 | 103.775304876 | 30.106012782 | 61.793692847 | - -*** 4xX mit out-degree 20 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 20 --good 8000 --start-states 14281 -#+END_SRC - -#+RESULTS: -: Trying 14281... -: Trying 28562... -: Trying 57124... -: Trying 114248... -: Trying 228496... -: Trying 456992... -: Trying 342744... -: Trying 399868... -: Trying 371306... -: Trying 357025... -: Trying 349884... -: Trying 353454... -: Trying 355239... -: Trying 356132... -: Trying 355685... -: Trying 355462... -: Trying 355573... -: Trying 355629... -: Trying 355657... -: Trying 355671... -: Trying 355678... -: Trying 355681... -: Trying 355683... -: Trying 355684... -: First bad state count: 355685 - -**** File Size - - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,4 --out-degree 20 --states 355684 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 20 --states 355684 --indiv --header -#+END_SRC - -#+NAME: power_1_20 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 7469364 | 14227360 | 6 | 1768728 | 355684 | 10883373 | 344.399732107 | 61.942569869 | 262.572157652 | 32.047148894 | 209.333188906 | -| 1 | 7469364 | 14227360 | 6 | 1768935 | 355684 | 10883077 | 340.732038227 | 60.912573518 | 260.176273796 | 31.928906963 | 208.837646082 | -| 2 | 7469364 | 14227360 | 6 | 1768908 | 355684 | 10885631 | 340.838739608 | 61.120402905 | 260.008098908 | 31.951679391 | 208.775189688 | -| 3 | 7469364 | 14227360 | 6 | 1768880 | 355684 | 10880372 | 340.237713603 | 61.448840572 | 259.027481579 | 31.936433445 | 207.318948419 | -| 4 | 7469364 | 14227360 | 6 | 1768875 | 355684 | 10886155 | 342.792217839 | 61.487509806 | 261.434824046 | 32.045849362 | 209.995181997 | - -*** 4xX mit out-degree 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 50 --good 130000 --bad 140000 -#+END_SRC - -#+RESULTS: -: Trying 135000... -: Trying 132500... -: Trying 131250... -: Trying 131875... -: Trying 132187... -: Trying 132031... -: Trying 132109... -: Trying 132148... -: Trying 132167... -: Trying 132177... -: Trying 132182... -: Trying 132179... -: Trying 132178... -: First bad state count: 132179 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,4_*_132178_* | tr " ," ",." -#+END_SRC - -#+NAME: power_1_file -#+RESULTS: -| 117M | bench/wta_powerset_0.4_t6608900__132178_0.coalgebra | -| 117M | bench/wta_powerset_0.4_t6608900__132178_1.coalgebra | -| 117M | bench/wta_powerset_0.4_t6608900__132178_2.coalgebra | -| 117M | bench/wta_powerset_0.4_t6608900__132178_3.coalgebra | -| 117M | bench/wta_powerset_0.4_t6608900__132178_4.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,4 --out-degree 50 --states 132177 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,4 --out-degree 50 --states 132177 --indiv --header -#+END_SRC - -#+NAME: power_1 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 6741027 | 13217700 | 6 | 660882 | 132177 | 9323005 | 265.849947508 | 53.024255888 | 200.012469965 | 32.711091055 | 156.049078211 | -| 1 | 6741027 | 13217700 | 6 | 660884 | 132177 | 9336757 | 266.027492928 | 53.656205959 | 199.630533624 | 33.784156055 | 154.30670604 | -| 2 | 6741027 | 13217700 | 6 | 660885 | 132177 | 9295860 | 266.131064164 | 53.031692734 | 200.333990554 | 33.839128343 | 154.752397766 | -| 3 | 6741027 | 13217700 | 6 | 660882 | 132177 | 9287608 | 266.57863175 | 53.338030998 | 200.492577153 | 33.341400299 | 155.694877544 | -| 4 | 6741027 | 13217700 | 6 | 660884 | 132177 | 9347998 | 265.39360727 | 52.816564437 | 199.812521066 | 33.25935421 | 155.166041015 | - -*** 4xX^2 mit out-degree 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,0,4 --out-degree 50 --start-states 80000 -#+END_SRC - -#+RESULTS: -: Trying 80000... -: Trying 160000... -: Trying 120000... -: Trying 100000... -: Trying 90000... -: Trying 95000... -: Trying 97500... -: Trying 98750... -: Trying 98125... -: Trying 98437... -: Trying 98593... -: Trying 98671... -: Trying 98632... -: Trying 98651... -: Trying 98661... -: Trying 98666... -: Trying 98668... -: Trying 98669... -: Trying 98670... -: First bad state count: 98671 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,0,4_*_98670_* | tr " ," ",." -#+END_SRC - -#+NAME: power_2_file -#+RESULTS: -| 123M | bench/wta_powerset_0.0.4_t4933500__98670_0.coalgebra | -| 123M | bench/wta_powerset_0.0.4_t4933500__98670_1.coalgebra | -| 123M | bench/wta_powerset_0.0.4_t4933500__98670_2.coalgebra | -| 123M | bench/wta_powerset_0.0.4_t4933500__98670_3.coalgebra | -| 123M | bench/wta_powerset_0.0.4_t4933500__98670_4.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,0,4 --out-degree 50 --states 98670 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,0,4 --out-degree 50 --states 98670 --indiv --header -#+END_SRC - -#+NAME: power_2 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5032170 | 14800500 | 6 | 5031861 | 98670 | 11563672 | 318.18771425 | 46.231443471 | 259.512847417 | 31.400595851 | 212.323222545 | -| 1 | 5032170 | 14800500 | 6 | 5031879 | 98670 | 11565958 | 318.887658897 | 46.483533968 | 259.856085361 | 31.407316023 | 212.38857748 | -| 2 | 5032170 | 14800500 | 6 | 5031848 | 98670 | 11565284 | 318.529242826 | 46.499900763 | 259.501330137 | 31.347128979 | 210.955648567 | -| 3 | 5032170 | 14800500 | 6 | 5031845 | 98670 | 11558234 | 317.809993575 | 46.522121526 | 258.840719384 | 31.371523591 | 211.925301877 | -| 4 | 5032170 | 14800500 | 6 | 5031882 | 98670 | 11551538 | 316.309936896 | 46.212332602 | 257.508264904 | 31.362333309 | 210.039264838 | - -*** 4xX^3 mit out-degree 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,0,0,4 --out-degree 50 --start-states 60000 -#+END_SRC - -#+RESULTS: -: Trying 60000... -: Trying 120000... -: Trying 90000... -: Trying 75000... -: Trying 82500... -: Trying 86250... -: Trying 84375... -: Trying 85312... -: Trying 84843... -: Trying 85077... -: Trying 84960... -: Trying 85018... -: Trying 84989... -: Trying 85003... -: Trying 85010... -: Trying 85014... -: Trying 85016... -: Trying 85017... -: First bad state count: 85018 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,0,0,4_*_85017_* | tr " ," ",." -#+END_SRC - -#+NAME: power_3_file -#+RESULTS: -| 138M | bench/wta_powerset_0.0.0.4_t4250850__85017_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,0,0,4 --out-degree 50 --states 85016 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,0,0,4 --out-degree 50 --states 85016 --indiv --header -#+END_SRC - -#+NAME: power_3 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4335816 | 17003200 | 6 | 4335816 | 85016 | 11932210 | 261.096600392 | 47.614392976 | 203.643561011 | 20.446586332 | 167.587154416 | - -*** 4xX^4 mit out-degree 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,0,0,0,4 --out-degree 50 --start-states 48000 -#+END_SRC - -#+RESULTS: -: Trying 48000... -: Trying 96000... -: Trying 72000... -: Trying 60000... -: Trying 54000... -: Trying 57000... -: Trying 58500... -: Trying 59250... -: Trying 59625... -: Trying 59437... -: Trying 59531... -: Trying 59578... -: Trying 59601... -: Trying 59589... -: Trying 59595... -: Trying 59598... -: Trying 59596... -: First bad state count: 59596 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,0,0,0,4_*_59596_* | tr " ," ",." -#+END_SRC - -#+NAME: power_4_file -#+RESULTS: -| 119M | bench/wta_powerset_0.0.0.0.4_t2979800__59596_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,0,0,0,4 --out-degree 50 --states 59596 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,0,0,0,4 --out-degree 50 --states 59596 --indiv --header -#+END_SRC - -#+NAME: power_4 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3039396 | 14899000 | 6 | 3039396 | 59596 | 13024716 | 200.034099951 | 41.065064963 | 152.485306449 | 25.383501709 | 121.316305478 | - -*** 4xX^5 mit out-degree 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid powerset --symbols 0,0,0,0,0,4 --out-degree 50 --start-states 40000 -#+END_SRC - -#+RESULTS: -: Trying 40000... -: Trying 80000... -: Trying 60000... -: Trying 50000... -: Trying 45000... -: Trying 47500... -: Trying 48750... -: Trying 49375... -: Trying 49687... -: Trying 49531... -: Trying 49453... -: Trying 49414... -: Trying 49394... -: Trying 49384... -: Trying 49379... -: Trying 49377... -: Trying 49376... -: First bad state count: 49376 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_powerset_0,0,0,0,0,4_*_49375_* | tr " ," ",." -#+END_SRC - -#+NAME: power_5_file -#+RESULTS: -| 116M | bench/wta_powerset_0.0.0.0.0.4_t2468750__49375_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid powerset --symbols 0,0,0,0,0,4 --out-degree 50 --states 49375 -./bench.py run ../../copar/bin/copar --monoid powerset --symbols 0,0,0,0,0,4 --out-degree 50 --states 49375 --indiv --header -#+END_SRC - -#+NAME: power_5 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 2518125 | 14812500 | 6 | 2518125 | 49375 | 13940781 | 164.986249384 | 38.769441334 | 119.843574846 | 24.415685672 | 90.703821725 | - -** Z,max -*** 4xX mit out-degree 50 und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Z,max --symbols 0,4 --out-degree 50 --good 100000 --bad 130000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 115000... -: Trying 107500... -: Trying 111250... -: Trying 113125... -: Trying 114062... -: Trying 114531... -: Trying 114765... -: Trying 114882... -: Trying 114941... -: Trying 114911... -: Trying 114896... -: Trying 114889... -: Trying 114885... -: Trying 114887... -: Trying 114888... -: First bad state count: 114889 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Z,max_0,4_*_114888_* | tr " ," ",." -#+END_SRC - -#+NAME: zmax_1_file -#+RESULTS: -| 122M | bench/wta_Z.max_0.4_t5744400_50_114888_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Z,max --symbols 0,4 --out-degree 50 --different-values 50 --states 114888 -./bench.py run ../../copar/bin/copar --monoid Z,max --symbols 0,4 --out-degree 50 --different-values 50 --states 114888 --indiv --header -#+END_SRC - -#+NAME: zmax_1 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5859288 | 11488800 | 416 | 574439 | 114888 | 6911761 | 181.011843864 | 58.957254337 | 111.080014285 | 34.573326846 | 66.278452727 | - -*** 4xX^2 mit out-degree 50 und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Z,max --symbols 0,0,4 --out-degree 50 --good 50000 --bad 100000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 75000... -: Trying 87500... -: Trying 93750... -: Trying 96875... -: Trying 95312... -: Trying 94531... -: Trying 94921... -: Trying 95116... -: Trying 95214... -: Trying 95263... -: Trying 95287... -: Trying 95299... -: Trying 95293... -: Trying 95290... -: Trying 95288... -: First bad state count: 95288 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Z,max_0,0,4_*_95287_* | tr " ," ",." -#+END_SRC - -#+NAME: zmax_2_file -#+RESULTS: -| 136M | bench/wta_Z.max_0.0.4_t4764350_50_95287_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Z,max --symbols 0,0,4 --out-degree 50 --different-values 50 --states 95287 -./bench.py run ../../copar/bin/copar --monoid Z,max --symbols 0,0,4 --out-degree 50 --different-values 50 --states 95287 --indiv --header -#+END_SRC - -#+NAME: zmax_2 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4859637 | 14293050 | 404 | 4859343 | 95287 | 7100778 | 222.092892824 | 54.223932252 | 154.676164911 | 30.811423501 | 108.364036654 | - -*** 4xX^3 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,4 --out-degree 50 --good 58471 --bad 73000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 65735... -: Trying 69367... -: Trying 71183... -: Trying 70275... -: Trying 70729... -: Trying 70502... -: Trying 70615... -: Trying 70672... -: Trying 70643... -: Trying 70657... -: Trying 70664... -: Trying 70660... -: Trying 70662... -: Trying 70661... -: First bad state count: 70661 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Z,max_0,0,0,4_*_70660_* | tr " ," ",." -#+END_SRC - -#+NAME: zmax_3_file -#+RESULTS: -| 127M | bench/wta_Z.max_0.0.0.4_t3533000_50_70660_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Z,max --symbols 0,0,0,4 --out-degree 50 --different-values 50 --states 70660 -./bench.py run ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,4 --out-degree 50 --different-values 50 --states 70660 --indiv --header -#+END_SRC - -#+NAME: zmax_3 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3603660 | 14132000 | 397 | 3603660 | 70660 | 9226293 | 172.420794076 | 49.287429 | 115.080725376 | 25.88631871 | 82.245759651 | - -*** 4xX^4 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,0,4 --out-degree 50 --good 55181 --bad 73000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 64090... -: Trying 59635... -: Trying 61862... -: Trying 62976... -: Trying 62419... -: Trying 62697... -: Trying 62558... -: Trying 62627... -: Trying 62662... -: Trying 62679... -: Trying 62670... -: Trying 62666... -: Trying 62664... -: Trying 62665... -: First bad state count: 62666 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Z,max_0,0,0,0,4_*_62665_* | tr " ," ",." -#+END_SRC - -#+NAME: zmax_4_file -#+RESULTS: -| 136M | bench/wta_Z.max_0.0.0.0.4_t3133250_50_62665_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Z,max --symbols 0,0,0,0,4 --out-degree 50 --different-values 50 --states 62665 -./bench.py run ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,0,4 --out-degree 50 --different-values 50 --states 62665 --indiv --header -#+END_SRC - -#+NAME: zmax_4 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3195915 | 15666250 | 397 | 3195915 | 62665 | 11627719 | 154.99753875 | 48.473165 | 98.758726744 | 26.2347205 | 66.312403669 | - -*** 4xX^5 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,0,0,4 --out-degree 50 --good 31000 --bad 55000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 43000... -: Trying 49000... -: Trying 52000... -: Trying 50500... -: Trying 49750... -: Trying 50125... -: Trying 49937... -: Trying 49843... -: Trying 49890... -: Trying 49913... -: Trying 49925... -: Trying 49931... -: Trying 49928... -: Trying 49926... -: Trying 49927... -: First bad state count: 49927 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Z,max_0,0,0,0,0,4_*_49926_* | tr " ," ",." -#+END_SRC - -#+NAME: zmax_5_file -#+RESULTS: -| 127M | bench/wta_Z.max_0.0.0.0.0.4_t2496300_50_49926_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Z,max --symbols 0,0,0,0,0,4 --out-degree 50 --different-values 50 --states 49926 -./bench.py run ../../copar/bin/copar --monoid Z,max --symbols 0,0,0,0,0,4 --out-degree 50 --different-values 50 --states 49926 --indiv --header -#+END_SRC - -#+NAME: zmax_5 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 2546226 | 14977800 | 376 | 2546226 | 49926 | 11841832 | 129.05925319 | 44.887706321 | 78.246885415 | 20.851582498 | 52.50648174 | - -** Word,or -*** 4xX mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Word,or --symbols 0,4 --out-degree 50 --good 100000 --bad 130000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 115000... -: Trying 107500... -: Trying 111250... -: Trying 113125... -: Trying 114062... -: Trying 113593... -: Trying 113827... -: Trying 113944... -: Trying 114003... -: Trying 113973... -: Trying 113958... -: Trying 113951... -: Trying 113954... -: Trying 113956... -: Trying 113957... -: First bad state count: 113958 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Word,or_0,4_*_113957_* | tr " ," ",." -#+END_SRC - -#+NAME: wordor_1_file -#+RESULTS: -| 131M | bench/wta_Word.or_0.4_t5697850_50_113957_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Word,or --symbols 0,4 --out-degree 50 --different-values 50 --states 113957 -./bench.py run ../../copar/bin/copar --monoid Word,or --symbols 0,4 --out-degree 50 --different-values 50 --states 113957 --indiv --header -#+END_SRC - -#+NAME: wordor_1 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 5811807 | 11395700 | 54 | 569783 | 113957 | 11076343 | 223.763784071 | 61.587433127 | 152.359932717 | 32.126284469 | 109.721586786 | - -*** 4xX^2 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Word,or --symbols 0,0,4 --out-degree 50 --bad 93001 --good 80000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 86500... -: Trying 89750... -: Trying 91375... -: Trying 92188... -: Trying 92594... -: Trying 92391... -: Trying 92492... -: Trying 92441... -: Trying 92416... -: Trying 92428... -: Trying 92434... -: Trying 92437... -: Trying 92435... -: First bad state count: 92435 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Word,or_0,0,4_*_92434_* | tr " ," ",." -#+END_SRC - -#+NAME: wordor_2_file -#+RESULTS: -| 141M | bench/wta_Word.or_0.0.4_t4621700_50_92434_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Word,or --symbols 0,0,4 --out-degree 50 --different-values 50 --states 92434 -./bench.py run ../../copar/bin/copar --monoid Word,or --symbols 0,0,4 --out-degree 50 --different-values 50 --states 92434 --indiv --header -#+END_SRC - -#+NAME: wordor_2 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 4714134 | 13865100 | 54 | 4713833 | 92434 | 13286924 | 258.308924373 | 55.730150301 | 184.86496102 | 31.15297126 | 144.089898137 | - -*** 4xX^3 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,4 --out-degree 50 --good 67000 --bad 73000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 70000... -: Trying 68500... -: Trying 69250... -: Trying 69625... -: Trying 69437... -: Trying 69531... -: Trying 69578... -: Trying 69601... -: Trying 69613... -: Trying 69619... -: Trying 69622... -: Trying 69623... -: Trying 69624... -: First bad state count: 69624 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Word,or_0,0,0,4_*_69623_* | tr " ," ",." -#+END_SRC - -#+NAME: wordor_3_file -#+RESULTS: -| 132M | bench/wta_Word.or_0.0.0.4_t3481150_50_69623_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Word,or --symbols 0,0,0,4 --out-degree 50 --different-values 50 --states 69623 -./bench.py run ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,4 --out-degree 50 --different-values 50 --states 69623 --indiv --header -#+END_SRC - -#+NAME: wordor_3 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 3550773 | 13924600 | 54 | 3550773 | 69623 | 13715478 | 217.684389256 | 49.986173123 | 159.050504019 | 25.229488197 | 127.060520493 | - -*** 4xX^4 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,0,4 --out-degree 50 --bad 60001 --good 55000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 57500... -: Trying 56250... -: Trying 56875... -: Trying 57187... -: Trying 57343... -: Trying 57265... -: Trying 57304... -: Trying 57323... -: Trying 57313... -: Trying 57318... -: Trying 57320... -: Trying 57319... -: First bad state count: 57320 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Word,or_0,0,0,0,4_*_57319_* | tr " ," ",." -#+END_SRC - -#+NAME: wordor_4_file -#+RESULTS: -| 130M | bench/wta_Word.or_0.0.0.0.4_t2865950_50_57319_0.coalgebra | - -**** Automaton Size - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Word,or --symbols 0,0,0,0,4 --out-degree 50 --different-values 50 --states 57319 -./bench.py run ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,0,4 --out-degree 50 --different-values 50 --states 57319 --indiv --header -#+END_SRC - -#+NAME: wordor_4 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 2923269 | 14329750 | 54 | 2923269 | 57319 | 15469967 | 199.956928585 | 47.318311842 | 146.418279061 | 25.807646931 | 115.015762137 | - -*** 4xX^5 mit out-degree und different-values 50 - -#+BEGIN_SRC shell -./bench.py bisect ../../copar/bin/random-wta ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,0,0,4 --out-degree 50 --good 48000 --bad 52000 --different-values 50 -#+END_SRC - -#+RESULTS: -: Trying 50000... -: Trying 49000... -: Trying 48500... -: Trying 48750... -: Trying 48875... -: Trying 48937... -: Trying 48968... -: Trying 48952... -: Trying 48960... -: Trying 48964... -: Trying 48962... -: Trying 48963... -: First bad state count: 48964 - -**** File Size - -#+BEGIN_SRC sh :results output table -ls -sh bench/wta_Word,or_0,0,0,0,0,4_*_48963_* | tr " ," ",." -#+END_SRC - -#+NAME: wordor_5_file -#+RESULTS: -| 129M | bench/wta_Word.or_0.0.0.0.0.4_t2448150_50_48963_0.coalgebra | - -**** Automaton Size - -Aus irgendeinem Grund läuft jetzt 48963 auch schon ins memory limit, deswegen 48962 - -#+BEGIN_SRC shell -./bench.py generate ../../copar/bin/random-wta --monoid Word,or --symbols 0,0,0,0,0,4 --out-degree 50 --different-values 50 --states 48962 -./bench.py run ../../copar/bin/copar --monoid Word,or --symbols 0,0,0,0,0,4 --out-degree 50 --different-values 50 --states 48962 --indiv --header -#+END_SRC - -#+NAME: wordor_5 -#+RESULTS: -| i | states | edges | initial-partition-size | final-partition-size | explicit-final-partition-size | size1-skipped | overall-duration | parse-duration | algorithm-duration | initialize-duration | refine-duration | -| 0 | 2497062 | 14688600 | 54 | 2497062 | 48962 | 18284567 | 167.692238761 | 45.179623229 | 117.531354091 | 20.079035336 | 92.723851956 | -** Summary -*** 4xX - -| Monoid | States | States+Interm. | Edges | File Size | init part | final part | t_p | t_i | t_r | -|----------+--------+----------------+----------+-----------+-----------+------------+-----------+-----------+-----------| -| powerset | 132177 | 6741027 | 13217700 | 117 M | 6 | 132177 | 53.024256 | 32.711091 | 156.04908 | -| Z,max | 114888 | 5859288 | 11488800 | 122 M | 416 | 114888 | 58.957254 | 34.573327 | 66.278453 | -| Word,or | 113957 | 5811807 | 11395700 | 131 M | 54 | 113957 | 61.587433 | 32.126284 | 109.72159 | -#+TBLFM: $2=$3/51::@2$3=remote(power_1,@2$2)::@2$4=remote(power_1,@2$3)::@2$5=remote(power_1_file,@1$1)::@2$6=remote(power_1, @2$4)::@2$7=remote(power_1, @2$6)::@2$8=remote(power_1,@2$9)::@2$9=remote(power_1,@2$11)::@2$10=remote(power_1,@2$12)::@3$3=remote(zmax_1,@2$2)::@3$4=remote(zmax_1,@2$3)::@3$5=remote(zmax_1_file,@1$1)::@3$6=remote(zmax_1, @2$4)::@3$7=remote(zmax_1, @2$6)::@3$8=remote(zmax_1,@2$9)::@3$9=remote(zmax_1,@2$11)::@3$10=remote(zmax_1,@2$12)::@4$3=remote(wordor_1,@2$2)::@4$4=remote(wordor_1,@2$3)::@4$5=remote(wordor_1_file,@1$1)::@4$6=remote(wordor_1, @2$4)::@4$7=remote(wordor_1, @2$6)::@4$8=remote(wordor_1,@2$9)::@4$9=remote(wordor_1,@2$11)::@4$10=remote(wordor_1,@2$12) - -*** 4xX^2 - -| Monoid | States | States+Interm. | Edges | File Size | init part | final part | t_p | t_i | t_r | -|----------+--------+----------------+----------+-----------+-----------+------------+-----------+-----------+-----------| -| powerset | 98670 | 5032170 | 14800500 | 123 M | 6 | 98670 | 46.231443 | 31.400596 | 212.32322 | -| Z,max | 95287 | 4859637 | 14293050 | 136 M | 404 | 95287 | 54.223932 | 30.811424 | 108.36404 | -| Word,or | 92434 | 4714134 | 13865100 | 141 M | 54 | 92434 | 55.730150 | 31.152971 | 144.08990 | -#+TBLFM: $2=$3/51::@2$3=remote(power_2,@2$2)::@2$4=remote(power_2,@2$3)::@2$5=remote(power_2_file,@1$1)::@2$6=remote(power_2, @2$4)::@2$7=remote(power_2, @2$6)::@2$8=remote(power_2,@2$9)::@2$9=remote(power_2,@2$11)::@2$10=remote(power_2,@2$12)::@3$3=remote(zmax_2,@2$2)::@3$4=remote(zmax_2,@2$3)::@3$5=remote(zmax_2_file,@1$1)::@3$6=remote(zmax_2, @2$4)::@3$7=remote(zmax_2, @2$6)::@3$8=remote(zmax_2,@2$9)::@3$9=remote(zmax_2,@2$11)::@3$10=remote(zmax_2,@2$12)::@4$3=remote(wordor_2,@2$2)::@4$4=remote(wordor_2,@2$3)::@4$5=remote(wordor_2_file,@1$1)::@4$6=remote(wordor_2, @2$4)::@4$7=remote(wordor_2, @2$6)::@4$8=remote(wordor_2,@2$9)::@4$9=remote(wordor_2,@2$11)::@4$10=remote(wordor_2,@2$12) - -*** 4xx^3 - -| Monoid | States | States+Interm. | Edges | File Size | init part | final part | t_p | t_i | t_r | -|----------+--------+----------------+----------+-----------+-----------+------------+-----------+-----------+-----------| -| powerset | 85016 | 4335816 | 17003200 | 138 M | 6 | 85016 | 47.614393 | 20.446586 | 167.58715 | -| Z,max | 70660 | 3603660 | 14132000 | 127 M | 397 | 70660 | 49.287429 | 25.886319 | 82.245760 | -| Word,or | 69623 | 3550773 | 13924600 | 132 M | 54 | 69623 | 49.986173 | 25.229488 | 127.06052 | -#+TBLFM: $2=$3/51::@2$3=remote(power_3,@2$2)::@2$4=remote(power_3,@2$3)::@2$5=remote(power_3_file,@1$1)::@2$6=remote(power_3, @2$4)::@2$7=remote(power_3, @2$6)::@2$8=remote(power_3,@2$9)::@2$9=remote(power_3,@2$11)::@2$10=remote(power_3,@2$12)::@3$3=remote(zmax_3,@2$2)::@3$4=remote(zmax_3,@2$3)::@3$5=remote(zmax_3_file,@1$1)::@3$6=remote(zmax_3, @2$4)::@3$7=remote(zmax_3, @2$6)::@3$8=remote(zmax_3,@2$9)::@3$9=remote(zmax_3,@2$11)::@3$10=remote(zmax_3,@2$12)::@4$3=remote(wordor_3,@2$2)::@4$4=remote(wordor_3,@2$3)::@4$5=remote(wordor_3_file,@1$1)::@4$6=remote(wordor_3, @2$4)::@4$7=remote(wordor_3, @2$6)::@4$8=remote(wordor_3,@2$9)::@4$9=remote(wordor_3,@2$11)::@4$10=remote(wordor_3,@2$12) - -*** 4xx^4 - -| Monoid | States | States+Interm. | Edges | File Size | init part | final part | t_p | t_i | t_r | -|----------+--------+----------------+----------+-----------+-----------+------------+-----------+-----------+-----------| -| powerset | 59596 | 3039396 | 14899000 | 119 M | 6 | 59596 | 41.065065 | 25.383502 | 121.31631 | -| Z,max | 62665 | 3195915 | 15666250 | 136 M | 397 | 62665 | 48.473165 | 26.234721 | 66.312404 | -| Word,or | 57319 | 2923269 | 14329750 | 130 M | 54 | 57319 | 47.318312 | 25.807647 | 115.01576 | -#+TBLFM: $2=$3/51::@2$3=remote(power_4,@2$2)::@2$4=remote(power_4,@2$3)::@2$5=remote(power_4_file,@1$1)::@2$6=remote(power_4, @2$4)::@2$7=remote(power_4, @2$6)::@2$8=remote(power_4,@2$9)::@2$9=remote(power_4,@2$11)::@2$10=remote(power_4,@2$12)::@3$3=remote(zmax_4,@2$2)::@3$4=remote(zmax_4,@2$3)::@3$5=remote(zmax_4_file,@1$1)::@3$6=remote(zmax_4, @2$4)::@3$7=remote(zmax_4, @2$6)::@3$8=remote(zmax_4,@2$9)::@3$9=remote(zmax_4,@2$11)::@3$10=remote(zmax_4,@2$12)::@4$3=remote(wordor_4,@2$2)::@4$4=remote(wordor_4,@2$3)::@4$5=remote(wordor_4_file,@1$1)::@4$6=remote(wordor_4, @2$4)::@4$7=remote(wordor_4, @2$6)::@4$8=remote(wordor_4,@2$9)::@4$9=remote(wordor_4,@2$11)::@4$10=remote(wordor_4,@2$12) - -*** 4xx^5 - -| Monoid | States | States+Interm. | Edges | File Size | init part | final part | t_p | t_i | t_r | -|----------+--------+----------------+----------+-----------+-----------+------------+-----------+-----------+-----------| -| powerset | 49375 | 2518125 | 14812500 | 116 M | 6 | 49375 | 38.769441 | 24.415686 | 90.703822 | -| Z,max | 49926 | 2546226 | 14977800 | 127 M | 376 | 49926 | 44.887706 | 20.851582 | 52.506482 | -| Word,or | 48962 | 2497062 | 14688600 | 129 M | 54 | 48962 | 45.179623 | 20.079035 | 92.723852 | -#+TBLFM: $2=$3/51::@2$3=remote(power_5,@2$2)::@2$4=remote(power_5,@2$3)::@2$5=remote(power_5_file,@1$1)::@2$6=remote(power_5, @2$4)::@2$7=remote(power_5, @2$6)::@2$8=remote(power_5,@2$9)::@2$9=remote(power_5,@2$11)::@2$10=remote(power_5,@2$12)::@3$3=remote(zmax_5,@2$2)::@3$4=remote(zmax_5,@2$3)::@3$5=remote(zmax_5_file,@1$1)::@3$6=remote(zmax_5, @2$4)::@3$7=remote(zmax_5, @2$6)::@3$8=remote(zmax_5,@2$9)::@3$9=remote(zmax_5,@2$11)::@3$10=remote(zmax_5,@2$12)::@4$3=remote(wordor_5,@2$2)::@4$4=remote(wordor_5,@2$3)::@4$5=remote(wordor_5_file,@1$1)::@4$6=remote(wordor_5, @2$4)::@4$7=remote(wordor_5, @2$6)::@4$8=remote(wordor_5,@2$9)::@4$9=remote(wordor_5,@2$11)::@4$10=remote(wordor_5,@2$12) -- GitLab