squiggle/packages/squiggle-lang/src/js/index.ts

229 lines
5.5 KiB
TypeScript
Raw Normal View History

import { runAll } from "../rescript/ProgramEvaluator.gen";
import type {
Inputs_SamplingInputs_t as SamplingInputs,
exportEnv,
exportType,
exportDistribution,
} from "../rescript/ProgramEvaluator.gen";
export type { SamplingInputs, exportEnv, exportDistribution };
export type { t as DistPlus } from "../rescript/OldInterpreter/DistPlus.gen";
import {
2022-04-08 19:55:04 +00:00
genericDist,
2022-04-09 02:55:06 +00:00
env,
2022-04-08 19:55:04 +00:00
resultDist,
resultFloat,
resultString,
2022-04-09 02:55:06 +00:00
} from "../rescript/TypescriptInterface.gen";
2022-04-10 01:56:05 +00:00
export {makeSampleSetDist} from "../rescript/TypescriptInterface.gen";
2022-04-08 19:55:04 +00:00
import {
Constructors_mean,
Constructors_sample,
Constructors_pdf,
Constructors_cdf,
Constructors_inv,
Constructors_normalize,
Constructors_toPointSet,
Constructors_toSampleSet,
Constructors_truncate,
Constructors_inspect,
Constructors_toString,
Constructors_toSparkline,
Constructors_algebraicAdd,
Constructors_algebraicMultiply,
Constructors_algebraicDivide,
Constructors_algebraicSubtract,
Constructors_algebraicLogarithm,
2022-04-09 16:37:26 +00:00
Constructors_algebraicPower,
Constructors_pointwiseAdd,
Constructors_pointwiseMultiply,
Constructors_pointwiseDivide,
Constructors_pointwiseSubtract,
Constructors_pointwiseLogarithm,
2022-04-09 16:37:26 +00:00
Constructors_pointwisePower,
} from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen";
export let defaultSamplingInputs: SamplingInputs = {
sampleCount: 10000,
outputXYPoints: 10000,
pointDistLength: 1000,
};
export function run(
squiggleString: string,
samplingInputs?: SamplingInputs,
environment?: exportEnv
): { tag: "Ok"; value: exportType } | { tag: "Error"; value: string } {
let si: SamplingInputs = samplingInputs
? samplingInputs
: defaultSamplingInputs;
let env: exportEnv = environment ? environment : [];
return runAll(squiggleString, si, env);
}
2022-04-09 02:55:06 +00:00
//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;
}
| {
tag: "Error";
value: any;
2022-04-09 02:55:06 +00:00
};
export function resultMap(r: result, mapFn: any): result {
if (r.tag === "Ok") {
return { tag: "Ok", value: mapFn(r.value) };
} else {
return r;
}
}
2022-04-10 01:56:05 +00:00
export function resultExn(r: result): any {
r.value
}
export class GenericDist {
t: genericDist;
env: env;
constructor(t: genericDist, env: env) {
this.t = t;
this.env = env;
return this;
}
mapResultDist(r: resultDist) {
return resultMap(r, (v: genericDist) => new GenericDist(v, this.env));
}
mean() {
return Constructors_mean({ env: this.env }, this.t);
2022-04-08 19:55:04 +00:00
}
sample(): resultFloat {
return Constructors_sample({ env: this.env }, this.t);
2022-04-08 19:55:04 +00:00
}
pdf(n: number): resultFloat {
return Constructors_pdf({ env: this.env }, this.t, n);
2022-04-08 19:55:04 +00:00
}
cdf(n: number): resultFloat {
return Constructors_cdf({ env: this.env }, this.t, n);
2022-04-08 19:55:04 +00:00
}
inv(n: number): resultFloat {
return Constructors_inv({ env: this.env }, this.t, n);
2022-04-08 19:55:04 +00:00
}
normalize() {
return this.mapResultDist(
Constructors_normalize({ env: this.env }, this.t)
);
2022-04-08 19:55:04 +00:00
}
toPointSet() {
return this.mapResultDist(
Constructors_toPointSet({ env: this.env }, this.t)
);
2022-04-08 19:55:04 +00:00
}
toSampleSet(n: number) {
return this.mapResultDist(
Constructors_toSampleSet({ env: this.env }, this.t, n)
);
2022-04-08 19:55:04 +00:00
}
truncate(left: number, right: number) {
return this.mapResultDist(
Constructors_truncate({ env: this.env }, this.t, left, right)
2022-04-08 19:55:04 +00:00
);
}
inspect() {
return this.mapResultDist(Constructors_inspect({ env: this.env }, this.t));
2022-04-08 19:55:04 +00:00
}
toString(): resultString {
return Constructors_toString({ env: this.env }, this.t);
2022-04-08 19:55:04 +00:00
}
toSparkline(n: number): resultString {
return Constructors_toSparkline({ env: this.env }, this.t, n);
2022-04-08 19:55:04 +00:00
}
algebraicAdd(d2: GenericDist) {
return this.mapResultDist(
Constructors_algebraicAdd({ env: this.env }, this.t, d2.t)
);
}
algebraicMultiply(d2: GenericDist) {
return this.mapResultDist(
Constructors_algebraicMultiply({ env: this.env }, this.t, d2.t)
);
}
algebraicDivide(d2: GenericDist) {
return this.mapResultDist(
Constructors_algebraicDivide({ env: this.env }, this.t, d2.t)
);
}
algebraicSubtract(d2: GenericDist) {
return this.mapResultDist(
Constructors_algebraicSubtract({ env: this.env }, this.t, d2.t)
);
}
algebraicLogarithm(d2: GenericDist) {
return this.mapResultDist(
Constructors_algebraicLogarithm({ env: this.env }, this.t, d2.t)
);
}
2022-04-09 16:37:26 +00:00
algebraicPower(d2: GenericDist) {
return this.mapResultDist(
2022-04-09 16:37:26 +00:00
Constructors_algebraicPower({ env: this.env }, this.t, d2.t)
);
}
pointwiseAdd(d2: GenericDist) {
return this.mapResultDist(
Constructors_pointwiseAdd({ env: this.env }, this.t, d2.t)
);
}
pointwiseMultiply(d2: GenericDist) {
return this.mapResultDist(
Constructors_pointwiseMultiply({ env: this.env }, this.t, d2.t)
);
}
pointwiseDivide(d2: GenericDist) {
return this.mapResultDist(
Constructors_pointwiseDivide({ env: this.env }, this.t, d2.t)
);
}
pointwiseSubtract(d2: GenericDist) {
return this.mapResultDist(
Constructors_pointwiseSubtract({ env: this.env }, this.t, d2.t)
);
}
pointwiseLogarithm(d2: GenericDist) {
return this.mapResultDist(
Constructors_pointwiseLogarithm({ env: this.env }, this.t, d2.t)
);
}
2022-04-09 16:37:26 +00:00
pointwisePower(d2: GenericDist) {
return this.mapResultDist(
2022-04-09 16:37:26 +00:00
Constructors_pointwisePower({ env: this.env }, this.t, d2.t)
);
}
}