1. 05 Dec, 2017 6 commits
  2. 03 Dec, 2017 19 commits
    • Akim Demaille's avatar
      tests: more logs · 9928c5bc
      Akim Demaille authored
      * tests/unit/pylint.chk: here.
      9928c5bc
    • Akim Demaille's avatar
      tools: fix handing of invalid options · ed976197
      Akim Demaille authored
      * libexec/vcsn-tools.cc: here.
      ed976197
    • Akim Demaille's avatar
      compile: simplify option handling · 6c7ce169
      Akim Demaille authored
      * libexec/vcsn-compile: here.
      6c7ce169
    • Akim Demaille's avatar
      compile: pass the libs last · b08a1186
      Akim Demaille authored
      Needed for static libraries such as benchmark.a.
      
      * libexec/vcsn-compile: here.
      b08a1186
    • Akim Demaille's avatar
      vcsn: an AUTHORS file, used in --version · cb62c6f8
      Akim Demaille authored
      * AUTHORS.md: New (from `git summary`).
      * share/vcsn/config.in.yaml, configure.ac, bin/vcsn.in: Use it.
      cb62c6f8
    • Akim Demaille's avatar
      news: vcsn score and score-compare · 95e7945e
      Akim Demaille authored
      * NEWS.md: here.
      95e7945e
    • Akim Demaille's avatar
      build: fix test code for yaml-cpp · ba928b47
      Akim Demaille authored
      Currently on Stretch we fail with:
      
          lib/.libs/libvcsn.so: undefined reference to `YAML::detail::node_data::empty_scalar'
      
      It looks like what is described in
      https://github.com/jbeder/yaml-cpp/issues/332, but defining
      YAML_CPP_DLL does not solve our issue.
      
      * configure.ac: Fix object instantiation.
      ba928b47
    • Akim Demaille's avatar
      bin: let `vcsn version` display the git describe · cdc79864
      Akim Demaille authored
      This is really handy.
      
      * bin/vcsn.in: Here.
      While at it, revamp --help.
      cdc79864
    • Akim Demaille's avatar
      score: better --help · 28f50ba0
      Akim Demaille authored
      * libexec/vcsn-score: here.
      28f50ba0
    • Akim Demaille's avatar
      score: use a thread pool to run in parallel · c1a7451b
      Akim Demaille authored
      With four threads, we run in 3:47 instead of 7 minutes.  With one
      thread, it's about the same as without thread pool.
      
      It seems that -j4 is a sweet spot: it is more than twice faster, the
      results are not to biased.  However, real measurements must still be
      done with -j0, even -j2 is significantly worse.
      
      -j0:  407,97s user 15,23s system 99% cpu 7:05,14 total
      -j1:  405,23s user 14,81s system 99% cpu 7:01,31 total
      -j2:  440,83s user 15,80s system 180% cpu 4:13,22 total
      -j3:  485,92s user 18,85s system 243% cpu 3:26,96 total
      -j4:  484,52s user 18,58s system 285% cpu 2:56,11 total
      -j5:  494,52s user 18,68s system 288% cpu 2:57,84 total
      -j6:  594,24s user 22,43s system 360% cpu 2:50,85 total
      -j7:  646,45s user 25,01s system 388% cpu 2:52,62 total
      -j8:  657,94s user 24,55s system 408% cpu 2:47,13 total
      -j9:  663,67s user 24,60s system 416% cpu 2:45,37 total
      
      With colors:
      
            0     1     2     3     4     5     6     7     8     9
          12.61[0m 13.29[0m 12.35[0m 14.76[0m [31m[1m14.80[0m 12.81[0m 13.45[0m 14.12[0m 13.96[0m [32m[1m12.07[0m a & 12               # a = std([a-e]*b(<2>[a-e])*)
           0.41[0m [32m[1m 0.37[0m  0.44[0m [32m[1m 0.40[0m [32m[1m 0.34[0m [32m[1m 0.37[0m  0.43[0m [31m[1m 0.71[0m [32m[1m 0.40[0m [31m[1m 0.58[0m a.accessible()       # a = thm([a-m]{20000}).proper(prune=False), 4x
          [32m[1m 0.52[0m [32m[1m 0.51[0m [32m[1m 0.51[0m [32m[1m 0.58[0m [32m[1m 0.51[0m  0.72[0m [31m[1m 0.96[0m [31m[1m 1.08[0m [31m[1m 1.07[0m [31m[1m 1.32[0m a.compose(a)         # a = std(((\e|a+a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w+z|\e)){300}), c = [a-z]x[a-z] -> B, 20x
          [32m[1m 0.77[0m [32m[1m 0.77[0m [32m[1m 0.76[0m [32m[1m 0.75[0m [32m[1m 0.77[0m  1.01[0m [32m[1m 0.76[0m [32m[1m 0.78[0m [31m[1m 1.82[0m [31m[1m 1.90[0m a.compose(a)         # a = std(((a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w)){300}), c = [a-z]x[a-z] -> B, 50x
          19.95[0m 19.87[0m 20.00[0m 20.17[0m 19.72[0m 20.10[0m 19.94[0m 20.17[0m 20.14[0m 20.00[0m a.compose(a)         # a = std(['(a,a)'-'(i,z)']{4}), c = [a-z]x[a-z] -> B
          [32m[1m 0.69[0m [32m[1m 0.81[0m [32m[1m 0.81[0m [32m[1m 0.87[0m [32m[1m 0.69[0m  0.98[0m  1.09[0m [31m[1m 1.41[0m [31m[1m 1.37[0m [31m[1m 1.59[0m a.compose(a)         # a = thm(((\e|a+a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w+z|\e)){300}), c = [a-z]x[a-z] -> B, 10x
          [32m[1m 0.65[0m [32m[1m 0.64[0m [32m[1m 0.64[0m [32m[1m 0.71[0m [32m[1m 0.65[0m  1.00[0m [31m[1m 1.22[0m [31m[1m 1.40[0m [31m[1m 1.37[0m [31m[1m 1.59[0m a.compose(a)         # a = thm(((a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w)){300}), c = [a-z]x[a-z] -> B, 20x
           0.70[0m  0.71[0m  0.75[0m  0.79[0m [31m[1m 0.83[0m  0.71[0m  0.72[0m  0.73[0m  0.75[0m  0.71[0m a.compose(a2)        # a2 = std(([a-z]|[a-z])?{20}), a = std(a|a), 50x
          [32m[1m 2.43[0m [32m[1m 2.13[0m [32m[1m 2.34[0m [32m[1m 2.68[0m [32m[1m 2.84[0m [32m[1m 2.82[0m  3.31[0m [31m[1m 3.82[0m [31m[1m 4.48[0m [31m[1m 4.95[0m a.conjunction(a)     # a = std([a-e]?{50})
          [32m[1m 0.67[0m [32m[1m 0.67[0m  0.69[0m  0.77[0m  0.78[0m  0.80[0m [31m[1m 0.86[0m [31m[1m 0.85[0m  0.82[0m [32m[1m 0.65[0m a.conjunction(a)     # a = thm([a-e]?{80})
          [32m[1m 1.40[0m [32m[1m 1.40[0m [32m[1m 1.44[0m [32m[1m 1.61[0m [32m[1m 1.69[0m [32m[1m 1.68[0m [31m[1m 2.12[0m [31m[1m 2.34[0m [31m[1m 2.59[0m [31m[1m 2.90[0m a.conjunction(a, a, a) # a = thm([a-e]?{5})
          [32m[1m 0.93[0m [32m[1m 0.91[0m [32m[1m 1.20[0m [32m[1m 1.16[0m [32m[1m 1.23[0m  1.32[0m  1.52[0m [31m[1m 1.78[0m [31m[1m 1.85[0m [31m[1m 2.10[0m a.determinize("lazy,weighted").accessible() # a = de_bruijn(13), c = [abc] -> F2, 5x
          [32m[1m 0.36[0m [32m[1m 0.36[0m [32m[1m 0.46[0m [32m[1m 0.39[0m [32m[1m 0.47[0m [32m[1m 0.45[0m [31m[1m 0.66[0m [31m[1m 0.68[0m [31m[1m 0.71[0m [31m[1m 0.84[0m a.determinize("lazy,weighted").accessible() # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
          [32m[1m 0.46[0m [32m[1m 0.45[0m [32m[1m 0.46[0m [32m[1m 0.60[0m [32m[1m 0.55[0m  0.73[0m  0.74[0m [31m[1m 0.84[0m [31m[1m 0.93[0m [31m[1m 1.07[0m a.determinize("weighted") # a = de_bruijn(13), 5x
          [32m[1m 0.45[0m [32m[1m 0.45[0m [32m[1m 0.46[0m  0.61[0m [32m[1m 0.58[0m  0.63[0m [31m[1m 0.75[0m  0.71[0m [31m[1m 0.89[0m [31m[1m 1.00[0m a.determinize("weighted") # a = de_bruijn(13), c = [abc] -> F2, 5x
          [32m[1m 1.12[0m [32m[1m 1.11[0m [32m[1m 1.33[0m [32m[1m 1.22[0m [32m[1m 1.30[0m [32m[1m 1.39[0m [31m[1m 1.73[0m [31m[1m 1.95[0m [31m[1m 2.02[0m [31m[1m 2.32[0m a.determinize("weighted") # a = de_bruijn(14), 5x
          [32m[1m 1.11[0m [32m[1m 1.13[0m [32m[1m 1.31[0m [32m[1m 1.27[0m [32m[1m 1.28[0m  1.39[0m [31m[1m 1.69[0m [31m[1m 1.75[0m [31m[1m 2.02[0m [31m[1m 2.19[0m a.determinize("weighted") # a = de_bruijn(14), c = [abc] -> F2, 5x
          [32m[1m 1.16[0m [32m[1m 1.17[0m [32m[1m 1.14[0m [32m[1m 1.21[0m [32m[1m 1.33[0m  1.35[0m [31m[1m 1.68[0m [31m[1m 1.90[0m [31m[1m 1.82[0m [31m[1m 2.19[0m a.determinize("weighted") # a = de_bruijn(16)
          [32m[1m 1.17[0m [32m[1m 1.19[0m [32m[1m 1.15[0m [32m[1m 1.19[0m [32m[1m 1.23[0m [32m[1m 1.22[0m  1.48[0m [31m[1m 1.83[0m [31m[1m 1.88[0m [31m[1m 2.05[0m a.determinize("weighted") # a = de_bruijn(16), c = [abc] -> F2
          [32m[1m 0.28[0m [32m[1m 0.29[0m [32m[1m 0.37[0m [32m[1m 0.31[0m [32m[1m 0.38[0m [32m[1m 0.40[0m [31m[1m 0.55[0m [31m[1m 0.63[0m [31m[1m 0.59[0m [31m[1m 0.70[0m a.determinize("weighted") # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
          [32m[1m 0.57[0m [32m[1m 0.57[0m [32m[1m 0.61[0m [32m[1m 0.62[0m [32m[1m 0.71[0m  0.84[0m [31m[1m 1.02[0m [31m[1m 1.15[0m [31m[1m 1.12[0m [31m[1m 1.26[0m a.determinize()      # a = de_bruijn(13), 20x
          [32m[1m 0.66[0m [32m[1m 0.63[0m [32m[1m 0.67[0m [32m[1m 0.69[0m [32m[1m 0.81[0m  0.88[0m [31m[1m 1.17[0m [31m[1m 1.26[0m [31m[1m 1.22[0m [31m[1m 1.41[0m a.determinize()      # a = de_bruijn(13), c = [abc] -> F2, 20x
          [32m[1m 0.61[0m [32m[1m 0.61[0m [32m[1m 0.65[0m [32m[1m 0.79[0m  0.82[0m  0.84[0m  0.96[0m [31m[1m 0.97[0m [31m[1m 1.20[0m [31m[1m 1.35[0m a.determinize()      # a = de_bruijn(14), 10x
          [32m[1m 0.67[0m [32m[1m 0.67[0m [32m[1m 0.73[0m [32m[1m 0.82[0m  0.89[0m [32m[1m 0.78[0m  1.02[0m [31m[1m 1.24[0m [31m[1m 1.28[0m [31m[1m 1.40[0m a.determinize()      # a = de_bruijn(14), c = [abc] -> F2, 10x
          [32m[1m 0.51[0m [32m[1m 0.51[0m [32m[1m 0.61[0m [32m[1m 0.59[0m [32m[1m 0.61[0m  0.67[0m  0.77[0m [31m[1m 0.87[0m [31m[1m 0.99[0m [31m[1m 1.05[0m a.determinize()      # a = de_bruijn(16), 2x
          [32m[1m 0.56[0m [32m[1m 0.56[0m [32m[1m 0.62[0m [32m[1m 0.63[0m [32m[1m 0.70[0m [32m[1m 0.71[0m [31m[1m 0.92[0m [31m[1m 1.05[0m [31m[1m 1.08[0m [31m[1m 1.17[0m a.determinize()      # a = de_bruijn(16), c = [abc] -> F2, 2x
          [32m[1m 0.77[0m [32m[1m 0.77[0m [32m[1m 0.75[0m [32m[1m 0.80[0m [32m[1m 0.75[0m [32m[1m 0.80[0m  0.97[0m [31m[1m 1.03[0m [31m[1m 1.20[0m [31m[1m 1.38[0m a.determinize()      # a = ladybird(18)
          [32m[1m 0.76[0m [32m[1m 0.78[0m [32m[1m 0.71[0m [32m[1m 0.77[0m [32m[1m 0.81[0m  0.92[0m [31m[1m 1.14[0m [31m[1m 1.17[0m [31m[1m 1.16[0m [31m[1m 1.35[0m a.determinize()      # a = ladybird(18), c = [a-zA-Z0-9] -> B
          [32m[1m 6.92[0m [32m[1m 6.99[0m [32m[1m 6.98[0m [32m[1m 6.95[0m [32m[1m 7.29[0m  7.87[0m  8.99[0m [31m[1m10.07[0m [31m[1m10.46[0m [31m[1m12.05[0m a.determinize()      # a = ladybird(21)
          [32m[1m 1.21[0m [32m[1m 1.21[0m [32m[1m 1.42[0m [32m[1m 1.31[0m  1.49[0m  1.47[0m  1.72[0m [31m[1m 1.84[0m [31m[1m 1.97[0m [31m[1m 2.44[0m a.determinize()      # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
          [32m[1m 1.31[0m [32m[1m 1.24[0m [32m[1m 1.55[0m [32m[1m 1.57[0m [32m[1m 1.58[0m [32m[1m 1.68[0m [31m[1m 2.24[0m [31m[1m 2.54[0m [31m[1m 2.68[0m [31m[1m 3.05[0m a.evaluate("a"*151)  # a = de_bruijn(150), 10000x
          [32m[1m 0.80[0m [32m[1m 0.76[0m [32m[1m 0.95[0m [32m[1m 0.98[0m  1.16[0m  1.05[0m  1.17[0m [31m[1m 1.35[0m [31m[1m 1.42[0m [31m[1m 1.82[0m a.evaluate("abcxyz"*25) # a = std([a-z]*), c = [a-z] -> Z, 20000x
          [32m[1m 1.27[0m [32m[1m 1.21[0m [32m[1m 1.29[0m [32m[1m 1.48[0m [32m[1m 1.62[0m  1.68[0m [31m[1m 2.23[0m [31m[1m 2.46[0m [31m[1m 2.55[0m [31m[1m 2.84[0m a.evaluate("abcxyz"*25) # a = std([a-z]*), c = [a-z]* -> Z, 10000x
          [32m[1m 0.82[0m [32m[1m 0.78[0m [32m[1m 0.83[0m [32m[1m 1.01[0m [32m[1m 1.04[0m  1.08[0m  1.27[0m [31m[1m 1.44[0m [31m[1m 1.56[0m [31m[1m 1.77[0m a.evaluate(wc.polynomial("abcxyz"*25)) # a = std([a-z]*), c = [a-z] -> Z, 20000x
          [32m[1m 1.32[0m [32m[1m 1.27[0m [32m[1m 1.33[0m [32m[1m 1.50[0m [32m[1m 1.71[0m [32m[1m 1.64[0m [31m[1m 2.27[0m [31m[1m 2.60[0m [31m[1m 2.59[0m [31m[1m 3.26[0m a.evaluate(wc.polynomial("abcxyz"*25)) # a = std([a-z]*), c = [a-z]* -> Z, 10000x
          [32m[1m 0.99[0m [32m[1m 0.95[0m [32m[1m 1.16[0m [32m[1m 1.31[0m [32m[1m 1.29[0m [32m[1m 1.25[0m [31m[1m 1.78[0m [31m[1m 1.89[0m [31m[1m 1.87[0m [31m[1m 2.33[0m a.expression("associative", "delgado") # a = ladybird(2000), 10x
          [32m[1m 0.61[0m [32m[1m 0.56[0m [32m[1m 0.68[0m [32m[1m 0.63[0m  0.79[0m [32m[1m 0.74[0m [31m[1m 0.93[0m [31m[1m 1.02[0m [31m[1m 1.13[0m [31m[1m 1.24[0m a.expression("associative", "naive") # a = ladybird(8000), 10x
          [32m[1m 0.51[0m [32m[1m 0.44[0m [32m[1m 0.52[0m [32m[1m 0.59[0m  0.79[0m  0.72[0m [31m[1m 0.94[0m [31m[1m 1.05[0m [31m[1m 1.14[0m [31m[1m 1.25[0m a.expression("associative", "naive") # a = std([a-d]?{100})
          [32m[1m 0.93[0m [32m[1m 0.85[0m [32m[1m 1.17[0m [32m[1m 1.12[0m [32m[1m 1.13[0m  1.24[0m  1.46[0m [31m[1m 1.54[0m [31m[1m 1.80[0m [31m[1m 2.06[0m a.expression("linear", "delgado") # a = ladybird(2000), 5x
          [32m[1m 0.77[0m [32m[1m 0.74[0m [32m[1m 1.03[0m [32m[1m 1.02[0m [32m[1m 1.02[0m [32m[1m 1.02[0m [31m[1m 1.51[0m [31m[1m 1.63[0m [31m[1m 1.75[0m [31m[1m 1.92[0m a.expression("linear", "delgado") # a = std([a-d]?{15}), 5x
          [32m[1m 0.72[0m [32m[1m 0.66[0m [32m[1m 0.72[0m [32m[1m 0.96[0m [32m[1m 0.97[0m [32m[1m 0.95[0m  1.14[0m [31m[1m 1.48[0m [31m[1m 1.81[0m [31m[1m 1.92[0m a.expression("linear", "naive") # a = ladybird(4000), 2x
          [32m[1m 0.48[0m [32m[1m 0.47[0m [32m[1m 0.62[0m [32m[1m 0.64[0m [32m[1m 0.62[0m [32m[1m 0.66[0m  0.77[0m [31m[1m 1.07[0m [31m[1m 1.12[0m [31m[1m 1.27[0m a.expression("linear", "naive") # a = std([a-d]?{9}), 5x
          [32m[1m 0.54[0m [32m[1m 0.53[0m [32m[1m 0.58[0m [32m[1m 0.58[0m [32m[1m 0.60[0m  0.74[0m [31m[1m 0.88[0m [31m[1m 1.00[0m [31m[1m 1.10[0m [31m[1m 1.27[0m a.format("daut")     # a = std(a?{500}), 5x
          [32m[1m 0.65[0m [32m[1m 0.65[0m [32m[1m 0.70[0m [32m[1m 0.73[0m [32m[1m 0.78[0m  0.88[0m [31m[1m 1.11[0m [31m[1m 1.20[0m [31m[1m 1.39[0m [31m[1m 1.58[0m a.format("dot")      # a = std(a?{500}), 5x
          [32m[1m 0.25[0m [32m[1m 0.25[0m [32m[1m 0.27[0m [32m[1m 0.28[0m [32m[1m 0.29[0m  0.35[0m [31m[1m 0.42[0m [31m[1m 0.42[0m [31m[1m 0.55[0m [31m[1m 0.64[0m a.format("efsm")     # a = std(a?{500}), 5x
          [32m[1m 0.25[0m [32m[1m 0.25[0m [32m[1m 0.26[0m [32m[1m 0.28[0m [32m[1m 0.28[0m  0.35[0m  0.36[0m [31m[1m 0.53[0m [31m[1m 0.53[0m [31m[1m 0.63[0m a.format("fado")     # a = std(a?{500}), 5x
          [32m[1m 0.33[0m [32m[1m 0.33[0m [32m[1m 0.35[0m [32m[1m 0.36[0m [32m[1m 0.37[0m  0.44[0m  0.50[0m [31m[1m 0.68[0m [31m[1m 0.71[0m [31m[1m 0.81[0m a.format("grail")    # a = std(a?{500}), 5x
          [32m[1m 0.53[0m [32m[1m 0.54[0m [32m[1m 0.56[0m [32m[1m 0.59[0m [32m[1m 0.59[0m  0.69[0m  0.78[0m [31m[1m 0.85[0m [31m[1m 1.11[0m [31m[1m 1.25[0m a.format("tikz")     # a = std(a?{500}), 5x
          [32m[1m 0.55[0m [32m[1m 0.55[0m [32m[1m 0.56[0m [32m[1m 0.56[0m [32m[1m 0.57[0m [32m[1m 0.54[0m  0.67[0m [31m[1m 0.74[0m [31m[1m 0.79[0m [31m[1m 0.92[0m a.has_bounded_lag()  # a = std(['(a,x)'-'(b,y)']*{600}), 20x
          [32m[1m 1.13[0m [32m[1m 1.13[0m [32m[1m 1.14[0m [32m[1m 1.20[0m [31m[1m 1.89[0m [32m[1m 1.48[0m [31m[1m 1.86[0m [31m[1m 1.89[0m [31m[1m 2.37[0m [31m[1m 2.36[0m a.has_bounded_lag()  # a = std(['(a,x)'-'(b,y)']{1000}*), 10x
           FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL a.has_twins_property() # a = std([a-c]{200}*+[a-c]{200}*, "associative"), c = [abc] -> Zmin
           6.01[0m [32m[1m 5.86[0m [32m[1m 5.91[0m  6.48[0m  6.89[0m [31m[1m 7.55[0m [31m[1m 8.22[0m  6.86[0m  6.78[0m [32m[1m 5.54[0m a.infiltrate(a)      # a = std([a-e]?{30})
          [32m[1m 0.50[0m [32m[1m 0.51[0m [32m[1m 0.54[0m [32m[1m 0.54[0m [32m[1m 0.62[0m  0.71[0m [31m[1m 0.83[0m [31m[1m 1.07[0m [31m[1m 1.00[0m [31m[1m 1.08[0m a.is_ambiguous()     # a = std([a-c]{2000}(<2>ab+a<3>b)), c = [abc] -> Z, 20x
          [32m[1m 1.13[0m [32m[1m 1.18[0m [32m[1m 1.22[0m [32m[1m 1.29[0m [32m[1m 1.56[0m  1.59[0m [31m[1m 2.19[0m [31m[1m 2.34[0m [31m[1m 2.23[0m [31m[1m 2.71[0m a.is_cycle_ambiguous() # a = std([a-c]{2000}(<2>ab+a<3>b)), c = [abc] -> Z, 20x
          [32m[1m 0.30[0m [32m[1m 0.33[0m [32m[1m 0.32[0m [32m[1m 0.34[0m [32m[1m 0.39[0m [32m[1m 0.39[0m [31m[1m 0.59[0m [31m[1m 0.63[0m [31m[1m 0.76[0m [31m[1m 0.90[0m a.is_deterministic() # a = ladybird(15).determinize(), 1000000x
          [32m[1m 0.54[0m [32m[1m 0.55[0m [32m[1m 0.56[0m [32m[1m 0.59[0m [32m[1m 0.63[0m [32m[1m 0.63[0m [31m[1m 0.95[0m [31m[1m 1.13[0m [31m[1m 1.07[0m [31m[1m 1.12[0m a.is_functional()    # a = std((a|x){2000}(b|y)), 100x
          [32m[1m 0.30[0m [32m[1m 0.33[0m [32m[1m 0.31[0m [32m[1m 0.32[0m [32m[1m 0.35[0m  0.41[0m  0.48[0m [31m[1m 0.57[0m [31m[1m 0.66[0m [31m[1m 0.70[0m a.is_proper()        # a = "", 1000000x
           1.08[0m  1.08[0m  1.05[0m  1.07[0m  1.08[0m  1.13[0m [31m[1m 1.48[0m [31m[1m 1.40[0m  1.15[0m  1.12[0m a.is_synchronized()  # a = std((abc|de)((f|\e)+((g|h)(i|j)*(\e|k)))(l|mn){500000})
          [32m[1m 0.35[0m [32m[1m 0.33[0m [32m[1m 0.52[0m [32m[1m 0.48[0m  0.73[0m [32m[1m 0.59[0m  0.76[0m [31m[1m 1.00[0m [31m[1m 1.05[0m [31m[1m 1.18[0m a.lightest()         # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
          [32m[1m 0.70[0m [32m[1m 0.67[0m [32m[1m 0.68[0m [32m[1m 0.67[0m [32m[1m 0.72[0m  0.79[0m  0.91[0m [31m[1m 1.04[0m [31m[1m 1.18[0m [31m[1m 1.29[0m a.lightest(5, "auto") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 10x
          [32m[1m 1.35[0m [32m[1m 1.21[0m [32m[1m 1.44[0m [32m[1m 1.68[0m  1.89[0m  1.85[0m  2.11[0m [31m[1m 2.80[0m [31m[1m 2.69[0m [31m[1m 3.08[0m a.lightest(5, "eppstein") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
          [32m[1m 0.90[0m [32m[1m 0.85[0m [32m[1m 1.08[0m [32m[1m 1.19[0m [32m[1m 1.42[0m  1.55[0m [31m[1m 1.90[0m [31m[1m 2.17[0m [31m[1m 2.41[0m [31m[1m 2.75[0m a.lightest(5, "yen") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
          [32m[1m 0.29[0m [32m[1m 0.27[0m [32m[1m 0.29[0m [32m[1m 0.33[0m  0.37[0m  0.40[0m  0.43[0m [31m[1m 0.50[0m [31m[1m 0.60[0m [31m[1m 0.59[0m a.lightest(5000)     # a = derived_term((\e|x + a|\e)*), c = [a]x[x] -> Q, 10x
          [32m[1m 0.25[0m [32m[1m 0.22[0m [32m[1m 0.28[0m [32m[1m 0.29[0m  0.31[0m [32m[1m 0.29[0m [31m[1m 0.39[0m [31m[1m 0.44[0m [31m[1m 0.47[0m [31m[1m 0.48[0m a.lightest_automaton(1, "a-star") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 20x
          [32m[1m 0.64[0m [32m[1m 0.61[0m [32m[1m 0.70[0m [32m[1m 0.70[0m [32m[1m 0.81[0m [32m[1m 0.81[0m [31m[1m 1.16[0m [31m[1m 1.33[0m [31m[1m 1.39[0m [31m[1m 1.54[0m a.lightest_automaton(1, "bellman-ford") # a = std([a-e]?{150}), c = [a-e] -> Nmin
          [32m[1m 0.36[0m [32m[1m 0.34[0m [32m[1m 0.42[0m [32m[1m 0.48[0m [32m[1m 0.59[0m [31m[1m 0.75[0m [31m[1m 0.77[0m [31m[1m 0.96[0m [31m[1m 0.93[0m [31m[1m 1.14[0m a.lightest_automaton(1, "dijkstra") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
          [32m[1m 0.96[0m [32m[1m 0.96[0m [32m[1m 1.31[0m  1.41[0m  1.41[0m  1.45[0m [31m[1m 1.83[0m [31m[1m 2.04[0m [31m[1m 1.94[0m [31m[1m 2.00[0m a.minimize("brzozowski") # a = std([a-g]{300}), c = [a-k] -> B, 200x
          [32m[1m 1.05[0m [32m[1m 1.07[0m  1.47[0m  1.50[0m  1.53[0m  1.48[0m [31m[1m 2.08[0m [31m[1m 2.32[0m [31m[1m 1.81[0m [31m[1m 1.85[0m a.minimize("hopcroft") # a = std([a-g]{300}), c = [a-k] -> B, 2x
          [32m[1m 0.58[0m [32m[1m 0.58[0m [32m[1m 0.81[0m [32m[1m 0.83[0m [32m[1m 0.82[0m [32m[1m 0.82[0m [31m[1m 1.08[0m [31m[1m 1.26[0m [31m[1m 1.42[0m [31m[1m 1.58[0m a.minimize("moore")  # a = std([a-g]{300}), c = [a-k] -> B, 40x
          [32m[1m 0.74[0m [32m[1m 0.73[0m [32m[1m 0.98[0m [32m[1m 1.02[0m [32m[1m 1.04[0m [32m[1m 1.03[0m [31m[1m 1.35[0m [31m[1m 1.54[0m [31m[1m 1.61[0m [31m[1m 2.00[0m a.minimize("signature") # a = std([a-g]{300}), c = [a-k] -> B, 2x
          [32m[1m 1.14[0m [32m[1m 1.15[0m [32m[1m 1.45[0m [32m[1m 1.50[0m [32m[1m 1.57[0m [32m[1m 1.60[0m [31m[1m 2.15[0m [31m[1m 2.59[0m [31m[1m 2.43[0m [31m[1m 2.70[0m a.minimize("weighted") # a = std([a-g]{300}), c = [a-k] -> B
          [32m[1m 1.24[0m [32m[1m 1.14[0m [32m[1m 1.58[0m [32m[1m 1.28[0m [32m[1m 1.46[0m  1.67[0m [31m[1m 2.25[0m [31m[1m 2.39[0m [31m[1m 2.39[0m [31m[1m 2.21[0m a.minimize("weighted") # a = std([a-g]{300}), c = [a-k] -> Z
          [32m[1m 2.16[0m [32m[1m 2.00[0m [32m[1m 2.94[0m [32m[1m 2.97[0m [32m[1m 3.00[0m  3.45[0m [31m[1m 4.08[0m [31m[1m 4.83[0m [31m[1m 5.13[0m [31m[1m 6.07[0m a.proper()           # a = thm(a?{1200})
          [32m[1m 1.95[0m [32m[1m 1.96[0m [32m[1m 2.05[0m [32m[1m 2.35[0m  2.88[0m [32m[1m 2.34[0m [31m[1m 3.66[0m [31m[1m 4.10[0m [31m[1m 3.79[0m [31m[1m 3.73[0m a.reduce()           # a = std([a-g]{300}), c = [a-k] -> Q
          [32m[1m 1.35[0m [32m[1m 1.37[0m [32m[1m 1.73[0m [32m[1m 1.50[0m  2.03[0m [32m[1m 1.64[0m [31m[1m 2.63[0m [31m[1m 2.99[0m [31m[1m 3.06[0m [31m[1m 3.68[0m a.reduce()           # a = std([a-g]{300}), c = [a-k] -> Z
          [32m[1m 0.18[0m [32m[1m 0.20[0m [32m[1m 0.19[0m [32m[1m 0.20[0m  0.25[0m [32m[1m 0.22[0m  0.24[0m [31m[1m 0.39[0m [31m[1m 0.38[0m [31m[1m 0.40[0m a.scc("dijkstra")    # a = std((abc)*{1000}), 20x
          [32m[1m 0.24[0m [32m[1m 0.24[0m [32m[1m 0.21[0m [32m[1m 0.22[0m [32m[1m 0.23[0m [32m[1m 0.24[0m [31m[1m 0.37[0m [31m[1m 0.45[0m [31m[1m 0.38[0m [31m[1m 0.41[0m a.scc("kosaraju")    # a = std((abc)*{1000}), 20x
          [32m[1m 0.22[0m [32m[1m 0.22[0m [32m[1m 0.23[0m [32m[1m 0.24[0m [32m[1m 0.26[0m [32m[1m 0.27[0m [31m[1m 0.52[0m  0.33[0m [31m[1m 0.57[0m [31m[1m 0.53[0m a.scc("tarjan_iterative") # a = std((abc)*{1000}), 20x
          [32m[1m 0.23[0m [32m[1m 0.23[0m [32m[1m 0.20[0m [32m[1m 0.23[0m [32m[1m 0.21[0m  0.25[0m [31m[1m 0.34[0m  0.28[0m [31m[1m 0.34[0m [31m[1m 0.36[0m a.scc("tarjan_recursive") # a = std((abc)*{1000}), 20x
          [32m[1m 0.59[0m [32m[1m 0.61[0m [32m[1m 0.56[0m [32m[1m 0.63[0m  0.74[0m  0.76[0m [31m[1m 0.88[0m [31m[1m 0.98[0m [31m[1m 0.92[0m [31m[1m 1.01[0m a.shortest(5)        # a = de_bruijn(9), 10x
          [32m[1m 1.24[0m [32m[1m 1.21[0m [32m[1m 1.12[0m [32m[1m 1.22[0m [32m[1m 1.25[0m [32m[1m 1.22[0m  1.37[0m [31m[1m 1.72[0m [31m[1m 1.61[0m [31m[1m 1.96[0m a.shortest(5)        # a = std([a-e]?{600}), c = [a-e] -> Z, 5x
          [32m[1m 0.68[0m [32m[1m 0.63[0m [32m[1m 0.62[0m [32m[1m 0.67[0m  0.82[0m  0.77[0m  0.87[0m [31m[1m 0.91[0m [31m[1m 1.08[0m [31m[1m 1.21[0m a.shortest(5000)     # a = de_bruijn(9), 10x
          [32m[1m 0.22[0m [32m[1m 0.21[0m [32m[1m 0.22[0m [32m[1m 0.23[0m [32m[1m 0.27[0m  0.32[0m [31m[1m 0.34[0m [31m[1m 0.37[0m [31m[1m 0.38[0m [31m[1m 0.44[0m a.shortest(5000)     # a = derived_term((\e|x + a|\e)*), c = [a]x[x] -> Q, 10x
          [32m[1m 2.49[0m [32m[1m 2.32[0m  2.85[0m  2.95[0m  2.94[0m  2.87[0m  3.27[0m [31m[1m 3.43[0m [31m[1m 3.87[0m [31m[1m 4.05[0m a.shuffle(a)         # a = std([a-e]?{50})
          [32m[1m 0.92[0m [32m[1m 0.86[0m [32m[1m 1.07[0m [32m[1m 1.11[0m  1.14[0m [32m[1m 1.08[0m  1.31[0m [31m[1m 1.40[0m [31m[1m 1.51[0m [31m[1m 1.94[0m a.sort()             # a = std([a-e]?{700})
          [32m[1m 0.68[0m [32m[1m 0.66[0m [32m[1m 0.70[0m  0.81[0m [32m[1m 0.70[0m [32m[1m 0.77[0m  0.90[0m  0.93[0m [31m[1m 1.23[0m [31m[1m 1.24[0m a.synchronize()      # a = std((abc|de)((f|\e)+((g|h)(i|j)*(\e|k)))(l|mn){2000})
          [32m[1m 0.33[0m [32m[1m 0.34[0m [32m[1m 0.35[0m [32m[1m 0.37[0m  0.48[0m [32m[1m 0.40[0m [31m[1m 0.60[0m [31m[1m 0.79[0m [31m[1m 0.56[0m [31m[1m 0.62[0m a.synchronizing_word() # a = de_bruijn(6)
          [32m[1m 0.75[0m [32m[1m 0.77[0m [32m[1m 0.80[0m [32m[1m 0.80[0m [32m[1m 0.88[0m  1.02[0m  1.06[0m  1.06[0m [31m[1m 1.49[0m [31m[1m 1.63[0m a.weight_series()    # a = std([a-z]{200}), c = [a-z] -> Z, 10x
          [32m[1m 0.65[0m [32m[1m 0.65[0m [32m[1m 0.69[0m [32m[1m 0.69[0m  0.72[0m [31m[1m 0.88[0m [31m[1m 1.05[0m [31m[1m 0.95[0m  0.77[0m  0.73[0m a.weight_series()    # a = std(a{12000}+<1>[b-z]{12000}), c = [a-z] -> Nmin, 200x
          [32m[1m 0.57[0m [32m[1m 0.62[0m [32m[1m 0.62[0m [32m[1m 0.64[0m [32m[1m 0.65[0m  0.75[0m  0.85[0m [31m[1m 0.88[0m [31m[1m 1.03[0m [31m[1m 1.16[0m b.expression(e)      # e = "(\e+a)" * 500, 100x
          [32m[1m 0.31[0m [32m[1m 0.33[0m [32m[1m 0.33[0m [32m[1m 0.35[0m [32m[1m 0.37[0m  0.42[0m  0.44[0m  0.45[0m [31m[1m 0.54[0m [31m[1m 0.58[0m b.expression(e)      # e = [ab]{20000}, 1000x
          [32m[1m 0.12[0m [32m[1m 0.11[0m [32m[1m 0.12[0m [32m[1m 0.13[0m [32m[1m 0.13[0m  0.16[0m  0.17[0m [31m[1m 0.20[0m [31m[1m 0.24[0m [31m[1m 0.26[0m b.format("text")     # b = [abc] -> B, 100000x
          [32m[1m 0.90[0m [32m[1m 0.85[0m [32m[1m 1.11[0m  1.21[0m  1.17[0m [32m[1m 1.11[0m  1.36[0m [31m[1m 1.54[0m [31m[1m 1.50[0m [31m[1m 1.88[0m e.split()            # e = [a-e]?{15}
          [32m[1m 0.98[0m [32m[1m 0.97[0m [32m[1m 1.00[0m [32m[1m 1.01[0m [32m[1m 1.07[0m [32m[1m 1.04[0m [31m[1m 1.42[0m  1.26[0m [31m[1m 1.65[0m [31m[1m 1.83[0m p.trie()             # p = [a-j]{6}
          [32m[1m 0.68[0m [32m[1m 0.69[0m [32m[1m 0.75[0m  0.87[0m  0.81[0m  0.84[0m [31m[1m 0.99[0m [31m[1m 1.01[0m [31m[1m 1.10[0m [31m[1m 1.23[0m r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){150}, c = [a-z] -> Z, 50x
          [32m[1m 0.36[0m [32m[1m 0.35[0m [32m[1m 0.37[0m [32m[1m 0.38[0m  0.44[0m  0.45[0m  0.48[0m [31m[1m 0.50[0m [31m[1m 0.50[0m [31m[1m 0.56[0m r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){150}, c = [ab] -> Z, 50x
          [32m[1m 0.98[0m [32m[1m 0.99[0m [32m[1m 1.04[0m  1.18[0m  1.14[0m  1.28[0m  1.31[0m [31m[1m 1.38[0m [31m[1m 1.49[0m [31m[1m 1.69[0m r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
          [32m[1m 0.55[0m [32m[1m 0.55[0m  0.62[0m  0.71[0m  0.64[0m  0.67[0m  0.72[0m  0.74[0m [31m[1m 0.79[0m [31m[1m 0.89[0m r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){300}, c = [ab] -> Z, 20x
          [32m[1m 0.42[0m [32m[1m 0.42[0m [32m[1m 0.45[0m [32m[1m 0.46[0m [32m[1m 0.47[0m  0.57[0m  0.58[0m [31m[1m 0.66[0m [31m[1m 0.82[0m [31m[1m 0.96[0m r.derived_term("derivation") # r = a?{150}, c = [a] -> Z, 2x
          [32m[1m 0.25[0m [32m[1m 0.24[0m [32m[1m 0.26[0m  0.31[0m [32m[1m 0.28[0m  0.30[0m  0.33[0m [31m[1m 0.35[0m [31m[1m 0.38[0m [31m[1m 0.43[0m r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){150}, c = [a-z] -> Z, 50x
          [32m[1m 0.38[0m [32m[1m 0.37[0m [32m[1m 0.40[0m [32m[1m 0.41[0m  0.44[0m  0.44[0m  0.49[0m  0.49[0m [31m[1m 0.54[0m [31m[1m 0.62[0m r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
          [32m[1m 0.32[0m [32m[1m 0.32[0m [32m[1m 0.35[0m [32m[1m 0.35[0m  0.42[0m [32m[1m 0.40[0m  0.44[0m [31m[1m 0.51[0m [31m[1m 0.63[0m [31m[1m 0.73[0m r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){3}, c = [a-z] -> Z, 10000x
          [32m[1m 0.45[0m [32m[1m 0.45[0m [32m[1m 0.48[0m [32m[1m 0.51[0m [32m[1m 0.54[0m  0.62[0m  0.63[0m [31m[1m 0.73[0m [31m[1m 0.93[0m [31m[1m 1.04[0m r.derived_term("expansion") # r = a?{150}, c = [a] -> Z, 2x
          [32m[1m 0.37[0m [32m[1m 0.37[0m [32m[1m 0.39[0m [32m[1m 0.41[0m  0.46[0m  0.47[0m  0.51[0m [31m[1m 0.56[0m [31m[1m 0.58[0m [31m[1m 0.65[0m r.derived_term("lazy,expansion").accessible() # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
          [32m[1m 0.36[0m [32m[1m 0.37[0m [32m[1m 0.39[0m [32m[1m 0.41[0m [32m[1m 0.44[0m  0.51[0m  0.56[0m [31m[1m 0.59[0m [31m[1m 0.69[0m [31m[1m 0.78[0m r.derived_term("lazy,expansion").accessible() # r = (a+b)*b(<2>a+<2>b){3}, c = [a-z] -> Z, 10000x
          [32m[1m 0.45[0m [32m[1m 0.50[0m [32m[1m 0.47[0m [32m[1m 0.49[0m [32m[1m 0.54[0m [32m[1m 0.55[0m  0.68[0m [31m[1m 0.83[0m [31m[1m 0.91[0m [31m[1m 1.05[0m r.derived_term("lazy,expansion").accessible() # r = a?{150}, c = [a] -> Z, 2x
          [32m[1m 0.11[0m [32m[1m 0.11[0m [32m[1m 0.12[0m [32m[1m 0.12[0m  0.13[0m  0.15[0m  0.15[0m  0.14[0m [31m[1m 0.16[0m [31m[1m 0.19[0m r.format("text")     # r = b.expression("(\e+a)" * 500), 1000x
          [32m[1m 0.35[0m [32m[1m 0.35[0m [32m[1m 0.37[0m [32m[1m 0.38[0m [32m[1m 0.39[0m  0.45[0m  0.50[0m [31m[1m 0.57[0m [31m[1m 0.64[0m [31m[1m 0.72[0m r.standard()         # r = (a+b)*b(<2>a+<2>b){20000}, c = [a-z] -> Z, 10x
          [32m[1m 0.38[0m [32m[1m 0.38[0m [32m[1m 0.40[0m [32m[1m 0.43[0m [32m[1m 0.45[0m  0.50[0m [31m[1m 0.62[0m [31m[1m 0.64[0m [31m[1m 0.71[0m [31m[1m 0.81[0m r.thompson()         # r = (a+b)*b(<2>a+<2>b){20000}, c = [a-z] -> Z, 10x
          [32m[1m 0.64[0m [32m[1m 0.64[0m [32m[1m 0.68[0m [32m[1m 0.70[0m [32m[1m 0.73[0m  0.91[0m  0.96[0m [31m[1m 1.14[0m [31m[1m 1.33[0m [31m[1m 1.52[0m read(s)              # s = daut(std(a?{500})), 5x
          [32m[1m 0.55[0m [32m[1m 0.56[0m [32m[1m 0.58[0m [32m[1m 0.60[0m [32m[1m 0.65[0m  0.75[0m [31m[1m 0.94[0m [31m[1m 0.99[0m [31m[1m 1.19[0m [31m[1m 1.28[0m read(s)              # s = dot(std(a?{500}))
          [32m[1m 0.70[0m [32m[1m 0.70[0m [32m[1m 0.74[0m [32m[1m 0.75[0m [32m[1m 0.84[0m  0.91[0m  1.01[0m [31m[1m 1.16[0m [31m[1m 1.34[0m [31m[1m 1.58[0m read(s)              # s = efsm(std(a?{500})), 5x
          [32m[1m 0.50[0m [32m[1m 0.50[0m [32m[1m 0.60[0m [32m[1m 0.56[0m [32m[1m 0.58[0m  0.67[0m  0.79[0m [31m[1m 0.95[0m [31m[1m 1.03[0m [31m[1m 1.15[0m read(s)              # s = fado(std(a?{500})), 5x
            0     1     2     3     4     5     6     7     8     9
      
      Without:
      
            0     1     2     3     4     5     6     7     8     9
          12.61 13.29 12.35 14.76 14.80 12.81 13.45 14.12 13.96 12.07 a & 12               # a = std([a-e]*b(<2>[a-e])*)
           0.41  0.37  0.44  0.40  0.34  0.37  0.43  0.71  0.40  0.58 a.accessible()       # a = thm([a-m]{20000}).proper(prune=False), 4x
           0.52  0.51  0.51  0.58  0.51  0.72  0.96  1.08  1.07  1.32 a.compose(a)         # a = std(((\e|a+a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w+z|\e)){300}), c = [a-z]x[a-z] -> B, 20x
           0.77  0.77  0.76  0.75  0.77  1.01  0.76  0.78  1.82  1.90 a.compose(a)         # a = std(((a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w)){300}), c = [a-z]x[a-z] -> B, 50x
          19.95 19.87 20.00 20.17 19.72 20.10 19.94 20.17 20.14 20.00 a.compose(a)         # a = std(['(a,a)'-'(i,z)']{4}), c = [a-z]x[a-z] -> B
           0.69  0.81  0.81  0.87  0.69  0.98  1.09  1.41  1.37  1.59 a.compose(a)         # a = thm(((\e|a+a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w+z|\e)){300}), c = [a-z]x[a-z] -> B, 10x
           0.65  0.64  0.64  0.71  0.65  1.00  1.22  1.40  1.37  1.59 a.compose(a)         # a = thm(((a|b+b|c+c|d+d|a)(w|x+x|y+y|z+z|w)){300}), c = [a-z]x[a-z] -> B, 20x
           0.70  0.71  0.75  0.79  0.83  0.71  0.72  0.73  0.75  0.71 a.compose(a2)        # a2 = std(([a-z]|[a-z])?{20}), a = std(a|a), 50x
           2.43  2.13  2.34  2.68  2.84  2.82  3.31  3.82  4.48  4.95 a.conjunction(a)     # a = std([a-e]?{50})
           0.67  0.67  0.69  0.77  0.78  0.80  0.86  0.85  0.82  0.65 a.conjunction(a)     # a = thm([a-e]?{80})
           1.40  1.40  1.44  1.61  1.69  1.68  2.12  2.34  2.59  2.90 a.conjunction(a, a, a) # a = thm([a-e]?{5})
           0.93  0.91  1.20  1.16  1.23  1.32  1.52  1.78  1.85  2.10 a.determinize("lazy,weighted").accessible() # a = de_bruijn(13), c = [abc] -> F2, 5x
           0.36  0.36  0.46  0.39  0.47  0.45  0.66  0.68  0.71  0.84 a.determinize("lazy,weighted").accessible() # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
           0.46  0.45  0.46  0.60  0.55  0.73  0.74  0.84  0.93  1.07 a.determinize("weighted") # a = de_bruijn(13), 5x
           0.45  0.45  0.46  0.61  0.58  0.63  0.75  0.71  0.89  1.00 a.determinize("weighted") # a = de_bruijn(13), c = [abc] -> F2, 5x
           1.12  1.11  1.33  1.22  1.30  1.39  1.73  1.95  2.02  2.32 a.determinize("weighted") # a = de_bruijn(14), 5x
           1.11  1.13  1.31  1.27  1.28  1.39  1.69  1.75  2.02  2.19 a.determinize("weighted") # a = de_bruijn(14), c = [abc] -> F2, 5x
           1.16  1.17  1.14  1.21  1.33  1.35  1.68  1.90  1.82  2.19 a.determinize("weighted") # a = de_bruijn(16)
           1.17  1.19  1.15  1.19  1.23  1.22  1.48  1.83  1.88  2.05 a.determinize("weighted") # a = de_bruijn(16), c = [abc] -> F2
           0.28  0.29  0.37  0.31  0.38  0.40  0.55  0.63  0.59  0.70 a.determinize("weighted") # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
           0.57  0.57  0.61  0.62  0.71  0.84  1.02  1.15  1.12  1.26 a.determinize()      # a = de_bruijn(13), 20x
           0.66  0.63  0.67  0.69  0.81  0.88  1.17  1.26  1.22  1.41 a.determinize()      # a = de_bruijn(13), c = [abc] -> F2, 20x
           0.61  0.61  0.65  0.79  0.82  0.84  0.96  0.97  1.20  1.35 a.determinize()      # a = de_bruijn(14), 10x
           0.67  0.67  0.73  0.82  0.89  0.78  1.02  1.24  1.28  1.40 a.determinize()      # a = de_bruijn(14), c = [abc] -> F2, 10x
           0.51  0.51  0.61  0.59  0.61  0.67  0.77  0.87  0.99  1.05 a.determinize()      # a = de_bruijn(16), 2x
           0.56  0.56  0.62  0.63  0.70  0.71  0.92  1.05  1.08  1.17 a.determinize()      # a = de_bruijn(16), c = [abc] -> F2, 2x
           0.77  0.77  0.75  0.80  0.75  0.80  0.97  1.03  1.20  1.38 a.determinize()      # a = ladybird(18)
           0.76  0.78  0.71  0.77  0.81  0.92  1.14  1.17  1.16  1.35 a.determinize()      # a = ladybird(18), c = [a-zA-Z0-9] -> B
           6.92  6.99  6.98  6.95  7.29  7.87  8.99 10.07 10.46 12.05 a.determinize()      # a = ladybird(21)
           1.21  1.21  1.42  1.31  1.49  1.47  1.72  1.84  1.97  2.44 a.determinize()      # a = std(([^]+a){100}), c = [a-zA-Z0-9] -> B, 2x
           1.31  1.24  1.55  1.57  1.58  1.68  2.24  2.54  2.68  3.05 a.evaluate("a"*151)  # a = de_bruijn(150), 10000x
           0.80  0.76  0.95  0.98  1.16  1.05  1.17  1.35  1.42  1.82 a.evaluate("abcxyz"*25) # a = std([a-z]*), c = [a-z] -> Z, 20000x
           1.27  1.21  1.29  1.48  1.62  1.68  2.23  2.46  2.55  2.84 a.evaluate("abcxyz"*25) # a = std([a-z]*), c = [a-z]* -> Z, 10000x
           0.82  0.78  0.83  1.01  1.04  1.08  1.27  1.44  1.56  1.77 a.evaluate(wc.polynomial("abcxyz"*25)) # a = std([a-z]*), c = [a-z] -> Z, 20000x
           1.32  1.27  1.33  1.50  1.71  1.64  2.27  2.60  2.59  3.26 a.evaluate(wc.polynomial("abcxyz"*25)) # a = std([a-z]*), c = [a-z]* -> Z, 10000x
           0.99  0.95  1.16  1.31  1.29  1.25  1.78  1.89  1.87  2.33 a.expression("associative", "delgado") # a = ladybird(2000), 10x
           0.61  0.56  0.68  0.63  0.79  0.74  0.93  1.02  1.13  1.24 a.expression("associative", "naive") # a = ladybird(8000), 10x
           0.51  0.44  0.52  0.59  0.79  0.72  0.94  1.05  1.14  1.25 a.expression("associative", "naive") # a = std([a-d]?{100})
           0.93  0.85  1.17  1.12  1.13  1.24  1.46  1.54  1.80  2.06 a.expression("linear", "delgado") # a = ladybird(2000), 5x
           0.77  0.74  1.03  1.02  1.02  1.02  1.51  1.63  1.75  1.92 a.expression("linear", "delgado") # a = std([a-d]?{15}), 5x
           0.72  0.66  0.72  0.96  0.97  0.95  1.14  1.48  1.81  1.92 a.expression("linear", "naive") # a = ladybird(4000), 2x
           0.48  0.47  0.62  0.64  0.62  0.66  0.77  1.07  1.12  1.27 a.expression("linear", "naive") # a = std([a-d]?{9}), 5x
           0.54  0.53  0.58  0.58  0.60  0.74  0.88  1.00  1.10  1.27 a.format("daut")     # a = std(a?{500}), 5x
           0.65  0.65  0.70  0.73  0.78  0.88  1.11  1.20  1.39  1.58 a.format("dot")      # a = std(a?{500}), 5x
           0.25  0.25  0.27  0.28  0.29  0.35  0.42  0.42  0.55  0.64 a.format("efsm")     # a = std(a?{500}), 5x
           0.25  0.25  0.26  0.28  0.28  0.35  0.36  0.53  0.53  0.63 a.format("fado")     # a = std(a?{500}), 5x
           0.33  0.33  0.35  0.36  0.37  0.44  0.50  0.68  0.71  0.81 a.format("grail")    # a = std(a?{500}), 5x
           0.53  0.54  0.56  0.59  0.59  0.69  0.78  0.85  1.11  1.25 a.format("tikz")     # a = std(a?{500}), 5x
           0.55  0.55  0.56  0.56  0.57  0.54  0.67  0.74  0.79  0.92 a.has_bounded_lag()  # a = std(['(a,x)'-'(b,y)']*{600}), 20x
           1.13  1.13  1.14  1.20  1.89  1.48  1.86  1.89  2.37  2.36 a.has_bounded_lag()  # a = std(['(a,x)'-'(b,y)']{1000}*), 10x
           FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL  FAIL a.has_twins_property() # a = std([a-c]{200}*+[a-c]{200}*, "associative"), c = [abc] -> Zmin
           6.01  5.86  5.91  6.48  6.89  7.55  8.22  6.86  6.78  5.54 a.infiltrate(a)      # a = std([a-e]?{30})
           0.50  0.51  0.54  0.54  0.62  0.71  0.83  1.07  1.00  1.08 a.is_ambiguous()     # a = std([a-c]{2000}(<2>ab+a<3>b)), c = [abc] -> Z, 20x
           1.13  1.18  1.22  1.29  1.56  1.59  2.19  2.34  2.23  2.71 a.is_cycle_ambiguous() # a = std([a-c]{2000}(<2>ab+a<3>b)), c = [abc] -> Z, 20x
           0.30  0.33  0.32  0.34  0.39  0.39  0.59  0.63  0.76  0.90 a.is_deterministic() # a = ladybird(15).determinize(), 1000000x
           0.54  0.55  0.56  0.59  0.63  0.63  0.95  1.13  1.07  1.12 a.is_functional()    # a = std((a|x){2000}(b|y)), 100x
           0.30  0.33  0.31  0.32  0.35  0.41  0.48  0.57  0.66  0.70 a.is_proper()        # a = "", 1000000x
           1.08  1.08  1.05  1.07  1.08  1.13  1.48  1.40  1.15  1.12 a.is_synchronized()  # a = std((abc|de)((f|\e)+((g|h)(i|j)*(\e|k)))(l|mn){500000})
           0.35  0.33  0.52  0.48  0.73  0.59  0.76  1.00  1.05  1.18 a.lightest()         # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
           0.70  0.67  0.68  0.67  0.72  0.79  0.91  1.04  1.18  1.29 a.lightest(5, "auto") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 10x
           1.35  1.21  1.44  1.68  1.89  1.85  2.11  2.80  2.69  3.08 a.lightest(5, "eppstein") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
           0.90  0.85  1.08  1.19  1.42  1.55  1.90  2.17  2.41  2.75 a.lightest(5, "yen") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
           0.29  0.27  0.29  0.33  0.37  0.40  0.43  0.50  0.60  0.59 a.lightest(5000)     # a = derived_term((\e|x + a|\e)*), c = [a]x[x] -> Q, 10x
           0.25  0.22  0.28  0.29  0.31  0.29  0.39  0.44  0.47  0.48 a.lightest_automaton(1, "a-star") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 20x
           0.64  0.61  0.70  0.70  0.81  0.81  1.16  1.33  1.39  1.54 a.lightest_automaton(1, "bellman-ford") # a = std([a-e]?{150}), c = [a-e] -> Nmin
           0.36  0.34  0.42  0.48  0.59  0.75  0.77  0.96  0.93  1.14 a.lightest_automaton(1, "dijkstra") # a = std([a-e]?{150}), c = [a-e] -> Nmin, 500x
           0.96  0.96  1.31  1.41  1.41  1.45  1.83  2.04  1.94  2.00 a.minimize("brzozowski") # a = std([a-g]{300}), c = [a-k] -> B, 200x
           1.05  1.07  1.47  1.50  1.53  1.48  2.08  2.32  1.81  1.85 a.minimize("hopcroft") # a = std([a-g]{300}), c = [a-k] -> B, 2x
           0.58  0.58  0.81  0.83  0.82  0.82  1.08  1.26  1.42  1.58 a.minimize("moore")  # a = std([a-g]{300}), c = [a-k] -> B, 40x
           0.74  0.73  0.98  1.02  1.04  1.03  1.35  1.54  1.61  2.00 a.minimize("signature") # a = std([a-g]{300}), c = [a-k] -> B, 2x
           1.14  1.15  1.45  1.50  1.57  1.60  2.15  2.59  2.43  2.70 a.minimize("weighted") # a = std([a-g]{300}), c = [a-k] -> B
           1.24  1.14  1.58  1.28  1.46  1.67  2.25  2.39  2.39  2.21 a.minimize("weighted") # a = std([a-g]{300}), c = [a-k] -> Z
           2.16  2.00  2.94  2.97  3.00  3.45  4.08  4.83  5.13  6.07 a.proper()           # a = thm(a?{1200})
           1.95  1.96  2.05  2.35  2.88  2.34  3.66  4.10  3.79  3.73 a.reduce()           # a = std([a-g]{300}), c = [a-k] -> Q
           1.35  1.37  1.73  1.50  2.03  1.64  2.63  2.99  3.06  3.68 a.reduce()           # a = std([a-g]{300}), c = [a-k] -> Z
           0.18  0.20  0.19  0.20  0.25  0.22  0.24  0.39  0.38  0.40 a.scc("dijkstra")    # a = std((abc)*{1000}), 20x
           0.24  0.24  0.21  0.22  0.23  0.24  0.37  0.45  0.38  0.41 a.scc("kosaraju")    # a = std((abc)*{1000}), 20x
           0.22  0.22  0.23  0.24  0.26  0.27  0.52  0.33  0.57  0.53 a.scc("tarjan_iterative") # a = std((abc)*{1000}), 20x
           0.23  0.23  0.20  0.23  0.21  0.25  0.34  0.28  0.34  0.36 a.scc("tarjan_recursive") # a = std((abc)*{1000}), 20x
           0.59  0.61  0.56  0.63  0.74  0.76  0.88  0.98  0.92  1.01 a.shortest(5)        # a = de_bruijn(9), 10x
           1.24  1.21  1.12  1.22  1.25  1.22  1.37  1.72  1.61  1.96 a.shortest(5)        # a = std([a-e]?{600}), c = [a-e] -> Z, 5x
           0.68  0.63  0.62  0.67  0.82  0.77  0.87  0.91  1.08  1.21 a.shortest(5000)     # a = de_bruijn(9), 10x
           0.22  0.21  0.22  0.23  0.27  0.32  0.34  0.37  0.38  0.44 a.shortest(5000)     # a = derived_term((\e|x + a|\e)*), c = [a]x[x] -> Q, 10x
           2.49  2.32  2.85  2.95  2.94  2.87  3.27  3.43  3.87  4.05 a.shuffle(a)         # a = std([a-e]?{50})
           0.92  0.86  1.07  1.11  1.14  1.08  1.31  1.40  1.51  1.94 a.sort()             # a = std([a-e]?{700})
           0.68  0.66  0.70  0.81  0.70  0.77  0.90  0.93  1.23  1.24 a.synchronize()      # a = std((abc|de)((f|\e)+((g|h)(i|j)*(\e|k)))(l|mn){2000})
           0.33  0.34  0.35  0.37  0.48  0.40  0.60  0.79  0.56  0.62 a.synchronizing_word() # a = de_bruijn(6)
           0.75  0.77  0.80  0.80  0.88  1.02  1.06  1.06  1.49  1.63 a.weight_series()    # a = std([a-z]{200}), c = [a-z] -> Z, 10x
           0.65  0.65  0.69  0.69  0.72  0.88  1.05  0.95  0.77  0.73 a.weight_series()    # a = std(a{12000}+<1>[b-z]{12000}), c = [a-z] -> Nmin, 200x
           0.57  0.62  0.62  0.64  0.65  0.75  0.85  0.88  1.03  1.16 b.expression(e)      # e = "(\e+a)" * 500, 100x
           0.31  0.33  0.33  0.35  0.37  0.42  0.44  0.45  0.54  0.58 b.expression(e)      # e = [ab]{20000}, 1000x
           0.12  0.11  0.12  0.13  0.13  0.16  0.17  0.20  0.24  0.26 b.format("text")     # b = [abc] -> B, 100000x
           0.90  0.85  1.11  1.21  1.17  1.11  1.36  1.54  1.50  1.88 e.split()            # e = [a-e]?{15}
           0.98  0.97  1.00  1.01  1.07  1.04  1.42  1.26  1.65  1.83 p.trie()             # p = [a-j]{6}
           0.68  0.69  0.75  0.87  0.81  0.84  0.99  1.01  1.10  1.23 r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){150}, c = [a-z] -> Z, 50x
           0.36  0.35  0.37  0.38  0.44  0.45  0.48  0.50  0.50  0.56 r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){150}, c = [ab] -> Z, 50x
           0.98  0.99  1.04  1.18  1.14  1.28  1.31  1.38  1.49  1.69 r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
           0.55  0.55  0.62  0.71  0.64  0.67  0.72  0.74  0.79  0.89 r.derived_term("derivation") # r = (a+b)*b(<2>a+<2>b){300}, c = [ab] -> Z, 20x
           0.42  0.42  0.45  0.46  0.47  0.57  0.58  0.66  0.82  0.96 r.derived_term("derivation") # r = a?{150}, c = [a] -> Z, 2x
           0.25  0.24  0.26  0.31  0.28  0.30  0.33  0.35  0.38  0.43 r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){150}, c = [a-z] -> Z, 50x
           0.38  0.37  0.40  0.41  0.44  0.44  0.49  0.49  0.54  0.62 r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
           0.32  0.32  0.35  0.35  0.42  0.40  0.44  0.51  0.63  0.73 r.derived_term("expansion") # r = (a+b)*b(<2>a+<2>b){3}, c = [a-z] -> Z, 10000x
           0.45  0.45  0.48  0.51  0.54  0.62  0.63  0.73  0.93  1.04 r.derived_term("expansion") # r = a?{150}, c = [a] -> Z, 2x
           0.37  0.37  0.39  0.41  0.46  0.47  0.51  0.56  0.58  0.65 r.derived_term("lazy,expansion").accessible() # r = (a+b)*b(<2>a+<2>b){300}, c = [a-z] -> Z, 20x
           0.36  0.37  0.39  0.41  0.44  0.51  0.56  0.59  0.69  0.78 r.derived_term("lazy,expansion").accessible() # r = (a+b)*b(<2>a+<2>b){3}, c = [a-z] -> Z, 10000x
           0.45  0.50  0.47  0.49  0.54  0.55  0.68  0.83  0.91  1.05 r.derived_term("lazy,expansion").accessible() # r = a?{150}, c = [a] -> Z, 2x
           0.11  0.11  0.12  0.12  0.13  0.15  0.15  0.14  0.16  0.19 r.format("text")     # r = b.expression("(\e+a)" * 500), 1000x
           0.35  0.35  0.37  0.38  0.39  0.45  0.50  0.57  0.64  0.72 r.standard()         # r = (a+b)*b(<2>a+<2>b){20000}, c = [a-z] -> Z, 10x
           0.38  0.38  0.40  0.43  0.45  0.50  0.62  0.64  0.71  0.81 r.thompson()         # r = (a+b)*b(<2>a+<2>b){20000}, c = [a-z] -> Z, 10x
           0.64  0.64  0.68  0.70  0.73  0.91  0.96  1.14  1.33  1.52 read(s)              # s = daut(std(a?{500})), 5x
           0.55  0.56  0.58  0.60  0.65  0.75  0.94  0.99  1.19  1.28 read(s)              # s = dot(std(a?{500}))
           0.70  0.70  0.74  0.75  0.84  0.91  1.01  1.16  1.34  1.58 read(s)              # s = efsm(std(a?{500})), 5x
           0.50  0.50  0.60  0.56  0.58  0.67  0.79  0.95  1.03  1.15 read(s)              # s = fado(std(a?{500})), 5x
            0     1     2     3     4     5     6     7     8     9
      c1a7451b
    • Akim Demaille's avatar
      score: prefer passing a environment to a bench than running a setup · b226b5e5
      Akim Demaille authored
      The setup passed to timeit is run for each iteration.  That's very
      costly (some cases are run 100,000 times), especially if we even move
      the `import vcsn` into the setup: 8:50 to run `vcsn score` instead of
      7:30.
      
      However, evaluating the setup in the global context is unsafe,
      especially if we want to run benches in parallel.  Fortunately, it is
      possible to passe to timeit an environment (aka namespace), and `exec`
      allows to specify the environment in which to run the commands.
      
      Once put together, `vcsn score` runs in about 7.15.  However, at first
      sight the result appear much better than before.  We might have
      changed the meaning of our benches.
      
      * libexec/vcsn-score: here.
      b226b5e5
    • Akim Demaille's avatar
      score: be more explicit about set up · 0d5ea08f
      Akim Demaille authored
      * libexec/vcsn-score: Pass all the variables the bench depends upon.
      0d5ea08f
    • Akim Demaille's avatar
      score: remove the setup cache · 8030a3e8
      Akim Demaille authored
      The idea was to avoid repeating the setup sequence when equal by
      successive benches.  The gains are limited: from 7:23 for benching the
      previous commit, and 7:36 for this one.
      
      * libexec/vcsn-score: Here.
      8030a3e8
    • Akim Demaille's avatar
      score: add --output/--dir support · 64d723f3
      Akim Demaille authored
      I used to run `v score | tee +scores/4s/$(git describe)`, which has
      several issues:
      
      - I have to rewrite some description so that they always have at
        least 3 digits (v2.9-41-gf6bb8af2 -> v2.9-041-gf6bb8af2).
      - now we need to pass --first-parent to make sure we don't take
        tags from merged branches
      - passing --all is a good idea (we had several v2.6)
      - passing --dirty seems good too
      
      - now it's really way too long to type...  I can run
      `v score -d +scores/4s`.
      
      * libexec/vcsn-score: here.
      64d723f3
    • Akim Demaille's avatar
      score: revamp option handling · 5f9e7ed0
      Akim Demaille authored
      * libexec/vcsn-score (getargs): New.
      5f9e7ed0
    • Akim Demaille's avatar
      score-compare: accept any kind of tag · d86fa444
      Akim Demaille authored
      * libexec/vcsn-score-compare: We have `v2.9.dev` currently.
      Accept it.
      d86fa444
    • Akim Demaille's avatar
      config: improve use of git describe · f823f8c8
      Akim Demaille authored
      * share/vcsn/local.mk: Stick to the first-parent brachnes.
      f823f8c8
    • Akim Demaille's avatar
      tests: update cell/line magic missing support · 733d790c
      Akim Demaille authored
      Now IPython reports
      
          UsageError: Cell magic `%%automaton` not found.
          UsageError: Line magic function `%demo` not found.
      
      * tests/bin/ipynbdoctest.py: here.
      733d790c
    • Akim Demaille's avatar
      tests: skip pylint when pylint does not work with Python 3.6 · cca0e032
      Akim Demaille authored
      We have errors like this on the CI:
      
      ```
      command
         vcsn run pylint3 --rcfile=/srv/teamcity-agent/work/9fc823827e961a53/python/pylintrc /srv/teamcity-agent/work/9fc823827e961a53/python/vcsn
      
      status (FAIL)
        expected:  0
        effective: 1
      
      Standard error::
      
      	Traceback (most recent call last):
      	  File "/usr/bin/pylint3", line 3, in <module>
      	    run_pylint()
      	  File "/usr/lib/python3/dist-packages/pylint/__init__.py", line 17, in run_pylint
      	    Run(sys.argv[1:])
      	  File "/usr/lib/python3/dist-packages/pylint/lint.py", line 1333, in __init__
      	    linter.check(args)
      	  File "/usr/lib/python3/dist-packages/pylint/lint.py", line 755, in check
      	    self._do_check(files_or_modules)
      	  File "/usr/lib/python3/dist-packages/pylint/lint.py", line 886, in _do_check
      	    self.check_astroid_module(ast_node, walker, rawcheckers, tokencheckers)
      	  File "/usr/lib/python3/dist-packages/pylint/lint.py", line 967, in check_astroid_module
      	    walker.walk(ast_node)
      	  File "/usr/lib/python3/dist-packages/pylint/utils.py", line 959, in walk
      	    self.walk(child)
      	  File "/usr/lib/python3/dist-packages/pylint/utils.py", line 956, in walk
      	    cb(astroid)
      	  File "/usr/lib/python3/dist-packages/pylint/checkers/variables.py", line 1051, in visit_import
      	    module = next(node.infer_name_module(parts[0]))
      	  File "/usr/lib/python3/dist-packages/astroid/context.py", line 49, in cache_generator
      	    for result in generator:
      	  File "/usr/lib/python3/dist-packages/astroid/bases.py", line 302, in wrapped
      	    for res in _func(node, context, **kwargs):
      	  File "/usr/lib/python3/dist-packages/astroid/inference.py", line 123, in infer_import
      	    yield self.do_import_module(name)
      	  File "/usr/lib/python3/dist-packages/astroid/mixins.py", line 129, in do_import_module
      	    relative_only=level and level >= 1)
      	  File "/usr/lib/python3/dist-packages/astroid/scoped_nodes.py", line 492, in import_module
      	    return MANAGER.ast_from_module_name(absmodname)
      	  File "/usr/lib/python3/dist-packages/astroid/manager.py", line 136, in ast_from_module_name
      	    return self.ast_from_file(filepath, modname, fallback=False)
      	  File "/usr/lib/python3/dist-packages/astroid/manager.py", line 86, in ast_from_file
      	    return AstroidBuilder(self).file_build(filepath, modname)
      	  File "/usr/lib/python3/dist-packages/astroid/builder.py", line 141, in file_build
      	    module = self._data_build(data, modname, path)
      	  File "/usr/lib/python3/dist-packages/astroid/builder.py", line 185, in _data_build
      	    module = builder.visit_module(node, modname, node_file, package)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 154, in visit_module
      	    newnode.body = [self.visit(child, newnode) for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 154, in <listcomp>
      	    newnode.body = [self.visit(child, newnode) for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 957, in visit_classdef
      	    newnode = super(TreeRebuilder3k, self).visit_classdef(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 357, in visit_classdef
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 357, in <listcomp>
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 543, in visit_functiondef
      	    assign_ctx=assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 528, in _visit_functiondef
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 528, in <listcomp>
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 510, in visit_for
      	    assign_ctx=assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 503, in _visit_for
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 503, in <listcomp>
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 591, in visit_if
      	    for child in node.orelse]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 591, in <listcomp>
      	    for child in node.orelse]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 589, in visit_if
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 589, in <listcomp>
      	    for child in node.body]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 447, in visit_expr
      	    newnode.value = self.visit(node.value, newnode, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 167, in visit
      	    return visit_method(node, parent, assign_ctx)
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 315, in visit_call
      	    for child in node.args]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 315, in <listcomp>
      	    for child in node.args]
      	  File "/usr/lib/python3/dist-packages/astroid/rebuilder.py", line 165, in visit
      	    visit_method = getattr(self, visit_name)
      	AttributeError: 'TreeRebuilder3k' object has no attribute 'visit_joinedstr'
      ```
      
      It appears to be due to pylint itself, see
      https://github.com/DonJayamanne/pythonVSCode/issues/798 for instance.
      
      * tests/unit/pylint.chk: Require pylint 1.7 with Python 3.6.
      cca0e032
  3. 15 Nov, 2017 1 commit
  4. 14 Nov, 2017 1 commit
  5. 13 Nov, 2017 1 commit
  6. 11 Nov, 2017 2 commits
  7. 07 Nov, 2017 1 commit
    • Akim Demaille's avatar
      debian: build on Debian stable · 2f9415e5
      Akim Demaille authored
      We still have failures when trying to use the Debian package to build
      the Docker image:
      
          The following packages have unmet dependencies:
           vcsn : Depends: libpython3.6 (>= 3.6.0~b2) but it is not installable
                  Depends: python3 (>= 3.6~) but 3.5.3-1 is to be installed
      
      during the build of the Debian package we have:
      
          RUN apt-get update &&
          RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install          \
            --no-install-recommends -y --allow-unauthenticated autoconf      \
            automake bison build-essential ccache debhelper devscripts       \
            dh-python dot2tex doxygen fakeroot flex g++ git graphviz         \
            imagemagick libboost-all-dev libgmp-dev libtool libyaml-cpp-dev  \
            lintian locales pdf2svg python-matplotlib python3-all-dev        \
            python3-dev texlive-latex-extra texlive-pictures &&
          apt-get autoremove &&
          apt-get clean
      
          ...
          libpython3-dev libpython3-stdlib libpython3.6 libpython3.6-dev
          libpython3.6-minimal libpython3.6-stdlib libquadmath0 librdmacm1
          ...
          python-cycler python-dateutil python-dev python-functools32
          python-matplotlib-data python-minimal python-numpy python-pyparsing
          python-six python-subprocess32 python-tz python2.7 python2.7-dev
          python2.7-minimal python3 python3-all python3-minimal python3.6
          python3.6-dev python3.6-minimal readline-common shared-mime-info t1utils
          ...
      
      So it installs Python 3.6, but during the Docker build, we get Python
      3.5, although in both cases we ask for Python3:
      
          RUN apt-get update &&
          RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install -y        \
            --no-install-recommends ccache curl dot2tex g++ gnupg graphviz    \
            imagemagick libboost-all-dev libgmp-dev libzmq3-dev locales       \
            pdf2svg python3-colorama python3-dev python3-matplotlib           \
            python3-pandas python3-pip python3-psutil python3-regex           \
            python3-setuptools texlive-latex-extra texlive-pictures wamerican \
            wamerican-insane wamerican-large wamerican-small wfrench &&
          apt-get autoremove &&
          apt-get clean &&
          pip3 install jupyter
      
          ...
          python3-pyparsing python3-six python3-tz python3.5 python3.5-dev
          python3.5-minimal readline-common shared-mime-info t1utils tex-common
          ...
      
      So the difference is probably that in the debian package is built with
      `Step 1/11 : FROM debian:sid`, while the Docker image build is built
      with `Step 1/16 : FROM debian:stable`.  Let's use stable in both cases.
      
      * debuild/Dockerfile: here.
      2f9415e5
  8. 30 Oct, 2017 1 commit
    • Akim Demaille's avatar
      Debian: do not require Python-3.5 · 3adc6162
      Akim Demaille authored
      Our builds currently fail:
      
          The following packages have unmet dependencies:
           vcsn : Depends: libpython3.6 (>= 3.6.0~b2) but it is not installable
                  Depends: python3 (>= 3.6~) but 3.5.3-1 is to be installed
          E: Unable to correct problems, you have held broken packages.
          The command '/bin/sh -c apt-get install --no-install-recommends -y vcsn && jupyter nbextension enable --py --sys-prefix widgetsnbextension && useradd -d /vcsn -m -r vcsn' returned a non-zero code: 100
      
      On the one hand we already require that we want Python >= 3.5, and on
      other place we require the package python-3.5-dev.  Let's require
      python-3 packages, but require Python >= 3.5.
      
      * debian/control, debuild/Dockerfile: here.
      3adc6162
  9. 28 Oct, 2017 1 commit
    • Akim Demaille's avatar
      expansions: do not denormalize for conjunction · ac17d19b
      Akim Demaille authored
      There is no need to denormalize, the code is not really harder to
      write, but the result is really bad when we denormalize.  The reason
      is the same compared to what we did with compose: a constant weight is
      really as if it were attached to $ as first, not \e.  So for instance
      the conjunction of the expansions of `(\e+a)` and `aa` gave two very
      different results in lal (⟨0⟩) vs. lan (ε ⊙ [ε & aa]).
      
      The key difference is that \e . [<k>1] matches a . [P]
      whereas obviously          <k>         does not.
      
      Denormalizing does simplify the code, but ruins the result.  To get
      simple code, we should get rid of the constant code by attaching it to
      the endmarker, `$`.
      
      This will also help integrating Sarasvati Moutoucomarapoulé's fusion
      of lal with lan, removing useless differences.
      
      * vcsn/core/rat/expansionset.hh: Do not denormalize conjunctions.
      ac17d19b
  10. 27 Oct, 2017 2 commits
    • Akim Demaille's avatar
      daut: treat "->" as a keyword · 5d66ae54
      Akim Demaille authored
      Fixes #191.
      
      We still accept dubious input:
      
          In [9]: %%automaton a daut
             ...: 0  ->  ->  a
             ...: 0 "->" 1   b
             ...:
          name_automaton<mutable_automaton<context<letterset<char_letters>, b>>>
      
          In [10]: print(a.format('daut'))
          context = letterset<char_letters(ab)>, b
          0 -> 1 a
          0 -> 2 b
      
      * lib/vcsn/algos/daut.cc: Implement.
      * tests/python/automaton.py: Check.
      5d66ae54
    • Akim Demaille's avatar
      style: formatting changes · 2bdbdb00
      Akim Demaille authored
      2bdbdb00
  11. 26 Oct, 2017 2 commits
    • Akim Demaille's avatar
      misc: more quotes in error messages · 801f3575
      Akim Demaille authored
      See #193: use quotes in error messages.
      
      We have one regression:
      
          RuntimeError: 1.4-6: unexpected character: ⟩
          ab ⟩a⟨ ab
             ^^^
            while reading expression: ab ⟩a⟨ ab
      
      now ends with:
      
            while reading expression: "ab \xe2\x9f\xa9a\xe2\x9f\xa8 ab"
      
      I'm ambivalent on what to do here.
      
      * vcsn/algos/make-context.hh, vcsn/dyn/algos.hxx,
      * lib/vcsn/dyn/context-parser.cc: Use str_quote.
      Remove useless namespace qualifications.
      
      Adjust test suite.
      801f3575
    • Akim Demaille's avatar
      misc: improve some error messages · 72db9be1
      Akim Demaille authored
      Use delimiters.  See #193.
      
      * vcsn/misc/escape.hh (str_quote): Be variadic.
      * lib/vcsn/misc/stream.cc (get_char): Use it to improve messages.
      * vcsn/misc/raise.hh: Likewise.
      
      Adjust test suite.
      72db9be1
  12. 25 Oct, 2017 3 commits
    • Akim Demaille's avatar
      fado: use " in error messages, for consistency · 753cd305
      Akim Demaille authored
      * lib/vcsn/algos/fado.cc: Do it.
      * tests/python/automaton.py: Check it.
      753cd305
    • Akim Demaille's avatar
      contexts: improve error messages · d905e318
      Akim Demaille authored
      Error messages are sometimes obscur:
      
          RuntimeError: expected ,, got
            while reading context: lal_char(ab)
      
      Prefer:
      
          RuntimeError: unexpected end-of-file, expected ","
            while reading context: lal_char(ab)
      
      Caret errors would be nice, but we don't track locations here...
      
      Reported by Alexandre Duret-Lutz in #193.
      
      * vcsn/misc/escape.hh, lib/vcsn/misc/escape.cc (str_quote): New.
      * vcsn/misc/stream.hh, lib/vcsn/misc/stream.cc: Use it.
      * tests/python/context.py: Check.
      Adjust other tests.
      d905e318
    • Akim Demaille's avatar
      rat: print aaaa the same way for lal and lan · 00272e94
      Akim Demaille authored
      For some reason, the treatment of lal is different from lan (and law).
      This introduces gratuitous differences when applying Sarasvati
      Moutoucomarapoulé's fusion of lal with lan.
      
      Maybe the special case was meant to distinguish the case of wordset
      where `aaaaa` is actually a single five-letter label, not a product of
      `a`.  But in that case anyway `aaaaa` is different from `a{5}`, the
      latter begin a product of single-letter labels.
      
      Related to #23 and #24, and b9820c10.
      
      * vcsn/core/rat/printer.hh, vcsn/core/rat/printer.hxx:
      Don't special case lal.
      * tests/python/expression.py, tests/rat/common.rat, tests/rat/q.rat:
      Check it.
      00272e94