Skip to content

Commit

Permalink
Merge pull request #2351 from quantified-uncertainty/list-methods-all…
Browse files Browse the repository at this point in the history
…ow-empty-lists

Specific List functions can accept 0 elements
  • Loading branch information
berekuk committed Oct 29, 2023
2 parents eba8a50 + 85d81c8 commit 214c4f0
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 9 deletions.
5 changes: 5 additions & 0 deletions .changeset/slimy-seals-teach.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@quri/squiggle-lang": patch
---

Number.sum, product, sort, cumsum, cumprod, should all accept lists with 0 elements
9 changes: 9 additions & 0 deletions packages/squiggle-lang/__tests__/library/number_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,30 @@ describe("Numbers", () => {
testEvalToBe("floor(5.5)", "5");
testEvalToBe("ceil(5.5)", "6");
testEvalToBe("Number.abs(5.5)", "5.5");
testEvalToBe("Number.abs(-5.5)", "5.5");
testEvalToBe("Number.abs(0)", "0");
testEvalToBe("abs(5.5)", "5.5");
testEvalToBe("Number.exp(10)", "22026.465794806718");
testEvalToBe("Number.log10(10)", "1");
testEvalToBe("Number.log2(10)", "3.321928094887362");
testEvalToBe("Number.sum([])", "0");
testEvalToBe("Number.sum([2,5,3])", "10");
testEvalToBe("sum([])", "0");
testEvalToBe("sum([2,5,3])", "10");
testEvalToBe("Number.product([])", "1");
testEvalToBe("Number.product([2,5,3])", "30");
testEvalToBe("Number.min([2,5,3])", "2");
testEvalToBe("Number.max([2,5,3])", "5");
testEvalToBe("Number.mean([0,5,10])", "5");
testEvalToBe("Number.geomean([1,5,18])", "4.481404746557164");
testEvalToBe("Number.stdev([0,5,10,15])", "5.5901699437494745");
testEvalToBe("Number.variance([0,5,10,15])", "31.25");
testEvalToBe("Number.sort([])", "[]");
testEvalToBe("Number.sort([10,0,15,5])", "[0,5,10,15]");
testEvalToBe("Number.cumsum([])", "[]");
testEvalToBe("Number.cumsum([1,5,3])", "[1,6,9]");
testEvalToBe("Number.cumprod([])", "[]");
testEvalToBe("Number.cumprod([1,5,3])", "[1,5,15]");
testEvalToBe("Number.diff([1])", "[]");
testEvalToBe("Number.diff([1,5,3])", "[4,-2]");
});
32 changes: 23 additions & 9 deletions packages/squiggle-lang/src/fr/number.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,24 @@ const throwEmptyList = (): never => {
throw new REArgumentError("List is empty");
};

function makeNumberArrayToNumberDefinition(fn: (arr: number[]) => number) {
function makeNumberArrayToNumberDefinition(
fn: (arr: number[]) => number,
throwIfEmpty = true
) {
return makeDefinition([frArray(frNumber)], ([arr]) => {
if (arr.length === 0) {
if (arr.length === 0 && throwIfEmpty) {
return throwEmptyList();
}
return vNumber(fn(arr));
});
}

function makeNumberArrayToNumberArrayDefinition(
fn: (arr: number[]) => number[]
fn: (arr: number[]) => number[],
throwIfEmpty = true
) {
return makeDefinition([frArray(frNumber)], ([arr]) => {
if (arr.length === 0) {
if (arr.length === 0 && throwIfEmpty) {
return throwEmptyList();
}
return vArray(fn(arr).map(vNumber));
Expand Down Expand Up @@ -83,15 +87,18 @@ export const library = [
output: "Number",
examples: [`sum([3,5,2])`],
definitions: [
makeNumberArrayToNumberDefinition((arr) => E_A_Floats.sum(arr)),
makeNumberArrayToNumberDefinition((arr) => E_A_Floats.sum(arr), false),
],
}),
maker.make({
name: "product",
output: "Number",
examples: [`product([3,5,2])`],
definitions: [
makeNumberArrayToNumberDefinition((arr) => E_A_Floats.product(arr)),
makeNumberArrayToNumberDefinition(
(arr) => E_A_Floats.product(arr),
false
),
],
}),
maker.make({
Expand Down Expand Up @@ -145,22 +152,29 @@ export const library = [
output: "Array",
examples: [`sort([3,5,2,3,5])`],
definitions: [
makeNumberArrayToNumberArrayDefinition((arr) => E_A_Floats.sort(arr)),
makeNumberArrayToNumberArrayDefinition(
(arr) => E_A_Floats.sort(arr),
false
),
],
}),
maker.make({
name: "cumsum",
output: "Array",
description: "cumulative sum",
examples: [`cumsum([3,5,2,3,5])`],
definitions: [makeNumberArrayToNumberArrayDefinition(E_A_Floats.cumSum)],
definitions: [
makeNumberArrayToNumberArrayDefinition(E_A_Floats.cumSum, false),
],
}),
maker.make({
name: "cumprod",
description: "cumulative product",
output: "Array",
examples: [`cumprod([3,5,2,3,5])`],
definitions: [makeNumberArrayToNumberArrayDefinition(E_A_Floats.cumProd)],
definitions: [
makeNumberArrayToNumberArrayDefinition(E_A_Floats.cumProd, false),
],
}),
maker.make({
name: "diff",
Expand Down

3 comments on commit 214c4f0

@vercel
Copy link

@vercel vercel bot commented on 214c4f0 Oct 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vercel
Copy link

@vercel vercel bot commented on 214c4f0 Oct 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vercel
Copy link

@vercel vercel bot commented on 214c4f0 Oct 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.