feat: negative numbers, printing

This commit is contained in:
NunoSempere 2022-04-15 11:49:36 -04:00
parent 4b9b223aeb
commit 13550fbdda

View File

@ -2,31 +2,53 @@ import { create, all } from "mathjs";
const math = create(all); const math = create(all);
// Helper functions // Helper functions
let printNode = (x) => console.log(JSON.stringify(x, null, 4)); let VERBOSE = true;
let print = (x) => {
if (VERBOSE) {
console.log(x);
}
};
let printNode = (x) => print(JSON.stringify(x, null, 4));
let isNumber = (x) => typeof x === "number" && isFinite(x); let isNumber = (x) => typeof x === "number" && isFinite(x);
let isConstantNode = (arg) => { let isConstantNode = (arg) => {
return !!arg.value && isNumber(arg.value); return isNumber(arg.value);
};
let isNegativeNumberNode = (arg) => {
return (
arg.op == "-" && arg.fn == "unaryMinus" && arg.args && arg.args.length == 1
);
}; };
let isArgLognormal = (arg) => { let isArgLognormal = (arg) => {
let isFn = typeof arg.fn != "undefined"; let isFn = typeof arg.fn != "undefined";
let andNameIsLognormal = isFn && arg.fn.name == "lognormal"; let andNameIsLognormal = isFn && arg.fn.name == "lognormal";
let andHasArgs = andNameIsLognormal && !!arg.args; let andHasArgs = andNameIsLognormal && !!arg.args;
let andHasTwoArgs = andHasArgs && arg.args.length == 2; let andHasTwoArgs = andHasArgs && arg.args.length == 2;
let andTwoArgsAreConstant = let andTwoArgsAreCorrectType =
andHasTwoArgs && andHasTwoArgs &&
arg.args arg.args
.map( .map(
(innerArg) => isConstantNode(innerArg) (innerArg) => {
let isConstant = isConstantNode(innerArg);
let isNegative = isNegativeNumberNode(innerArg);
return isConstant || isNegative;
}
// innerArg // innerArg
) )
.reduce((a, b) => a && b, true); .reduce((a, b) => a && b, true);
return andTwoArgsAreConstant; return andTwoArgsAreCorrectType;
}; };
let getFactors = (node) => { let getFactors = (node) => {
return node.args.map((arg) => arg.value); return node.args.map((arg) => {
if (isConstantNode(arg)) {
return arg.value;
} else if (isNegativeNumberNode(arg)) {
return -arg.args[0].value;
}
});
}; };
let createLogarithmNode = (mu, sigma) => { let createLogarithmNode = (mu, sigma) => {
@ -44,7 +66,6 @@ let transformerInner = (string) => {
if (node.type == "OperatorNode" && node.op == "*") { if (node.type == "OperatorNode" && node.op == "*") {
let hasTwoArgs = node.args && node.args.length == 2; let hasTwoArgs = node.args && node.args.length == 2;
if (hasTwoArgs) { if (hasTwoArgs) {
console.log(JSON.stringify(node.args, null, 4));
// Multiplication of two lognormals // Multiplication of two lognormals
let areArgsLognormal = node.args let areArgsLognormal = node.args
.map((arg) => isArgLognormal(arg)) .map((arg) => isArgLognormal(arg))
@ -148,7 +169,7 @@ let transformerInner = (string) => {
return node; return node;
}); });
return transformed.toString(); return transformed;
}; };
let from90PercentCI = (low, high) => { let from90PercentCI = (low, high) => {
@ -163,19 +184,25 @@ let from90PercentCI = (low, high) => {
let simplePreprocessor = (string) => { let simplePreprocessor = (string) => {
// left for documentation purposes only // left for documentation purposes only
function replacer(match, p1, p2) { function replacer(match, p1, p2) {
console.log(match); print(match);
// p1 is nondigits, p2 digits, and p3 non-alphanumericsa // p1 is nondigits, p2 digits, and p3 non-alphanumericsa
console.log([p1, p2]); print([p1, p2]);
let result = from90PercentCI(p1, p2); let result = from90PercentCI(p1, p2);
return `lognormal(${result[0]}, ${result[1]})`; return `lognormal(${result[0]}, ${result[1]})`;
} }
let newString = string.replace(/(\d+) to (\d+)/g, replacer); let newString = string.replace(/(\d+) to (\d+)/g, replacer);
console.log(newString); print(newString);
return newString; // abc - 12345 - #$*% return newString; // abc - 12345 - #$*%
}; };
// simplePreprocessor("1 to 10 + 1 to 20"); // simplePreprocessor("1 to 10 + 1 to 20");
let customToStringHandler = (node, options) => {
if (node.type == "ConstantNode") {
return node.value.toFixed(2);
}
};
let preprocessor = (string) => { let preprocessor = (string) => {
// work in progress, currently not working // work in progress, currently not working
let regex = /([\d]+\.?[\d]*|\.[\d]+) to ([\d]+\.?[\d]*|\.[\d]+)/g; let regex = /([\d]+\.?[\d]*|\.[\d]+) to ([\d]+\.?[\d]*|\.[\d]+)/g;
@ -184,29 +211,41 @@ let preprocessor = (string) => {
return `lognormal(${result[0]}, ${result[1]})`; return `lognormal(${result[0]}, ${result[1]})`;
} }
let newString = string.replace(regex, replacer); let newString = string.replace(regex, replacer);
if (newString != string) console.log(`\tPreprocessing: ${newString}`); if (newString != string)
print(
`\t= ${math
.parse(newString)
.toString({ handler: customToStringHandler })}`
);
return newString; // abc - 12345 - #$*% return newString; // abc - 12345 - #$*%
}; };
// preprocessor("1.2 to 10.5 * 1.1 to 20 * 1 to 2.5 * 1 to 5"); // preprocessor("1.2 to 10.5 * 1.1 to 20 * 1 to 2.5 * 1 to 5");
let transformer = (string) => { let transformer = (string) => {
string = preprocessor(string); string = preprocessor(string);
let stringNew = transformerInner(string); let transformerOutput = transformerInner(string);
let stringNew = transformerOutput.toString();
while (stringNew != string) { while (stringNew != string) {
console.log(`\tNew transformation: ${stringNew}`); print(
`\t->: ${transformerOutput.toString({ handler: customToStringHandler })}`
);
string = stringNew; string = stringNew;
stringNew = transformerInner(string); transformerOutput = transformerInner(string);
stringNew = transformerOutput.toString();
} }
return stringNew; return stringNew;
}; };
let testTransformer = (string) => { let testTransformer = (string) => {
console.log(`New test: ${string}`); print(string);
console.group(); console.group();
print("");
let result = transformer(string); let result = transformer(string);
print("");
console.groupEnd(); console.groupEnd();
console.log(`Result: ${result}`); print(`=> ${result}`);
console.log(""); print("-".repeat(52));
print("");
}; };
// Defs // Defs