basedpl 0.1.40__tar.gz → 0.1.41__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. {basedpl-0.1.40 → basedpl-0.1.41}/.github/workflows/ci.yml +15 -5
  2. basedpl-0.1.41/.github/workflows/speed.yml +36 -0
  3. {basedpl-0.1.40 → basedpl-0.1.41}/Cargo.lock +7 -7
  4. {basedpl-0.1.40 → basedpl-0.1.41}/Cargo.toml +2 -2
  5. {basedpl-0.1.40 → basedpl-0.1.41}/PKG-INFO +1 -1
  6. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/ceiling.qmd +2 -1
  7. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/floor.qmd +2 -1
  8. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/numbers.qmd +2 -2
  9. {basedpl-0.1.40 → basedpl-0.1.41}/src/number.rs +4 -5
  10. {basedpl-0.1.40 → basedpl-0.1.41}/src/pervasive.rs +10 -10
  11. {basedpl-0.1.40 → basedpl-0.1.41}/tests/speed.txt +72 -72
  12. basedpl-0.1.40/.github/workflows/speed.yml +0 -23
  13. {basedpl-0.1.40 → basedpl-0.1.41}/.cargo/config.toml +0 -0
  14. {basedpl-0.1.40 → basedpl-0.1.41}/.gitattributes +0 -0
  15. {basedpl-0.1.40 → basedpl-0.1.41}/.github/workflows/docs.yml +0 -0
  16. {basedpl-0.1.40 → basedpl-0.1.41}/.gitignore +0 -0
  17. {basedpl-0.1.40 → basedpl-0.1.41}/CONTRIBUTING.md +0 -0
  18. {basedpl-0.1.40 → basedpl-0.1.41}/LICENSE +0 -0
  19. {basedpl-0.1.40 → basedpl-0.1.41}/README.md +0 -0
  20. {basedpl-0.1.40 → basedpl-0.1.41}/_config.yml +0 -0
  21. {basedpl-0.1.40 → basedpl-0.1.41}/_layouts/default.html +0 -0
  22. {basedpl-0.1.40 → basedpl-0.1.41}/build.rs +0 -0
  23. {basedpl-0.1.40 → basedpl-0.1.41}/editors/jetbrains/BPL.tmbundle/Syntaxes/bpl.tmLanguage.json +0 -0
  24. {basedpl-0.1.40 → basedpl-0.1.41}/editors/jetbrains/BPL.tmbundle/info.plist +0 -0
  25. {basedpl-0.1.40 → basedpl-0.1.41}/editors/jetbrains/BPL.xml +0 -0
  26. {basedpl-0.1.40 → basedpl-0.1.41}/editors/jetbrains/README.md +0 -0
  27. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.bundle/Contents/Info.plist +0 -0
  28. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.icns +0 -0
  29. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.bundle/Contents/Resources/BasedPL-de.keylayout +0 -0
  30. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  31. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.bundle/Contents/version.plist +0 -0
  32. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-de.txt +0 -0
  33. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.bundle/Contents/Info.plist +0 -0
  34. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.icns +0 -0
  35. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.bundle/Contents/Resources/BasedPL-es.keylayout +0 -0
  36. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  37. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.bundle/Contents/version.plist +0 -0
  38. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-es.txt +0 -0
  39. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.bundle/Contents/Info.plist +0 -0
  40. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.icns +0 -0
  41. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.bundle/Contents/Resources/BasedPL-fr.keylayout +0 -0
  42. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  43. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.bundle/Contents/version.plist +0 -0
  44. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-fr.txt +0 -0
  45. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.bundle/Contents/Info.plist +0 -0
  46. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.icns +0 -0
  47. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.bundle/Contents/Resources/BasedPL-uk.keylayout +0 -0
  48. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  49. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.bundle/Contents/version.plist +0 -0
  50. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-uk.txt +0 -0
  51. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.bundle/Contents/Info.plist +0 -0
  52. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.icns +0 -0
  53. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.bundle/Contents/Resources/BasedPL-us.keylayout +0 -0
  54. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.bundle/Contents/Resources/en.lproj/InfoPlist.strings +0 -0
  55. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.bundle/Contents/version.plist +0 -0
  56. {basedpl-0.1.40 → basedpl-0.1.41}/editors/macos/BasedPL-us.txt +0 -0
  57. {basedpl-0.1.40 → basedpl-0.1.41}/editors/vim/ftdetect/bpl.vim +0 -0
  58. {basedpl-0.1.40 → basedpl-0.1.41}/editors/vim/syntax/bpl.vim +0 -0
  59. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/README.md +0 -0
  60. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/build.ps1 +0 -0
  61. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/install.ps1 +0 -0
  62. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/keyboard.c +0 -0
  63. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/keyboard.def +0 -0
  64. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/keyboard.rc +0 -0
  65. {basedpl-0.1.40 → basedpl-0.1.41}/editors/windows/layout.h +0 -0
  66. {basedpl-0.1.40 → basedpl-0.1.41}/index_files/figure-commonmark/cell-17-output-1.svg +0 -0
  67. {basedpl-0.1.40 → basedpl-0.1.41}/index_files/figure-commonmark/cell-18-output-1.svg +0 -0
  68. {basedpl-0.1.40 → basedpl-0.1.41}/index_files/figure-html/cell-17-output-1.svg +0 -0
  69. {basedpl-0.1.40 → basedpl-0.1.41}/index_files/figure-html/cell-18-output-1.svg +0 -0
  70. {basedpl-0.1.40 → basedpl-0.1.41}/lib/LICENSE-april +0 -0
  71. {basedpl-0.1.40 → basedpl-0.1.41}/lib/README.md +0 -0
  72. {basedpl-0.1.40 → basedpl-0.1.41}/lib/array.bpl +0 -0
  73. {basedpl-0.1.40 → basedpl-0.1.41}/lib/dyalog.bpl +0 -0
  74. {basedpl-0.1.40 → basedpl-0.1.41}/lib/graph.bpl +0 -0
  75. {basedpl-0.1.40 → basedpl-0.1.41}/lib/numeric.bpl +0 -0
  76. {basedpl-0.1.40 → basedpl-0.1.41}/lib/power.bpl +0 -0
  77. {basedpl-0.1.40 → basedpl-0.1.41}/lib/regex.bpl +0 -0
  78. {basedpl-0.1.40 → basedpl-0.1.41}/lib/string.bpl +0 -0
  79. {basedpl-0.1.40 → basedpl-0.1.41}/lib/tree.bpl +0 -0
  80. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/.gitignore +0 -0
  81. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/_quarto.yml +0 -0
  82. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/arrays.ipynb +0 -0
  83. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/assignment.ipynb +0 -0
  84. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/bpl.xml +0 -0
  85. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/bqn.xml +0 -0
  86. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/bracket-types.ipynb +0 -0
  87. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/cli.qmd +0 -0
  88. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/comparison.qmd +0 -0
  89. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/data.ipynb +0 -0
  90. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/dfns.ipynb +0 -0
  91. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/distributions.ipynb +0 -0
  92. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/driver.js +0 -0
  93. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/dyalog.ipynb +0 -0
  94. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/dyalog.xml +0 -0
  95. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/evaluation.qmd +0 -0
  96. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/fonts/LICENSE-SAX2 +0 -0
  97. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/fonts/README.md +0 -0
  98. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/fonts/SAX2B.ttf +0 -0
  99. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/fonts/SAX2B.woff2 +0 -0
  100. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/fonts.css +0 -0
  101. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/attractor.bpl +0 -0
  102. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/boids.bpl +0 -0
  103. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/dragon.bpl +0 -0
  104. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/flow.bpl +0 -0
  105. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/mandelbrot.bpl +0 -0
  106. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/mandelbrot32.bpl +0 -0
  107. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/orbits.bpl +0 -0
  108. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/phyllotaxis.bpl +0 -0
  109. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/prefs.bpl +0 -0
  110. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery/reaction.bpl +0 -0
  111. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/gallery.qmd +0 -0
  112. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/getting-started.ipynb +0 -0
  113. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/_metadata.yml +0 -0
  114. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/add.qmd +0 -0
  115. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/after.qmd +0 -0
  116. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/agenda.qmd +0 -0
  117. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/alpha-underbar.qmd +0 -0
  118. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/alpha.qmd +0 -0
  119. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/and.qmd +0 -0
  120. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/assign.qmd +0 -0
  121. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/atop.qmd +0 -0
  122. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/axis.qmd +0 -0
  123. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/backslash-bar.qmd +0 -0
  124. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/backslash.qmd +0 -0
  125. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/before.qmd +0 -0
  126. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/braces.qmd +0 -0
  127. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/brackets.qmd +0 -0
  128. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/bullet.qmd +0 -0
  129. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/circle.qmd +0 -0
  130. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/colon.qmd +0 -0
  131. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/comma.qmd +0 -0
  132. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/comment.qmd +0 -0
  133. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/commute.qmd +0 -0
  134. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/dash.qmd +0 -0
  135. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/decode.qmd +0 -0
  136. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/del-diaeresis.qmd +0 -0
  137. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/del.qmd +0 -0
  138. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/derivative.qmd +0 -0
  139. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/diamond.qmd +0 -0
  140. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/div.qmd +0 -0
  141. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/domino.qmd +0 -0
  142. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/dot.qmd +0 -0
  143. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/drop.qmd +0 -0
  144. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/each.qmd +0 -0
  145. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/enclose.qmd +0 -0
  146. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/encode.qmd +0 -0
  147. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/equal.qmd +0 -0
  148. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/error-guard.qmd +0 -0
  149. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/execute.qmd +0 -0
  150. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/factor.qmd +0 -0
  151. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/factorial.qmd +0 -0
  152. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/find.qmd +0 -0
  153. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/format.qmd +0 -0
  154. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/grade-down.qmd +0 -0
  155. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/grade-up.qmd +0 -0
  156. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/greater-or-equal.qmd +0 -0
  157. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/greater.qmd +0 -0
  158. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/hash.qmd +0 -0
  159. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/infinity.qmd +0 -0
  160. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/intersection.qmd +0 -0
  161. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/inverse-pair.qmd +0 -0
  162. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/inverted-question.qmd +0 -0
  163. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/iota.qmd +0 -0
  164. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/key.qmd +0 -0
  165. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/left.qmd +0 -0
  166. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/less-or-equal.qmd +0 -0
  167. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/less.qmd +0 -0
  168. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/log.qmd +0 -0
  169. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/match.qmd +0 -0
  170. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/member.qmd +0 -0
  171. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/mix.qmd +0 -0
  172. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/mul.qmd +0 -0
  173. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/nand.qmd +0 -0
  174. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/nest.qmd +0 -0
  175. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/nor.qmd +0 -0
  176. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/not-equal.qmd +0 -0
  177. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/omega-underbar.qmd +0 -0
  178. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/omega.qmd +0 -0
  179. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/or.qmd +0 -0
  180. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/outer-product.qmd +0 -0
  181. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/over.qmd +0 -0
  182. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/overbar.qmd +0 -0
  183. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/parentheses.qmd +0 -0
  184. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/pi.qmd +0 -0
  185. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/polynomial.qmd +0 -0
  186. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/power.qmd +0 -0
  187. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/prime.qmd +0 -0
  188. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/quad.qmd +0 -0
  189. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/question.qmd +0 -0
  190. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/quote.qmd +0 -0
  191. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/range.qmd +0 -0
  192. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/rank.qmd +0 -0
  193. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/reverse-first.qmd +0 -0
  194. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/reverse.qmd +0 -0
  195. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/rho.qmd +0 -0
  196. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/right.qmd +0 -0
  197. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/root.qmd +0 -0
  198. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/slash-bar.qmd +0 -0
  199. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/slash.qmd +0 -0
  200. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/squad.qmd +0 -0
  201. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/star.qmd +0 -0
  202. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/stencil.qmd +0 -0
  203. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/stile.qmd +0 -0
  204. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/table.qmd +0 -0
  205. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/take.qmd +0 -0
  206. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/tally.qmd +0 -0
  207. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/tilde.qmd +0 -0
  208. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/transpose.qmd +0 -0
  209. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/under.qmd +0 -0
  210. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/union.qmd +0 -0
  211. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/valences.qmd +0 -0
  212. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/where.qmd +0 -0
  213. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/windows.qmd +0 -0
  214. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs/zilde.qmd +0 -0
  215. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/glyphs.qmd +0 -0
  216. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/index.ipynb +0 -0
  217. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/introspection.ipynb +0 -0
  218. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/keyboard.qmd +0 -0
  219. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/keyed.ipynb +0 -0
  220. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/llms.txt +0 -0
  221. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/magics.ipynb +0 -0
  222. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/modules.qmd +0 -0
  223. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/nbdev.yml +0 -0
  224. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/notebooks.ipynb +0 -0
  225. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/overview.ipynb +0 -0
  226. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/papers/aplwiki-arrays.md +0 -0
  227. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/papers/brickman-depth-1-scalars.md +0 -0
  228. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/papers/mercer-based-system.md +0 -0
  229. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground/bpl.js +0 -0
  230. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground/gallery.js +0 -0
  231. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground/monaco-worker.js +0 -0
  232. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground/page.js +0 -0
  233. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground/worker.js +0 -0
  234. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/playground.qmd +0 -0
  235. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/plot.ipynb +0 -0
  236. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/principles.ipynb +0 -0
  237. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/processes.qmd +0 -0
  238. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/puppy.jpg +0 -0
  239. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/python.ipynb +0 -0
  240. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/regex.ipynb +0 -0
  241. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/repl.qmd +0 -0
  242. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/scripts.ipynb +0 -0
  243. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/sidebar.yml +0 -0
  244. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/strings.ipynb +0 -0
  245. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/styles.css +0 -0
  246. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/syntax.qmd +0 -0
  247. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/_metadata.yml +0 -0
  248. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/c.qmd +0 -0
  249. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/canvas.qmd +0 -0
  250. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/constants.qmd +0 -0
  251. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/copy.qmd +0 -0
  252. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/csv.qmd +0 -0
  253. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/date.qmd +0 -0
  254. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/decompose.qmd +0 -0
  255. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/deflate.qmd +0 -0
  256. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/delay.qmd +0 -0
  257. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/distribution.qmd +0 -0
  258. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/element.qmd +0 -0
  259. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/ex.qmd +0 -0
  260. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/fetch.qmd +0 -0
  261. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/float.qmd +0 -0
  262. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/hash.qmd +0 -0
  263. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/host.qmd +0 -0
  264. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/image.qmd +0 -0
  265. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/js.qmd +0 -0
  266. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/json.qmd +0 -0
  267. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/literal.qmd +0 -0
  268. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/load.qmd +0 -0
  269. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/metadata.qmd +0 -0
  270. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/mime.qmd +0 -0
  271. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/mkdir.qmd +0 -0
  272. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/nc.qmd +0 -0
  273. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/nget.qmd +0 -0
  274. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/nl.qmd +0 -0
  275. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/normalize.qmd +0 -0
  276. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/nput.qmd +0 -0
  277. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/path.qmd +0 -0
  278. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/plot.qmd +0 -0
  279. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/prefs.qmd +0 -0
  280. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/r.qmd +0 -0
  281. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/rand.qmd +0 -0
  282. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/readdir.qmd +0 -0
  283. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/remove.qmd +0 -0
  284. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/rename.qmd +0 -0
  285. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/signal.qmd +0 -0
  286. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/src.qmd +0 -0
  287. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/storage.qmd +0 -0
  288. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/svg.qmd +0 -0
  289. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/time.qmd +0 -0
  290. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/ucs.qmd +0 -0
  291. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/uuid.qmd +0 -0
  292. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/vfi.qmd +0 -0
  293. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system/xml.qmd +0 -0
  294. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/system-functions.qmd +0 -0
  295. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/terms.qmd +0 -0
  296. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/web.ipynb +0 -0
  297. {basedpl-0.1.40 → basedpl-0.1.41}/nbs/xml.ipynb +0 -0
  298. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/README.md +0 -0
  299. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/aplcart.jsonl +0 -0
  300. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/april.jsonl +0 -0
  301. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/bqn.jsonl +0 -0
  302. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/core.jsonl +0 -0
  303. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/dyalog.jsonl +0 -0
  304. {basedpl-0.1.40 → basedpl-0.1.41}/provenance/ngn.jsonl +0 -0
  305. {basedpl-0.1.40 → basedpl-0.1.41}/py/Cargo.toml +0 -0
  306. {basedpl-0.1.40 → basedpl-0.1.41}/py/build.rs +0 -0
  307. {basedpl-0.1.40 → basedpl-0.1.41}/py/src/lib.rs +0 -0
  308. {basedpl-0.1.40 → basedpl-0.1.41}/pyproject.toml +0 -0
  309. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/__init__.py +0 -0
  310. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/_modidx.py +0 -0
  311. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/bpl.tmLanguage.json +0 -0
  312. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/bpltests.py +0 -0
  313. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/dyalog.py +0 -0
  314. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/editors.py +0 -0
  315. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/font.py +0 -0
  316. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/fonts.css +0 -0
  317. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/functions.py +0 -0
  318. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/input.js +0 -0
  319. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/ipython.py +0 -0
  320. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/keyboards.json +0 -0
  321. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/keyboards.py +0 -0
  322. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/layout.json +0 -0
  323. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/lb.js +0 -0
  324. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/notebook_runner.py +0 -0
  325. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/notebooks.py +0 -0
  326. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/printing.py +0 -0
  327. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/reference.py +0 -0
  328. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/syntax.py +0 -0
  329. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/windows_keyboard.py +0 -0
  330. {basedpl-0.1.40 → basedpl-0.1.41}/python/basedpl/worker.py +0 -0
  331. {basedpl-0.1.40 → basedpl-0.1.41}/rustfmt.toml +0 -0
  332. {basedpl-0.1.40 → basedpl-0.1.41}/scripts/install-macos.sh +0 -0
  333. {basedpl-0.1.40 → basedpl-0.1.41}/scripts/prep.py +0 -0
  334. {basedpl-0.1.40 → basedpl-0.1.41}/src/agreement.rs +0 -0
  335. {basedpl-0.1.40 → basedpl-0.1.41}/src/array/storage.rs +0 -0
  336. {basedpl-0.1.40 → basedpl-0.1.41}/src/array/text.rs +0 -0
  337. {basedpl-0.1.40 → basedpl-0.1.41}/src/array.rs +0 -0
  338. {basedpl-0.1.40 → basedpl-0.1.41}/src/canvas.js +0 -0
  339. {basedpl-0.1.40 → basedpl-0.1.41}/src/canvas.rs +0 -0
  340. {basedpl-0.1.40 → basedpl-0.1.41}/src/csv.rs +0 -0
  341. {basedpl-0.1.40 → basedpl-0.1.41}/src/data.rs +0 -0
  342. {basedpl-0.1.40 → basedpl-0.1.41}/src/date.rs +0 -0
  343. {basedpl-0.1.40 → basedpl-0.1.41}/src/display.rs +0 -0
  344. {basedpl-0.1.40 → basedpl-0.1.41}/src/distribution.rs +0 -0
  345. {basedpl-0.1.40 → basedpl-0.1.41}/src/element.rs +0 -0
  346. {basedpl-0.1.40 → basedpl-0.1.41}/src/error.rs +0 -0
  347. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval/assign.rs +0 -0
  348. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval/binder.rs +0 -0
  349. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval/dissect.rs +0 -0
  350. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval/operators.rs +0 -0
  351. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval/session.rs +0 -0
  352. {basedpl-0.1.40 → basedpl-0.1.41}/src/eval.rs +0 -0
  353. {basedpl-0.1.40 → basedpl-0.1.41}/src/execution.rs +0 -0
  354. {basedpl-0.1.40 → basedpl-0.1.41}/src/files.rs +0 -0
  355. {basedpl-0.1.40 → basedpl-0.1.41}/src/host.rs +0 -0
  356. {basedpl-0.1.40 → basedpl-0.1.41}/src/host_web.rs +0 -0
  357. {basedpl-0.1.40 → basedpl-0.1.41}/src/image.rs +0 -0
  358. {basedpl-0.1.40 → basedpl-0.1.41}/src/inspection.rs +0 -0
  359. {basedpl-0.1.40 → basedpl-0.1.41}/src/js.rs +0 -0
  360. {basedpl-0.1.40 → basedpl-0.1.41}/src/json.rs +0 -0
  361. {basedpl-0.1.40 → basedpl-0.1.41}/src/keyed.rs +0 -0
  362. {basedpl-0.1.40 → basedpl-0.1.41}/src/lib.rs +0 -0
  363. {basedpl-0.1.40 → basedpl-0.1.41}/src/number_theory.rs +0 -0
  364. {basedpl-0.1.40 → basedpl-0.1.41}/src/plot.rs +0 -0
  365. {basedpl-0.1.40 → basedpl-0.1.41}/src/polynomial.rs +0 -0
  366. {basedpl-0.1.40 → basedpl-0.1.41}/src/primitive/indexing.rs +0 -0
  367. {basedpl-0.1.40 → basedpl-0.1.41}/src/primitive/numeric.rs +0 -0
  368. {basedpl-0.1.40 → basedpl-0.1.41}/src/primitive/search.rs +0 -0
  369. {basedpl-0.1.40 → basedpl-0.1.41}/src/primitive/structural.rs +0 -0
  370. {basedpl-0.1.40 → basedpl-0.1.41}/src/primitive.rs +0 -0
  371. {basedpl-0.1.40 → basedpl-0.1.41}/src/protocol.rs +0 -0
  372. {basedpl-0.1.40 → basedpl-0.1.41}/src/reference.rs +0 -0
  373. {basedpl-0.1.40 → basedpl-0.1.41}/src/regex.rs +0 -0
  374. {basedpl-0.1.40 → basedpl-0.1.41}/src/search.rs +0 -0
  375. {basedpl-0.1.40 → basedpl-0.1.41}/src/selection.rs +0 -0
  376. {basedpl-0.1.40 → basedpl-0.1.41}/src/symbols.rs +0 -0
  377. {basedpl-0.1.40 → basedpl-0.1.41}/src/syntax.rs +0 -0
  378. {basedpl-0.1.40 → basedpl-0.1.41}/src/system.rs +0 -0
  379. {basedpl-0.1.40 → basedpl-0.1.41}/src/timing.rs +0 -0
  380. {basedpl-0.1.40 → basedpl-0.1.41}/src/xml.rs +0 -0
  381. {basedpl-0.1.40 → basedpl-0.1.41}/tests/conftest.py +0 -0
  382. {basedpl-0.1.40 → basedpl-0.1.41}/tests/core.rs +0 -0
  383. {basedpl-0.1.40 → basedpl-0.1.41}/tests/highlighting.mjs +0 -0
  384. {basedpl-0.1.40 → basedpl-0.1.41}/tests/input.mjs +0 -0
  385. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-aplcart +0 -0
  386. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-april +0 -0
  387. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-bqn +0 -0
  388. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-bqncrate +0 -0
  389. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-dyalog +0 -0
  390. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/LICENSE-ngn +0 -0
  391. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/README.md +0 -0
  392. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/aplcart.bpl +0 -0
  393. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/april.bpl +0 -0
  394. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/bqn.bpl +0 -0
  395. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/core.bpl +0 -0
  396. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/distributions.bpl +0 -0
  397. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/dyalog.bpl +0 -0
  398. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/graphics.bpl +0 -0
  399. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/lib.bpl +0 -0
  400. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/ngn.bpl +0 -0
  401. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/regex.bpl +0 -0
  402. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/support/april.bpl +0 -0
  403. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/support/avl.bpl +0 -0
  404. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/support/redblack.bpl +0 -0
  405. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/support/sbst.bpl +0 -0
  406. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference/support/splay.bpl +0 -0
  407. {basedpl-0.1.40 → basedpl-0.1.41}/tests/reference.rs +0 -0
  408. {basedpl-0.1.40 → basedpl-0.1.41}/tests/scaling.rs +0 -0
  409. {basedpl-0.1.40 → basedpl-0.1.41}/tests/speed.rs +0 -0
  410. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_api.py +0 -0
  411. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_basic.py +0 -0
  412. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_bpltests.py +0 -0
  413. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_glyphs.py +0 -0
  414. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_graphics.py +0 -0
  415. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_ipython.py +0 -0
  416. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_kernel.py +0 -0
  417. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_keylayout.py +0 -0
  418. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_notebooks.py +0 -0
  419. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_reference.py +0 -0
  420. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_repl.py +0 -0
  421. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_windows_keyboard.py +0 -0
  422. {basedpl-0.1.40 → basedpl-0.1.41}/tests/test_worker.py +0 -0
  423. {basedpl-0.1.40 → basedpl-0.1.41}/tests/units.rs +0 -0
  424. {basedpl-0.1.40 → basedpl-0.1.41}/tests/wasm-pkg.mjs +0 -0
  425. {basedpl-0.1.40 → basedpl-0.1.41}/tests/wasm-speed.mjs +0 -0
  426. {basedpl-0.1.40 → basedpl-0.1.41}/tests/wasm.mjs +0 -0
  427. {basedpl-0.1.40 → basedpl-0.1.41}/tests/windows_keyboard.c +0 -0
  428. {basedpl-0.1.40 → basedpl-0.1.41}/wheel/data/share/jupyter/kernels/bpl/kernel.json +0 -0
