diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1f1ac6f3..e8ea53a6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -2,6 +2,7 @@ "packages/cli": "0.0.3", "packages/components": "0.3.1", "packages/squiggle-lang": "0.3.0", + "packages/squiggle-mc-cached-wasm": "0.0.1", "packages/vscode-ext": "0.3.1", "packages/website": "0.3.0" } diff --git a/nix/shell.nix b/nix/shell.nix index 29008b8d..9ceb0b0f 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -3,6 +3,6 @@ with pkgs; { shell = mkShell { name = "SQUIGGLE_yarn-wasm-devshell"; buildInputs = - [ wasm-pack cargo yarn nodejs rustup pkg-config openssl nixfmt ]; + [ wasm-pack cargo yarn nodejs rustup pkg-config openssl nixfmt rustfmt ]; }; } diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index 73db9a42..de23a37f 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -5,8 +5,9 @@ "license": "MIT", "scripts": { "peggy": "peggy --cache", + "build:mc-cached": "cd ../squiggle-mc-cached && yarn build and cd ../squiggle-lang", "rescript": "rescript", - "build": "yarn build:peggy && yarn build:rescript && yarn build:typescript", + "build": "yarn build:mc-cached && yarn build:peggy && yarn build:rescript && yarn build:typescript", "build:peggy:helpers": "tsc --module commonjs --outDir src/rescript/Reducer/Reducer_Peggy/ src/rescript/Reducer/Reducer_Peggy/helpers.ts", "build:peggy": "yarn build:peggy:helpers && find . -type f -name *.peggy -exec yarn peggy {} \\;", "build:rescript": "rescript build -with-deps", @@ -40,6 +41,7 @@ ], "author": "Quantified Uncertainty Research Institute", "dependencies": { + "@quri/par-cached-monte-carlo": "file:../squiggle-mc-cached/pkg", "@rescript/std": "^9.1.4", "@stdlib/stats": "^0.0.13", "jstat": "^1.9.5", diff --git a/packages/squiggle-mc-cached-wasm/.gitignore b/packages/squiggle-mc-cached/.gitignore similarity index 100% rename from packages/squiggle-mc-cached-wasm/.gitignore rename to packages/squiggle-mc-cached/.gitignore diff --git a/packages/squiggle-mc-cached/Cargo.lock b/packages/squiggle-mc-cached/Cargo.lock new file mode 100644 index 00000000..1b401384 --- /dev/null +++ b/packages/squiggle-mc-cached/Cargo.lock @@ -0,0 +1,817 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "async-trait" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "async_once" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "cached" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e6092f8c7ba6e65a46f6f26d7d7997201d3a6f0e69ff5d2440b930d7c0513a" +dependencies = [ + "async-trait", + "async_once", + "cached_proc_macro", + "cached_proc_macro_types", + "futures 0.3.23", + "hashbrown", + "instant", + "lazy_static", + "once_cell", + "thiserror", + "tokio", +] + +[[package]] +name = "cached_proc_macro" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "751f7f4e7a091545e7f6c65bacc404eaee7e87bfb1f9ece234a1caa173dc16f2" +dependencies = [ + "cached_proc_macro_types", + "darling", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.43", + "quote 1.0.21", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" + +[[package]] +name = "futures-io" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" + +[[package]] +name = "futures-sink" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" + +[[package]] +name = "futures-task" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" + +[[package]] +name = "futures-util" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "js-sys" +version = "0.3.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel_density" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4650e4bc6bb55f57f16f669ddb3c643c8b2e99a477f2f1fa9162528322d2a1b1" +dependencies = [ + "ordered-float", + "rand 0.3.23", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" + +[[package]] +name = "libm" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.15", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" + +[[package]] +name = "ordered-float" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc511538298611a79d5a4ddfbb75315b866d942ed26a00bdc3590795c68b7279" +dependencies = [ + "num-traits 0.1.43", + "unreachable", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quickcheck" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" +dependencies = [ + "env_logger", + "log", + "rand 0.8.5", +] + +[[package]] +name = "quickcheck_macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b22a693222d716a9587786f37ac3f6b4faedb5b80c23914e7303ff5a1d8016e9" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2 1.0.43", +] + +[[package]] +name = "rand" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +dependencies = [ + "libc", + "rand 0.4.6", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits 0.2.15", + "rand 0.8.5", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "squiggle-mc-cached-wasm" +version = "0.0.1" +dependencies = [ + "cached", + "console_error_panic_hook", + "futures 0.1.31", + "getrandom", + "js-sys", + "kernel_density", + "quickcheck", + "quickcheck_macros", + "rand 0.8.5", + "rand_distr", + "statistics", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", + "wee_alloc", +] + +[[package]] +name = "statistics" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4628c807954468b720f27d8863a5447d328378cbb874d633f6c4e952073acf" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "tokio" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" +dependencies = [ + "autocfg", + "num_cpus", + "once_cell", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "unreachable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" +dependencies = [ + "void", +] + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83420b37346c311b9ed822af41ec2e82839bfe99867ec6c54e2da43b7538771c" +dependencies = [ + "cfg-if 0.1.10", + "futures 0.1.31", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" +dependencies = [ + "quote 1.0.21", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" +dependencies = [ + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" + +[[package]] +name = "wasm-bindgen-test" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d9693b63a742d481c7f80587e057920e568317b2806988c59cd71618bc26c1" +dependencies = [ + "console_error_panic_hook", + "futures 0.1.31", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0789dac148a8840bbcf9efe13905463b733fa96543bfbf263790535c11af7ba5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", +] + +[[package]] +name = "web-sys" +version = "0.3.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wee_alloc" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "memory_units", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/packages/squiggle-mc-cached-wasm/Cargo.toml b/packages/squiggle-mc-cached/Cargo.toml similarity index 82% rename from packages/squiggle-mc-cached-wasm/Cargo.toml rename to packages/squiggle-mc-cached/Cargo.toml index e6a8a136..c41493d2 100644 --- a/packages/squiggle-mc-cached-wasm/Cargo.toml +++ b/packages/squiggle-mc-cached/Cargo.toml @@ -1,10 +1,12 @@ # You must change these to your own details. [package] name = "squiggle-mc-cached-wasm" -description = "Caching for Monte Carlo simulations in WebAssembly" +description = "Cached and parallel Monte Carlo simulations in WebAssembly" version = "0.0.1" authors = ["Quinn "] -categories = ["wasm"] +repository = "github.com/quantified-uncertainty/squiggle" +license = "MIT" +categories = ["wasm", "Monte Carlo"] readme = "README.md" edition = "2018" @@ -31,8 +33,12 @@ wasm-bindgen = "0.2.45" wee_alloc = { version = "0.4.2", optional = true } # Numerical things +rand = "0.8.5" getrandom = { version = "0.2", features = ["js"] } rand_distr = "0.4.3" +statistics = "0.4.1" +kernel_density = "0.0.1" +cached = { version = "0.38.0", features = ["wasm"] } # The `web-sys` crate allows you to interact with the various browser APIs, # like the DOM. @@ -53,3 +59,5 @@ wasm-bindgen-test = "0.2.45" futures = "0.1.27" js-sys = "0.3.22" wasm-bindgen-futures = "0.3.22" +quickcheck = "1" +quickcheck_macros = "1" diff --git a/packages/squiggle-mc-cached-wasm/README.md b/packages/squiggle-mc-cached/README.md similarity index 86% rename from packages/squiggle-mc-cached-wasm/README.md rename to packages/squiggle-mc-cached/README.md index 680f386c..10a2fd68 100644 --- a/packages/squiggle-mc-cached-wasm/README.md +++ b/packages/squiggle-mc-cached/README.md @@ -1,34 +1,34 @@ +# `@quri/par-cached-monte-carlo` - parallel Monte Carlo with memoization + ## How to install -```sh -npm install -``` +Please run `yarn` at hte monorepo level ## How to run in debug mode ```sh # Builds the project and opens it in a new browser tab. Auto-reloads when the project changes. -npm start +yarn start ``` ## How to build in release mode ```sh # Builds the project and places it into the `dist` folder. -npm run build +yarn build ``` ## How to run unit tests ```sh # Runs tests in Firefox -npm test -- --firefox +yarn test -- --firefox # Runs tests in Chrome -npm test -- --chrome +yarn test -- --chrome # Runs tests in Safari -npm test -- --safari +yarn test -- --safari ``` ## What does each file do? diff --git a/packages/squiggle-mc-cached-wasm/js/index.js b/packages/squiggle-mc-cached/js/index.js similarity index 100% rename from packages/squiggle-mc-cached-wasm/js/index.js rename to packages/squiggle-mc-cached/js/index.js diff --git a/packages/squiggle-mc-cached-wasm/package.json b/packages/squiggle-mc-cached/package.json similarity index 78% rename from packages/squiggle-mc-cached-wasm/package.json rename to packages/squiggle-mc-cached/package.json index 26c47082..7ba8e061 100644 --- a/packages/squiggle-mc-cached-wasm/package.json +++ b/packages/squiggle-mc-cached/package.json @@ -1,7 +1,7 @@ { - "author": "You ", - "name": "rust-webpack-template", - "version": "0.1.0", + "author": "Quinn Dougherty ", + "name": "@quri/par-cached-monte-carlo", + "version": "0.0.1", "scripts": { "build": "rimraf dist pkg && webpack", "start": "rimraf dist pkg && webpack-dev-server --open -d", diff --git a/packages/squiggle-mc-cached/src/distribution/bandwidth.rs b/packages/squiggle-mc-cached/src/distribution/bandwidth.rs new file mode 100644 index 00000000..2c566625 --- /dev/null +++ b/packages/squiggle-mc-cached/src/distribution/bandwidth.rs @@ -0,0 +1,57 @@ +/** The math here was taken from https://github.com/jasondavies/science.js/blob/master/src/stats/SampleSetDist_Bandwidth.js +*/ +use statistics::variance; +// mod magic_numbers; +use crate::distribution::BandwidthParameters; +use crate::distribution::e::a::floats::{lenf, min, percentile}; + +fn iqr_percentile() -> f64 { + return BandwidthParameters::default().iqr_percentile; +} +fn iqr_percentile_complement() -> f64 { + return BandwidthParameters::default().iqr_percentile_complement; +} +fn nrd0_lo_denominator() -> f64 { + return BandwidthParameters::default().nrd0_lo_denominator; +} +fn onef() -> f64 { + return 1.0; +} +fn nrd0_coef() -> f64 { + return BandwidthParameters::default().nrd0_coef; +} +fn nrd_coef() -> f64 { + return BandwidthParameters::default().nrd_coef; +} +fn nrd_fractional_power() -> f64 { + return BandwidthParameters::default().nrd_fractional_power; +} + +pub fn iqr(x: &Vec) -> f64 { + return percentile(x, iqr_percentile()) - percentile(x, iqr_percentile_complement()); +} + +/** Silverman, B. W. (1986) Density Estimation. London: Chapman and Hall. +*/ +pub fn nrd0(x: Vec) -> f64 { + let _hi = variance(&x).sqrt(); + let _lo = min([_hi, iqr(&x) / nrd0_lo_denominator()].to_vec()); + let _e = x[1].abs(); + // nanhandling + let lo = if !_lo.is_nan() { + _lo + } else if !_hi.is_nan() { + _hi + } else if !_e.is_nan() { + _e + } else { + onef() + }; + return nrd0_coef() * lo * lenf(&x).powf(nrd_fractional_power()); +} + +/** Scott, D. W. (1992) Multivariate Density Estimation: Theory, Practice, and Visualization. Wiley. */ +pub fn nrd(x: Vec) -> f64 { + let h = iqr(&x) / nrd0_lo_denominator(); + return nrd_coef() * min([variance(&x).sqrt(), h].to_vec()) * lenf(&x).powf(nrd_fractional_power()); +} diff --git a/packages/squiggle-mc-cached/src/distribution/e/mod.rs b/packages/squiggle-mc-cached/src/distribution/e/mod.rs new file mode 100644 index 00000000..ed7833ee --- /dev/null +++ b/packages/squiggle-mc-cached/src/distribution/e/mod.rs @@ -0,0 +1,29 @@ +pub mod a { + pub mod floats { + + pub fn lenf(x: &Vec) -> f64 { + return x.len() as f64; + } + + pub fn percentile(x: &Vec, p: f64) -> f64 { + let mut sortedx: Vec = Vec::new(); + for item in x { + sortedx.push(*item) + } + sortedx.sort_by(|a, b| a.partial_cmp(b).unwrap()); + let idx_float = p * (lenf(&sortedx) + 1.0); + let idx = idx_float as usize; + let frac = idx_float - (idx as f64); + let p = if idx + 1 < sortedx.len() { + sortedx[idx - 1] + frac * (sortedx[idx] - sortedx[idx - 1]) + } else { + sortedx[idx - 1] + }; + return p + } + + pub fn min(x: Vec) -> f64 { + return x.into_iter().min_by(|a, b| a.partial_cmp(b).unwrap()).unwrap() + } + } +} diff --git a/packages/squiggle-mc-cached/src/distribution/magic_numbers.rs b/packages/squiggle-mc-cached/src/distribution/magic_numbers.rs new file mode 100644 index 00000000..b95d47e5 --- /dev/null +++ b/packages/squiggle-mc-cached/src/distribution/magic_numbers.rs @@ -0,0 +1,59 @@ +pub mod bandwidth { + // Silverman, B. W. (1986) Density Estimation. London: Chapman and Hall. + // Scott, D. W. (1992) Multivariate Density Estimation: Theory, Practice, and Visualization. Wiley. + pub struct Parameters { + pub iqr_percentile: f64, + pub iqr_percentile_complement: f64, + pub nrd0_lo_denominator: f64, + pub nrd0_coef: f64, + pub nrd_coef: f64, + pub nrd_fractional_power: f64, + } + + impl Default for Parameters { + fn default() -> Parameters { + let iqr_percentile: f64 = 0.75; + let iqr_percentile_complement: f64 = (1.0 as f64) - iqr_percentile; + Parameters { + iqr_percentile: iqr_percentile, + iqr_percentile_complement: iqr_percentile_complement, + nrd0_lo_denominator: 1.34, + nrd0_coef: 0.9, + nrd_coef: 1.06, + nrd_fractional_power: -0.2, + } + } + } +} + +pub mod to_point_set { + use std::cmp::max; + /** This function chooses the minimum amount of duplicate samples that need + to exist in order for this to be considered discrete. The tricky thing + is that there are some operations that create duplicate continuous samples, + so we can't guarantee that these only will occur because the fundamental + structure is meant to be discrete. I chose this heuristic because I think + it would strike a reasonable trade-off, but I’m really unsure what’s + best right now. + */ + pub fn min_discrete_to_keep(samples: [f64; 3]) -> usize { + return max(20, samples.len() / 50); + } +} + +pub mod environment { + pub struct Parameters { + pub default_xy_point_length: usize, + pub default_sample_count: usize, + pub sparkline_length: usize, + } + impl Default for Parameters { + fn default() -> Parameters { + Parameters { + default_xy_point_length: 1000, + default_sample_count: 10000, + sparkline_length: 20, + } + } + } +} diff --git a/packages/squiggle-mc-cached/src/distribution/mod.rs b/packages/squiggle-mc-cached/src/distribution/mod.rs new file mode 100644 index 00000000..6d57d116 --- /dev/null +++ b/packages/squiggle-mc-cached/src/distribution/mod.rs @@ -0,0 +1,10 @@ +pub mod e; +pub mod bandwidth; +pub mod magic_numbers; +pub mod monte_carlo; + +pub use e::*; +// pub use bandwidth; +pub use magic_numbers::bandwidth::Parameters as BandwidthParameters; +pub use magic_numbers::environment::Parameters as EnvironmentParameters; +pub use monte_carlo::my_string; diff --git a/packages/squiggle-mc-cached/src/distribution/monte_carlo.rs b/packages/squiggle-mc-cached/src/distribution/monte_carlo.rs new file mode 100644 index 00000000..68fe3ab5 --- /dev/null +++ b/packages/squiggle-mc-cached/src/distribution/monte_carlo.rs @@ -0,0 +1,8 @@ +use rand; +use rand_distr::{Distribution, Normal}; + +pub fn my_string() -> String { + let normal = Normal::new(2.0, 3.0).unwrap(); + let v = normal.sample(&mut rand::thread_rng()); + return format!("{} is from an N(2,3) distribution", v); +} diff --git a/packages/squiggle-mc-cached-wasm/src/lib.rs b/packages/squiggle-mc-cached/src/lib.rs similarity index 72% rename from packages/squiggle-mc-cached-wasm/src/lib.rs rename to packages/squiggle-mc-cached/src/lib.rs index a649970c..14aefe02 100644 --- a/packages/squiggle-mc-cached-wasm/src/lib.rs +++ b/packages/squiggle-mc-cached/src/lib.rs @@ -1,6 +1,7 @@ use wasm_bindgen::prelude::*; use web_sys::console; - +mod distribution; +use distribution::{monte_carlo, bandwidth}; // When the `wee_alloc` feature is enabled, this uses `wee_alloc` as the global // allocator. @@ -10,7 +11,6 @@ use web_sys::console; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; - // This is like the `main` function, except for JavaScript. #[wasm_bindgen(start)] pub fn main_js() -> Result<(), JsValue> { @@ -19,9 +19,12 @@ pub fn main_js() -> Result<(), JsValue> { #[cfg(debug_assertions)] console_error_panic_hook::set_once(); - + console::log_1(&JsValue::from_str(&format!( + "nrd(1,2,5): {}", + bandwidth::nrd([1.0, 2.0, 5.0].to_vec()) + ))); // Your code goes here! - console::log_1(&JsValue::from_str("Hello world!")); + console::log_1(&JsValue::from_str(&monte_carlo::my_string())); Ok(()) } diff --git a/packages/squiggle-mc-cached-wasm/static/index.html b/packages/squiggle-mc-cached/static/index.html similarity index 100% rename from packages/squiggle-mc-cached-wasm/static/index.html rename to packages/squiggle-mc-cached/static/index.html diff --git a/packages/squiggle-mc-cached-wasm/tests/app.rs b/packages/squiggle-mc-cached/tests/app.rs similarity index 100% rename from packages/squiggle-mc-cached-wasm/tests/app.rs rename to packages/squiggle-mc-cached/tests/app.rs diff --git a/packages/squiggle-mc-cached-wasm/webpack.config.js b/packages/squiggle-mc-cached/webpack.config.js similarity index 100% rename from packages/squiggle-mc-cached-wasm/webpack.config.js rename to packages/squiggle-mc-cached/webpack.config.js diff --git a/yarn.lock b/yarn.lock index 1a41e7dd..5eaafd45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2504,6 +2504,9 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@quri/par-cached-monte-carlo@file:packages/squiggle-mc-cached/pkg": + version "0.0.0" + "@quri/squiggle-components@^0.2.23": version "0.2.24" resolved "https://registry.yarnpkg.com/@quri/squiggle-components/-/squiggle-components-0.2.24.tgz#16a2d72fb16f46a0bf71388c85d1238927676923"