Added tests for index.js and fixed some corresponding functionality
This commit is contained in:
		
							parent
							
								
									d62ccc27bd
								
							
						
					
					
						commit
						0af0c9e274
					
				|  | @ -1,34 +1,66 @@ | ||||||
| import { run } from '../src/js/index'; | import { run, GenericDist, resultMap } from "../src/js/index"; | ||||||
| 
 | 
 | ||||||
| let testRun = (x: string) => { | let testRun = (x: string) => { | ||||||
|   let result = run(x) |   let result = run(x); | ||||||
|   if(result.tag == 'Ok'){ |   if (result.tag == "Ok") { | ||||||
|     return { tag: 'Ok', value: result.value.exports } |     return { tag: "Ok", value: result.value.exports }; | ||||||
|   } |   } else { | ||||||
|   else { |     return result; | ||||||
|     return result |  | ||||||
|   } |  | ||||||
|   } |   } | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| describe("Simple calculations and results", () => { | describe("Simple calculations and results", () => { | ||||||
|   test("mean(normal(5,2))", () => { |   test("mean(normal(5,2))", () => { | ||||||
|         expect(testRun("mean(normal(5,2))")).toEqual({ tag: 'Ok', value: [ { NAME: 'Float', VAL: 5  } ] }) |     expect(testRun("mean(normal(5,2))")).toEqual({ | ||||||
|     }) |       tag: "Ok", | ||||||
|  |       value: [{ NAME: "Float", VAL: 5 }], | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|   test("10+10", () => { |   test("10+10", () => { | ||||||
|         let foo = testRun("10 + 10") |     let foo = testRun("10 + 10"); | ||||||
|         expect(foo).toEqual({ tag: 'Ok', value: [ { NAME: 'Float', VAL: 20  } ] }) |     expect(foo).toEqual({ tag: "Ok", value: [{ NAME: "Float", VAL: 20 }] }); | ||||||
|     }) |   }); | ||||||
| }) | }); | ||||||
| describe("Log function", () => { | describe("Log function", () => { | ||||||
|   test("log(1) = 0", () => { |   test("log(1) = 0", () => { | ||||||
|       let foo = testRun("log(1)") |     let foo = testRun("log(1)"); | ||||||
|       expect(foo).toEqual({ tag: 'Ok', value: [ { NAME: 'Float', VAL: 0} ]}) |     expect(foo).toEqual({ tag: "Ok", value: [{ NAME: "Float", VAL: 0 }] }); | ||||||
|     }) |   }); | ||||||
| }) | }); | ||||||
| 
 | 
 | ||||||
| describe("Multimodal too many weights error", () => { | describe("Multimodal too many weights error", () => { | ||||||
|   test("mm(0,0,[0,0,0])", () => { |   test("mm(0,0,[0,0,0])", () => { | ||||||
|       let foo = testRun("mm(0,0,[0,0,0])") |     let foo = testRun("mm(0,0,[0,0,0])"); | ||||||
|       expect(foo).toEqual({ "tag": "Error", "value": "Function multimodal error: Too many weights provided" }) |     expect(foo).toEqual({ | ||||||
|     }) |       tag: "Error", | ||||||
|  |       value: "Function multimodal error: Too many weights provided", | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | describe("GenericDist", () => { | ||||||
|  |   let dist = new GenericDist( | ||||||
|  |     { tag: "SampleSet", value: [3, 4, 5, 6, 6, 7, 10, 15, 30] }, | ||||||
|  |     { sampleCount: 100, xyPointLength: 100 } | ||||||
|  |   ); | ||||||
|  |   test("mean", () => { | ||||||
|  |     expect(dist.mean().value).toBeCloseTo(3.737); | ||||||
|  |   }); | ||||||
|  |   test("pdf", () => { | ||||||
|  |     expect(dist.pdf(5.0).value).toBeCloseTo(0.0431); | ||||||
|  |   }); | ||||||
|  |   test("cdf", () => { | ||||||
|  |     expect(dist.cdf(5.0).value).toBeCloseTo(0.155); | ||||||
|  |   }); | ||||||
|  |   test("inv", () => { | ||||||
|  |     expect(dist.inv(0.5).value).toBeCloseTo(9.458); | ||||||
|  |   }); | ||||||
|  |   test("toPointSet", () => { | ||||||
|  |     expect( | ||||||
|  |       resultMap(dist.toPointSet(), (r: GenericDist) => r.toString()).value.value | ||||||
|  |     ).toBe("Point Set Distribution"); | ||||||
|  |   }); | ||||||
|  |   test("toSparkline", () => { | ||||||
|  |     expect(dist.toSparkline(20).value).toBe("▁▁▃▅███▆▄▃▂▁▁▂▂▃▂▁▁▁"); | ||||||
|  |   }); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | @ -7,7 +7,6 @@ import type { | ||||||
| } from "../rescript/ProgramEvaluator.gen"; | } from "../rescript/ProgramEvaluator.gen"; | ||||||
| export type { SamplingInputs, exportEnv, exportDistribution }; | export type { SamplingInputs, exportEnv, exportDistribution }; | ||||||
| export type { t as DistPlus } from "../rescript/OldInterpreter/DistPlus.gen"; | export type { t as DistPlus } from "../rescript/OldInterpreter/DistPlus.gen"; | ||||||
| import type { Operation_genericFunctionCallInfo } from "../rescript/Distributions/GenericDist/GenericDist_Types.gen"; |  | ||||||
| import { | import { | ||||||
|   genericDist, |   genericDist, | ||||||
|   resultDist, |   resultDist, | ||||||
|  | @ -16,30 +15,30 @@ import { | ||||||
| } from "../rescript/TSInterface.gen"; | } from "../rescript/TSInterface.gen"; | ||||||
| import { | import { | ||||||
|   env, |   env, | ||||||
|   Constructors_UsingDists_mean, |   Constructors_mean, | ||||||
|   Constructors_UsingDists_sample, |   Constructors_sample, | ||||||
|   Constructors_UsingDists_pdf, |   Constructors_pdf, | ||||||
|   Constructors_UsingDists_cdf, |   Constructors_cdf, | ||||||
|   Constructors_UsingDists_inv, |   Constructors_inv, | ||||||
|   Constructors_UsingDists_normalize, |   Constructors_normalize, | ||||||
|   Constructors_UsingDists_toPointSet, |   Constructors_toPointSet, | ||||||
|   Constructors_UsingDists_toSampleSet, |   Constructors_toSampleSet, | ||||||
|   Constructors_UsingDists_truncate, |   Constructors_truncate, | ||||||
|   Constructors_UsingDists_inspect, |   Constructors_inspect, | ||||||
|   Constructors_UsingDists_toString, |   Constructors_toString, | ||||||
|   Constructors_UsingDists_toSparkline, |   Constructors_toSparkline, | ||||||
|   Constructors_UsingDists_algebraicAdd, |   Constructors_algebraicAdd, | ||||||
|   Constructors_UsingDists_algebraicMultiply, |   Constructors_algebraicMultiply, | ||||||
|   Constructors_UsingDists_algebraicDivide, |   Constructors_algebraicDivide, | ||||||
|   Constructors_UsingDists_algebraicSubtract, |   Constructors_algebraicSubtract, | ||||||
|   Constructors_UsingDists_algebraicLogarithm, |   Constructors_algebraicLogarithm, | ||||||
|   Constructors_UsingDists_algebraicExponentiate, |   Constructors_algebraicExponentiate, | ||||||
|   Constructors_UsingDists_pointwiseAdd, |   Constructors_pointwiseAdd, | ||||||
|   Constructors_UsingDists_pointwiseMultiply, |   Constructors_pointwiseMultiply, | ||||||
|   Constructors_UsingDists_pointwiseDivide, |   Constructors_pointwiseDivide, | ||||||
|   Constructors_UsingDists_pointwiseSubtract, |   Constructors_pointwiseSubtract, | ||||||
|   Constructors_UsingDists_pointwiseLogarithm, |   Constructors_pointwiseLogarithm, | ||||||
|   Constructors_UsingDists_pointwiseExponentiate, |   Constructors_pointwiseExponentiate, | ||||||
| } from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen"; | } from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen"; | ||||||
| 
 | 
 | ||||||
| export let defaultSamplingInputs: SamplingInputs = { | export let defaultSamplingInputs: SamplingInputs = { | ||||||
|  | @ -60,160 +59,172 @@ export function run( | ||||||
|   return runAll(squiggleString, si, env); |   return runAll(squiggleString, si, env); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class GenericDist { | export function resultMap( | ||||||
|  |   r: | ||||||
|  |     | { | ||||||
|  |         tag: "Ok"; | ||||||
|  |         value: any; | ||||||
|  |       } | ||||||
|  |     | { | ||||||
|  |         tag: "Error"; | ||||||
|  |         value: any; | ||||||
|  |       }, | ||||||
|  |   mapFn: any | ||||||
|  | ): | ||||||
|  |   | { | ||||||
|  |       tag: "Ok"; | ||||||
|  |       value: any; | ||||||
|  |     } | ||||||
|  |   | { | ||||||
|  |       tag: "Error"; | ||||||
|  |       value: any; | ||||||
|  |     } { | ||||||
|  |   if (r.tag === "Ok") { | ||||||
|  |     return { tag: "Ok", value: mapFn(r.value) }; | ||||||
|  |   } else { | ||||||
|  |     return r; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export class GenericDist { | ||||||
|   t: genericDist; |   t: genericDist; | ||||||
|   env: env; |   env: env; | ||||||
| 
 | 
 | ||||||
|   constructor(t: genericDist, env: env) { |   constructor(t: genericDist, env: env) { | ||||||
|     this.t = t; |     this.t = t; | ||||||
|  |     this.env = env; | ||||||
|  |     return this; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   mean(): resultFloat { |   mapResultDist(r: resultDist) { | ||||||
|     return Constructors_UsingDists_mean({ env: this.env }, this.t); |     return resultMap(r, (v: genericDist) => new GenericDist(v, this.env)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   mean() { | ||||||
|  |     return Constructors_mean({ env: this.env }, this.t); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   sample(): resultFloat { |   sample(): resultFloat { | ||||||
|     return Constructors_UsingDists_sample({ env: this.env }, this.t); |     return Constructors_sample({ env: this.env }, this.t); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pdf(n: number): resultFloat { |   pdf(n: number): resultFloat { | ||||||
|     return Constructors_UsingDists_pdf({ env: this.env }, this.t, n); |     return Constructors_pdf({ env: this.env }, this.t, n); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   cdf(n: number): resultFloat { |   cdf(n: number): resultFloat { | ||||||
|     return Constructors_UsingDists_cdf({ env: this.env }, this.t, n); |     return Constructors_cdf({ env: this.env }, this.t, n); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   inv(n: number): resultFloat { |   inv(n: number): resultFloat { | ||||||
|     return Constructors_UsingDists_inv({ env: this.env }, this.t, n); |     return Constructors_inv({ env: this.env }, this.t, n); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   normalize(): resultDist { |   normalize() { | ||||||
|     return Constructors_UsingDists_normalize({ env: this.env }, this.t); |     return this.mapResultDist( | ||||||
|   } |       Constructors_normalize({ env: this.env }, this.t) | ||||||
| 
 |  | ||||||
|   toPointSet(): resultDist { |  | ||||||
|     return Constructors_UsingDists_toPointSet({ env: this.env }, this.t); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   toSampleSet(n: number): resultDist { |  | ||||||
|     return Constructors_UsingDists_toSampleSet({ env: this.env }, this.t, n); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   truncate(left: number, right: number): resultDist { |  | ||||||
|     return Constructors_UsingDists_truncate( |  | ||||||
|       { env: this.env }, |  | ||||||
|       this.t, |  | ||||||
|       left, |  | ||||||
|       right |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   inspect(): resultDist { |   toPointSet() { | ||||||
|     return Constructors_UsingDists_inspect({ env: this.env }, this.t); |     return this.mapResultDist( | ||||||
|  |       Constructors_toPointSet({ env: this.env }, this.t) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   toSampleSet(n: number) { | ||||||
|  |     return this.mapResultDist( | ||||||
|  |       Constructors_toSampleSet({ env: this.env }, this.t, n) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   truncate(left: number, right: number) { | ||||||
|  |     return this.mapResultDist( | ||||||
|  |       Constructors_truncate({ env: this.env }, this.t, left, right) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   inspect() { | ||||||
|  |     return this.mapResultDist(Constructors_inspect({ env: this.env }, this.t)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   toString(): resultString { |   toString(): resultString { | ||||||
|     return Constructors_UsingDists_toString({ env: this.env }, this.t); |     return Constructors_toString({ env: this.env }, this.t); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   toSparkline(n: number): resultString { |   toSparkline(n: number): resultString { | ||||||
|     return Constructors_UsingDists_toSparkline({ env: this.env }, this.t, n); |     return Constructors_toSparkline({ env: this.env }, this.t, n); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicAdd(d2: GenericDist): resultDist { |   algebraicAdd(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicAdd( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicAdd({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicMultiply(d2: GenericDist): resultDist { |   algebraicMultiply(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicMultiply( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicMultiply({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicDivide(d2: GenericDist): resultDist { |   algebraicDivide(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicDivide( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicDivide({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicSubtract(d2: GenericDist): resultDist { |   algebraicSubtract(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicSubtract( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicSubtract({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicLogarithm(d2: GenericDist): resultDist { |   algebraicLogarithm(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicLogarithm( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicLogarithm({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   algebraicExponentiate(d2: GenericDist): resultDist { |   algebraicExponentiate(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_algebraicExponentiate( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_algebraicExponentiate({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseAdd(d2: GenericDist): resultDist { |   pointwiseAdd(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseAdd( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseAdd({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseMultiply(d2: GenericDist): resultDist { |   pointwiseMultiply(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseMultiply( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseMultiply({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseDivide(d2: GenericDist): resultDist { |   pointwiseDivide(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseDivide( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseDivide({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseSubtract(d2: GenericDist): resultDist { |   pointwiseSubtract(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseSubtract( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseSubtract({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseLogarithm(d2: GenericDist): resultDist { |   pointwiseLogarithm(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseLogarithm( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseLogarithm({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   pointwiseExponentiate(d2: GenericDist): resultDist { |   pointwiseExponentiate(d2: GenericDist) { | ||||||
|     return Constructors_UsingDists_pointwiseExponentiate( |     return this.mapResultDist( | ||||||
|       { env: this.env }, |       Constructors_pointwiseExponentiate({ env: this.env }, this.t, d2.t) | ||||||
|       this.t, |  | ||||||
|       d2.t |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -187,8 +187,7 @@ module Output = { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module Constructors = { | module Constructors = { | ||||||
|   module UsingDists = { |     module C = GenericDist_Types.Constructors.UsingDists; | ||||||
|     module C = GenericDist_Types.Constructors.UsingDists |  | ||||||
|     open OutputLocal |     open OutputLocal | ||||||
|     let mean = (~env, dist) => C.mean(dist)->run(~env)->toFloatR |     let mean = (~env, dist) => C.mean(dist)->run(~env)->toFloatR | ||||||
|     let sample = (~env, dist) => C.sample(dist)->run(~env)->toFloatR |     let sample = (~env, dist) => C.sample(dist)->run(~env)->toFloatR | ||||||
|  | @ -226,4 +225,3 @@ module Constructors = { | ||||||
|     let pointwiseExponentiate = (~env, dist1, dist2) => |     let pointwiseExponentiate = (~env, dist1, dist2) => | ||||||
|       C.pointwiseSubtract(dist1, dist2)->run(~env)->toDistR |       C.pointwiseSubtract(dist1, dist2)->run(~env)->toDistR | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -39,7 +39,6 @@ module Output: { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module Constructors: { | module Constructors: { | ||||||
|   module UsingDists: { |  | ||||||
|     @genType |     @genType | ||||||
|     let mean: (~env: env, genericDist) => result<float, error> |     let mean: (~env: env, genericDist) => result<float, error> | ||||||
|     @genType |     @genType | ||||||
|  | @ -94,4 +93,3 @@ module Constructors: { | ||||||
|     @genType |     @genType | ||||||
|     let pointwiseExponentiate: (~env: env, genericDist, genericDist) => result<genericDist, error> |     let pointwiseExponentiate: (~env: env, genericDist, genericDist) => result<genericDist, error> | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -83,8 +83,8 @@ let toPointSet = ( | ||||||
| 
 | 
 | ||||||
| let toSparkline = (t: t, ~sampleCount: int, ~buckets: int=20, unit): result<string, error> => | let toSparkline = (t: t, ~sampleCount: int, ~buckets: int=20, unit): result<string, error> => | ||||||
|   t |   t | ||||||
|   ->toPointSet(~xSelection=#Linear, ~xyPointLength=buckets, ~sampleCount, ()) |   ->toPointSet(~xSelection=#Linear, ~xyPointLength=buckets*3, ~sampleCount, ()) | ||||||
|   ->E.R.bind(r => r->PointSetDist.toSparkline->E.R2.errMap(r => Error(GenericDist_Types.Other(r)))) |   ->E.R.bind(r => r->PointSetDist.toSparkline(buckets)->E.R2.errMap(r => Error(GenericDist_Types.Other(r)))) | ||||||
| 
 | 
 | ||||||
| module Truncate = { | module Truncate = { | ||||||
|   let trySymbolicSimplification = (leftCutoff, rightCutoff, t: t): option<t> => |   let trySymbolicSimplification = (leftCutoff, rightCutoff, t: t): option<t> => | ||||||
|  |  | ||||||
|  | @ -102,6 +102,7 @@ module Constructors = { | ||||||
|   type t = Operation.genericFunctionCallInfo |   type t = Operation.genericFunctionCallInfo | ||||||
| 
 | 
 | ||||||
|   module UsingDists = { |   module UsingDists = { | ||||||
|  |     @genType | ||||||
|     let mean = (dist): t => FromDist(ToFloat(#Mean), dist) |     let mean = (dist): t => FromDist(ToFloat(#Mean), dist) | ||||||
|     let sample = (dist): t => FromDist(ToFloat(#Sample), dist) |     let sample = (dist): t => FromDist(ToFloat(#Sample), dist) | ||||||
|     let cdf = (dist, f): t => FromDist(ToFloat(#Cdf(f)), dist) |     let cdf = (dist, f): t => FromDist(ToFloat(#Cdf(f)), dist) | ||||||
|  |  | ||||||
|  | @ -249,6 +249,9 @@ module T = Dist({ | ||||||
|     ) |     ) | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | let downsampleEquallyOverX = (length, t): t => | ||||||
|  |   t |> shapeMap(XYShape.XsConversion.proportionEquallyOverX(length)) | ||||||
|  | 
 | ||||||
| /* This simply creates multiple copies of the continuous distribution, scaled and shifted according to | /* This simply creates multiple copies of the continuous distribution, scaled and shifted according to | ||||||
|  each discrete data point, and then adds them all together. */ |  each discrete data point, and then adds them all together. */ | ||||||
| let combineAlgebraicallyWithDiscrete = ( | let combineAlgebraicallyWithDiscrete = ( | ||||||
|  |  | ||||||
|  | @ -203,7 +203,8 @@ let operate = (distToFloatOp: Operation.distToFloatOperation, s): float => | ||||||
|   | #Mean => T.mean(s) |   | #Mean => T.mean(s) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| let toSparkline = (t: t) => | let toSparkline = (t: t, n) => | ||||||
|   T.toContinuous(t) |   T.toContinuous(t) | ||||||
|  |   ->E.O2.fmap(Continuous.downsampleEquallyOverX(n)) | ||||||
|   ->E.O2.toResult("toContinous Error: Could not convert into continuous distribution") |   ->E.O2.toResult("toContinous Error: Could not convert into continuous distribution") | ||||||
|   ->E.R2.fmap(r => Continuous.getShape(r).ys->Sparklines.create()) |   ->E.R2.fmap(r => Continuous.getShape(r).ys->Sparklines.create()) | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user