@@ -8,15 +8,20 @@ on:
8
8
 
9
9
  jobs:
10
10
  test:
11
- runs-on: ubuntu-latest
11
+ # A `v*` tag runs this job and `wasm` on GitHub's runner, like the release jobs, without the speed tests. The speed budgets come from Ubicloud's runner.
12
+ runs-on: ${{ startsWith(github.ref, 'refs/tags/v') && 'ubuntu-latest' || 'ubicloud-standard-4' }}
12
13
  steps:
13
14
  - uses: actions/checkout@v7
14
15
  - run: node tests/input.mjs
15
16
  - uses: dtolnay/rust-toolchain@stable
16
17
  # The repository has no `Cargo.lock`. Creating one first makes rust-cache's key change when a dependency publishes a new version.
17
18
  - run: cargo generate-lockfile
19
+ # The `Speed` workflow restores this cache and the `wasm` job's, by their `shared-key`.
18
20
  - uses: Swatinem/rust-cache@v2
19
- - run: cargo test
21
+ with:
22
+ shared-key: native
23
+ - run: grep -m1 'model name' /proc/cpuinfo
24
+ - run: cargo test -- ${{ startsWith(github.ref, 'refs/tags/v') && '--skip functions_cost_what_their_work_needs' || '' }}
20
25
  - uses: actions/setup-python@v7
