From ca67140361b26b2bc7261264f203c4f314c14cb3 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 14:49:15 -0400 Subject: [PATCH 01/13] `Language.mdx` changes and `examples` Value: [1e-2 to 2e-1] --- examples/decay.squiggle | 20 ++++++++ examples/givedirectly.squiggle | 38 +++++++++++++++ .../wholenumberassignmentevaluation.squiggle | 3 ++ packages/website/docs/Features/Language.mdx | 48 ++++++++++++------- 4 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 examples/decay.squiggle create mode 100644 examples/givedirectly.squiggle create mode 100644 examples/wholenumberassignmentevaluation.squiggle diff --git a/examples/decay.squiggle b/examples/decay.squiggle new file mode 100644 index 00000000..60f4c95e --- /dev/null +++ b/examples/decay.squiggle @@ -0,0 +1,20 @@ +# The following code was provided by Nuño Sempere, it comes directly from the post https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3/p/j8o6sgRerE3tqNWdj +## Initial setup +yearly_probability_max = 0.95 +yearly_probability_min = 0.66 +period_probability_function(epsilon, yearly_probability) = 1 - (1 - yearly_probability) ^ (1 / epsilon) +probability_decayed(t, time_periods, period_probability) = 1 - (1 - period_probability) ^ (time_periods - t) + +## Monthly decomposition +months_in_a_year=12 + +monthly_probability_min = period_probability_function(months_in_a_year, yearly_probability_min) +monthly_probability_max = period_probability_function(months_in_a_year, yearly_probability_max) + +probability_decayed_monthly_min(t) = probability_decayed(t, months_in_a_year, monthly_probability_min) +probability_decayed_monthly_max(t) = probability_decayed(t, months_in_a_year, monthly_probability_max) +probability_decayed_monthly(t) = probability_decayed_monthly_min(t) to probability_decayed_monthly_max(t) + +probability_decayed_monthly +## probability_decayed_monthly(6) +## mean(probability_decayed_monthly(6)) diff --git a/examples/givedirectly.squiggle b/examples/givedirectly.squiggle new file mode 100644 index 00000000..16dda3a7 --- /dev/null +++ b/examples/givedirectly.squiggle @@ -0,0 +1,38 @@ +# This is a cost effectiveness analysis of givedirectly, originally done by givewell, and translated into Squiggle by Sam Nolan +donation_size = 10000 +proportion_of_funding_available = beta(10, 2) +total_funding_available = donation_size * proportion_of_funding_available +household_size = 3.7 to 5.7 +size_of_transfer = 800 to 1200 +size_of_transfer_per_person = size_of_transfer / household_size + +portion_invested = 0.3 to 0.5 +amount_invested = portion_invested * size_of_transfer_per_person +amount_consumed = (1 - portion_invested) * size_of_transfer_per_person +return_on_investment = 0.08 to 0.12 +increase_in_consumption_from_investments = return_on_investment * amount_invested +baseline_consumption = 200 to 350 +log_increase_in_consumption = log(amount_consumed + baseline_consumption) + log(baseline_consumption) +log_increase_in_consumption_from_investment = log(increase_in_consumption_from_investments + baseline_consumption) + log(baseline_consumption) +investment_duration = 8 to 12 +discount_rate = beta(1.004, 20) + +present_value_excluding_last_year = log_increase_in_consumption_from_investment * (1 - (1 + discount_rate) ^ (-investment_duration)) / (log(1 + discount_rate)) + +percent_of_investment_returned = 0.15 to 0.25 + +pv_consumption_last_year = (log(baseline_consumption + amount_invested * (return_on_investment + percent_of_investment_returned)) - log(baseline_consumption)) / (1 + discount_rate)^investment_duration + +total_pv_of_cash_transfer = pv_consumption_last_year + present_value_excluding_last_year + log_increase_in_consumption + +discount_negative_spoiler = 0.03 to 0.07 + +value_discounting_spoiler = discount_negative_spoiler * total_pv_of_cash_transfer + +consumption_increase_per_household = value_discounting_spoiler * household_size + +amount_of_transfers_made = total_funding_available / size_of_transfer + +total_increase_in_ln_consumption = amount_of_transfers_made * consumption_increase_per_household + +total_increase_in_ln_consumption diff --git a/examples/wholenumberassignmentevaluation.squiggle b/examples/wholenumberassignmentevaluation.squiggle new file mode 100644 index 00000000..f441c67e --- /dev/null +++ b/examples/wholenumberassignmentevaluation.squiggle @@ -0,0 +1,3 @@ +xY1 = 99 +aBa3 = xY1 * 2 + 1 +aBa3 * xY1 + aBa3 diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index e559fb60..57dcaa0a 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -1,39 +1,51 @@ --- sidebar_position: 2 +title: Squiggle Language --- import { SquiggleEditor } from "../../src/components/SquiggleEditor"; -# Squiggle Language - The squiggle language has a very simple syntax. The best way to get to understand it is by simply looking at examples. -## Basic Language +## Expressions and statements -As an example: +A squiggle **expression** is a value like a float or a distribution or a data structure like an array or a record. + + + +The bottom line of your squiggle buffer should be an expression, which we evaluate (i.e., render). Sometimes we call the last expression of a squiggle file an _export_. + +A squiggle **assignment** is a statement, when you want to bind an expression to a name. -Squiggle can declare variables (`value_of_work = 10 to 70`) and declare exports -(the lone `value_of_work` line). Variables can be used later in a squiggle program -and even in other notebooks! +### Functions -An export is rendered to the output view so you can see your result. - -the exports can be expressions, such as: - - - -## Functions - -Squiggle supports functions, including the rendering of functions: +Some assignments are functions + +## Data structures + +A squiggle **array** is a list of expressions, which is interpretable as an export. + + + +A squiggle **record** is a key-value store with dot accessors. + + From 98bc2ddd5818eb452562d95f871e2ea1966da4bd Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:28:10 -0400 Subject: [PATCH 02/13] Made docs better Value: [1e-3 to 2e-1] --- packages/website/docs/Discussions/Gallery.md | 7 +++++++ ...butions.md => Three-Formats-Of-Distributions.md} | 8 +++----- packages/website/docs/Features/Language.mdx | 10 +++++----- .../{Javascript-Libraries.md => Node-Packages.md} | 9 ++++----- ...ervals.md => Processing-Confidence-Intervals.md} | 8 ++++++-- packages/website/docs/Introduction.md | 13 +++++++++---- 6 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 packages/website/docs/Discussions/Gallery.md rename packages/website/docs/Discussions/{Three-Types-Of-Distributions.md => Three-Formats-Of-Distributions.md} (99%) rename packages/website/docs/Features/{Javascript-Libraries.md => Node-Packages.md} (83%) rename packages/website/docs/Internal/{ProcessingConfidenceIntervals.md => Processing-Confidence-Intervals.md} (90%) diff --git a/packages/website/docs/Discussions/Gallery.md b/packages/website/docs/Discussions/Gallery.md new file mode 100644 index 00000000..fee8f344 --- /dev/null +++ b/packages/website/docs/Discussions/Gallery.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 6 +title: Gallery +--- + +- [Adjusting probabilities for the passage of time](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3/p/j8o6sgRerE3tqNWdj) by Nuño Sempere +- [GiveWell's GiveDirectly cost effectiveness analysis](https://observablehq.com/@hazelfire/givewells-givedirectly-cost-effectiveness-analysis) by Sam Nolan diff --git a/packages/website/docs/Discussions/Three-Types-Of-Distributions.md b/packages/website/docs/Discussions/Three-Formats-Of-Distributions.md similarity index 99% rename from packages/website/docs/Discussions/Three-Types-Of-Distributions.md rename to packages/website/docs/Discussions/Three-Formats-Of-Distributions.md index ffd99fc1..8ec5b88d 100644 --- a/packages/website/docs/Discussions/Three-Types-Of-Distributions.md +++ b/packages/website/docs/Discussions/Three-Formats-Of-Distributions.md @@ -1,12 +1,10 @@ --- sidebar_position: 5 +title: Three Formats of Distributions +author: Ozzie Gooen +date: 02-19-2022 --- -# Three Formats of Distributions - -_Author: Ozzie Gooen_ -_Written on: Feb 19, 2022_ - Probability distributions have several subtle possible formats. Three important ones that we deal with in Squiggle are symbolic, sample set, and graph formats. _Symbolic_ formats are just the math equations. `normal(5,3)` is the symbolic representation of a normal distribution. diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 57dcaa0a..4862bd5d 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 2 -title: Squiggle Language +title: Language Basics --- import { SquiggleEditor } from "../../src/components/SquiggleEditor"; @@ -29,8 +29,8 @@ Some assignments are functions @@ -46,6 +46,6 @@ A squiggle **record** is a key-value store with dot accessors. diff --git a/packages/website/docs/Features/Javascript-Libraries.md b/packages/website/docs/Features/Node-Packages.md similarity index 83% rename from packages/website/docs/Features/Javascript-Libraries.md rename to packages/website/docs/Features/Node-Packages.md index c782be6f..6a55c6dd 100644 --- a/packages/website/docs/Features/Javascript-Libraries.md +++ b/packages/website/docs/Features/Node-Packages.md @@ -1,13 +1,12 @@ --- sidebar_position: 3 +title: Node Packages --- -# Javascript Libraries - There are two JavaScript packages currently available for Squiggle: -- [`@quri/squiggle-lang`](https://www.npmjs.com/package/@quri/squiggle-lang) -- [`@quri/squiggle-components`](https://www.npmjs.com/package/@quri/squiggle-components) +- [`@quri/squiggle-lang`](https://www.npmjs.com/package/@quri/squiggle-lang) ![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg) +- [`@quri/squiggle-components`](https://www.npmjs.com/package/@quri/squiggle-components) ![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg) Types are available for both packages. @@ -24,7 +23,7 @@ call. Passing this environment will mean that all previously declared variables in the previous environment will be made available. The return type of `run` is a bit complicated, and comes from auto generated js -code that comes from rescript. I highly recommend using typescript when using +code that comes from rescript. We highly recommend using typescript when using this library to help navigate the return type. ## Squiggle Components diff --git a/packages/website/docs/Internal/ProcessingConfidenceIntervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md similarity index 90% rename from packages/website/docs/Internal/ProcessingConfidenceIntervals.md rename to packages/website/docs/Internal/Processing-Confidence-Intervals.md index 99e72e5a..cc193e8f 100644 --- a/packages/website/docs/Internal/ProcessingConfidenceIntervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -1,6 +1,8 @@ -# Processing confidence intervals +--- +title: Processing Confidence Intervals +--- -This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it +This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it. ## For normals @@ -30,3 +32,5 @@ We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% poin So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. ## For lognormals + +TODO diff --git a/packages/website/docs/Introduction.md b/packages/website/docs/Introduction.md index ecfe7f02..021bd845 100644 --- a/packages/website/docs/Introduction.md +++ b/packages/website/docs/Introduction.md @@ -1,10 +1,15 @@ --- sidebar_position: 1 +title: Introduction --- -# Squiggle +Squiggle is an _estimation language_, and a syntax for _calculating and expressing beliefs_ involving uncertainty. It has use cases in forecasting and writing evaluations. -Squiggle is a language for writing calculations under uncertainty. It has use -cases in forecasting and writing better evaluations. +## Get started -The best way to get started with Squiggle is to [try it out yourself](https://playground.squiggle-language.com/). +- [Gallery](https://www.squiggle-language.com/docs/Discussions/Gallery) +- [Squiggle playground](https://squiggle-language.com/playground) +- [Language basics](https://www.squiggle-language.com/docs/Features/Language) +- [Squiggle functions source of truth](https://www.squiggle-language.com/docs/Features/Functions) +- [Known bugs](https://www.squiggle-language.com/docs/Discussions/Bugs) +- [Original lesswrong sequence](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3) From 6bd8aecb31c4e3e0ed583cc2fabd091b08e3ada0 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:51:23 -0400 Subject: [PATCH 03/13] Fixed 95->90 Value: [1e-4 to 3e-3] --- packages/website/docs/Features/Node-Packages.md | 2 +- .../docs/Internal/Processing-Confidence-Intervals.md | 10 ++++------ packages/website/docs/Introduction.md | 1 + 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/website/docs/Features/Node-Packages.md b/packages/website/docs/Features/Node-Packages.md index 6a55c6dd..ab590c32 100644 --- a/packages/website/docs/Features/Node-Packages.md +++ b/packages/website/docs/Features/Node-Packages.md @@ -22,7 +22,7 @@ argument allows you to pass an environment previously created by another `run` call. Passing this environment will mean that all previously declared variables in the previous environment will be made available. -The return type of `run` is a bit complicated, and comes from auto generated js +The return type of `run` is a bit complicated, and comes from auto generated `js` code that comes from rescript. We highly recommend using typescript when using this library to help navigate the return type. diff --git a/packages/website/docs/Internal/Processing-Confidence-Intervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md index cc193e8f..004e3bb7 100644 --- a/packages/website/docs/Internal/Processing-Confidence-Intervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -1,8 +1,9 @@ --- title: Processing Confidence Intervals +author: Nuño Sempere --- -This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it. +This page explains what we are doing when we take a 90% confidence interval, and we get a mean and a standard deviation from it. ## For normals @@ -21,13 +22,10 @@ module Normal = { We know that for a normal with mean $\mu$ and standard deviation $\sigma$, $$ - -a \cdot Normal(\mu, \sigma) = Normal(a\cdot \mu, |a|\cdot \sigma) - - +a \cdot Normal(\mu, \sigma) = Normal(a \cdot \mu, |a| \cdot \sigma) $$ -We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. +We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 90% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. diff --git a/packages/website/docs/Introduction.md b/packages/website/docs/Introduction.md index 021bd845..91cfd919 100644 --- a/packages/website/docs/Introduction.md +++ b/packages/website/docs/Introduction.md @@ -13,3 +13,4 @@ Squiggle is an _estimation language_, and a syntax for _calculating and expressi - [Squiggle functions source of truth](https://www.squiggle-language.com/docs/Features/Functions) - [Known bugs](https://www.squiggle-language.com/docs/Discussions/Bugs) - [Original lesswrong sequence](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3) +- [Author your squiggle models as Observable notebooks](https://observablehq.com/@hazelfire/squiggle) From 8866b9d09353a52b98479ad333554fa6d0f115e4 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:56:30 -0400 Subject: [PATCH 04/13] the _correct_ 90 vs. 95 thing Value: [1e-6 to 1e-4] --- .../website/docs/Internal/Processing-Confidence-Intervals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/docs/Internal/Processing-Confidence-Intervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md index 004e3bb7..01afeb79 100644 --- a/packages/website/docs/Internal/Processing-Confidence-Intervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -25,7 +25,7 @@ $$ a \cdot Normal(\mu, \sigma) = Normal(a \cdot \mu, |a| \cdot \sigma) $$ -We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 90% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. +We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. From b83d3a73925e26984665597ee1dd787cf259127c Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 18:18:49 -0400 Subject: [PATCH 05/13] New logo and favicon: stripped `QURI` text from beneath Value: [1e-2 to 1e-1] --- packages/website/static/img/docusaurus.png | Bin 5142 -> 0 bytes packages/website/static/img/favicon.ico | Bin 6611 -> 12704 bytes packages/website/static/img/logo.svg | 1 - ...quri-logo-with-QURI-written-underneath.png | Bin 0 -> 20214 bytes packages/website/static/img/quri-logo.png | Bin 20214 -> 12704 bytes .../static/img/undraw_docusaurus_mountain.svg | 170 ------------------ .../static/img/undraw_docusaurus_react.svg | 169 ----------------- .../static/img/undraw_docusaurus_tree.svg | 1 - 8 files changed, 341 deletions(-) delete mode 100644 packages/website/static/img/docusaurus.png delete mode 100644 packages/website/static/img/logo.svg create mode 100644 packages/website/static/img/quri-logo-with-QURI-written-underneath.png delete mode 100644 packages/website/static/img/undraw_docusaurus_mountain.svg delete mode 100644 packages/website/static/img/undraw_docusaurus_react.svg delete mode 100644 packages/website/static/img/undraw_docusaurus_tree.svg diff --git a/packages/website/static/img/docusaurus.png b/packages/website/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 F{0H{b<4^zq diff --git a/packages/website/static/img/favicon.ico b/packages/website/static/img/favicon.ico index d318e2344334b98493b932a60f95c1d389357b68..d88e28c49f892a935b93c51112215cfa7a8322dc 100644 GIT binary patch literal 12704 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 KneS4jAO8==>R7G- literal 6611 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
Jvzps}Nnrwa6}}3DUefLf zQuM1hZe0kEV>gY{Q9aAPqXoyS`}{GmMf24VKL2nt6C@7(X7AblFNu@Bs80^GQ(xhT zLL~g_n7hoN0UGn;-h1J{4ZR}0->p)Ay%ZHmrNHkt_^K4p`4k&E \ No newline at end of file diff --git a/packages/website/static/img/quri-logo-with-QURI-written-underneath.png b/packages/website/static/img/quri-logo-with-QURI-written-underneath.png new file mode 100644 index 0000000000000000000000000000000000000000..14932c801d39b038ed1a523d7dafd89939e79c6b GIT binary patch literal 20214 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 literal 0 HcmV?d00001 diff --git a/packages/website/static/img/quri-logo.png b/packages/website/static/img/quri-logo.png index 14932c801d39b038ed1a523d7dafd89939e79c6b..d88e28c49f892a935b93c51112215cfa7a8322dc 100644 GIT binary patch literal 12704 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 KneS4jAO8==>R7G- literal 20214 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 diff --git a/packages/website/static/img/undraw_docusaurus_mountain.svg b/packages/website/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index 431cef2f..00000000 --- a/packages/website/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/undraw_docusaurus_react.svg b/packages/website/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index e4170504..00000000 --- a/packages/website/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/undraw_docusaurus_tree.svg b/packages/website/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index a05cc03d..00000000 --- a/packages/website/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1 +0,0 @@ -docu_tree \ No newline at end of file From 5025f2d55f66358542763f285c8995bad43824bd Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 27 Apr 2022 18:34:37 -0400 Subject: [PATCH 06/13] Refactor of splitContinuousAndDiscrete to allow for more customization --- .../Distributions/SampleSetDist_test.res | 42 ++++++++++++----- .../SampleSetDist_ToPointSet.res | 25 +--------- .../squiggle-lang/src/rescript/Utility/E.res | 47 ++++++++++++++----- 3 files changed, 66 insertions(+), 48 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res index 1c430f3d..edfcb6ef 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res @@ -4,20 +4,34 @@ open TestHelpers describe("Continuous and discrete splits", () => { makeTest( "splits (1)", - SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete([1.432, 1.33455, 2.0]), - ([1.432, 1.33455, 2.0], E.FloatFloatMap.empty()), + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight([1.432, 1.33455, 2.0], 2), + ([1.33455, 1.432, 2.0], E.FloatFloatMap.empty()), ) makeTest( "splits (2)", - SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete([ - 1.432, - 1.33455, - 2.0, - 2.0, - 2.0, - 2.0, - ]) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), - ([1.432, 1.33455], [(2.0, 4.0)]), + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 2.0, 2.0], + 2, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432], [(2.0, 4.0)]), + ) + + makeTest( + "splits (3)", + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], + 3, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432, 2.0, 2.0], [(3.5, 3.0)]), + ) + + makeTest( + "splits (3)", + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], + 5, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432, 2.0, 2.0, 3.5, 3.5, 3.5], []), ) let makeDuplicatedArray = count => { @@ -26,14 +40,16 @@ describe("Continuous and discrete splits", () => { E.A.concatMany([sorted, sorted, sorted, sorted]) |> Belt.SortArray.stableSortBy(_, compare) } - let (_, discrete1) = SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete( + let (_, discrete1) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(10), + 2, ) let toArr1 = discrete1 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=10", toArr1 |> Belt.Array.length, 10) - let (_c, discrete2) = SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete( + let (_c, discrete2) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(500), + 2, ) let toArr2 = discrete2 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=500", toArr2 |> Belt.Array.length, 500) diff --git a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res index 90537a12..10874f96 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res +++ b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res @@ -39,28 +39,6 @@ module Internals = { module T = { type t = array - let splitContinuousAndDiscrete = (sortedArray: t) => { - let continuous = [] - let discrete = E.FloatFloatMap.empty() - Belt.Array.forEachWithIndex(sortedArray, (index, element) => { - let maxIndex = (sortedArray |> Array.length) - 1 - let possiblySimilarElements = switch index { - | 0 => [index + 1] - | n if n == maxIndex => [index - 1] - | _ => [index - 1, index + 1] - } |> Belt.Array.map(_, r => sortedArray[r]) - let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) - hasSimilarElement - ? E.FloatFloatMap.increment(element, discrete) - : { - let _ = Js.Array.push(element, continuous) - } - - () - }) - (continuous, discrete) - } - let xWidthToUnitWidth = (samples, outputXYPoints, xWidth) => { let xyPointRange = E.A.Sorted.range(samples) |> E.O.default(0.0) let xyPointWidth = xyPointRange /. float_of_int(outputXYPoints) @@ -85,7 +63,8 @@ let toPointSetDist = ( (), ): Internals.Types.outputs => { Array.fast_sort(compare, samples) - let (continuousPart, discretePart) = E.A.Sorted.Floats.split(samples) + let minDiscreteToKeep = max(2, E.A.length(samples) / 10); + let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(samples, minDiscreteToKeep) let length = samples |> E.A.length |> float_of_int let discrete: PointSetTypes.discreteShape = discretePart diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 030c2961..69ded69b 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -8,7 +8,7 @@ module FloatFloatMap = { type t = Belt.MutableMap.t let fromArray = (ar: array<(float, float)>) => Belt.MutableMap.fromArray(ar, ~id=module(Id)) - let toArray = (t: t) => Belt.MutableMap.toArray(t) + let toArray = (t: t): array<(float, float)> => Belt.MutableMap.toArray(t) let empty = () => Belt.MutableMap.make(~id=module(Id)) let increment = (el, t: t) => Belt.MutableMap.update(t, el, x => @@ -20,6 +20,10 @@ module FloatFloatMap = { let get = (el, t: t) => Belt.MutableMap.get(t, el) let fmap = (fn, t: t) => Belt.MutableMap.map(t, fn) + let partition = (fn, t: t) => { + let (match, noMatch) = Belt.Array.partition(toArray(t), fn) + (fromArray(match), fromArray(noMatch)) + } } module Int = { @@ -518,18 +522,17 @@ module A = { let makeIncrementalDown = (a, b) => Array.make(a - b + 1, a) |> Array.mapi((i, c) => c - i) |> Belt.Array.map(_, float_of_int) - let split = (sortedArray: array) => { - let continuous = [] + let splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { + let continuous: array = [] let discrete = FloatFloatMap.empty() - Belt.Array.forEachWithIndex(sortedArray, (_, element) => { - // let maxIndex = (sortedArray |> Array.length) - 1 - // let possiblySimilarElements = switch index { - // | 0 => [index + 1] - // | n if n == maxIndex => [index - 1] - // | _ => [index - 1, index + 1] - // } |> Belt.Array.map(_, r => sortedArray[r]) - // let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) - let hasSimilarElement = false + Belt.Array.forEachWithIndex(sortedArray, (index, element) => { + let maxIndex = (sortedArray |> Array.length) - 1 + let possiblySimilarElements = switch index { + | 0 => [index + 1] + | n if n == maxIndex => [index - 1] + | _ => [index - 1, index + 1] + } |> Belt.Array.map(_, r => sortedArray[r]) + let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) hasSimilarElement ? FloatFloatMap.increment(element, discrete) : { @@ -541,6 +544,26 @@ module A = { (continuous, discrete) } + + let splitContinuousAndDiscreteForMinWeight = ( + sortedArray: array, + minDiscreteWeight: int, + ) => { + let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) + let keepFn = v => Belt.Float.toInt(v) > minDiscreteWeight + let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( + ((_, v)) => keepFn(v), + discrete, + ) + let newContinousSamples = + discreteToIntegrate->FloatFloatMap.toArray + |> fmap(((k, v)) => Belt.Array.makeBy(Belt.Float.toInt(v), _ => k)) + |> Belt.Array.concatMany + + let newContinuous = concat(continuous, newContinousSamples) + newContinuous |> Array.fast_sort(floatCompare) + (newContinuous, discreteToKeep) + } } } From 335d0b5d0430cb556e4dc222e5dd3c573fe649cf Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 07:36:53 -0400 Subject: [PATCH 07/13] Cleaned tests --- .../Distributions/SampleSetDist_test.res | 33 +++++++------------ .../squiggle-lang/src/rescript/Utility/E.res | 2 +- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res index edfcb6ef..825c0095 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res @@ -1,36 +1,27 @@ open Jest open TestHelpers +let prepareInputs = (ar, minWeight) => + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, minWeight) |> ( + ((c, disc)) => (c, disc |> E.FloatFloatMap.toArray) + ) + describe("Continuous and discrete splits", () => { makeTest( - "splits (1)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight([1.432, 1.33455, 2.0], 2), - ([1.33455, 1.432, 2.0], E.FloatFloatMap.empty()), - ) - makeTest( - "splits (2)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 2.0, 2.0], - 2, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), - ([1.33455, 1.432], [(2.0, 4.0)]), + "is empty, with no common elements", + prepareInputs([1.432, 1.33455, 2.0], 2), + ([1.33455, 1.432, 2.0], []), ) makeTest( - "splits (3)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], - 3, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + "only stores 3.5 as discrete when minWeight is 3", + prepareInputs([1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], 3), ([1.33455, 1.432, 2.0, 2.0], [(3.5, 3.0)]), ) makeTest( - "splits (3)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], - 5, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + "doesn't store 3.5 as discrete when minWeight is 5", + prepareInputs([1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], 5), ([1.33455, 1.432, 2.0, 2.0, 3.5, 3.5, 3.5], []), ) diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 69ded69b..b0d9ef19 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -550,7 +550,7 @@ module A = { minDiscreteWeight: int, ) => { let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) - let keepFn = v => Belt.Float.toInt(v) > minDiscreteWeight + let keepFn = v => Belt.Float.toInt(v) >= minDiscreteWeight let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( ((_, v)) => keepFn(v), discrete, From 2eec389b55368722afb85bac22351b6c4d906df1 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 07:56:23 -0400 Subject: [PATCH 08/13] Added docstrings and cleanup --- .../splitContinuousAndDiscrete_test.res} | 6 +++--- .../SampleSetDist_ToPointSet.res | 7 +++++-- .../src/rescript/MagicNumbers.res | 13 +++++++++++++ .../squiggle-lang/src/rescript/Utility/E.res | 19 +++++++++++++++---- 4 files changed, 36 insertions(+), 9 deletions(-) rename packages/squiggle-lang/__tests__/{Distributions/SampleSetDist_test.res => E/splitContinuousAndDiscrete_test.res} (90%) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res similarity index 90% rename from packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res rename to packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res index 825c0095..449787dd 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res @@ -2,7 +2,7 @@ open Jest open TestHelpers let prepareInputs = (ar, minWeight) => - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, minWeight) |> ( + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, ~minDiscreteWeight=minWeight) |> ( ((c, disc)) => (c, disc |> E.FloatFloatMap.toArray) ) @@ -33,14 +33,14 @@ describe("Continuous and discrete splits", () => { let (_, discrete1) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(10), - 2, + ~minDiscreteWeight=2, ) let toArr1 = discrete1 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=10", toArr1 |> Belt.Array.length, 10) let (_c, discrete2) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(500), - 2, + ~minDiscreteWeight=2, ) let toArr2 = discrete2 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=500", toArr2 |> Belt.Array.length, 500) diff --git a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res index 10874f96..142f10b2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res +++ b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res @@ -63,8 +63,11 @@ let toPointSetDist = ( (), ): Internals.Types.outputs => { Array.fast_sort(compare, samples) - let minDiscreteToKeep = max(2, E.A.length(samples) / 10); - let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(samples, minDiscreteToKeep) + let minDiscreteToKeep = MagicNumbers.ToPointSet.minDiscreteToKeep(samples) + let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + samples, + ~minDiscreteWeight=minDiscreteToKeep, + ) let length = samples |> E.A.length |> float_of_int let discrete: PointSetTypes.discreteShape = discretePart diff --git a/packages/squiggle-lang/src/rescript/MagicNumbers.res b/packages/squiggle-lang/src/rescript/MagicNumbers.res index 291f05d6..124a44f4 100644 --- a/packages/squiggle-lang/src/rescript/MagicNumbers.res +++ b/packages/squiggle-lang/src/rescript/MagicNumbers.res @@ -22,3 +22,16 @@ module OpCost = { let wildcardCost = 1000 let monteCarloCost = Environment.defaultSampleCount } + +module ToPointSet = { + /* + 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. + */ + let minDiscreteToKeep = samples => max(20, E.A.length(samples) / 50) +} diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index b0d9ef19..1f218194 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -522,7 +522,12 @@ module A = { let makeIncrementalDown = (a, b) => Array.make(a - b + 1, a) |> Array.mapi((i, c) => c - i) |> Belt.Array.map(_, float_of_int) - let splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { + /* + This function goes through a sorted array and divides it into two different clusters: + continuous samples and discrete samples. The discrete samples are stored in a mutable map. + Samples are thought to be discrete if they have any duplicates. + */ + let _splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { let continuous: array = [] let discrete = FloatFloatMap.empty() Belt.Array.forEachWithIndex(sortedArray, (index, element) => { @@ -545,11 +550,18 @@ module A = { (continuous, discrete) } + /* + This function works very similarly to splitContinuousAndDiscreteForDuplicates. The one major difference + is that you can specify a minDiscreteWeight. If the min discreet weight is 4, that would mean that + at least four elements needed from a specific value for that to be kept as discrete. This is important + because in some cases, we can expect that some common elements will be generated by regular operations. + The final continous array will be sorted. + */ let splitContinuousAndDiscreteForMinWeight = ( sortedArray: array, - minDiscreteWeight: int, + ~minDiscreteWeight: int, ) => { - let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) + let (continuous, discrete) = _splitContinuousAndDiscreteForDuplicates(sortedArray) let keepFn = v => Belt.Float.toInt(v) >= minDiscreteWeight let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( ((_, v)) => keepFn(v), @@ -559,7 +571,6 @@ module A = { discreteToIntegrate->FloatFloatMap.toArray |> fmap(((k, v)) => Belt.Array.makeBy(Belt.Float.toInt(v), _ => k)) |> Belt.Array.concatMany - let newContinuous = concat(continuous, newContinousSamples) newContinuous |> Array.fast_sort(floatCompare) (newContinuous, discreteToKeep) From 934ce783994fe5d68136c2cfdd74e491729ddf7f Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 09:08:53 -0400 Subject: [PATCH 09/13] Algebraic Strategy should use MC when inputs include sample set dists --- .../Distributions/GenericDist/GenericDist.res | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index d5dbe1cf..c19bdf7f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -6,6 +6,24 @@ type toSampleSetFn = t => result type scaleMultiplyFn = (t, float) => result type pointwiseAddFn = (t, t) => result +let isPointSet = (t: t) => + switch t { + | PointSet(_) => true + | _ => false + } + +let isSampleSetSet = (t: t) => + switch t { + | SampleSet(_) => true + | _ => false + } + +let isSymbolic = (t: t) => + switch t { + | Symbolic(_) => true + | _ => false + } + let sampleN = (t: t, n) => switch t { | PointSet(r) => PointSetDist.sampleNRendered(n, r) @@ -248,20 +266,24 @@ module AlgebraicCombination = { | _ => MagicNumbers.OpCost.wildcardCost } + let hasSampleSetDist = (t1: t, t2: t): bool => isSampleSetSet(t1) || isSampleSetSet(t2) + + let convolutionIsFasterThanMonteCarlo = (t1: t, t2: t): bool => + expectedConvolutionCost(t1) * expectedConvolutionCost(t2) < MagicNumbers.OpCost.monteCarloCost + + let preferConvolutionToMonteCarlo = (t1, t2, arithmeticOperation) => { + !hasSampleSetDist(t1, t2) && + Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) && + convolutionIsFasterThanMonteCarlo(t1, t2) + } + let run = (~t1: t, ~t2: t, ~arithmeticOperation): specificStrategy => { switch StrategyCallOnValidatedInputs.symbolic(arithmeticOperation, t1, t2) { | #AnalyticalSolution(_) | #Error(_) => #AsSymbolic | #NoSolution => - if Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) { - expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > - MagicNumbers.OpCost.monteCarloCost - ? #AsMonteCarlo - : #AsConvolution - } else { - #AsMonteCarlo - } + preferConvolutionToMonteCarlo(t1, t2, arithmeticOperation) ? #AsConvolution : #AsMonteCarlo } } } From a8cc554354965047aa8d4713cbfd5c5659260bb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:36:16 +0000 Subject: [PATCH 10/13] :arrow_up: Bump chalk from 4.1.2 to 5.0.1 Bumps [chalk](https://github.com/chalk/chalk) from 4.1.2 to 5.0.1. - [Release notes](https://github.com/chalk/chalk/releases) - [Commits](https://github.com/chalk/chalk/compare/v4.1.2...v5.0.1) --- updated-dependencies: - dependency-name: chalk dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/squiggle-lang/package.json | 2 +- yarn.lock | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index f9157ada..0dca9ea6 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -45,7 +45,7 @@ "@types/jest": "^27.4.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "bisect_ppx": "^2.7.1", - "chalk": "^4.1.2", + "chalk": "^5.0.1", "codecov": "3.8.3", "fast-check": "2.25.0", "gentype": "^4.3.0", diff --git a/yarn.lock b/yarn.lock index f9feaabc..cb1e6b3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6155,6 +6155,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" From 7c14fd55c08df79fa235f5fe44a8ec2131123191 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 10:58:39 -0400 Subject: [PATCH 11/13] Made less programmery based on feedback Value: [5e-4 to 8e-3] --- packages/website/docs/Features/Language.mdx | 52 ++++++++++----------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 4862bd5d..117f5993 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -8,44 +8,42 @@ import { SquiggleEditor } from "../../src/components/SquiggleEditor"; The squiggle language has a very simple syntax. The best way to get to understand it is by simply looking at examples. -## Expressions and statements +## Expressions -A squiggle **expression** is a value like a float or a distribution or a data structure like an array or a record. +A distribution -The bottom line of your squiggle buffer should be an expression, which we evaluate (i.e., render). Sometimes we call the last expression of a squiggle file an _export_. +A number -A squiggle **assignment** is a statement, when you want to bind an expression to a name. + - - -### Functions - -Some assignments are functions - - - -## Data structures - -A squiggle **array** is a list of expressions, which is interpretable as an export. +Arrays -A squiggle **record** is a key-value store with dot accessors. +Records + + + +## Statements + +A statement assigns expressions to names. It looks like ` = ` + +### Functions + +We can define functions + + From 114d537c0770347c84b3ebced6246481791c188e Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 11:21:10 -0400 Subject: [PATCH 12/13] rm top line; fixed some examples; added `See more` section Value: [5e-4 to 2e-3] --- packages/website/docs/Features/Language.mdx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 117f5993..5b66d2e2 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -5,9 +5,6 @@ title: Language Basics import { SquiggleEditor } from "../../src/components/SquiggleEditor"; -The squiggle language has a very simple syntax. The best way to get to understand -it is by simply looking at examples. - ## Expressions A distribution @@ -21,12 +18,15 @@ A number Arrays Records - + ## Statements @@ -44,6 +44,10 @@ We can define functions + +## See more + +- [Functions reference](https://squiggle-language.com/docs/Features/Functions) +- [Gallery](https://squiggle-language.com/docs/Discussions/Gallery) From c9301085b91441c9332c47bee20e73ee63da7783 Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Thu, 28 Apr 2022 15:50:12 +0000 Subject: [PATCH 13/13] Add functions to implementation file to fix warnings --- .../src/rescript/Distributions/GenericDist/GenericDist.resi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi index ed2c5c03..e91803e2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi @@ -69,3 +69,6 @@ let mixture: ( ~scaleMultiplyFn: scaleMultiplyFn, ~pointwiseAddFn: pointwiseAddFn, ) => result + +let isSymbolic: t => bool +let isPointSet: t => bool