Merge pull request #1140 from quantified-uncertainty/scripts
benchmarking and testing scripts for squiggle-lang
This commit is contained in:
		
						commit
						2aaf6816f6
					
				
							
								
								
									
										25
									
								
								packages/squiggle-lang/scripts/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								packages/squiggle-lang/scripts/README.md
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					Various scripts used for development, benchmarking and testing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					None of these are bundled in the NPM package yet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# run.mjs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`scripts/run.mjs` allows quick testing of Squiggle programs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					$ ./scripts/run.mjs '2+2'
 | 
				
			||||||
 | 
					Running 2+2
 | 
				
			||||||
 | 
					Ok 4
 | 
				
			||||||
 | 
					@{__result__: 4}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# run-file.mjs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`scripts/run-file.mjs` can be used to run and benchmark squiggle scripts stored in files:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					$ ./scripts/run-file.mjs ./path/to/file.squiggle
 | 
				
			||||||
 | 
					Time: 3.18 Ok
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To see the result and bindings, add the `-o` or `--output` flag.
 | 
				
			||||||
							
								
								
									
										27
									
								
								packages/squiggle-lang/scripts/bench-map-reduce.mjs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								packages/squiggle-lang/scripts/bench-map-reduce.mjs
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env node
 | 
				
			||||||
 | 
					import { SqProject } from "@quri/squiggle-lang";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const measure = (cb, times = 1) => {
 | 
				
			||||||
 | 
					  const t1 = new Date();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (let i = 1; i <= times; i++) {
 | 
				
			||||||
 | 
					    cb();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const t2 = new Date();
 | 
				
			||||||
 | 
					  return (t2 - t1) / 1000;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const maxP = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (let p = 0; p <= maxP; p++) {
 | 
				
			||||||
 | 
					  const size = Math.pow(10, p);
 | 
				
			||||||
 | 
					  const project = SqProject.create();
 | 
				
			||||||
 | 
					  project.setSource(
 | 
				
			||||||
 | 
					    "main",
 | 
				
			||||||
 | 
					    `List.upTo(1, ${size}) |> map({|x| List.upTo(1, 100) |> reduce(0, {|a,b|a+b})})`
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  const time = measure(() => {
 | 
				
			||||||
 | 
					    project.run("main");
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  console.log(`1e${p}`, "\t", time);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								packages/squiggle-lang/scripts/bench-map.mjs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								packages/squiggle-lang/scripts/bench-map.mjs
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env node
 | 
				
			||||||
 | 
					import { SqProject } from "@quri/squiggle-lang";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const measure = (cb, times = 1) => {
 | 
				
			||||||
 | 
					  const t1 = new Date();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (let i = 1; i <= times; i++) {
 | 
				
			||||||
 | 
					    cb();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const t2 = new Date();
 | 
				
			||||||
 | 
					  return (t2 - t1) / 1000;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const maxP = 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (let p = 0; p <= maxP; p++) {
 | 
				
			||||||
 | 
					  const size = Math.pow(10, p);
 | 
				
			||||||
 | 
					  const project = SqProject.create();
 | 
				
			||||||
 | 
					  project.setSource("list", `l = List.upTo(1,${size})`);
 | 
				
			||||||
 | 
					  project.run("list");
 | 
				
			||||||
 | 
					  project.setSource("map", "l |> map({|x| x})");
 | 
				
			||||||
 | 
					  project.setContinues("map", ["list"]);
 | 
				
			||||||
 | 
					  const time = measure(() => {
 | 
				
			||||||
 | 
					    project.run("map");
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  console.log(`1e${p}`, "\t", time);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										57
									
								
								packages/squiggle-lang/scripts/run-file.mjs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								packages/squiggle-lang/scripts/run-file.mjs
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,57 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env node
 | 
				
			||||||
 | 
					import { SqProject } from "@quri/squiggle-lang";
 | 
				
			||||||
 | 
					import fs from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Command } from "commander";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const measure = (cb, times = 1) => {
 | 
				
			||||||
 | 
					  const t1 = new Date();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (let i = 1; i <= times; i++) {
 | 
				
			||||||
 | 
					    cb();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const t2 = new Date();
 | 
				
			||||||
 | 
					  return (t2 - t1) / 1000;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const red = (str) => `\x1b[31m${str}\x1b[0m`;
 | 
				
			||||||
 | 
					const green = (str) => `\x1b[32m${str}\x1b[0m`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const program = new Command();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					program.option("-o, --output");
 | 
				
			||||||
 | 
					program.arguments("<string>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options = program.parse(process.argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const project = SqProject.create();
 | 
				
			||||||
 | 
					const sampleCount = process.env.SAMPLE_COUNT;
 | 
				
			||||||
 | 
					if (sampleCount) {
 | 
				
			||||||
 | 
					  project.setEnvironment({
 | 
				
			||||||
 | 
					    sampleCount: Number(sampleCount),
 | 
				
			||||||
 | 
					    xyPointLength: Number(sampleCount),
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const src = fs.readFileSync(program.args[0], "utf-8");
 | 
				
			||||||
 | 
					if (!src) {
 | 
				
			||||||
 | 
					  throw new Error("Expected src");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project.setSource("main", src);
 | 
				
			||||||
 | 
					const time = measure(() => project.run("main"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const bindings = project.getBindings("main");
 | 
				
			||||||
 | 
					const result = project.getResult("main");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (options.output) {
 | 
				
			||||||
 | 
					  console.log("Result:", result.tag, result.value.toString());
 | 
				
			||||||
 | 
					  console.log("Bindings:", bindings.toString());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "Time:",
 | 
				
			||||||
 | 
					  String(time),
 | 
				
			||||||
 | 
					  result.tag === "Error" ? red(result.tag) : green(result.tag),
 | 
				
			||||||
 | 
					  result.tag === "Error" ? result.value.toString() : ""
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										18
									
								
								packages/squiggle-lang/scripts/run.mjs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								packages/squiggle-lang/scripts/run.mjs
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env node
 | 
				
			||||||
 | 
					import { SqProject } from "@quri/squiggle-lang";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const project = SqProject.create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const src = process.argv[2];
 | 
				
			||||||
 | 
					if (!src) {
 | 
				
			||||||
 | 
					  throw new Error("Expected src");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					console.log(`Running ${src}`);
 | 
				
			||||||
 | 
					project.setSource("a", src);
 | 
				
			||||||
 | 
					project.run("a");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const result = project.getResult("a");
 | 
				
			||||||
 | 
					console.log(result.tag, result.value.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const bindings = project.getBindings("a");
 | 
				
			||||||
 | 
					console.log(bindings.asValue().toString());
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user