21
26
  with:
22
27
  python-version: '3.12'
@@ -27,7 +32,7 @@ jobs:
27
32
  - run: nbdev-test
28
33
 
29
34
  wasm:
30
- runs-on: ubuntu-latest
35
+ runs-on: ${{ startsWith(github.ref, 'refs/tags/v') && 'ubuntu-latest' || 'ubicloud-standard-4' }}
31
36
  steps:
32
37
  - uses: actions/checkout@v7
33
38
  - uses: dtolnay/rust-toolchain@stable
@@ -35,11 +40,16 @@ jobs:
35
40
  targets: wasm32-unknown-unknown
36
41
  - run: cargo generate-lockfile
37
42
  - uses: Swatinem/rust-cache@v2
43
+ with:
44
+ shared-key: wasm
38
45
  - run: cargo wasm --strip
39
46
  - run: node --test tests/wasm.mjs
40
- - run: node --no-liftoff --test tests/wasm-speed.mjs
47
+ - run: grep -m1 'model name' /proc/cpuinfo
48
+ - if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
49
+ run: node --no-liftoff --test tests/wasm-speed.mjs
41
50
  # The `npm` job publishes this package on a `v*` tag.
42
- - uses: actions/upload-artifact@v7
51
+ - if: startsWith(github.ref, 'refs/tags/v')
52
+ uses: actions/upload-artifact@v7
43
53
  with:
