Cleanup and commenting for PR
This commit is contained in:
parent
2dc57bedc5
commit
54b6b18d3a
|
@ -9,12 +9,12 @@ export type { SamplingInputs, exportEnv, exportDistribution };
|
|||
export type { t as DistPlus } from "../rescript/OldInterpreter/DistPlus.gen";
|
||||
import {
|
||||
genericDist,
|
||||
env,
|
||||
resultDist,
|
||||
resultFloat,
|
||||
resultString,
|
||||
} from "../rescript/TSInterface.gen";
|
||||
} from "../rescript/TypescriptInterface.gen";
|
||||
import {
|
||||
env,
|
||||
Constructors_mean,
|
||||
Constructors_sample,
|
||||
Constructors_pdf,
|
||||
|
@ -59,18 +59,9 @@ export function run(
|
|||
return runAll(squiggleString, si, env);
|
||||
}
|
||||
|
||||
export function resultMap(
|
||||
r:
|
||||
| {
|
||||
tag: "Ok";
|
||||
value: any;
|
||||
}
|
||||
| {
|
||||
tag: "Error";
|
||||
value: any;
|
||||
},
|
||||
mapFn: any
|
||||
):
|
||||
//This is clearly not fully typed. I think later we should use a functional library to
|
||||
// provide a better Either type and corresponding functions.
|
||||
type result =
|
||||
| {
|
||||
tag: "Ok";
|
||||
value: any;
|
||||
|
@ -78,7 +69,9 @@ export function resultMap(
|
|||
| {
|
||||
tag: "Error";
|
||||
value: any;
|
||||
} {
|
||||
};
|
||||
|
||||
export function resultMap(r: result, mapFn: any): result {
|
||||
if (r.tag === "Ok") {
|
||||
return { tag: "Ok", value: mapFn(r.value) };
|
||||
} else {
|
||||
|
|
|
@ -114,8 +114,8 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => {
|
|||
->E.R2.fmap(r => Float(r))
|
||||
->OutputLocal.fromResult
|
||||
| ToString(ToString) => dist->GenericDist.toString->String
|
||||
| ToString(ToSparkline(buckets)) =>
|
||||
GenericDist.toSparkline(dist, ~sampleCount, ~buckets, ())
|
||||
| ToString(ToSparkline(bucketCount)) =>
|
||||
GenericDist.toSparkline(dist, ~sampleCount, ~bucketCount, ())
|
||||
->E.R2.fmap(r => String(r))
|
||||
->OutputLocal.fromResult
|
||||
| ToDist(Inspect) => {
|
||||
|
@ -186,42 +186,43 @@ module Output = {
|
|||
}
|
||||
}
|
||||
|
||||
// See comment above GenericDist_Types.Constructors to explain the purpose of this module.
|
||||
// I tried having another internal module called UsingDists, similar to how its done in
|
||||
// GenericDist_Types.Constructors. However, this broke GenType for me, so beware.
|
||||
module Constructors = {
|
||||
module C = GenericDist_Types.Constructors.UsingDists;
|
||||
open OutputLocal
|
||||
let mean = (~env, dist) => C.mean(dist)->run(~env)->toFloatR
|
||||
let sample = (~env, dist) => C.sample(dist)->run(~env)->toFloatR
|
||||
let cdf = (~env, dist, f) => C.cdf(dist, f)->run(~env)->toFloatR
|
||||
let inv = (~env, dist, f) => C.inv(dist, f)->run(~env)->toFloatR
|
||||
let pdf = (~env, dist, f) => C.pdf(dist, f)->run(~env)->toFloatR
|
||||
let normalize = (~env, dist) => C.normalize(dist)->run(~env)->toDistR
|
||||
let toPointSet = (~env, dist) => C.toPointSet(dist)->run(~env)->toDistR
|
||||
let toSampleSet = (~env, dist, n) => C.toSampleSet(dist, n)->run(~env)->toDistR
|
||||
let truncate = (~env, dist, leftCutoff, rightCutoff) =>
|
||||
C.truncate(dist, leftCutoff, rightCutoff)->run(~env)->toDistR
|
||||
let inspect = (~env, dist) => C.inspect(dist)->run(~env)->toDistR
|
||||
let toString = (~env, dist) => C.toString(dist)->run(~env)->toStringR
|
||||
let toSparkline = (~env, dist, buckets) => C.toSparkline(dist, buckets)->run(~env)->toStringR
|
||||
let algebraicAdd = (~env, dist1, dist2) => C.algebraicAdd(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicMultiply = (~env, dist1, dist2) =>
|
||||
C.algebraicMultiply(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicDivide = (~env, dist1, dist2) =>
|
||||
C.algebraicDivide(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicSubtract = (~env, dist1, dist2) =>
|
||||
C.algebraicSubtract(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicLogarithm = (~env, dist1, dist2) =>
|
||||
C.algebraicLogarithm(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicExponentiate = (~env, dist1, dist2) =>
|
||||
C.algebraicExponentiate(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseAdd = (~env, dist1, dist2) => C.pointwiseAdd(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseMultiply = (~env, dist1, dist2) =>
|
||||
C.pointwiseMultiply(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseDivide = (~env, dist1, dist2) =>
|
||||
C.pointwiseDivide(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseSubtract = (~env, dist1, dist2) =>
|
||||
C.pointwiseSubtract(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseLogarithm = (~env, dist1, dist2) =>
|
||||
C.pointwiseLogarithm(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseExponentiate = (~env, dist1, dist2) =>
|
||||
C.pointwiseExponentiate(dist1, dist2)->run(~env)->toDistR
|
||||
module C = GenericDist_Types.Constructors.UsingDists
|
||||
open OutputLocal
|
||||
let mean = (~env, dist) => C.mean(dist)->run(~env)->toFloatR
|
||||
let sample = (~env, dist) => C.sample(dist)->run(~env)->toFloatR
|
||||
let cdf = (~env, dist, f) => C.cdf(dist, f)->run(~env)->toFloatR
|
||||
let inv = (~env, dist, f) => C.inv(dist, f)->run(~env)->toFloatR
|
||||
let pdf = (~env, dist, f) => C.pdf(dist, f)->run(~env)->toFloatR
|
||||
let normalize = (~env, dist) => C.normalize(dist)->run(~env)->toDistR
|
||||
let toPointSet = (~env, dist) => C.toPointSet(dist)->run(~env)->toDistR
|
||||
let toSampleSet = (~env, dist, n) => C.toSampleSet(dist, n)->run(~env)->toDistR
|
||||
let truncate = (~env, dist, leftCutoff, rightCutoff) =>
|
||||
C.truncate(dist, leftCutoff, rightCutoff)->run(~env)->toDistR
|
||||
let inspect = (~env, dist) => C.inspect(dist)->run(~env)->toDistR
|
||||
let toString = (~env, dist) => C.toString(dist)->run(~env)->toStringR
|
||||
let toSparkline = (~env, dist, bucketCount) => C.toSparkline(dist, bucketCount)->run(~env)->toStringR
|
||||
let algebraicAdd = (~env, dist1, dist2) => C.algebraicAdd(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicMultiply = (~env, dist1, dist2) =>
|
||||
C.algebraicMultiply(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicDivide = (~env, dist1, dist2) => C.algebraicDivide(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicSubtract = (~env, dist1, dist2) =>
|
||||
C.algebraicSubtract(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicLogarithm = (~env, dist1, dist2) =>
|
||||
C.algebraicLogarithm(dist1, dist2)->run(~env)->toDistR
|
||||
let algebraicExponentiate = (~env, dist1, dist2) =>
|
||||
C.algebraicExponentiate(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseAdd = (~env, dist1, dist2) => C.pointwiseAdd(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseMultiply = (~env, dist1, dist2) =>
|
||||
C.pointwiseMultiply(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseDivide = (~env, dist1, dist2) => C.pointwiseDivide(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseSubtract = (~env, dist1, dist2) =>
|
||||
C.pointwiseSubtract(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseLogarithm = (~env, dist1, dist2) =>
|
||||
C.pointwiseLogarithm(dist1, dist2)->run(~env)->toDistR
|
||||
let pointwiseExponentiate = (~env, dist1, dist2) =>
|
||||
C.pointwiseExponentiate(dist1, dist2)->run(~env)->toDistR
|
||||
}
|
||||
|
|
|
@ -81,11 +81,17 @@ let toPointSet = (
|
|||
}
|
||||
}
|
||||
|
||||
let toSparkline = (t: t, ~sampleCount: int, ~buckets: int=20, unit): result<string, error> =>
|
||||
/*
|
||||
PointSetDist.toSparkline calls "downsampleEquallyOverX", which downsamples it to n=bucketCount.
|
||||
It first needs a pointSetDist, so we convert to a pointSetDist. In this process we want the
|
||||
xyPointLength to be a bit longer than the eventual toSparkline downsampling. I chose 3
|
||||
fairly arbitrarily.
|
||||
*/
|
||||
let toSparkline = (t: t, ~sampleCount: int, ~bucketCount: int=20, unit): result<string, error> =>
|
||||
t
|
||||
->toPointSet(~xSelection=#Linear, ~xyPointLength=buckets * 3, ~sampleCount, ())
|
||||
->toPointSet(~xSelection=#Linear, ~xyPointLength=bucketCount * 3, ~sampleCount, ())
|
||||
->E.R.bind(r =>
|
||||
r->PointSetDist.toSparkline(buckets)->E.R2.errMap(r => Error(GenericDist_Types.Other(r)))
|
||||
r->PointSetDist.toSparkline(bucketCount)->E.R2.errMap(r => Error(GenericDist_Types.Other(r)))
|
||||
)
|
||||
|
||||
module Truncate = {
|
||||
|
|
|
@ -26,7 +26,7 @@ let toPointSet: (
|
|||
~xSelection: GenericDist_Types.Operation.pointsetXSelection=?,
|
||||
unit,
|
||||
) => result<PointSetTypes.pointSetDist, error>
|
||||
let toSparkline: (t, ~sampleCount: int, ~buckets: int=?, unit) => result<string, error>
|
||||
let toSparkline: (t, ~sampleCount: int, ~bucketCount: int=?, unit) => result<string, error>
|
||||
|
||||
let truncate: (
|
||||
t,
|
||||
|
|
|
@ -98,6 +98,14 @@ module Operation = {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
It can be a pain to write out the genericFunctionCallInfo. The constructors help with this.
|
||||
This code only covers some of genericFunctionCallInfo: many arguments could be called with either a
|
||||
float or a distribution. The "UsingDists" module assumes that everything is a distribution.
|
||||
This is a tradeoff of some generality in order to get a bit more simplicity.
|
||||
I could see having a longer interface in the future, but it could be messy.
|
||||
Like, algebraicAddDistFloat vs. algebraicAddDistDist
|
||||
*/
|
||||
module Constructors = {
|
||||
type t = Operation.genericFunctionCallInfo
|
||||
|
||||
|
@ -105,9 +113,9 @@ module Constructors = {
|
|||
@genType
|
||||
let mean = (dist): t => FromDist(ToFloat(#Mean), dist)
|
||||
let sample = (dist): t => FromDist(ToFloat(#Sample), dist)
|
||||
let cdf = (dist, f): t => FromDist(ToFloat(#Cdf(f)), dist)
|
||||
let inv = (dist, f): t => FromDist(ToFloat(#Inv(f)), dist)
|
||||
let pdf = (dist, f): t => FromDist(ToFloat(#Pdf(f)), dist)
|
||||
let cdf = (dist, x): t => FromDist(ToFloat(#Cdf(x)), dist)
|
||||
let inv = (dist, x): t => FromDist(ToFloat(#Inv(x)), dist)
|
||||
let pdf = (dist, x): t => FromDist(ToFloat(#Pdf(x)), dist)
|
||||
let normalize = (dist): t => FromDist(ToDist(Normalize), dist)
|
||||
let toPointSet = (dist): t => FromDist(ToDist(ToPointSet), dist)
|
||||
let toSampleSet = (dist, r): t => FromDist(ToDist(ToSampleSet(r)), dist)
|
||||
|
@ -165,63 +173,3 @@ module Constructors = {
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
module DistVariant = {
|
||||
type t =
|
||||
| Mean(genericDist)
|
||||
| Sample(genericDist)
|
||||
| Cdf(genericDist, float)
|
||||
| Inv(genericDist, float)
|
||||
| Pdf(genericDist, float)
|
||||
| Normalize(genericDist)
|
||||
| ToPointSet(genericDist)
|
||||
| ToSampleSet(genericDist, int)
|
||||
| Truncate(genericDist, option<float>, option<float>)
|
||||
| Inspect(genericDist)
|
||||
| ToString(genericDist)
|
||||
| ToSparkline(genericDist, int)
|
||||
| AlgebraicAdd(genericDist, genericDist)
|
||||
| AlgebraicMultiply(genericDist, genericDist)
|
||||
| AlgebraicDivide(genericDist, genericDist)
|
||||
| AlgebraicSubtract(genericDist, genericDist)
|
||||
| AlgebraicLogarithm(genericDist, genericDist)
|
||||
| AlgebraicExponentiate(genericDist, genericDist)
|
||||
| PointwiseAdd(genericDist, genericDist)
|
||||
| PointwiseMultiply(genericDist, genericDist)
|
||||
| PointwiseDivide(genericDist, genericDist)
|
||||
| PointwiseSubtract(genericDist, genericDist)
|
||||
| PointwiseLogarithm(genericDist, genericDist)
|
||||
| PointwiseExponentiate(genericDist, genericDist)
|
||||
|
||||
let toGenericFunctionCallInfo = (t: t) =>
|
||||
switch t {
|
||||
| Mean(d) => Operation.FromDist(ToFloat(#Mean), d)
|
||||
| Sample(d) => FromDist(ToFloat(#Mean), d)
|
||||
| Cdf(d, f) => FromDist(ToFloat(#Cdf(f)), d)
|
||||
| Inv(d, f) => FromDist(ToFloat(#Inv(f)), d)
|
||||
| Pdf(d, f) => FromDist(ToFloat(#Pdf(f)), d)
|
||||
| Normalize(d) => FromDist(ToDist(Normalize), d)
|
||||
| ToPointSet(d) => FromDist(ToDist(ToPointSet), d)
|
||||
| ToSampleSet(d, r) => FromDist(ToDist(ToSampleSet(r)), d)
|
||||
| Truncate(d, left, right) => FromDist(ToDist(Truncate(left, right)), d)
|
||||
| Inspect(d) => FromDist(ToDist(Inspect), d)
|
||||
| ToString(d) => FromDist(ToString(ToString), d)
|
||||
| ToSparkline(d, n) => FromDist(ToString(ToSparkline(n)), d)
|
||||
| AlgebraicAdd(d1, d2) => FromDist(ToDistCombination(Algebraic, #Add, #Dist(d2)), d1)
|
||||
| AlgebraicMultiply(d1, d2) => FromDist(ToDistCombination(Algebraic, #Multiply, #Dist(d2)), d1)
|
||||
| AlgebraicDivide(d1, d2) => FromDist(ToDistCombination(Algebraic, #Divide, #Dist(d2)), d1)
|
||||
| AlgebraicSubtract(d1, d2) => FromDist(ToDistCombination(Algebraic, #Subtract, #Dist(d2)), d1)
|
||||
| AlgebraicLogarithm(d1, d2) =>
|
||||
FromDist(ToDistCombination(Algebraic, #Logarithm, #Dist(d2)), d1)
|
||||
| AlgebraicExponentiate(d1, d2) =>
|
||||
FromDist(ToDistCombination(Algebraic, #Exponentiate, #Dist(d2)), d1)
|
||||
| PointwiseAdd(d1, d2) => FromDist(ToDistCombination(Pointwise, #Add, #Dist(d2)), d1)
|
||||
| PointwiseMultiply(d1, d2) => FromDist(ToDistCombination(Pointwise, #Multiply, #Dist(d2)), d1)
|
||||
| PointwiseDivide(d1, d2) => FromDist(ToDistCombination(Pointwise, #Divide, #Dist(d2)), d1)
|
||||
| PointwiseSubtract(d1, d2) => FromDist(ToDistCombination(Pointwise, #Subtract, #Dist(d2)), d1)
|
||||
| PointwiseLogarithm(d1, d2) =>
|
||||
FromDist(ToDistCombination(Pointwise, #Logarithm, #Dist(d2)), d1)
|
||||
| PointwiseExponentiate(d1, d2) =>
|
||||
FromDist(ToDistCombination(Pointwise, #Exponentiate, #Dist(d2)), d1)
|
||||
}
|
||||
}
|
|
@ -203,8 +203,8 @@ let operate = (distToFloatOp: Operation.distToFloatOperation, s): float =>
|
|||
| #Mean => T.mean(s)
|
||||
}
|
||||
|
||||
let toSparkline = (t: t, n) =>
|
||||
let toSparkline = (t: t, bucketCount) =>
|
||||
T.toContinuous(t)
|
||||
->E.O2.fmap(Continuous.downsampleEquallyOverX(n))
|
||||
->E.O2.fmap(Continuous.downsampleEquallyOverX(bucketCount))
|
||||
->E.O2.toResult("toContinous Error: Could not convert into continuous distribution")
|
||||
->E.R2.fmap(r => Continuous.getShape(r).ys->Sparklines.create())
|
|
@ -146,11 +146,20 @@ let toPointSetDist = (
|
|||
samplesParse
|
||||
}
|
||||
|
||||
//Randomly get one sample from the distribution
|
||||
let sample = (t: t): float => {
|
||||
let i = E.Int.random(~min=0, ~max=E.A.length(t) - 1)
|
||||
E.A.unsafe_get(t, i)
|
||||
}
|
||||
|
||||
/*
|
||||
If asked for a length of samples shorter or equal the length of the distribution,
|
||||
return this first n samples of this distribution.
|
||||
Else, return n random samples of the distribution.
|
||||
The former helps in cases where multiple distributions are correlated.
|
||||
However, if n > length(t), then there's no clear right answer, so we just randomly
|
||||
sample everything.
|
||||
*/
|
||||
let sampleN = (t: t, n) => {
|
||||
if n <= E.A.length(t) {
|
||||
E.A.slice(t, ~offset=0, ~len=n)
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
@genType
|
||||
type functionCallInfo = GenericDist_Types.Operation.genericFunctionCallInfo;
|
||||
|
||||
@genType
|
||||
type env = DistributionOperation.env;
|
||||
|
||||
@genType
|
||||
type genericDist = GenericDist_Types.genericDist;
|
||||
|
||||
@genType
|
||||
type error = GenericDist_Types.error;
|
||||
|
||||
@genType
|
||||
let runDistributionOperation = DistributionOperation.run;
|
||||
|
||||
@genType
|
||||
type resultDist = result<genericDist, error>
|
||||
@genType
|
||||
type resultFloat = result<float, error>
|
||||
@genType
|
||||
type resultString = result<string, error>
|
24
packages/squiggle-lang/src/rescript/TypescriptInterface.res
Normal file
24
packages/squiggle-lang/src/rescript/TypescriptInterface.res
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
This is meant as a file to contain @genType declarations as needed for Typescript.
|
||||
I would ultimately want to have all @genType declarations here, vs. other files, but
|
||||
@genType doesn't play as nicely with renaming Modules and functions as
|
||||
would be preferable.
|
||||
|
||||
The below few seem to work fine. In the future there's definitely more work to do here.
|
||||
*/
|
||||
|
||||
@genType
|
||||
type env = DistributionOperation.env
|
||||
|
||||
@genType
|
||||
type genericDist = GenericDist_Types.genericDist
|
||||
|
||||
@genType
|
||||
type error = GenericDist_Types.error
|
||||
|
||||
@genType
|
||||
type resultDist = result<genericDist, error>
|
||||
@genType
|
||||
type resultFloat = result<float, error>
|
||||
@genType
|
||||
type resultString = result<string, error>
|
Loading…
Reference in New Issue
Block a user