44
54
  name: wasm-pkg
45
55
  path: wasm/pkg
@@ -0,0 +1,36 @@
1
+ name: Speed
2
+
3
+ on: workflow_dispatch
4
+
5
+ permissions:
6
+ contents: read
7
+
8
+ jobs:
9
+ native:
10
+ runs-on: ubicloud-standard-4
11
+ steps:
12
+ - uses: actions/checkout@v7
13
+ - uses: dtolnay/rust-toolchain@stable
14
+ - run: cargo generate-lockfile
15
+ # Only CI's `test` job saves this cache. This job builds only part of what `test` builds. GitHub never replaces a saved cache under the same key.
16
+ - uses: Swatinem/rust-cache@v2
17
+ with:
18
+ shared-key: native
19
+ save-if: false
20
+ - run: grep -m1 'model name' /proc/cpuinfo
21
+ - run: BASEDPL_COSTS=1 cargo test --test speed -- --nocapture
22
+
23
+ wasm:
24
+ runs-on: ubicloud-standard-4
25
+ steps:
26
+ - uses: actions/checkout@v7
27
+ - uses: dtolnay/rust-toolchain@stable
28
+ with:
29
+ targets: wasm32-unknown-unknown
30
+ - run: cargo generate-lockfile
31
+ - uses: Swatinem/rust-cache@v2
32
+ with:
33
+ shared-key: wasm
34
+ - run: cargo wasm --strip
35
+ - run: grep -m1 'model name' /proc/cpuinfo
36
+ - run: BASEDPL_COSTS=1 node --no-liftoff tests/wasm-speed.mjs
@@ -87,7 +87,7 @@ checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
87
87
 
88
88
  [[package]]
89
89
  name = "basedpl"
90
- version = "0.1.40"
90
+ version = "0.1.41"
91
91
  dependencies = [
92
92
  "base64 0.23.1",
93
93
  "bytemuck",
@@ -133,7 +133,7 @@ dependencies = [
133
133
 
134
134
  [[package]]
135
135
  name = "basedpl-cli"
136
- version = "0.1.40"
136
+ version = "0.1.41"
137
137
  dependencies = [
138
138
  "async-trait",
139
139
  "basedpl",
@@ -146,7 +146,7 @@ dependencies = [
146
146
 
147
147
  [[package]]
148
148
  name = "basedpl-py"
149
- version = "0.1.40"
149
+ version = "0.1.41"
150
150
  dependencies = [
151
151
  "basedpl",
152
152
  "bytemuck",
@@ -161,7 +161,7 @@ dependencies = [
161
161
 
162
162
  [[package]]
163
163
  name = "basedpl-wasm"
164
- version = "0.1.40"
164
+ version = "0.1.41"
165
165
  dependencies = [
166
166
  "basedpl",
167
167
  "js-sys",
@@ -1782,9 +1782,9 @@ dependencies = [
1782
1782
 
1783
1783
  [[package]]
1784
1784
  name = "rustymath"
1785
- version = "0.1.8"
1785
+ version = "0.1.9"
1786
1786
  source = "registry+https://github.com/rust-lang/crates.io-index"
1787
- checksum = "5fa6cb151bb850f07cfb59e53b5b4419a6e428474843814d4c9ad23e8d8c4c26"
1787
+ checksum = "45551e624b74066f0c0bf66b9110899e3e0c69d6b8dea0e70bc11b677da52241"
1788
1788
  dependencies = [
1789
1789
  "faer",
1790
1790
  "half",
@@ -2471,7 +2471,7 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
2471
2471
 
2472
2472
  [[package]]
2473
2473
  name = "xtask"
2474
- version = "0.1.40"
2474
+ version = "0.1.41"
2475
2475
  dependencies = [
2476
2476
  "anyhow",
2477
2477
  "serde_json",
@@ -2,7 +2,7 @@
2
2
  members = ["py"]
3
3
 
4
4
  [workspace.package]
5
- version = "0.1.40"
5
+ version = "0.1.41"
6
6
  edition = "2021"
7
7
  rust-version = "1.98"
8
8
  license = "Apache-2.0"
@@ -51,7 +51,7 @@ num-complex = { version = ">=0.4.6, <1", features = ["bytemuck"] }
51
51
  num-bigint = ">=0.4.6, <0.5"
52
52
  num-traits = ">=0.2.19, <1"
53
53
  half = { version = ">=2.7.1, <3", features = ["num-traits", "bytemuck"] }
54
- rustymath = ">=0.1.6, <1"
54
+ rustymath = ">=0.1.9, <1"
55
55
  strength_reduce = ">=0.2.4, <1"
56
56
  rand = ">=0.10.2, <1"
57
57
  faer = { version = ">=0.24.4, <1", default-features = false, features = ["std", "linalg"] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basedpl
3
- Version: 0.1.40
3
+ Version: 0.1.41
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Requires-Dist: fastcore
@@ -9,8 +9,9 @@ Keys: `Alt-s`. Ranks: `0` monadic, `0 0` dyadic
9
9
  ⌈3r2 ⍝ 2ₓ
10
10
  ```
11
11
 
12
- `X⌈Y` takes the real maximum. Pervasive. Beside NaN it returns the other argument, as Rust's `f64::max` does. Empty reduction identity: `¯∞`.
12
+ `X⌈Y` takes the real maximum. Pervasive. Beside NaN it gives NaN, as NumPy's `maximum` does. Empty reduction identity: `¯∞`.
13
13
 
14
14
  ```bpl
15
15
  3⌈1 5 ⍝ 3 5
16
+ 3⌈1 $n 5 ⍝ 3 $n 5
16
17
  ```
@@ -15,8 +15,9 @@ Complex floor uses APL's Gaussian-integer rule.
15
15
  ⌊1.5j0.5 ⍝ 1j1
16
16
  ```
17
17
 
18
- `X⌊Y` takes the real minimum. Pervasive. Beside NaN it returns the other argument, as Rust's `f64::min` does. Empty reduction identity: `∞`.
18
+ `X⌊Y` takes the real minimum. Pervasive. Beside NaN it gives NaN, as NumPy's `minimum` does. Empty reduction identity: `∞`.
19
19
 
20
20
  ```bpl
21
21
  3⌊1 5 ⍝ 1 3
22
+ 3⌊1 $n 5 ⍝ 1 $n 3
22
23
  ```
@@ -177,11 +177,11 @@ Joining infinities or NaN to exact integers keeps the integers exact. Exact inte
177
177
 
178
178
  CSV and JSON imports give NaN for a missing number. An integer column with gaps then stays exact.
179
179
 
180
- `⌊` and `⌈` return an exact argument unchanged beside an infinity, and return the other argument beside NaN:
180
+ `⌊` and `⌈` return an exact argument unchanged beside an infinity. Beside NaN they give NaN:
181
181
 
182
182
  ```bpl
183
183
  3ₓ⌊∞ ⍝ 3ₓ
184
- 3ₓ⌊$n ⍝ 3ₓ
184
+ 3ₓ⌊$n ⍝ $n
185
185
  ```
186
186
 
187
187
  Arithmetic with an infinity gives floats.
@@ -754,14 +754,13 @@ impl Number {
754
754
 
755
755
  fn minimum(&self, right: &Self, maximum: bool) -> Result<Self, &'static str> {
756
756
  if let (Integer(x), Integer(y)) = (&self.0, &right.0) { return Ok(Self(Integer(if maximum { *x.max(y) } else { *x.min(y) }))); }
757
- // As in Rust's `max` and `min`, NaN gives way to the other argument. An exact number stays exact beside an infinity, and beside
757
+ // NaN beside any number gives NaN, at the width the two compute at. An exact number stays exact beside an infinity, and beside
758
758
  // another exact number.
759
- if self.is_nan() { return Ok(right.clone()); }
760
- if right.is_nan() { return Ok(self.clone()); }
761
- if (self.is_exact() && right.is_exact()) || self.is_infinite() || right.is_infinite() {
759
+ let nan = self.is_nan() || right.is_nan();
760
+ if !nan && ((self.is_exact() && right.is_exact()) || self.is_infinite() || right.is_infinite()) {
762
761
  return Ok((if maximum == self.order(right)?.is_lt() { right } else { self }).clone());
763
762
  }
764
- reals!(self, right => |x, y: F| Ok(Self::from_float(if maximum { x.max(y) } else { x.min(y) })))
763
+ reals!(self, right => |x, y: F| Ok(Self::from_float(if maximum { rustymath::reduce::maximum(x, y) } else { rustymath::reduce::minimum(x, y) })))
765
764
  }
766
765
 
767
766
  /// The result at the first of four levels that gives one for `self` and `right`: both 64-bit integers, both exact, both real, and
@@ -209,8 +209,8 @@ mod float_arithmetic {
209
209
  Primitive::Arithmetic(Minus) => run.same(|x, y| Some(x - y)),
210
210
  Primitive::Arithmetic(Times) => run.same(|x, y| Some(x * y)),
211
211
  Primitive::Arithmetic(Divide) => run.same(|x, y| Some(x / y)),
212
- Primitive::Math(Ceiling) => run.same(|x: F, y| Some(x.max(y))),
213
- Primitive::Math(Floor) => run.same(|x: F, y| Some(x.min(y))),
212
+ Primitive::Math(Ceiling) => run.same(|x: F, y| Some(reduce::maximum(x, y))),
213
+ Primitive::Math(Floor) => run.same(|x: F, y| Some(reduce::minimum(x, y))),
214
214
  Primitive::Math(Magnitude) => with_tolerance!(t, |t| run.same(move |x: F, y: F| Some(t.residue(x, y)))),
215
215
  Primitive::Compare(op) => with_tolerance!(t, |t| compare(op, run, t)),
216
216
  _ => return None,
@@ -991,7 +991,7 @@ impl<A: Element, X: Element, Y: Source<A>> Monad<A> for Map<'_, X, Y> {
991
991
  }
992
992
 
993
993
  /// A loop over integers where an argument holds a non-finite value, read as `extended` defines them. Beside such a value, arithmetic
994
- /// gives `extended::arithmetic`. Comparisons, `⌊` and `⌈` follow IEEE: NaN is unordered and gives way to the other argument. Monadic
994
+ /// gives `extended::arithmetic`. Comparisons follow IEEE: NaN is unordered. `⌊` and `⌈` give NaN beside NaN, as they do on floats. Monadic
995
995
  /// `+ ⌊ ⌈` keep every value, `×` keeps NaN, and `-` and `|` act on the float the value stands for. Other kernels give up there. `seen`
996
996
  /// records whether any result is non-finite.
997
997
  struct Nonfinite<'a, R> { run: R, p: Primitive, seen: &'a Cell<bool> }
@@ -1006,7 +1006,7 @@ impl<R: Dyad<i64>> Dyad<i64> for Nonfinite<'_, R> {
1006
1006
  Primitive::Math(Math::Floor | Math::Ceiling) => self.run.same(move |x, y| {
1007
1007
  note(
1008
1008
  seen,
1009
- if extended::is_nan(x) { Some(y) } else if extended::is_nan(y) { Some(x) } else { f(x, y) },
1009
+ if extended::is_nan(x) { Some(x) } else if extended::is_nan(y) { Some(y) } else { f(x, y) },
1010
1010
  )
1011
1011
  }),
1012
1012
  Primitive::Arithmetic(op) => self.run.same(move |x, y| note(seen, if special(x, y) { extended::arithmetic(op, x, y) } else { f(x, y) })),
@@ -1091,8 +1091,8 @@ pub(crate) fn fold(p: Primitive, right: &Value, axis: &Axis, shape: Vec<usize>,
1091
1091
  }
1092
1092
  }
1093
1093
 
1094
- /// A reduction of floats of width `F`. `+/` and `×/` use algebraic operations, which may combine the items in any order. NaN gives way
1095
- /// in `max` and `min`, so each lane of `⌈/` or `⌊/` can start from it.
1094
+ /// A reduction of floats of width `F`. `+/` and `×/` use algebraic operations, which may combine the items in any order. Each lane of
1095
+ /// `⌈/` starts from ¯∞ and each lane of `⌊/` from ∞. A NaN item makes its lane's result NaN.
1096
1096
  fn float_fold<F: Float + Native + Kernels + reduce::Fold<Sum = F>>(p: Primitive, data: &[F], axis: &Axis, shape: Vec<usize>, numeric: Numeric) -> Option<Value>
1097
1097
  where
1098
1098
  bool: Source<F>,
@@ -1102,8 +1102,8 @@ where
1102
1102
  match p {
1103
1103
  Primitive::Arithmetic(Plus) => F::build_narrowed(shape, lanes(data, axis, F::zero(), F::algebraic_add, |l| total(reduce::sum(l)))),
1104
1104
  Primitive::Arithmetic(Times) => F::build_narrowed(shape, lanes(data, axis, F::one(), F::algebraic_mul, |l| total(reduce::prod(l)))),
1105
- Primitive::Math(Ceiling) => F::build_narrowed(shape, lanes(data, axis, F::nan(), F::max, reduce::max)),
1106
- Primitive::Math(Floor) => F::build_narrowed(shape, lanes(data, axis, F::nan(), F::min, reduce::min)),
1105
+ Primitive::Math(Ceiling) => F::build_narrowed(shape, lanes(data, axis, F::neg_infinity(), reduce::maximum, reduce::max)),
1106
+ Primitive::Math(Floor) => F::build_narrowed(shape, lanes(data, axis, F::infinity(), reduce::minimum, reduce::min)),
1107
1107
  _ => F::dyad(p, Fold { data, axis, shape, numeric })?,
1108
1108
  }
1109
1109
  }
@@ -1305,8 +1305,8 @@ where
1305
1305
  match p {
1306
1306
  Primitive::Arithmetic(Arithmetic::Plus) => scan.sliced(|x, y| x + y, |l, s, o| { reduce::cumsum(l, s, o); }),
1307
1307
  Primitive::Arithmetic(Arithmetic::Times) => scan.sliced(|x, y| x * y, |l, s, o| { reduce::cumprod(l, s, o); }),
1308
- Primitive::Math(Math::Ceiling) => scan.sliced(num_traits::Float::max, reduce::cummax),
1309
- Primitive::Math(Math::Floor) => scan.sliced(num_traits::Float::min, reduce::cummin),
1308
+ Primitive::Math(Math::Ceiling) => scan.sliced(reduce::maximum, reduce::cummax),
1309
+ Primitive::Math(Math::Floor) => scan.sliced(reduce::minimum, reduce::cummin),
1310
1310
  _ => F::dyad(p, scan)?,
1311
1311
  }
1312
1312
  }
@@ -1,6 +1,6 @@
1
1
  # The cases that `tests/speed.rs` times in the native build and `tests/wasm-speed.mjs` times in the browser build. Each case line holds the code, its native budget and its wasm budget, separated by tabs. Each section starts with its name in brackets and the prefs its session starts with. Every session then runs the lines under `[setup]`.
2
2
  # Budgets in `[copies]` and `[exact]` count copies of the same data. A budget in `[widths]` is the most that the time in that section's 32-bit session may be, as a fraction of the time in the `[exact]` session. Natively and in wasm, it is the worse of that fraction on a Mac and on CI's runner, plus 0.25.
3
- # A wasm budget in copies is twice the most the case has cost on a Mac in the module that `cargo wasm` builds, and at least 0.5. `tests/speed.rs` gives the rule for native budgets in copies.
3
+ # A wasm budget in copies is twice the most the case has cost on a Mac and on CI's runner, in the module that `cargo wasm` builds, and at least 0.5. `tests/speed.rs` gives the same rule for native budgets in copies. CI's Ubicloud runner hasn't timed the cases yet, so the CI figures come from GitHub's runner, in `Speed` run 38184659294. A CI wasm job on the same code cost about 2.5 times that run's wasm figures, so each wasm figure counts 2.5 times. `⌈/v`, `⌈\v` and `v⌊w` changed after that run, and the Mac's costs stand in for CI's.
4
4
  [setup]
5
5
  side←256 ⋄ n←side×side ⋄ v←¿n⍴0 ⋄ w←¿n⍴0 ⋄ s←v-0.5 ⋄ m←[side side]⍴v
6
6
  jv←¿n⍴1000ₓ ⋄ kv←¿n⍴1000000000000ₓ ⋄ b←0=¿n⍴3ₓ ⋄ i←¿n⍴⌊n
@@ -16,142 +16,142 @@ nd←•distribution "normal" ⋄ coeffs←0.5 ¯1.25 0.75 2 ¯0.125 0.0625 ¯1.
16
16
  ⌈/v 2.9 15
17
17
  ∧/b 0.6 3.4
18
18
  +/m 2.5 5.7
19
- +⌿m 3.4 4
19
+ +⌿m 3.4 5
20
20
  # Reading one argument and writing each item once.
21
- -v 2.8 3.8
21
+ -v 3 6
22
22
  -jv 2.1 2.2
23
23
  ~b 0.5 1.1
24
24
  ∧\b 0.5 0.96
25
25
  ∨\b 0.5 1.1
26
- ⌽v 2.8 3.7
27
- 1⌽v 3.4 3.9
28
- ⊖m 3.6 5.9
29
- 1↓v 3.7 4.2
30
- (n÷2)↑v 2.2 2.9
26
+ ⌽v 3 7.9
27
+ 1⌽v 3.4 5.4
28
+ ⊖m 3.8 6.9
29
+ 1↓v 3.7 4.3
30
+ (n÷2)↑v 2.2 3.3
31
31
  n⍴0 1.8 3.6
32
32
  # Reading two arguments and writing each item once.
33
- v+w 4.6 5.3
33
+ v+w 4.6 9.7
34
34
  jv+jv 2.7 2.7
35
- kv+kv 4.6 6.4
36
- v×2 2.8 4
37
- jv×2 2.6 3.8
35
+ kv+kv 4.9 14
36
+ v×2 3.1 4.8
37
+ jv×2 2.6 5.1
38
38
  jv=jv 2.0 2.3
39
- b×jv 3.2 4.6
40
- b×kv 4.7 6.6
39
+ b×jv 3.2 11
40
+ b×kv 4.7 13
41
41
  v⌊w 4.6 14
42
42
  b∧b 1.2 1.5
43
- c=c 1.4 3.3
43
+ c=c 1.4 6.8
44
44
  (⍳√n)×⊗⍳√n 4.0 4.7
45
45
  # Compressing by a mask can't be vectorised, because each kept item's place depends on the items before it.
46
- b#v 5.8 12
47
- ⍸b 6.1 9.3
46
+ b#v 6.7 14
47
+ ⍸b 6.1 11
48
48
  # A range with an approximate length converts each position from an integer to a float.
49
49
  ⍳n 2.1 5.9
50
50
  # Comparing within tolerance takes a subtraction, the magnitudes, a scale and a comparison for each item.
51
51
  ⌊v 18.0 55
52
- v<w 11.0 23
52
+ v<w 11.0 30
53
53
  jv<500 7.0 2.5
54
54
  # Writing twice as many items, or writing in a different order from reading.
55
- v,w 4.6 5.8
56
- ⍉m 21.0 18
55
+ v,w 4.6 11
56
+ ⍉m 21.0 29
57
57
  # A small-table index takes one pass for the range of the items, then one pass to write each item's first position into the
58
58
  # table. Each of these passes costs 1.4 to 2.5 copies, because a table read or write can't be vectorised.
59
- ≠jv 8.8 20
59
+ ≠jv 9.6 21
60
60
  # A search also looks each item of the other argument up in the table, and unique then compresses by the mask.
61
- jv⍳jv 19.0 34
62
- jv∊jv 19.0 33
63
- c⍳c 19.0 31
61
+ jv⍳jv 20 37
62
+ jv∊jv 19.0 37
63
+ c⍳c 20 36
64
64
  ∪jv 15.0 29
65
65
  ∪c 17.0 28
66
66
  # Key classifies the keys, counts and places each group's positions, then gathers each group's items.
67
- {≢⍵}⌸b 73.0 96
67
+ {≢⍵}⌸b 73.0 140
68
68
  # Each item waits for the result before it. In float scans by `+` and `⌈`, only one item in each group of four waits for the group
69
69
  # before it.
70
- +\v 5.3 6.2
71
- ⌈\v 8.1 26
72
- +\jv 13.0 25
73
- +\b 7.4 12
74
- ≠\b 5.8 7.1
70
+ +\v 5.3 6.5
71
+ ⌈\v 8.1 42
72
+ +\jv 14 27
73
+ +\b 7.4 18
74
+ ≠\b 6.6 9.8
75
75
  # Each item waits for a read from a random place.
76
- [i]⌷v 16.0 18
76
+ [i]⌷v 16.0 29
77
77
  # An approximate divisor reads the integers as floats. Each item then needs a float division and a floor within tolerance.
78
- 3|jv 21.0 170
78
+ 3|jv 27 170
79
79
  # rustymath's `exp` evaluates a polynomial of 10 terms for each item, and `ln` one of 7 terms and a division.
80
- *s 23.0 39
81
- ⍟v 31.0 46
80
+ *s 23.0 57
81
+ ⍟v 33 96
82
82
  # rustymath's sine and cosine reduce each item by π in three fused multiply-adds, and evaluate a polynomial of 7 terms. Tangent
83
83
  # reduces by π/2, evaluates a polynomial of 9 terms at half the angle, and divides once.
84
- 1○v 17.0 63
85
- 2○v 20.0 41
86
- 3○v 26.0 51
84
+ 1○v 20 68
85
+ 2○v 23 75
86
+ 3○v 26.0 110
87
87
  # The hyperbolic functions build on rustymath's `exp` and `expm1`, with a division. The inverse circle functions evaluate a
88
88
  # polynomial of 10 or 12 terms after a reduction with a square root or a division.
89
- 5○v 31.0 56
90
- 6○v 23.0 43
91
- 7○v 31.0 57
92
- 1○⁻¹v 24.0 46
93
- 2○⁻¹v 65.0 44
94
- 3○⁻¹v 23.0 41
89
+ 5○v 32 110
90
+ 6○v 24 65
91
+ 7○v 31.0 88
92
+ 1○⁻¹v 24.0 71
93
+ 2○⁻¹v 65.0 92
94
+ 3○⁻¹v 23.0 93
95
95
  # The inverse hyperbolic functions build on rustymath's `log1p`, after a square root or a division.
96
- 5○⁻¹v 48.0 67
97
- 4○v 13.0 18
96
+ 5○⁻¹v 48.0 110
97
+ 4○v 13.0 19
98
98
  # An exponent of 2 squares each item, in a loop of its own. Another exponent calls rustymath's `pow` for each item, which at f64
99
99
  # reads tables that NEON and wasm can't vectorize.
100
- v*2 3.2 4.1
100
+ v*2 3.2 4.9
101
101
  v*w 130.0 210
102
102
  # Bases 2 and 10 and degrees 2 and 3 have loops of their own.
103
- 2⍟v 33.0 49
104
- 10⍟v 34.0 50
105
- 3√v 27.0 61
103
+ 2⍟v 33.0 77
104
+ 10⍟v 34.0 98
105
+ 3√v 28 98
106
106
  # Exact integers read as floats for a function whose results are always approximate.
107
- ⍟jv 35 53
108
- *jv 23 44
109
- jv⍟2ₓ 140 130
110
- √jv 7.5 10
107
+ ⍟jv 35 96
108
+ *jv 23 69
109
+ jv⍟2ₓ 140 290
110
+ √jv 7.5 26
111
111
  # `!` calls rustymath's `gamma`, which sums its Lanczos series in double words. A distribution's density, cdf and quantile each
112
112
  # run over the array as one slice. The quantile refines Giles's approximation of erfcinv with Halley steps. `⌻` evaluates a
113
113
  # polynomial of degree 7 by Horner's rule.
114
- !v 430 860
115
- nd.density v 70 100
116
- nd.cdf v 62 77
117
- nd.quantile v 690 1090
114
+ !v 450 1400
115
+ nd.density v 70 120
116
+ nd.cdf v 62 140
117
+ nd.quantile v 690 1100
118
118
  coeffs⌻v 12 34
119
119
  # Each item goes into a hash table, and each item of the other argument is looked up in it. A tolerant search looks in two
120
120
  # buckets for each item, where an exact search looks in one.
121
121
  v⍳w 710.0 830
122
122
  # A radix sort moves every item once for each byte that differs between the keys.
123
- ⍋v 280.0 210
124
- ⍋jv 110.0 140
123
+ ⍋v 280.0 360
124
+ ⍋jv 110.0 190
125
125
  # Unique sorts the reals, then compares each with the next one.
126
- ∪v 320.0 350
126
+ ∪v 320.0 540
127
127
  [exact] •prefs ["tolerance":0]
128
128
  # Plain IEEE comparisons and `floor`, with nothing to scale by a tolerance.
129
129
  ⌊v 5.0 15
130
- v<w 3.0 5.9
131
- v=w 3.2 5.7
132
- 3|v 5.8 36
130
+ v<w 3.2 9.3
131
+ v=w 3.2 7.8
132
+ 3|v 8.5 36
133
133
  # Each real indexes its `order_key` in a hash map, as exact data does.
134
- v⍳w 340.0 250
134
+ v⍳w 340.0 260
135
135
  ∪v 410.0 260
136
136
  [widths] •prefs ["float":32]
137
137
  # Half the bytes to read and write, and twice the lanes in each SIMD instruction.
138
138
  -v 0.82 0.89
139
139
  v+w 0.78 0.85
140
140
  v×2 0.83 0.89
141
- v<w 0.82 0.88
141
+ v<w 0.83 0.88
142
142
  0.5<v 0.87 0.87
143
- √v 0.78 0.86
143
+ √v 0.79 0.86
144
144
  +⌿m 0.89 0.99
145
145
  +/v 0.88 0.77
146
146
  ⌈/v 0.91 1.26
147
147
  m+.×m 0.87 1.26
148
148
  # `⌊` reads half the bytes and writes 32-bit integers in place of 64-bit ones.
149
- ⌊v 0.89 1.03
149
+ ⌊v 0.89 1.05
150
150
  # An LU decomposition in 32 bits.
151
151
  ⌹m 0.99 1.23
152
152
  # rustymath's `exp` and `ln` run shorter polynomials at f32, with twice the lanes in each SIMD instruction.
153
- *s 0.65 0.61
154
- ⍟v 0.68 0.64
153
+ *s 0.66 0.61
154
+ ⍟v 0.69 0.64
155
155
  # rustymath's sine and cosine reduce in f32 with fused multiply-adds, and run a polynomial of 4 terms in place of 7.
156
156
  1○v 0.71 1.01
157
157
  2○v 0.74 0.98
@@ -159,10 +159,10 @@ m+.×m 0.87 1.26
159
159
  7○v 0.7 0.61
160
160
  1○⁻¹v 0.64 0.56
161
161
  3○⁻¹v 0.69 0.57
162
- v*2 0.82 0.93
162
+ v*2 0.82 1.08
163
163
  v*w 0.8 0.93
164
164
  # Grade sorts keys and positions of half the bytes.
165
- ⍋v 0.94 0.89
165
+ ⍋v 0.98 0.92
166
166
  # A hash lookup costs about the same at either width. These budgets catch a 32-bit search that costs much more than a 64-bit one.
167
- v⍳w 1.17 1.23
167
+ v⍳w 1.18 1.23
168
168
  ∪v 1.2 1.33
@@ -1,23 +0,0 @@
1
- name: Speed
2
-
3
- on: workflow_dispatch
4
-
5
- permissions:
6
- contents: read
7
-
8
- jobs:
9
- costs:
10
- runs-on: ubuntu-latest
11
- steps:
12
- - uses: actions/checkout@v7
13
- - uses: dtolnay/rust-toolchain@stable
14
- with:
15
- targets: wasm32-unknown-unknown
16
- - run: cargo generate-lockfile
17
- - uses: Swatinem/rust-cache@v2
18
- - run: BASEDPL_COSTS=1 cargo test --test speed -- --nocapture
19
- # The wasm costs print even when a native case goes over budget.
20
- - if: ${{ !cancelled() }}
21
- run: cargo wasm --strip
22
- - if: ${{ !cancelled() }}
23
- run: BASEDPL_COSTS=1 node --no-liftoff tests/wasm-speed.mjs
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes