exprify 1.0.4 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"exprify.min.js","sources":["../src/utils/matrix.js","../src/parser/evaluator.js","../src/core/context.js","../src/math/operations.js","../src/utils/globalUnits.js","../src/variables/store.js","../src/function/internal.js","../src/parser/astBuild.js","../src/core/Exprify.js","../src/utils/store.js","../src/function/registry.js","../src/parser/tokenizer.js"],"sourcesContent":["export const isDenseMatrixWrapper = (value) =>\n value &&\n typeof value === \"object\" &&\n value.exprify === \"DenseMatrix\" &&\n \"data\" in value &&\n \"size\" in value;\n\nexport const cloneMatrixData = (value) => {\n if (Array.isArray(value)) {\n return value.map(cloneMatrixData);\n }\n\n return value;\n};\n\nexport const getMatrixSize = (data) => {\n if (Array.isArray(data) && data.every(Array.isArray)) {\n return [data.length, data[0]?.length || 0];\n }\n\n if (Array.isArray(data)) {\n return [data.length];\n }\n\n throw new Error(\"Matrix data must be an array\");\n};\n\nexport const wrapDenseMatrix = (data) => ({\n exprify: \"DenseMatrix\",\n data: cloneMatrixData(data),\n size: getMatrixSize(data)\n});\n\nexport const unwrapDenseMatrix = (value) =>\n isDenseMatrixWrapper(value) ? cloneMatrixData(value.data) : value;\n\nexport const serializeExprifyValue = (value) => {\n if (isDenseMatrixWrapper(value)) {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value) || (value && typeof value === \"object\")) {\n return JSON.stringify(value, (_, current) => {\n if (isDenseMatrixWrapper(current)) {\n return current;\n }\n\n return current;\n });\n }\n\n return value;\n};\n","import { unwrapDenseMatrix, wrapDenseMatrix } from \"../utils/matrix.js\";\n\nexport function evaluateAST(node, context = {}) {\n\n const vars = context.variables;\n const fns = context.functions;\n const units = context.units;\n\n\n const isUnitObj = (v) =>\n v && typeof v === \"object\" && \"value\" in v && \"unit\" in v;\n\n const isComplex = (v) =>\n v && typeof v === \"object\" && \"re\" in v && \"im\" in v;\n\n const isSliceNode = (v) =>\n v && typeof v === \"object\" && v.type === \"SliceExpression\";\n\n const isMatrix = (v) =>\n Array.isArray(v) && v.length > 0 && v.every(Array.isArray);\n\n const cloneValue = (value) => {\n if (Array.isArray(value)) {\n return value.map(cloneValue);\n }\n\n if (value && typeof value === \"object\") {\n return { ...value };\n }\n\n return value;\n };\n\n const normalizeMatrix = (value) => {\n value = unwrapDenseMatrix(value);\n if (isMatrix(value)) return value.map((row) => [...row]);\n if (Array.isArray(value)) return [value];\n throw new Error(\"Expected matrix-compatible value\");\n };\n\n const toOneBasedIndex = (value) => {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 1) {\n throw new Error(\"Matrix indices must be positive integers\");\n }\n\n return value - 1;\n };\n\n const resolveSelector = (selector, contextLength) => {\n if (isSliceNode(selector)) {\n const startValue = selector.start == null ? 1 : evaluateAST(selector.start, context);\n const endValue = selector.end == null ? contextLength : evaluateAST(selector.end, context);\n const start = toOneBasedIndex(startValue);\n const end = toOneBasedIndex(endValue);\n\n if (end < start) {\n return [];\n }\n\n const result = [];\n for (let index = start; index <= end; index++) {\n result.push(index);\n }\n return result;\n }\n\n return [toOneBasedIndex(evaluateAST(selector, context))];\n };\n\n const indexMatrix = (matrix, selectors) => {\n const target = normalizeMatrix(matrix);\n\n if (selectors.length === 1) {\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const rows = rowIndexes.map((rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error(\"Row index out of range\");\n }\n return [...target[rowIndex]];\n });\n\n return rows.length === 1 ? rows[0] : rows;\n }\n\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const colIndexes = resolveSelector(selectors[1], target[0]?.length || 0);\n\n const values = rowIndexes.map((rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error(\"Row index out of range\");\n }\n\n return colIndexes.map((colIndex) => {\n if (colIndex >= target[rowIndex].length) {\n throw new Error(\"Column index out of range\");\n }\n return target[rowIndex][colIndex];\n });\n });\n\n if (rowIndexes.length === 1 && colIndexes.length === 1) {\n return values[0][0];\n }\n\n if (rowIndexes.length === 1) {\n return values[0];\n }\n\n if (colIndexes.length === 1) {\n return values.map((row) => [row[0]]);\n }\n\n return values;\n };\n\n const assignMatrixIndex = (matrix, selectors, value) => {\n const target = isMatrix(matrix)\n ? matrix.map((row) => [...row])\n : Array.isArray(matrix)\n ? [matrix.slice()]\n : [];\n\n const rowSelector = selectors[0];\n const colSelector = selectors[1];\n\n if (!rowSelector) {\n throw new Error(\"Matrix assignment requires at least one index\");\n }\n\n const rowContextLength = Math.max(target.length, 1);\n const rowIndexes = resolveSelector(rowSelector, rowContextLength);\n\n if (selectors.length === 1) {\n const rowsValue = isMatrix(value) ? value : normalizeMatrix(value);\n\n if (rowsValue.length !== rowIndexes.length) {\n throw new Error(\"Assigned row count does not match slice\");\n }\n\n rowIndexes.forEach((rowIndex, index) => {\n target[rowIndex] = [...rowsValue[index]];\n });\n\n return {\n updatedMatrix: target,\n selectionResult: rowIndexes.length === 1 ? [target[rowIndexes[0]]] : rowIndexes.map((rowIndex) => [target[rowIndex]])\n };\n }\n\n const maxCols = Math.max(...target.map((row) => row.length), 0, 1);\n const colIndexes = resolveSelector(colSelector, maxCols);\n const normalizedValue = normalizeMatrix(value);\n\n if (normalizedValue.length !== rowIndexes.length) {\n throw new Error(\"Assigned row count does not match matrix slice\");\n }\n\n normalizedValue.forEach((row, rowOffset) => {\n if (row.length !== colIndexes.length) {\n throw new Error(\"Assigned column count does not match matrix slice\");\n }\n });\n\n rowIndexes.forEach((rowIndex, rowOffset) => {\n if (!target[rowIndex]) {\n target[rowIndex] = [];\n }\n\n colIndexes.forEach((colIndex, colOffset) => {\n target[rowIndex][colIndex] = normalizedValue[rowOffset][colOffset];\n });\n });\n\n return {\n updatedMatrix: target,\n selectionResult: rowIndexes.length === 1\n ? [colIndexes.map((colIndex) => target[rowIndexes[0]][colIndex])]\n : rowIndexes.map((rowIndex) => colIndexes.map((colIndex) => target[rowIndex][colIndex]))\n };\n };\n\n const multiplyMatrices = (left, right) => {\n const a = normalizeMatrix(left);\n const b = normalizeMatrix(right);\n\n if (a[0].length !== b.length) {\n throw new Error(\"Matrix dimensions do not allow multiplication\");\n }\n\n return a.map((row) =>\n b[0].map((_, colIndex) =>\n row.reduce((sum, value, rowIndex) => sum + (value * b[rowIndex][colIndex]), 0)\n )\n );\n };\n\n const toComplex = (value) => {\n if (isComplex(value)) return value;\n if (typeof value === \"number\") return { re: value, im: 0 };\n throw new Error(\"Complex arithmetic only supports numbers\");\n };\n\n const fromImaginary = (value) => ({ re: 0, im: value });\n\n const simplifyComplex = (value) =>\n value.im === 0 ? value.re : value;\n\n const createFunctionScope = (params, args) => {\n const scopedValues = {};\n\n params.forEach((param, index) => {\n scopedValues[param] = args[index];\n });\n\n return scopedValues;\n };\n\n const evalComplexBinary = (operator, left, right) => {\n const a = toComplex(left);\n const b = toComplex(right);\n\n switch (operator) {\n case \"+\":\n return simplifyComplex({ re: a.re + b.re, im: a.im + b.im });\n case \"-\":\n return simplifyComplex({ re: a.re - b.re, im: a.im - b.im });\n case \"*\":\n return simplifyComplex({\n re: (a.re * b.re) - (a.im * b.im),\n im: (a.re * b.im) + (a.im * b.re)\n });\n case \"/\": {\n const denominator = (b.re ** 2) + (b.im ** 2);\n\n if (denominator === 0) {\n throw new Error(\"Division by zero\");\n }\n\n return simplifyComplex({\n re: ((a.re * b.re) + (a.im * b.im)) / denominator,\n im: ((a.im * b.re) - (a.re * b.im)) / denominator\n });\n }\n default:\n throw new Error(`Operator ${operator} is not supported for complex numbers`);\n }\n };\n\n /* ================= EVALUATOR ================= */\n\n switch (node.type) {\n\n /* ===== LITERAL ===== */\n case \"Literal\":\n return node.value;\n\n case \"ImaginaryLiteral\":\n return fromImaginary(node.value);\n\n case \"UnitLiteral\":\n return { value: node.value, unit: node.unit };\n\n /* ===== VARIABLE ===== */\n case \"Identifier\":\n return vars.get(node.name);\n\n /* ===== ASSIGNMENT ===== */\n case \"AssignmentExpression\": {\n const value = evaluateAST(node.right, context);\n\n if (node.left.type === \"Identifier\") {\n vars.set(node.left.name, value);\n if (node.right.type === \"ArrayExpression\") {\n return wrapDenseMatrix(unwrapDenseMatrix(value));\n }\n return value;\n }\n\n if (node.left.type === \"IndexExpression\" && node.left.object.type === \"Identifier\") {\n const currentValue = vars.get(node.left.object.name);\n const assigned = assignMatrixIndex(currentValue, node.left.selectors, value);\n vars.set(node.left.object.name, assigned.updatedMatrix);\n return assigned.selectionResult;\n }\n\n throw new Error(\"Invalid assignment target\");\n }\n\n case \"FunctionAssignmentExpression\": {\n if (node.operator !== \"=\") {\n throw new Error(`Operator ${node.operator} is not supported for function definitions`);\n }\n\n const fn = (...args) => {\n const scopedContext = context.withScope(createFunctionScope(node.params, args));\n return evaluateAST(node.right, scopedContext);\n };\n\n fns.register(node.left.name, fn);\n return fn;\n }\n\n /* ===== UNARY ===== */\n case \"UnaryExpression\": {\n const val = evaluateAST(node.argument, context);\n\n switch (node.operator) {\n case \"-\":\n return isComplex(val)\n ? simplifyComplex({ re: -val.re, im: -val.im })\n : -val;\n case \"!\": return !val;\n }\n\n throw new Error(`Unknown unary operator ${node.operator}`);\n }\n\n /* ===== BINARY ===== */\n case \"BinaryExpression\": {\n let left = evaluateAST(node.left, context);\n let right = evaluateAST(node.right, context);\n\n // UNIT handling\n if (isUnitObj(left) || isUnitObj(right)) {\n\n if (!units) throw new Error(\"Unit system not available\");\n\n return units.compute(node.operator, left, right);\n }\n\n if (node.operator === \"*\" && (Array.isArray(left) || Array.isArray(right))) {\n return multiplyMatrices(left, right);\n }\n\n if (isComplex(left) || isComplex(right)) {\n return evalComplexBinary(node.operator, left, right);\n }\n\n switch (node.operator) {\n case \"+\": return left + right;\n case \"-\": return left - right;\n case \"*\": return left * right;\n case \"/\": return left / right;\n case \"%\": return left % right;\n case \"^\": return left ** right;\n\n case \">\": return left > right;\n case \"<\": return left < right;\n case \">=\": return left >= right;\n case \"<=\": return left <= right;\n case \"==\": return left === right;\n }\n\n throw new Error(`Unknown operator ${node.operator}`);\n }\n\n /* ===== LOGICAL ===== */\n case \"LogicalExpression\": {\n const left = evaluateAST(node.left, context);\n\n if (node.operator === \"&&\") {\n return left && evaluateAST(node.right, context);\n }\n\n if (node.operator === \"||\") {\n return left || evaluateAST(node.right, context);\n }\n\n if (node.operator === \"??\") {\n return left ?? evaluateAST(node.right, context);\n }\n\n throw new Error(`Unknown logical operator ${node.operator}`);\n }\n\n /* ===== FUNCTION CALL ===== */\n case \"CallExpression\": {\n const fnName = node.callee.name;\n const fn = fns.get(fnName);\n\n const args = node.arguments.map(arg =>\n evaluateAST(arg, context)\n );\n\n return fn(...args);\n }\n\n /* ===== PIPELINE ===== */\n case \"PipelineExpression\": {\n const leftVal = evaluateAST(node.left, context);\n\n // right must be function\n if (node.right.type === \"CallExpression\") {\n const fnName = node.right.callee.name;\n const fn = fns.get(fnName);\n\n const args = [\n leftVal,\n ...node.right.arguments.map(arg =>\n evaluateAST(arg, context)\n )\n ];\n\n return fn(...args);\n }\n\n if (node.right.type === \"Identifier\") {\n const fn = fns.get(node.right.name);\n return fn(leftVal);\n }\n\n throw new Error(\"Invalid pipeline target\");\n }\n\n /* ===== UNIT CONVERSION ===== */\n case \"UnitConversion\": {\n const from = evaluateAST(node.from, context);\n\n if (!isUnitObj(from)) {\n throw new Error(\"Left side must be a unit value\");\n }\n\n if (!units) {\n throw new Error(\"Unit system not available\");\n }\n\n return units.convert(from.value, from.unit, node.to);\n }\n\n /* ===== ARRAY ===== */\n case \"ArrayExpression\":\n return node.elements.map(el => evaluateAST(el, context));\n\n case \"IndexExpression\": {\n const target = evaluateAST(node.object, context);\n return indexMatrix(target, node.selectors);\n }\n\n /* ===== OBJECT ===== */\n case \"ObjectExpression\": {\n const obj = {};\n for (let p of node.properties) {\n obj[p.key] = evaluateAST(p.value, context);\n }\n return obj;\n }\n\n /* ===== MEMBER ===== */\n case \"MemberExpression\": {\n const obj = evaluateAST(node.object, context);\n\n if (node.optional && obj == null) return undefined;\n\n return obj[node.property.name];\n }\n\n default:\n throw new Error(`Unknown AST node type: ${node.type}`);\n }\n}\n","export function createContext({ variables, functions, units, evaluate}) {\n if (!variables) throw new Error(\"Variable store missing\");\n if (!functions) throw new Error(\"Function registry missing\");\n if (!units) throw new Error(\"Units list missing\");\n if (!evaluate) throw new Error(\"evaluate function missing\");\n\n return {\n variables: variables,\n functions: functions,\n units: units,\n evaluate,\n withScope(scope = {}) {\n const tempVars = {\n ...variables.all?.(),\n ...scope\n };\n return createContext({\n functions: functions,\n evaluate,\n units,\n variables: {\n get: (k) => tempVars[k],\n set: (k, v) => (tempVars[k] = v),\n all: () => tempVars\n }\n });\n\n }\n };\n}","const isValidNumberPair = (a, b) =>\n (typeof a === typeof b) &&\n (typeof a === 'number' || typeof a === 'bigint');\n\nexport const mathOperations = Object.freeze({\n power: function(a, b) {\n if (isValidNumberPair(a, b)) return a ** b;\n throw new Error(\"Invalid types for ^\");\n },\n\n multiply: function(a, b) {\n if (isValidNumberPair(a, b)) return a * b;\n throw new Error(\"Invalid types for *\");\n },\n\n divide: function(a, b) {\n if (isValidNumberPair(a, b)) {\n if (b === 0) throw new Error(\"Division by zero\");\n return a / b;\n }\n throw new Error(\"Invalid types for /\");\n },\n\n add: function(a, b) {\n if (isValidNumberPair(a, b)) return a + b;\n if (typeof a === 'string' && typeof b === 'string') return a + b;\n throw new Error(\"Invalid types for +\");\n },\n subtract: function(a, b) {\n if (isValidNumberPair(a, b)) return a - b;\n throw new Error(\"Invalid types for -\");\n },\n\n modulus: function(a, b) {\n if (isValidNumberPair(a, b)) return a % b;\n throw new Error(\"Invalid types for %\");\n }\n});","export const globalUnits = {\n // Length\n length: {\n m: { value: 1, unit: 'meter', symbol: 'm' },\n cm: { value: 0.01, unit: 'centimeter', symbol: 'cm' },\n mm: { value: 0.001, unit: 'millimeter', symbol: 'mm' },\n km: { value: 1000, unit: 'kilometer', symbol: 'km' },\n um: { value: 0.000001, unit: 'micrometer', symbol: 'um', note: 'also called micron' },\n nm: { value: 0.000000001, unit: 'nanometer', symbol: 'nm' },\n px: { value: 0.000264583, unit: 'pixel', symbol: 'px', note: '96dpi standard' },\n em: { value: 0.000264583 * 16, unit: 'em', symbol: 'em', note: '1em = 16px by default' },\n rem: { value: 0.000264583 * 16, unit: 'rem', symbol: 'rem', note: 'root em = 16px by default' },\n pt: { value: 0.000352778, unit: 'point', symbol: 'pt', note: '1pt = 1/72 inch' },\n pc: { value: 0.00423333, unit: 'pica', symbol: 'pc', note: '1pc = 12pt' },\n inch: { value: 0.0254, unit: 'inch', symbol: 'in' },\n ft: { value: 0.3048, unit: 'foot', symbol: 'ft' },\n yd: { value: 0.9144, unit: 'yard', symbol: 'yd' },\n mi: { value: 1609.344, unit: 'mile', symbol: 'mi' },\n thou: { value: 0.0000254, unit: 'mil', symbol: 'thou', note: 'thousandth of an inch' },\n furlong: { value: 201.168, unit: 'furlong', symbol: 'fur', note: '220 yards' },\n nmi: { value: 1852, unit: 'nautical mile', symbol: 'nmi' },\n fathom: { value: 1.8288, unit: 'fathom', symbol: 'fathom' },\n au: { value: 1.496e11, unit: 'astronomical unit', symbol: 'AU' },\n ly: { value: 9.4607e15, unit: 'light year', symbol: 'ly' },\n pc: { value: 3.0857e16, unit: 'parsec', symbol: 'pc' }\n },\n\n // Weight / Mass\n weight: {\n mg: { value: 1e-6, unit: 'milligram', symbol: 'mg' },\n g: { value: 0.001, unit: 'gram', symbol: 'g' },\n kg: { value: 1, unit: 'kilogram', symbol: 'kg' },\n t: { value: 1000, unit: 'tonne', symbol: 't', note: 'metric ton' },\n lb: { value: 0.453592, unit: 'pound', symbol: 'lb' },\n oz: { value: 0.0283495, unit: 'ounce', symbol: 'oz' },\n stone: { value: 6.35029, unit: 'stone', symbol: 'st', note: '1 stone = 14 lb' }\n },\n\n // Time\n time: {\n s: { value: 1, unit: 'second', symbol: 's' },\n min: { value: 60, unit: 'minute', symbol: 'min' },\n h: { value: 3600, unit: 'hour', symbol: 'h' },\n day: { value: 86400, unit: 'day', symbol: 'd' },\n week: { value: 604800, unit: 'week', symbol: 'wk' },\n month: { value: 2629800, unit: 'month', symbol: 'mo', note: 'average month = 30.44 days' },\n year: { value: 31557600, unit: 'year', symbol: 'yr', note: 'average year = 365.25 days' }\n },\n\n // Voltage\n voltage: {\n V: { value: 1, unit: 'volt', symbol: 'V' },\n mV: { value: 0.001, unit: 'millivolt', symbol: 'mV' },\n kV: { value: 1000, unit: 'kilovolt', symbol: 'kV' },\n MV: { value: 1e6, unit: 'megavolt', symbol: 'MV' },\n GV: { value: 1e9, unit: 'gigavolt', symbol: 'GV' },\n statV: { value: 299.792458, unit: 'statvolt', symbol: 'statV', note: 'CGS unit' },\n abV: { value: 1e-8, unit: 'abvolt', symbol: 'abV', note: 'CGS electromagnetic unit' }\n },\n\n // Frequency\n frequency: {\n Hz: { value: 1, unit: 'hertz', symbol: 'Hz', note: '1 cycle per second' },\n kHz: { value: 1e3, unit: 'kilohertz', symbol: 'kHz' },\n MHz: { value: 1e6, unit: 'megahertz', symbol: 'MHz' },\n GHz: { value: 1e9, unit: 'gigahertz', symbol: 'GHz' },\n THz: { value: 1e12, unit: 'terahertz', symbol: 'THz' }\n },\n\n // Power\n power: {\n W: { value: 1, unit: 'watt', symbol: 'W', note: '1 joule per second' },\n mW: { value: 0.001, unit: 'milliwatt', symbol: 'mW' },\n kW: { value: 1000, unit: 'kilowatt', symbol: 'kW' },\n MW: { value: 1e6, unit: 'megawatt', symbol: 'MW' },\n GW: { value: 1e9, unit: 'gigawatt', symbol: 'GW' },\n HP: { value: 745.7, unit: 'horsepower', symbol: 'HP', note: 'mechanical HP = 745.7 W' },\n kcal_per_h: { value: 1.163, unit: 'kilocalorie per hour', symbol: 'kcal/h', note: '= 1.163 W' },\n BTU_per_h: { value: 0.29307107, unit: 'BTU per hour', symbol: 'BTU/h', note: '= 0.293 W' }\n },\n\n // Sound\n sound: {\n dB: { value: 1, unit: 'decibel', symbol: 'dB', note: 'logarithmic unit of sound intensity' },\n dBA: { value: 1, unit: 'A-weighted decibel', symbol: 'dBA', note: 'Adjusted for human hearing' },\n dBC: { value: 1, unit: 'C-weighted decibel', symbol: 'dBC', note: 'Flat weighting for high-level sounds' }\n },\n\n // Temperature\n temperature: {\n K: { value: 1, unit: 'kelvin', symbol: 'K' },\n C: { value: 1, unit: 'Celsius', symbol: '°C', note: '°C → K: add 273.15' },\n F: { value: 1, unit: 'Fahrenheit', symbol: '°F', note: '°F → K: (°F - 32) * 5/9 + 273.15' }\n },\n\n // Pressure\n pressure: {\n Pa: { value: 1, unit: 'pascal', symbol: 'Pa' },\n kPa: { value: 1000, unit: 'kilopascal', symbol: 'kPa' },\n MPa: { value: 1e6, unit: 'megapascal', symbol: 'MPa' },\n bar: { value: 1e5, unit: 'bar', symbol: 'bar' },\n atm: { value: 101325, unit: 'atmosphere', symbol: 'atm' },\n psi: { value: 6894.757, unit: 'pound per square inch', symbol: 'psi' },\n mmHg:{ value: 133.322, unit: 'millimeter of mercury', symbol: 'mmHg' }\n },\n\n // Energy\n energy: {\n J: { value: 1, unit: 'joule', symbol: 'J' },\n kJ: { value: 1000, unit: 'kilojoule', symbol: 'kJ' },\n cal: { value: 4.184, unit: 'calorie', symbol: 'cal' },\n kcal:{ value: 4184, unit: 'kilocalorie', symbol: 'kcal' },\n eV: { value: 1.60218e-19, unit: 'electronvolt', symbol: 'eV' },\n BTU: { value: 1055.06, unit: 'BTU', symbol: 'BTU' }\n },\n\n // Force\n force: {\n N: { value: 1, unit: 'newton', symbol: 'N' },\n kN: { value: 1000, unit: 'kilonewton', symbol: 'kN' },\n lbf: { value: 4.44822, unit: 'pound-force', symbol: 'lbf' },\n kgf: { value: 9.80665, unit: 'kilogram-force', symbol: 'kgf' },\n dyne:{ value: 1e-5, unit: 'dyne', symbol: 'dyn' }\n },\n\n // Area\n area: {\n m2: { value: 1, unit: 'square meter', symbol: 'm²' },\n cm2: { value: 0.0001, unit: 'square centimeter', symbol: 'cm²' },\n km2: { value: 1e6, unit: 'square kilometer', symbol: 'km²' },\n acre: { value: 4046.856, unit: 'acre', symbol: 'acre' },\n hectare:{ value: 10000, unit: 'hectare', symbol: 'ha' },\n ft2: { value: 0.092903, unit: 'square foot', symbol: 'ft²' },\n yd2: { value: 0.836127, unit: 'square yard', symbol: 'yd²' }\n },\n\n // Volume\n volume: {\n m3: { value: 1, unit: 'cubic meter', symbol: 'm³' },\n L: { value: 0.001, unit: 'liter', symbol: 'L' },\n mL: { value: 1e-6, unit: 'milliliter', symbol: 'mL' },\n gallon:{ value: 0.00378541, unit: 'US gallon', symbol: 'gal' },\n pint: { value: 0.000473176, unit: 'US pint', symbol: 'pt' },\n floz: { value: 2.9574e-5, unit: 'US fluid ounce', symbol: 'fl oz' }\n },\n\n // Electrical Current\n current: {\n A: { value: 1, unit: 'ampere', symbol: 'A' },\n mA: { value: 0.001, unit: 'milliampere', symbol: 'mA' },\n uA: { value: 0.000001, unit: 'microampere', symbol: 'uA' },\n kA: { value: 1000, unit: 'kiloampere', symbol: 'kA' }\n },\n\n // Resistance / Conductance\n resistance: {\n ohm: { value: 1, unit: 'ohm' },\n kohm: { value: 1000, unit: 'kiloohm'},\n megaohm: { value: 1e6, unit: 'megaohm'},\n S: { value: 1, unit: 'siemens', symbol: 'S', note: 'conductance' }\n },\n\n // Capacitance / Inductance\n capacitance: {\n F: { value: 1, unit: 'farad', symbol: 'F' },\n mF: { value: 0.001, unit: 'millifarad'},\n uF: { value: 0.000001, unit: 'microfarad' }\n },\n inductance: {\n H: { value: 1, unit: 'henry', symbol: 'H' },\n mH: { value: 0.001, unit: 'millihenry', symbol: 'mH' },\n uH: { value: 0.000001, unit: 'microhenry', symbol: 'uH' }\n },\n\n // Luminous Intensity / Illuminance\n light: {\n cd: { value: 1, unit: 'candela', symbol: 'cd' },\n lm: { value: 1, unit: 'lumen', symbol: 'lm' },\n lx: { value: 1, unit: 'lux', symbol: 'lx' }\n },\n\n // Data / Digital Storage\n data: {\n bit: { value: 1, unit: 'bit', symbol: 'bit' },\n B: { value: 8, unit: 'byte', symbol: 'B' },\n KB: { value: 8e3, unit: 'kilobyte', symbol: 'KB' },\n MB: { value: 8e6, unit: 'megabyte', symbol: 'MB' },\n GB: { value: 8e9, unit: 'gigabyte', symbol: 'GB' },\n TB: { value: 8e12, unit: 'terabyte', symbol: 'TB' }\n },\n\n // Angle\n angle: {\n deg: { value: 1, unit: 'degree', symbol: '°' },\n rad: { value: 57.2958, unit: 'radian', symbol: 'rad', note: '1 rad = 57.2958°' },\n grad:{ value: 0.9, unit: 'grad', symbol: 'grad', note: '1 grad = 0.9°' }\n },\n radiation: {\n // Absorbed Dose\n Gy: { value: 1, unit: 'gray', symbol: 'Gy', note: 'Absorbed dose: 1 Gy = 1 J/kg' },\n mGy: { value: 0.001, unit: 'milligray', symbol: 'mGy' },\n rad: { value: 0.01, unit: 'rad', symbol: 'rad', note: '1 rad = 0.01 Gy' },\n\n // Dose Equivalent\n Sv: { value: 1, unit: 'sievert', symbol: 'Sv', note: 'Biological effect dose equivalent' },\n mSv: { value: 0.001, unit: 'millisievert', symbol: 'mSv' },\n rem: { value: 0.01, unit: 'rem', symbol: 'rem', note: '1 rem = 0.01 Sv' },\n\n // Radioactivity\n Bq: { value: 1, unit: 'becquerel', symbol: 'Bq', note: '1 decay per second' },\n kBq: { value: 1e3, unit: 'kilobecquerel', symbol: 'kBq' },\n MBq: { value: 1e6, unit: 'megabecquerel', symbol: 'MBq' },\n GBq: { value: 1e9, unit: 'gigabecquerel', symbol: 'GBq' },\n Ci: { value: 3.7e10, unit: 'curie', symbol: 'Ci', note: '1 Ci = 3.7 x 10¹⁰ decays per second' },\n mCi: { value: 3.7e7, unit: 'millicurie', symbol: 'mCi' }\n }\n};","const validVarName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\nexport function createVarStore(initial = {}) {\n let store = Object.create(null);\n \n\n for (const key in initial) {\n store[key] = initial[key];\n }\n\n return {\n set(name, value, { override = true } = {}) {\n\n // Name validation\n if (typeof name !== \"string\" || !name) {\n throw new Error(\"Variable name must be a non-empty string\");\n }\n\n if (!validVarName.test(name)) {\n throw new Error(`Variable Name Error: '${name}' is not a valid variable name`);\n }\n\n // Value validation\n if (value === undefined) {\n throw new Error(`Variable Value Error: '${name}' cannot be undefined`);\n }\n\n // Prevent overwrite (optional)\n if (!override && name in variablesDB) {\n throw new Error(`Variable '${name}' already exists`);\n }\n\n store[name] = value;\n },\n\n //get variable\n get(name) {\n return store[name];\n },\n\n // check existence\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n // remove variable\n remove(name) {\n delete store[name];\n },\n\n // get all variables (snapshot)\n all() {\n return { ...store };\n },\n\n // clear all\n clear() {\n store = Object.create(null);\n },\n\n // merge multiple variables\n merge(obj = {}) {\n for (const key in obj) {\n store[key] = obj[key];\n }\n },\n\n // clone store (for scoped instances) \n clone() {\n return createVarStore(store);\n }\n };\n}\n\nexport default { createVarStore };","import { unwrapDenseMatrix, wrapDenseMatrix } from \"../utils/matrix.js\";\n\nfunction validateSquareMatrix(matrix) {\n matrix = unwrapDenseMatrix(matrix);\n if (!Array.isArray(matrix) || matrix.length === 0) {\n throw new Error(\"det() expects a non-empty matrix\");\n }\n\n if (!matrix.every(Array.isArray)) {\n throw new Error(\"det() expects a 2D matrix\");\n }\n\n const size = matrix.length;\n if (!matrix.every((row) => row.length === size)) {\n throw new Error(\"det() expects a square matrix\");\n }\n\n for (const row of matrix) {\n for (const value of row) {\n if (typeof value !== \"number\" && typeof value !== \"bigint\") {\n throw new Error(\"det() matrix values must be numeric\");\n }\n }\n }\n}\n\nfunction determinant(matrix) {\n matrix = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n\n if (matrix.length === 1) {\n return matrix[0][0];\n }\n\n if (matrix.length === 2) {\n return (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);\n }\n\n return matrix[0].reduce((sum, value, columnIndex) => {\n const minor = matrix.slice(1).map((row) =>\n row.filter((_, index) => index !== columnIndex)\n );\n const cofactor = columnIndex % 2 === 0 ? value : -value;\n return sum + (cofactor * determinant(minor));\n }, 0);\n}\n\nfunction toLinearArray(value) {\n const unwrapped = unwrapDenseMatrix(value);\n return Array.isArray(unwrapped) ? unwrapped : value;\n}\n\nfunction asMatrixData(value) {\n const data = unwrapDenseMatrix(value);\n if (!Array.isArray(data)) {\n throw new Error(\"Expected matrix data\");\n }\n return data;\n}\n\nfunction solveLinearSystem(coefficients, constants) {\n const n = coefficients.length;\n const augmented = coefficients.map((row, rowIndex) => [...row, constants[rowIndex]]);\n\n for (let pivot = 0; pivot < n; pivot++) {\n let maxRow = pivot;\n let maxValue = Math.abs(augmented[pivot][pivot]);\n\n for (let row = pivot + 1; row < n; row++) {\n const current = Math.abs(augmented[row][pivot]);\n if (current > maxValue) {\n maxValue = current;\n maxRow = row;\n }\n }\n\n if (maxValue === 0) {\n throw new Error(\"Linear system is singular\");\n }\n\n if (maxRow !== pivot) {\n [augmented[pivot], augmented[maxRow]] = [augmented[maxRow], augmented[pivot]];\n }\n\n const pivotValue = augmented[pivot][pivot];\n for (let col = pivot; col <= n; col++) {\n augmented[pivot][col] /= pivotValue;\n }\n\n for (let row = 0; row < n; row++) {\n if (row === pivot) continue;\n const factor = augmented[row][pivot];\n for (let col = pivot; col <= n; col++) {\n augmented[row][col] -= factor * augmented[pivot][col];\n }\n }\n }\n\n return augmented.map((row) => row[n]);\n}\n\nfunction lupDecomposition(input) {\n const matrix = asMatrixData(input).map((row) => [...row]);\n validateSquareMatrix(matrix);\n\n const n = matrix.length;\n const permutation = Array.from({ length: n }, (_, index) => index);\n\n for (let pivot = 0; pivot < n; pivot++) {\n let maxRow = pivot;\n let maxValue = Math.abs(matrix[pivot][pivot]);\n\n for (let row = pivot + 1; row < n; row++) {\n const current = Math.abs(matrix[row][pivot]);\n if (current > maxValue) {\n maxValue = current;\n maxRow = row;\n }\n }\n\n if (maxValue === 0) {\n throw new Error(\"Matrix is singular\");\n }\n\n if (maxRow !== pivot) {\n [matrix[pivot], matrix[maxRow]] = [matrix[maxRow], matrix[pivot]];\n [permutation[pivot], permutation[maxRow]] = [permutation[maxRow], permutation[pivot]];\n }\n\n for (let row = pivot + 1; row < n; row++) {\n matrix[row][pivot] /= matrix[pivot][pivot];\n for (let col = pivot + 1; col < n; col++) {\n matrix[row][col] -= matrix[row][pivot] * matrix[pivot][col];\n }\n }\n }\n\n const L = matrix.map((row, rowIndex) =>\n row.map((value, colIndex) => {\n if (rowIndex === colIndex) return 1;\n if (rowIndex > colIndex) return value;\n return 0;\n })\n );\n\n const U = matrix.map((row, rowIndex) =>\n row.map((value, colIndex) => (rowIndex <= colIndex ? value : 0))\n );\n\n return {\n L: wrapDenseMatrix(L),\n U: wrapDenseMatrix(U),\n p: permutation\n };\n}\n\nfunction linearSolve(aInput, bInput) {\n const { L, U, p } = lupDecomposition(aInput);\n const a = asMatrixData(aInput);\n const bData = asMatrixData(bInput);\n const bVector = Array.isArray(bData[0]) ? bData.map((row) => row[0]) : bData;\n\n if (a.length !== bVector.length) {\n throw new Error(\"Right-hand side dimension mismatch\");\n }\n\n const permutedB = p.map((index) => bVector[index]);\n const y = new Array(a.length).fill(0);\n\n for (let row = 0; row < a.length; row++) {\n y[row] = permutedB[row];\n for (let col = 0; col < row; col++) {\n y[row] -= L.data[row][col] * y[col];\n }\n }\n\n const x = new Array(a.length).fill(0);\n for (let row = a.length - 1; row >= 0; row--) {\n x[row] = y[row];\n for (let col = row + 1; col < a.length; col++) {\n x[row] -= U.data[row][col] * x[col];\n }\n x[row] /= U.data[row][row];\n }\n\n return wrapDenseMatrix(x.map((value) => [value]));\n}\n\nfunction solveLyapunov(aInput, qInput) {\n const A = asMatrixData(aInput).map((row) => [...row]);\n const Q = asMatrixData(qInput).map((row) => [...row]);\n validateSquareMatrix(A);\n validateSquareMatrix(Q);\n\n const n = A.length;\n if (Q.length !== n) {\n throw new Error(\"A and Q must have the same dimensions\");\n }\n\n const coefficients = [];\n const constants = [];\n\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n const equation = new Array(n * n).fill(0);\n\n for (let k = 0; k < n; k++) {\n equation[k * n + col] += A[row][k];\n equation[row * n + k] += A[col][k];\n }\n\n coefficients.push(equation);\n constants.push(-Q[row][col]);\n }\n }\n\n const solution = solveLinearSystem(coefficients, constants);\n const X = [];\n\n for (let row = 0; row < n; row++) {\n X.push(solution.slice(row * n, (row + 1) * n));\n }\n\n return wrapDenseMatrix(X);\n}\n\nfunction evaluatePolynomial(coefficients, x) {\n return coefficients.reduce((sum, coefficient, index) => sum + (coefficient * (x ** index)), 0);\n}\n\nfunction syntheticDivide(coefficients, root) {\n const descending = [...coefficients].reverse();\n const quotient = [descending[0]];\n\n for (let index = 1; index < descending.length - 1; index++) {\n quotient.push(descending[index] + (quotient[index - 1] * root));\n }\n\n const remainder = descending[descending.length - 1] + (quotient[quotient.length - 1] * root);\n return {\n quotient: quotient.reverse(),\n remainder\n };\n}\n\nfunction solveQuadratic(coefficients) {\n const [c, b, a] = coefficients;\n const discriminant = (b ** 2) - (4 * a * c);\n if (discriminant < 0) {\n throw new Error(\"Only real roots are supported\");\n }\n\n const sqrtDisc = Math.sqrt(discriminant);\n return [\n (-b + sqrtDisc) / (2 * a),\n (-b - sqrtDisc) / (2 * a)\n ];\n}\n\nfunction polynomialRoots(...coefficients) {\n while (coefficients.length > 1 && coefficients[coefficients.length - 1] === 0) {\n coefficients.pop();\n }\n\n const degree = coefficients.length - 1;\n if (degree < 1) {\n throw new Error(\"polynomialRoot() expects at least a linear polynomial\");\n }\n\n if (degree === 1) {\n const [b, a] = coefficients;\n return [-b / a];\n }\n\n if (degree === 2) {\n return solveQuadratic(coefficients);\n }\n\n if (degree === 3) {\n const constant = coefficients[0];\n const leading = coefficients[3];\n const candidates = [];\n const limit = Math.abs(constant);\n\n for (let divisor = 1; divisor <= Math.max(1, limit); divisor++) {\n if (limit % divisor === 0) {\n candidates.push(divisor, -divisor);\n }\n }\n\n for (const candidate of candidates) {\n if (evaluatePolynomial(coefficients, candidate) === 0) {\n const reduced = syntheticDivide(coefficients, candidate);\n const remainingRoots = solveQuadratic(reduced.quotient);\n return [candidate, ...remainingRoots];\n }\n }\n }\n\n throw new Error(\"polynomialRoot() currently supports degree up to 3\");\n}\n\nfunction dotProduct(a, b) {\n return a.reduce((sum, value, index) => sum + (value * b[index]), 0);\n}\n\nfunction vectorNorm(vector) {\n return Math.sqrt(dotProduct(vector, vector));\n}\n\nfunction scaleVector(vector, scalar) {\n return vector.map((value) => value * scalar);\n}\n\nfunction subtractVectors(a, b) {\n return a.map((value, index) => value - b[index]);\n}\n\nfunction transpose(matrix) {\n return matrix[0].map((_, colIndex) => matrix.map((row) => row[colIndex]));\n}\n\nfunction qrDecomposition(input) {\n const A = asMatrixData(input).map((row) => [...row]);\n if (!A.length || !A.every((row) => row.length === A[0].length)) {\n throw new Error(\"qr() expects a rectangular matrix\");\n }\n\n const rowCount = A.length;\n const colCount = A[0].length;\n const columns = transpose(A);\n const qColumns = [];\n\n for (let col = 0; col < colCount; col++) {\n let vector = [...columns[col]];\n\n for (let existing = 0; existing < qColumns.length; existing++) {\n const projection = dotProduct(qColumns[existing], columns[col]);\n vector = subtractVectors(vector, scaleVector(qColumns[existing], projection));\n }\n\n const norm = vectorNorm(vector);\n if (norm === 0) {\n throw new Error(\"qr() requires linearly independent columns\");\n }\n\n qColumns.push(scaleVector(vector, 1 / norm));\n }\n\n for (let basisIndex = 0; qColumns.length < rowCount && basisIndex < rowCount; basisIndex++) {\n let candidate = Array.from({ length: rowCount }, (_, index) => (index === basisIndex ? 1 : 0));\n\n for (const column of qColumns) {\n const projection = dotProduct(column, candidate);\n candidate = subtractVectors(candidate, scaleVector(column, projection));\n }\n\n const norm = vectorNorm(candidate);\n if (norm > 1e-10) {\n qColumns.push(scaleVector(candidate, 1 / norm));\n }\n }\n\n const Q = Array.from({ length: rowCount }, (_, rowIndex) =>\n qColumns.map((column) => column[rowIndex])\n );\n\n const fullR = Array.from({ length: rowCount }, () => Array(colCount).fill(0));\n for (let row = 0; row < rowCount; row++) {\n for (let col = 0; col < colCount; col++) {\n fullR[row][col] = dotProduct(qColumns[row], columns[col]);\n }\n }\n\n return {\n Q: wrapDenseMatrix(Q),\n R: wrapDenseMatrix(fullR)\n };\n}\n\nfunction splitTerms(expression) {\n const normalized = expression.replace(/\\s+/g, \"\");\n if (!normalized) {\n return [];\n }\n\n return normalized\n .replace(/-/g, \"+-\")\n .split(\"+\")\n .filter(Boolean);\n}\n\nfunction parsePolynomial(expression, variable) {\n const terms = splitTerms(expression);\n const coefficients = new Map();\n\n for (const term of terms) {\n if (term.includes(variable)) {\n const [rawCoeff, rawPower] = term.split(variable);\n let coefficient;\n\n if (rawCoeff === \"\" || rawCoeff === \"+\") coefficient = 1;\n else if (rawCoeff === \"-\") coefficient = -1;\n else {\n const cleaned = rawCoeff.endsWith(\"*\") ? rawCoeff.slice(0, -1) : rawCoeff;\n coefficient = Number(cleaned);\n }\n\n if (!Number.isFinite(coefficient)) {\n throw new Error(\"Unsupported algebra term\");\n }\n\n let power = 1;\n if (rawPower) {\n if (!rawPower.startsWith(\"^\")) {\n throw new Error(\"Unsupported algebra term\");\n }\n\n power = Number(rawPower.slice(1));\n }\n\n if (!Number.isInteger(power) || power < 0) {\n throw new Error(\"Only non-negative integer powers are supported\");\n }\n\n coefficients.set(power, (coefficients.get(power) || 0) + coefficient);\n } else {\n const constant = Number(term);\n if (!Number.isFinite(constant)) {\n throw new Error(\"Unsupported algebra term\");\n }\n coefficients.set(0, (coefficients.get(0) || 0) + constant);\n }\n }\n\n return coefficients;\n}\n\nfunction formatPolynomial(coefficients, variable) {\n const ordered = [...coefficients.entries()]\n .filter(([, coefficient]) => coefficient !== 0)\n .sort((a, b) => b[0] - a[0]);\n\n if (!ordered.length) {\n return \"0\";\n }\n\n return ordered.map(([power, coefficient], index) => {\n const negative = coefficient < 0;\n const absCoeff = Math.abs(coefficient);\n let body;\n\n if (power === 0) {\n body = `${absCoeff}`;\n } else if (power === 1) {\n body = absCoeff === 1 ? variable : `${absCoeff} * ${variable}`;\n } else {\n body = absCoeff === 1\n ? `${variable}^${power}`\n : `${absCoeff} * ${variable}^${power}`;\n }\n\n if (index === 0) {\n return negative ? `-${body}` : body;\n }\n\n return negative ? `- ${body}` : `+ ${body}`;\n }).join(\" \");\n}\n\nfunction simplifyExpression(expression) {\n const compact = expression.replace(/\\s+/g, \"\");\n const variableMatch = compact.match(/[a-zA-Z]+/);\n const variable = variableMatch?.[0] || \"x\";\n const coefficients = parsePolynomial(expression, variable);\n return formatPolynomial(coefficients, variable);\n}\n\nfunction derivativeExpression(expression, variable) {\n const coefficients = parsePolynomial(expression, variable);\n const derived = new Map();\n\n for (const [power, coefficient] of coefficients.entries()) {\n if (power === 0) continue;\n derived.set(power - 1, (derived.get(power - 1) || 0) + (coefficient * power));\n }\n\n return formatPolynomial(derived, variable);\n}\n\nexport const internalFunctions = {\n max: (...args) => {\n if (!args.length) throw new Error(\"max() requires arguments\");\n return Math.max(...args);\n },\n\n min: (...args) => {\n if (!args.length) throw new Error(\"min() requires arguments\");\n return Math.min(...args);\n },\n\n abs: (x) => Math.abs(x),\n\n round: (x) => Math.round(x),\n\n floor: (x) => Math.floor(x),\n\n ceil: (x) => Math.ceil(x),\n\n sqrt: (x) => {\n if (x < 0) throw new Error(\"sqrt() domain error\");\n return Math.sqrt(x);\n },\n\n pow: (a, b) => a ** b,\n det: (matrix) => determinant(matrix),\n polynomialRoot: (...coefficients) => polynomialRoots(...coefficients),\n lsolve: (a, b) => linearSolve(a, b),\n lup: (matrix) => lupDecomposition(matrix),\n lyap: (a, q) => solveLyapunov(a, q),\n qr: (matrix) => qrDecomposition(matrix),\n simplify: (expression) => {\n if (typeof expression !== \"string\") {\n throw new Error(\"simplify() expects an expression string\");\n }\n return simplifyExpression(expression);\n },\n derivative: (expression, variable = \"x\") => {\n if (typeof expression !== \"string\" || typeof variable !== \"string\") {\n throw new Error(\"derivative() expects expression and variable strings\");\n }\n return derivativeExpression(expression, variable);\n },\n\n /* ================= TRIGONOMETRY ================= */\n\n sin: (x) => Math.sin(x),\n cos: (x) => Math.cos(x),\n tan: (x) => Math.tan(x),\n\n asin: (x) => Math.asin(x),\n acos: (x) => Math.acos(x),\n atan: (x) => Math.atan(x),\n\n /* ================= LOG / EXP ================= */\n\n log: (x) => {\n if (x <= 0) throw new Error(\"log() domain error\");\n return Math.log(x);\n },\n\n log10: (x) => {\n if (x <= 0) throw new Error(\"log10() domain error\");\n return Math.log10(x);\n },\n\n exp: (x) => Math.exp(x),\n\n /* ================= RANDOM ================= */\n\n random: () => Math.random(),\n\n /* ================= BOOLEAN / LOGIC ================= */\n\n and: (a, b) => Boolean(a && b),\n\n or: (a, b) => Boolean(a || b),\n\n not: (a) => !a,\n \"!\": (a) => !a,\n\n /* ================= COMPARISON ================= */\n\n eq: (a, b) => a === b,\n\n neq: (a, b) => a !== b,\n \"notEqual\": (a, b) => a !== b,\n\n gt: (a, b) => a > b,\n \"greaterThan\": (a, b) => a > b,\n\n lt: (a, b) => a < b,\n \"lessThan\": (a, b) => a < b,\n\n gte: (a, b) => a >= b,\n \"greaterThanOrEqual\": (a, b) => a >= b,\n\n lte: (a, b) => a <= b,\n \"lessThanOrEqual\": (a, b) => a <= b,\n\n /* ================= UTILITY ================= */\n\n clamp: (x, min, max) => {\n if (min > max) throw new Error(\"clamp(): min > max\");\n return Math.min(Math.max(x, min), max);\n },\n\n if: (condition, a, b) => (condition ? a : b),\n\n /* ================= TYPE ================= */\n\n typeof: (x) => typeof x,\n\n /* ================= STRING ================= */\n\n length: (x) => {\n if (typeof x === \"string\" || Array.isArray(x)) {\n return x.length;\n }\n throw new Error(\"length() expects string or array\");\n }\n};\n","export function buildAST(tokens) {\n let current = 0;\n\n const peek = () => tokens[current];\n const consume = () => tokens[current++];\n\n const match = (type, value) => {\n const t = peek();\n if (!t) return false;\n\n if (t.type !== type) return false;\n\n if (value !== undefined && t.value !== value) return false;\n\n current++;\n return true;\n };\n\n const parseSliceOrIndex = () => {\n let start = null;\n\n if (!(peek()?.type === \"Colon\" || peek()?.type === \"Comma\" || peek()?.type === \"ArrayEnd\")) {\n start = parseExpression();\n }\n\n if (match(\"Colon\")) {\n let end = null;\n\n if (!(peek()?.type === \"Comma\" || peek()?.type === \"ArrayEnd\")) {\n end = parseExpression();\n }\n\n return {\n type: \"SliceExpression\",\n start,\n end\n };\n }\n\n return start;\n };\n\n /* ================= PRIMARY ================= */\n function parsePrimary() {\n const token = consume();\n if (!token) throw new Error(\"Unexpected end of input\");\n\n switch (token.type) {\n case \"Number\":\n case \"BigInt\":\n case \"Boolean\":\n case \"String\":\n return { type: \"Literal\", value: token.value };\n\n case \"ImaginaryLiteral\":\n return { type: \"ImaginaryLiteral\", value: token.value };\n\n case \"NumberWithUnit\":\n return {\n type: \"UnitLiteral\",\n value: token.value,\n unit: token.unit\n };\n\n case \"Identifier\":\n return { type: \"Identifier\", name: token.name };\n \n case \"Function\":\n return {\n type: \"Identifier\",\n name: token.name\n };\n\n case \"Parenthesis\":\n if (token.value === \"(\") {\n const expr = parseExpression();\n\n if (!match(\"Parenthesis\", \")\")) {\n throw new Error(`Expected ')'`);\n }\n\n return expr;\n }\n \n case \"ArrayStart\": {\n const rows = [];\n let currentRow = [];\n\n if (!match(\"ArrayEnd\")) {\n while (true) {\n currentRow.push(parseExpression());\n\n if (match(\"Comma\")) {\n continue;\n }\n\n if (match(\"Semicolon\")) {\n rows.push(currentRow);\n currentRow = [];\n continue;\n }\n\n if (match(\"ArrayEnd\")) {\n rows.push(currentRow);\n break;\n }\n\n throw new Error(`Expected ',', ';', or ']' at ${current}`);\n }\n }\n\n if (!rows.length) {\n return { type: \"ArrayExpression\", elements: [] };\n }\n\n if (rows.length === 1) {\n return { type: \"ArrayExpression\", elements: rows[0] };\n }\n\n return {\n type: \"ArrayExpression\",\n elements: rows.map((elements) => ({\n type: \"ArrayExpression\",\n elements\n }))\n };\n }\n\n case \"BlockStart\": {\n const properties = [];\n\n if (!match(\"BlockEnd\")) {\n do {\n const keyToken = consume();\n\n if (\n keyToken.type !== \"Identifier\" &&\n keyToken.type !== \"String\"\n ) {\n throw new Error(\"Invalid object key\");\n }\n\n if (!match(\"Colon\")) {\n throw new Error(\"Expected ':' after key\");\n }\n\n const value = parseExpression();\n\n properties.push({\n key: keyToken.value,\n value\n });\n\n } while (match(\"Comma\"));\n\n if (!match(\"BlockEnd\")) {\n throw new Error(`Expected '}' at ${current}`);\n }\n }\n\n return { type: \"ObjectExpression\", properties };\n }\n }\n\n throw new Error(`Unexpected token: ${JSON.stringify(token)}`);\n }\n\n /* ================= MEMBER ================= */\n function parseMember() {\n let object = parsePrimary();\n\n while (true) {\n if (match(\"ArrayStart\")) {\n const selectors = [];\n\n if (!match(\"ArrayEnd\")) {\n do {\n selectors.push(parseSliceOrIndex());\n } while (match(\"Comma\"));\n\n if (!match(\"ArrayEnd\")) {\n throw new Error(`Expected ']' at ${current}`);\n }\n }\n\n object = {\n type: \"IndexExpression\",\n object,\n selectors\n };\n continue;\n }\n\n if (match(\"Dot\")) {\n const property = consume();\n\n if (property.type !== \"Identifier\") {\n throw new Error(\"Expected property after '.'\");\n }\n\n object = {\n type: \"MemberExpression\",\n object,\n property: { type: \"Identifier\", name: property.value },\n optional: false\n };\n continue;\n }\n\n if (match(\"Operator\", \"?.\")) {\n const property = consume();\n\n object = {\n type: \"MemberExpression\",\n object,\n property: { type: \"Identifier\", name: property.value },\n optional: true\n };\n continue;\n }\n\n break;\n }\n\n return object;\n }\n\n /* ================= CALL ================= */\n function parseCallChain() {\n let expr = parseMember();\n\n while (peek()?.type === \"Parenthesis\" && peek()?.value === \"(\") {\n consume(); // '('\n\n const args = [];\n\n if (!(peek()?.type === \"Parenthesis\" && peek()?.value === \")\")) {\n do {\n args.push(parseExpression());\n } while (match(\"Comma\"));\n }\n\n if (!match(\"Parenthesis\", \")\")) {\n throw new Error(`Expected ')' at ${current}`);\n }\n\n expr = {\n type: \"CallExpression\",\n callee: expr,\n arguments: args\n };\n }\n\n return expr;\n }\n\n /* ================= UNARY ================= */\n function parseUnary() {\n if (match(\"UnaryOperator\")) {\n const operator = tokens[current - 1].value;\n\n return {\n type: \"UnaryExpression\",\n operator,\n argument: parseUnary()\n };\n }\n\n return parseCallChain();\n }\n\n /* ================= POWER ================= */\n function parsePower() {\n let left = parseUnary();\n\n if (match(\"Operator\", \"^\")) {\n const right = parsePower();\n return {\n type: \"BinaryExpression\",\n operator: \"^\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= MULT ================= */\n function parseMultiplication() {\n let left = parsePower();\n\n while (\n match(\"Operator\", \"*\") ||\n match(\"Operator\", \"/\") ||\n match(\"Operator\", \"%\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parsePower();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ADD ================= */\n function parseAddition() {\n let left = parseMultiplication();\n\n while (match(\"Operator\", \"+\") || match(\"Operator\", \"-\")) {\n const operator = tokens[current - 1].value;\n const right = parseMultiplication();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= UNIT CONVERSION ================= */\n function parseUnitConversion() {\n let left = parseAddition();\n\n const nextKeyword = peek();\n if (nextKeyword?.type === \"Keyword\" && [\"to\", \"in\"].includes(nextKeyword.value)) {\n consume();\n const next = consume();\n\n if (!next || next.type !== \"Unit\") {\n throw new Error(`Expected unit after '${nextKeyword.value}'`);\n }\n\n return {\n type: \"UnitConversion\",\n from: left,\n to: next.value\n };\n }\n\n return left;\n }\n\n /* ================= COMPARISON ================= */\n function parseComparison() {\n let left = parseUnitConversion();\n\n while (\n match(\"Operator\", \">\") ||\n match(\"Operator\", \"<\") ||\n match(\"Operator\", \">=\") ||\n match(\"Operator\", \"<=\") ||\n match(\"Operator\", \"==\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parseUnitConversion();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= LOGICAL ================= */\n function parseLogical() {\n let left = parseComparison();\n\n while (\n match(\"Operator\", \"&&\") ||\n match(\"Operator\", \"||\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parseComparison();\n\n left = {\n type: \"LogicalExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= NULLISH ================= */\n function parseNullish() {\n let left = parseLogical();\n\n while (match(\"Operator\", \"??\")) {\n const right = parseLogical();\n\n left = {\n type: \"LogicalExpression\",\n operator: \"??\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= TERNARY ================= */\n function parseTernary() {\n let test = parseNullish();\n\n if (match(\"Ternary\", \"?\")) {\n const consequent = parseExpression();\n\n if (!match(\"Ternary\", \":\")) {\n throw new Error(\"Expected ':' in ternary\");\n }\n\n const alternate = parseExpression();\n\n return {\n type: \"ConditionalExpression\",\n test,\n consequent,\n alternate\n };\n }\n\n return test;\n }\n\n /* ================= PIPELINE ================= */\n function parsePipeline() {\n let left = parseTernary();\n\n while (match(\"Operator\", \"|>\")) {\n const right = parseTernary();\n\n left = {\n type: \"PipelineExpression\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ASSIGNMENT ================= */\n function parseAssignment() {\n let left = parsePipeline();\n\n if (\n match(\"Operator\", \"=\") ||\n match(\"Operator\", \"+=\") ||\n match(\"Operator\", \"-=\") ||\n match(\"Operator\", \"*=\") ||\n match(\"Operator\", \"/=\")\n ) {\n const operator = tokens[current - 1].value;\n\n if (left.type === \"CallExpression\") {\n const isFunctionTarget =\n left.callee?.type === \"Identifier\" &&\n left.arguments.every((arg) => arg.type === \"Identifier\");\n\n if (!isFunctionTarget) {\n throw new Error(\"Invalid function definition\");\n }\n\n const right = parseAssignment();\n\n return {\n type: \"FunctionAssignmentExpression\",\n operator,\n left: {\n type: \"Identifier\",\n name: left.callee.name\n },\n params: left.arguments.map((arg) => arg.name),\n right\n };\n }\n\n if (\n left.type !== \"Identifier\" &&\n left.type !== \"MemberExpression\" &&\n left.type !== \"IndexExpression\"\n ) {\n throw new Error(\"Invalid assignment target\");\n }\n\n const right = parseAssignment();\n\n return {\n type: \"AssignmentExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ENTRY ================= */\n function parseExpression() {\n return parseAssignment();\n }\n\n const ast = parseExpression();\n\n if (current < tokens.length) {\n throw new Error(\n `Unexpected token at end: ${JSON.stringify(peek())}`\n );\n }\n\n return ast;\n}\n","import { tokenize } from \"../parser/tokenizer.js\";\n// import { infixToPostfix } from \"../parser/infixToPostfix.js\";\nimport { evaluateAST } from \"../parser/evaluator.js\";\nimport { createContext } from \"./context.js\";\nimport { mathOperations } from \"../math/operations.js\";\n\nimport { createUnitsStore } from \"../utils/store.js\";\nimport { globalUnits } from \"../utils/globalUnits.js\";\n\nimport { createVarStore } from \"../variables/store.js\";\nimport { createFunctionRegistry } from \"../function/registry.js\";\nimport { internalFunctions } from \"../function/internal.js\";\nimport { isDenseMatrixWrapper, serializeExprifyValue, wrapDenseMatrix } from \"../utils/matrix.js\";\n\nimport { buildAST } from \"../parser/astBuild.js\";\n\n\n//\n\nconst isComplex = (value) =>\n value && typeof value === \"object\" && \"re\" in value && \"im\" in value;\n\nconst isUnitValue = (value) =>\n value && typeof value === \"object\" && \"value\" in value && \"unit\" in value;\n\nconst isMatrix = (value) =>\n Array.isArray(value) && value.length > 0 && value.every(Array.isArray);\n\nconst formatComplex = (value) => {\n if (!isComplex(value)) return value;\n\n const real = value.re;\n const imaginary = Math.abs(value.im);\n const sign = value.im < 0 ? \"-\" : \"+\";\n\n if (real === 0) {\n if (value.im === 1) return \"i\";\n if (value.im === -1) return \"-i\";\n return `${value.im}i`;\n }\n\n const imagPart = imaginary === 1 ? \"i\" : `${imaginary}i`;\n return `${real} ${sign} ${imagPart}`;\n};\n\nconst formatScalar = (value) => {\n if (typeof value !== \"number\") {\n return String(value);\n }\n\n if (Number.isInteger(value)) {\n return String(value);\n }\n\n return Number(value.toFixed(14)).toString();\n};\n\nconst formatResult = (value) => {\n if (isComplex(value)) {\n return formatComplex(value);\n }\n\n if (isUnitValue(value)) {\n return `${value.value} ${value.unit}`;\n }\n\n if (isDenseMatrixWrapper(value)) {\n return serializeExprifyValue(value);\n }\n\n if (isMatrix(value)) {\n return value.map((row) => row.map(formatScalar).join(\"\\t\")).join(\"\\n\");\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (value && typeof value === \"object\") {\n return serializeExprifyValue(value);\n }\n\n return value;\n};\n\nclass exprify {\n constructor() {\n // Shared state\n this.math = mathOperations;\n this.units = createUnitsStore(globalUnits);\n this.functions = createFunctionRegistry(internalFunctions);\n this.variables = createVarStore();\n this._cache = new Map();\n this.variables.set(\"pi\", Math.PI);\n this.variables.set(\"e\", Math.E);\n this.addFunction(\"parse\", (expression) => {\n if (typeof expression !== \"string\") {\n throw new Error(\"parse() expects an expression string\");\n }\n return expression;\n });\n this.addFunction(\"leafCount\", (value) => {\n const countLeafTokens = (expression) => {\n const strippedKeys = expression.replace(/(^|[{,]\\s*)[a-zA-Z_][a-zA-Z0-9_]*\\s*:/g, \"$1\");\n const matches = strippedKeys.match(/\\d+(\\.\\d+)?(e[+-]?\\d+)?n?|[a-zA-Z_][a-zA-Z0-9_]*/gi);\n return matches ? matches.length : 0;\n };\n\n let ast = value;\n if (typeof value === \"string\") {\n try {\n ast = this.parse(value).ast;\n } catch {\n return countLeafTokens(value);\n }\n }\n\n const countLeaves = (node) => {\n if (!node || typeof node !== \"object\") return 0;\n\n switch (node.type) {\n case \"Literal\":\n case \"ImaginaryLiteral\":\n case \"UnitLiteral\":\n case \"Identifier\":\n return 1;\n default:\n return Object.values(node).reduce((sum, child) => {\n if (Array.isArray(child)) {\n return sum + child.reduce((inner, item) => inner + countLeaves(item), 0);\n }\n\n return sum + countLeaves(child);\n }, 0);\n }\n };\n\n return countLeaves(ast);\n });\n this.addFunction(\"matrix\", (value) => wrapDenseMatrix(value));\n this.addFunction(\"sparse\", (value) => wrapDenseMatrix(value));\n this.addFunction(\"rationalize\", (expression, withDetails = false) => {\n if (typeof expression !== \"string\") {\n throw new Error(\"rationalize() expects an expression string\");\n }\n\n const normalizedExpression = expression\n .replace(/\\s+/g, \"\")\n .replace(/(\\d)([a-zA-Z(])/g, \"$1*$2\")\n .replace(/([a-zA-Z)])(\\d)/g, \"$1*$2\");\n\n const polyKey = (powers) => JSON.stringify(Object.entries(powers).sort(([a], [b]) => a.localeCompare(b)));\n const keyToPowers = (key) => Object.fromEntries(JSON.parse(key));\n const makePoly = (terms = new Map()) => terms;\n const constPoly = (value) => new Map([[polyKey({}), value]]);\n const varPoly = (name) => new Map([[polyKey({ [name]: 1 }), 1]]);\n const cleanPoly = (poly) => new Map([...poly.entries()].filter(([, coeff]) => coeff !== 0));\n const addPoly = (a, b, sign = 1) => {\n const result = new Map(a);\n for (const [key, coeff] of b.entries()) {\n result.set(key, (result.get(key) || 0) + (sign * coeff));\n }\n return cleanPoly(result);\n };\n const multiplyPoly = (a, b) => {\n const result = new Map();\n for (const [keyA, coeffA] of a.entries()) {\n const powersA = keyToPowers(keyA);\n for (const [keyB, coeffB] of b.entries()) {\n const powersB = keyToPowers(keyB);\n const merged = { ...powersA };\n for (const [name, power] of Object.entries(powersB)) {\n merged[name] = (merged[name] || 0) + power;\n }\n const key = polyKey(merged);\n result.set(key, (result.get(key) || 0) + (coeffA * coeffB));\n }\n }\n return cleanPoly(result);\n };\n const powPoly = (poly, exponent) => {\n let result = constPoly(1);\n for (let index = 0; index < exponent; index++) {\n result = multiplyPoly(result, poly);\n }\n return result;\n };\n const rational = (num, den = constPoly(1)) => ({ num, den });\n const addRat = (a, b, sign = 1) => rational(\n addPoly(\n multiplyPoly(a.num, b.den),\n multiplyPoly(b.num, a.den),\n sign\n ),\n multiplyPoly(a.den, b.den)\n );\n const mulRat = (a, b) => rational(multiplyPoly(a.num, b.num), multiplyPoly(a.den, b.den));\n const divRat = (a, b) => rational(multiplyPoly(a.num, b.den), multiplyPoly(a.den, b.num));\n const negRat = (value) => rational(addPoly(new Map(), value.num, -1), value.den);\n const astToRat = (node) => {\n switch (node.type) {\n case \"Literal\":\n return rational(constPoly(node.value));\n case \"Identifier\":\n return rational(varPoly(node.name));\n case \"UnaryExpression\":\n if (node.operator === \"-\") return negRat(astToRat(node.argument));\n throw new Error(\"Unsupported unary operator\");\n case \"BinaryExpression\": {\n const left = astToRat(node.left);\n const right = astToRat(node.right);\n switch (node.operator) {\n case \"+\": return addRat(left, right);\n case \"-\": return addRat(left, right, -1);\n case \"*\": return mulRat(left, right);\n case \"/\": return divRat(left, right);\n case \"^\": {\n if (node.right.type !== \"Literal\" || !Number.isInteger(node.right.value) || node.right.value < 0) {\n throw new Error(\"Unsupported exponent\");\n }\n return rational(\n powPoly(left.num, node.right.value),\n powPoly(left.den, node.right.value)\n );\n }\n default:\n throw new Error(\"Unsupported operator in rationalize()\");\n }\n }\n default:\n throw new Error(\"Unsupported expression in rationalize()\");\n }\n };\n const formatPoly = (poly) => {\n const entries = [...poly.entries()]\n .filter(([, coeff]) => coeff !== 0)\n .sort(([keyA], [keyB]) => {\n const powersA = keyToPowers(keyA);\n const powersB = keyToPowers(keyB);\n const firstVarA = Object.keys(powersA).sort()[0] || \"\";\n const firstVarB = Object.keys(powersB).sort()[0] || \"\";\n\n if (firstVarA !== firstVarB) {\n return firstVarA.localeCompare(firstVarB);\n }\n\n const degreeA = Object.values(powersA).reduce((sum, value) => sum + value, 0);\n const degreeB = Object.values(powersB).reduce((sum, value) => sum + value, 0);\n return degreeB - degreeA;\n });\n\n if (!entries.length) return \"0\";\n\n return entries.map(([key, coeff], index) => {\n const powers = keyToPowers(key);\n const absCoeff = Math.abs(coeff);\n const variablePart = Object.entries(powers)\n .map(([name, power]) => power === 1 ? name : `${name} ^ ${power}`)\n .join(\" * \");\n let body = variablePart;\n\n if (!body) {\n body = `${absCoeff}`;\n } else if (absCoeff !== 1) {\n body = `${absCoeff} * ${body}`;\n }\n\n if (index === 0) {\n return coeff < 0 ? `- ${body}`.replace(\"- \", \"-\") : body;\n }\n\n return coeff < 0 ? `- ${body}` : `+ ${body}`;\n }).join(\" \");\n };\n\n const ast = this.parse(normalizedExpression).ast;\n const result = astToRat(ast);\n const numerator = formatPoly(result.num);\n const denominator = formatPoly(result.den);\n const variableSet = new Set();\n\n for (const poly of [result.num, result.den]) {\n for (const key of poly.keys()) {\n for (const name of Object.keys(keyToPowers(key))) {\n variableSet.add(name);\n }\n }\n }\n\n if (!withDetails) {\n return `(${numerator}) / (${denominator})`;\n }\n\n return {\n numerator,\n denominator,\n coefficients: [],\n variables: [...variableSet].sort(),\n expression: `(${numerator}) / (${denominator})`\n };\n });\n }\n\n setVariable(name, value) {\n this.variables.set(name, value);\n }\n\n getVariable(name) {\n return this.variables.get(name);\n }\n\n addFunction(name, fn) {\n this.functions.register(name, fn);\n }\n\n _createContext() {\n return createContext({\n functions: this.functions,\n variables: this.variables,\n units: this.units,\n evaluate: this.evaluate.bind(this)\n });\n }\n\n tokenize(expr) {\n if (typeof expr !== \"string\") {\n throw new Error(\"Expression must be a string\");\n }\n return tokenize(expr, this._createContext());\n }\n\n parse(expr) {\n const tokens = this.tokenize(expr);\n const ast = buildAST(tokens);\n return { tokens, ast };\n }\n\n evaluate(expr) {\n const { ast } = this.parse(expr);\n return formatResult(evaluateAST(\n ast,\n this._createContext()\n ));\n }\n\n compile(expr) {\n if (this._cache.has(expr)) {\n return this._cache.get(expr);\n }\n\n const { ast } = this.parse(expr);\n\n const compiledFn = (scope = {}) => {\n const baseContext = this._createContext();\n const scopedContext = baseContext.withScope(scope);\n return formatResult(evaluateAST(ast, scopedContext));\n };\n\n this._cache.set(expr, compiledFn);\n return compiledFn;\n }\n\n clearCache() {\n this._cache.clear();\n }\n\n}\n\nexport default exprify;\n","export function createUnitsStore(initial = {}) {\n let units = { ...initial};\n\n // ---------- Helpers ----------\n\n function getAllUnitsFlat() {\n const result = new Set();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n const keyLower = key.toLowerCase();\n result.add(keyLower);\n\n // Unit name\n if (u.unit) {\n const unitLower = u.unit.toLowerCase();\n\n // Avoid duplicate like \"m\" vs \"meter\"\n if (unitLower !== keyLower) {\n // Optional: only single-word units\n if (unitLower.split(/\\s+/).length === 1) {\n result.add(unitLower);\n }\n }\n }\n\n // Symbol\n if (u.symbol) {\n const symbolLower = u.symbol.toLowerCase();\n\n // Avoid duplicate with unit name\n if (!u.unit || symbolLower !== u.unit.toLowerCase()) {\n result.add(symbolLower);\n }\n }\n }\n }\n\n return Array.from(result);\n }\n\n function findUnit(input) {\n input = input.toLowerCase();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n if (\n key.toLowerCase() === input ||\n u.unit?.toLowerCase() === input ||\n u.symbol?.toLowerCase() === input\n ) {\n return { type, key , data: u};\n }\n }\n }\n\n return null;\n }\n\n // ---------- Core Convert ----------\n\n function convert(value, fromUnit, toUnit) {\n const from = findUnit(fromUnit);\n const to = findUnit(toUnit);\n\n if (!from) throw new Error(`Unknown unit: ${fromUnit}`);\n if (!to) throw new Error(`Unknown unit: ${toUnit}`);\n\n if (from.type !== to.type) {\n throw new Error(`Cannot convert ${fromUnit} to ${toUnit} (${to.data.unit || to.key}). ${from.data.unit || from.key} conversion units like ${Object.keys(units[from.type]).join(\", \")}`);\n }\n\n const result = value * (from.data.value / to.data.value);\n\n return { value: result, unit: to.key };\n }\n\n // ---------- Public API ----------\n\n return {\n // Get all units\n getUnits: () => units,\n\n // Replace all units\n setUnits: (newUnits) => {\n units = { ...newUnits };\n },\n\n // Update single type\n updateType: (type, data) => {\n units[type] = { ...units[type], ...data };\n },\n\n // Add new unit\n addUnit: (type, key, unitObj) => {\n if (!units[type]) units[type] = {};\n units[type][key] = unitObj;\n },\n compute(op, left, right) {\n\n const isUnit = (v) =>\n v && typeof v === \"object\" && \"value\" in v && \"unit\" in v;\n\n const apply = (a, b) => {\n switch (op) {\n case \"+\": return a + b;\n case \"-\": return a - b;\n case \"*\": return a * b;\n case \"/\": return a / b;\n case \"%\": return a % b;\n case \"^\": return Math.pow(a, b);\n }\n };\n\n // BOTH UNIT\n if (isUnit(left) && isUnit(right)) {\n\n const from = this.findUnit(right.unit);\n const to = this.findUnit(left.unit);\n\n if (from.type !== to.type) {\n throw new Error(`Cannot operate on different unit types`);\n }\n\n // convert right → left unit\n const r = right.value * (from.data.value / to.data.value);\n\n const result = apply(left.value, r);\n\n // multiplication/division produce compound units\n if (op === \"*\") {\n return { value: result, unit: left.unit };\n }\n\n if (op === \"/\") {\n return { value: result, unit: left.unit };\n }\n\n if (op === \"^\") {\n return { value: result, unit: left.unit };\n }\n\n return { value: result, unit: left.unit };\n }\n\n // ================= LEFT UNIT =================\n if (isUnit(left) && !isUnit(right)) {\n const result = apply(left.value, right);\n\n return { value: result, unit: left.unit };\n }\n\n // ================= RIGHT UNIT =================\n if (!isUnit(left) && isUnit(right)) {\n const result = apply(left, right.value);\n\n if (op === \"/\") {\n return { value: result, unit: right.unit };\n }\n\n return { value: result, unit: right.unit };\n }\n\n // ================= NORMAL =================\n return apply(left, right);\n },\n // Convert\n convert,\n\n // Search helpers\n getAllUnitsFlat,\n findUnit\n };\n}\n","export function createFunctionRegistry(initial = {}) {\n const store = Object.create(null);\n\n for (const key in initial) {\n if (typeof initial[key] === \"function\") {\n store[key] = initial[key];\n }\n }\n\n return {\n getAllFunctionsName() {\n return Object.keys(store);\n },\n // register new formula\n register(name, fn) {\n if (typeof name !== \"string\" || !name) {\n throw new Error(\"Formula name must be a non-empty string\");\n }\n\n if (typeof fn !== \"function\") {\n throw new Error(`Formula \"${name}\" must be callable`);\n }\n\n store[name] = fn;\n },\n\n // get formula\n get(name) {\n return store[name];\n },\n\n // check existence\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n // remove formula\n remove(name) {\n delete store[name];\n },\n\n // list all\n all() {\n return { ...store };\n },\n\n // clear registry\n clear() {\n for (const key in store) {\n delete store[key];\n }\n },\n\n // extend multiple\n extend(formulas = {}) {\n for (const name in formulas) {\n if (typeof formulas[name] === \"function\") {\n store[name] = formulas[name];\n }\n }\n },\n\n // clone (for scoped instances)\n clone() {\n return createFormulaRegistry(store);\n }\n };\n}","export function tokenize(expr, context = {}) {\n const tokens = [];\n let current = \"\";\n let quote = \"\";\n\n const operators = [\"+\", \"-\", \"*\", \"/\", \"%\", \"^\", \"=\", \">\", \"<\", \"!\", \"&\", \"|\"];\n const multiOps = [\n \"==\", \">=\", \"<=\", \"&&\", \"||\",\n \"+=\", \"-=\", \"*=\", \"/=\", \"%=\",\n \"?.\", \"??\", \"|>\"\n ];\n\n const parentheses = \"()\";\n const comma = \",\";\n const semicolon = \";\";\n const keywords = [\"to\", \"in\"];\n // const functions = context.functions?.getAllFunctionsName?.() || [];\n const units = context.units?.getAllUnitsFlat?.() || [];\n\n const isIdentifier = (s) => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s);\n\n function getContext(str, charIndex) {\n // 1. Extract all alphanumeric words into an array\n const words = str.match(/[a-z0-9]+/gi) || [];\n \n // 2. Identify the current character and the one immediately before it\n const currentChar = str[charIndex] || null;\n const prevChar = charIndex > 0 ? str[charIndex - 1] : null;\n \n // 3. Find the word that contains the current charIndex\n let start = charIndex;\n // Move pointer back to the start of the current word\n while (start > 0 && /[a-z0-9]/i.test(str[start - 1])) start--;\n \n let end = charIndex;\n // Move pointer forward to the end of the current word\n while (end < str.length && /[a-z0-9]/i.test(str[end])) end++;\n \n const currentWord = str.substring(start, end);\n\n // 4. Find the word that appears before the currentWord in the sequence\n const currentWordIdx = words.indexOf(currentWord);\n const prevWord = currentWordIdx > 0 ? words[currentWordIdx - 1] : null;\n\n // 5. Find the word that appears after the currentWord\n const nextWord = (currentWordIdx !== -1 && currentWordIdx < words.length - 1) \n ? words[currentWordIdx + 1] \n : null;\n\n return {\n prevWord: prevWord,\n prevChar: prevChar,\n currentWord: currentWord,\n currentChar: currentChar,\n nextWord: nextWord\n };\n }\n\n const isUnaryContext = (prev) =>\n !prev ||\n prev.type === \"Operator\" ||\n prev.type === \"UnaryOperator\" ||\n (prev.type === \"Parenthesis\" && prev.value !== \")\") ||\n prev.type === \"ArrayStart\" ||\n prev.type === \"Semicolon\" ||\n prev.type === \"Comma\" ||\n prev.type === \"Ternary\";\n\n const flushCurrent = (nextChar, index) => {\n if (!current) return;\n\n // BOOLEAN\n if (/^(true|false)$/i.test(current)) {\n tokens.push({ type: \"Boolean\", value: current.toLowerCase() === \"true\" });\n current = \"\";\n return;\n }\n\n // KEYWORD\n if (keywords.includes(current)) {\n tokens.push({ type: \"Keyword\", value: current, pos: index });\n current = \"\";\n return;\n }\n\n // BIGINT\n if (/^\\d+n$/.test(current)) {\n tokens.push({ type: \"BigInt\", value: BigInt(current.slice(0, -1)), pos: index });\n current = \"\";\n return;\n }\n\n // HEX\n if (/^0x[0-9a-fA-F]+$/.test(current)) {\n tokens.push({ type: \"Number\", value: parseInt(current, 16), pos: index });\n current = \"\";\n return;\n }\n\n // BINARY\n if (/^0b[01]+$/.test(current)) {\n tokens.push({ type: \"Number\", value: parseInt(current, 2), pos: index });\n current = \"\";\n return;\n }\n\n // NUMBER (including scientific)\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?$/i.test(current)) {\n tokens.push({ type: \"Number\", value: parseFloat(current), pos: index });\n current = \"\";\n return;\n }\n\n // IMAGINARY NUMBER\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?i$/i.test(current)) {\n tokens.push({\n type: \"ImaginaryLiteral\",\n value: parseFloat(current.slice(0, -1)),\n pos: index\n });\n current = \"\";\n return;\n }\n\n // IMAGINARY UNIT\n if (/^[+-]?i$/i.test(current)) {\n const sign = current[0] === \"-\" ? -1 : 1;\n tokens.push({\n type: \"ImaginaryLiteral\",\n value: sign,\n pos: index\n });\n current = \"\";\n return;\n }\n\n // NUMBER + UNIT\n const numUnit = current.match(/^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]+)$/);\n if (numUnit) {\n const value = parseFloat(numUnit[1]);\n const unit = numUnit[3];\n\n tokens.push({\n type: units.includes(unit) ? \"NumberWithUnit\" : \"UnknownUnit\",\n value,\n unit,\n pos: index\n });\n\n current = \"\";\n return;\n }\n\n // UNIT\n if (units.includes(current)) {\n const {prevWord} = getContext(expr, index);\n if (nextChar !== \"(\") {\n if (prevWord){\n if (!isNaN(parseFloat(prevWord)) || prevWord === \"to\" || prevWord === \"in\") {\n // console.log(\"Context for unit detection:\", {current, prevWord, nextChar});\n\n tokens.push({ type: \"Unit\", value: current, pos: index });\n current = \"\";\n return;\n }\n }\n }\n }\n\n // IDENTIFIER\n if (isIdentifier(current)) {\n if (nextChar === \"(\") {\n tokens.push({\n type: \"Function\",\n name: current,\n pos: index\n });\n } else {\n tokens.push({\n type: \"Identifier\",\n name: current,\n pos: index\n });\n }\n\n current = \"\";\n return;\n }\n\n throw new Error(`Invalid token \"${current}\" at index ${index}`);\n };\n \n\n for (let i = 0; i < expr.length; i++) {\n let char = expr[i];\n let next = expr[i + 1];\n\n // comments\n if (char === \"/\" && next === \"/\") {\n while (i < expr.length && expr[i] !== \"\\n\") i++;\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n i += 2;\n while (i < expr.length && !(expr[i] === \"*\" && expr[i + 1] === \"/\")) i++;\n i++;\n continue;\n }\n\n // string\n if (`\"'`.includes(char)) {\n if (!quote) {\n quote = char;\n current += char;\n } else if (quote === char) {\n current += char;\n tokens.push({\n type: \"String\",\n value: current.slice(1, -1),\n pos: i\n });\n current = \"\";\n quote = \"\";\n } else {\n current += char;\n }\n continue;\n }\n\n if (quote) {\n if (char === \"\\\\\") {\n current += char + expr[++i];\n } else {\n current += char;\n }\n continue;\n }\n\n // multi operators\n const twoChar = char + next;\n if (multiOps.includes(twoChar)) {\n flushCurrent(char, i);\n tokens.push({ type: \"Operator\", value: twoChar, pos: i });\n i++;\n continue;\n }\n\n if (char === \"?\") {\n tokens.push({ type: \"Ternary\", value: \"?\" });\n continue;\n }\n\n // only treat ':' as ternary IF previous token was '?'\n if (char === \":\") {\n flushCurrent(char, i);\n const prev = tokens[tokens.length - 1];\n\n if (prev && prev.type === \"Ternary\") {\n tokens.push({ type: \"Ternary\", value: \":\" });\n } else {\n tokens.push({ type: \"Colon\" });\n }\n continue;\n }\n\n // dot\n if (char === \".\" && /\\d/.test(current) && /\\d/.test(next)) {\n current += char;\n continue;\n }\n\n if (char === \".\") {\n flushCurrent(char, i);\n tokens.push({ type: \"Dot\", pos: i });\n continue;\n }\n\n // operators\n if (operators.includes(char)) {\n flushCurrent(char, i);\n\n const prev = tokens[tokens.length - 1];\n if ((char === \"-\" || char === \"!\") && isUnaryContext(prev)) {\n tokens.push({ type: \"UnaryOperator\", value: char, pos: i });\n } else {\n tokens.push({ type: \"Operator\", value: char, pos: i });\n }\n continue;\n }\n\n // parenthesis\n if (parentheses.includes(char)) {\n flushCurrent(char, i);\n tokens.push({ type: \"Parenthesis\", value: char, pos: i });\n continue;\n }\n\n // array\n if (char === \"[\") {\n flushCurrent(char, i);\n tokens.push({ type: \"ArrayStart\", pos: i });\n continue;\n }\n\n if (char === \"]\") {\n flushCurrent(char, i);\n tokens.push({ type: \"ArrayEnd\", pos: i });\n continue;\n }\n\n // OBJECT START\n if (char === \"{\") {\n flushCurrent(char, i);\n tokens.push({ type: \"BlockStart\", pos: i });\n continue;\n }\n\n // OBJECT END\n if (char === \"}\") {\n flushCurrent(char, i);\n tokens.push({ type: \"BlockEnd\", pos: i });\n continue;\n }\n\n // comma\n if (char === comma) {\n flushCurrent(char, i);\n tokens.push({ type: \"Comma\", pos: i });\n continue;\n }\n\n // semicolon\n if (char === semicolon) {\n flushCurrent(char, i);\n tokens.push({ type: \"Semicolon\", pos: i });\n continue;\n }\n\n // space\n if (char === \" \") {\n flushCurrent(next, i);\n continue;\n }\n\n // build token\n current += char;\n\n if (i === expr.length - 1) {\n flushCurrent(null, i);\n }\n }\n\n if (quote) throw new Error(\"Unclosed string literal\");\n\n // merge number + unit\n const merged = [];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n const next = tokens[i + 1];\n\n if (t?.type === \"Number\" && next?.type === \"Unit\") {\n merged.push({\n type: \"NumberWithUnit\",\n value: t.value,\n unit: next.value,\n pos: t.pos\n });\n i++;\n continue;\n }\n\n merged.push(t);\n }\n\n // implicit multiplication\n const final = [];\n for (let i = 0; i < merged.length; i++) {\n const a = merged[i];\n const b = merged[i + 1];\n\n final.push(a);\n\n if (\n a && b &&\n (\n ([\"Number\", \"Identifier\"].includes(a.type) ||\n (a.type === \"Parenthesis\" && a.value === \")\") ||\n a.type === \"ArrayEnd\") &&\n ([\"Identifier\", \"Function\"].includes(b.type) ||\n (b.type === \"Parenthesis\" && b.value === \"(\"))\n )\n ) {\n final.push({ type: \"Operator\", value: \"*\", implicit: true });\n }\n }\n\n return final;\n}\n"],"names":["isDenseMatrixWrapper","value","exprify","cloneMatrixData","Array","isArray","map","getMatrixSize","data","every","length","Error","wrapDenseMatrix","size","unwrapDenseMatrix","serializeExprifyValue","JSON","stringify","_","current","evaluateAST","node","context","vars","variables","fns","functions","units","isUnitObj","v","isComplex","isMatrix","normalizeMatrix","row","toOneBasedIndex","Number","isInteger","resolveSelector","selector","contextLength","type","startValue","start","endValue","end","result","index","push","toComplex","re","im","simplifyComplex","unit","get","name","right","left","set","object","assigned","matrix","selectors","target","slice","rowSelector","colSelector","rowContextLength","Math","max","rowIndexes","rowsValue","forEach","rowIndex","updatedMatrix","selectionResult","maxCols","colIndexes","normalizedValue","rowOffset","colIndex","colOffset","assignMatrixIndex","operator","fn","args","scopedContext","withScope","params","scopedValues","param","createFunctionScope","register","val","argument","compute","a","b","reduce","sum","multiplyMatrices","denominator","evalComplexBinary","fnName","callee","arguments","arg","leftVal","from","convert","to","elements","el","rows","values","indexMatrix","obj","p","properties","key","optional","property","createContext","evaluate","scope","tempVars","all","k","isValidNumberPair","mathOperations","Object","freeze","power","multiply","divide","add","subtract","modulus","globalUnits","m","symbol","cm","mm","km","um","note","nm","px","em","rem","pt","pc","inch","ft","yd","mi","thou","furlong","nmi","fathom","au","ly","weight","mg","g","kg","t","lb","oz","stone","time","s","min","h","day","week","month","year","voltage","V","mV","kV","MV","GV","statV","abV","frequency","Hz","kHz","MHz","GHz","THz","W","mW","kW","MW","GW","HP","kcal_per_h","BTU_per_h","sound","dB","dBA","dBC","temperature","K","C","F","pressure","Pa","kPa","MPa","bar","atm","psi","mmHg","energy","J","kJ","cal","kcal","eV","BTU","force","N","kN","lbf","kgf","dyne","area","m2","cm2","km2","acre","hectare","ft2","yd2","volume","m3","L","mL","gallon","pint","floz","A","mA","uA","kA","resistance","ohm","kohm","megaohm","S","capacitance","mF","uF","inductance","H","mH","uH","light","cd","lm","lx","bit","B","KB","MB","GB","TB","angle","deg","rad","grad","radiation","Gy","mGy","Sv","mSv","Bq","kBq","MBq","GBq","Ci","mCi","validVarName","createVarStore","initial","store","create","override","test","undefined","variablesDB","has","prototype","hasOwnProperty","call","remove","clear","merge","clone","validateSquareMatrix","determinant","columnIndex","minor","filter","asMatrixData","lupDecomposition","input","n","permutation","pivot","maxRow","maxValue","abs","col","U","solveLyapunov","aInput","qInput","Q","coefficients","constants","equation","fill","solution","augmented","pivotValue","factor","solveLinearSystem","X","evaluatePolynomial","x","coefficient","syntheticDivide","root","descending","reverse","quotient","remainder","solveQuadratic","c","discriminant","sqrtDisc","sqrt","dotProduct","vectorNorm","vector","scaleVector","scalar","subtractVectors","parsePolynomial","expression","variable","terms","normalized","replace","split","Boolean","splitTerms","Map","term","includes","rawCoeff","rawPower","cleaned","endsWith","isFinite","startsWith","constant","formatPolynomial","ordered","entries","sort","negative","absCoeff","body","join","internalFunctions","round","floor","ceil","pow","det","polynomialRoot","pop","degree","candidates","limit","divisor","candidate","polynomialRoots","lsolve","bInput","bData","bVector","permutedB","y","linearSolve","lup","lyap","q","qr","rowCount","colCount","columns","qColumns","existing","projection","norm","basisIndex","column","fullR","R","qrDecomposition","simplify","variableMatch","match","simplifyExpression","derivative","derived","derivativeExpression","sin","cos","tan","asin","acos","atan","log","log10","exp","random","and","or","not","eq","neq","notEqual","gt","greaterThan","lt","lessThan","gte","greaterThanOrEqual","lte","lessThanOrEqual","clamp","if","condition","typeof","buildAST","tokens","peek","consume","parseSliceOrIndex","parseExpression","parseMember","token","expr","currentRow","keyToken","parsePrimary","parseUnary","parseCallChain","parsePower","parseMultiplication","parseUnitConversion","parseAddition","nextKeyword","next","parseComparison","parseLogical","parseTernary","parseNullish","consequent","alternate","parseAssignment","parsePipeline","ast","formatScalar","String","toFixed","toString","formatResult","real","imaginary","sign","formatComplex","isUnitValue","constructor","this","math","findUnit","toLowerCase","u","getUnits","setUnits","newUnits","updateType","addUnit","unitObj","op","isUnit","apply","r","fromUnit","toUnit","keys","getAllUnitsFlat","Set","keyLower","unitLower","symbolLower","createUnitsStore","getAllFunctionsName","extend","formulas","createFormulaRegistry","createFunctionRegistry","_cache","PI","E","addFunction","parse","matches","countLeafTokens","countLeaves","child","inner","item","withDetails","normalizedExpression","polyKey","powers","localeCompare","keyToPowers","fromEntries","constPoly","cleanPoly","poly","coeff","addPoly","multiplyPoly","keyA","coeffA","powersA","keyB","coeffB","powersB","merged","powPoly","exponent","rational","num","den","addRat","astToRat","divRat","formatPoly","firstVarA","firstVarB","degreeA","numerator","variableSet","setVariable","getVariable","_createContext","bind","tokenize","quote","operators","multiOps","keywords","isUnaryContext","prev","flushCurrent","nextChar","pos","BigInt","parseInt","parseFloat","numUnit","prevWord","str","charIndex","words","currentChar","prevChar","currentWord","substring","currentWordIdx","indexOf","nextWord","getContext","isNaN","i","char","twoChar","final","implicit","compile","compiledFn","clearCache"],"mappings":"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"}
1
+ {"version":3,"file":"exprify.min.js","sources":["../src/utils/matrix.js","../src/math/fraction.js","../src/utils/decimal.js","../src/math/bignumber.js","../src/parser/evaluator.js","../src/core/context.js","../src/math/operations.js","../src/utils/globalUnits.js","../src/variables/store.js","../src/function/registry.js","../src/function/internal.js","../src/parser/astBuild.js","../src/core/exprify.js","../src/utils/store.js","../src/parser/tokenizer.js"],"sourcesContent":["export const isDenseMatrixWrapper = (/** @type {any} */ value) =>\n value &&\n typeof value === 'object' &&\n value.exprify === 'DenseMatrix' &&\n 'data' in value &&\n 'size' in value;\n\nexport const cloneMatrixData = (/** @type {any[]} */ value) => {\n if (Array.isArray(value)) {\n return value.map(cloneMatrixData);\n }\n\n return value;\n};\n\nexport const getMatrixSize = (/** @type {any[]} */ data) => {\n if (Array.isArray(data) && data.every(Array.isArray)) {\n return [data.length, data[0]?.length || 0];\n }\n\n if (Array.isArray(data)) {\n return [data.length];\n }\n\n throw new Error('Matrix data must be an array');\n};\n\nexport const wrapDenseMatrix = (/** @type {any[][]} */ data) => ({\n exprify: 'DenseMatrix',\n data: cloneMatrixData(data),\n size: getMatrixSize(data),\n});\n\nexport const unwrapDenseMatrix = (/** @type {any} */ value) =>\n isDenseMatrixWrapper(value) ? cloneMatrixData(value.data) : value;\n\nexport const serializeExprifyValue = (/** @type {any} */ value) => {\n if (isDenseMatrixWrapper(value)) {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value) || (value && typeof value === 'object')) {\n return JSON.stringify(value, (_, current) => {\n if (isDenseMatrixWrapper(current)) {\n return current;\n }\n\n return current;\n });\n }\n\n return value;\n};\n","const gcd = (/** @type {number} */ a, /** @type {number} */ b) => {\n a = Math.abs(a);\n b = Math.abs(b);\n while (b) {\n [a, b] = [b, a % b];\n }\n return a;\n};\n\n/**\n * @param {any} n\n */\nexport function fraction(n, d = 1) {\n if (typeof n !== 'number' || typeof d !== 'number') {\n throw new Error('Fraction requires numeric arguments');\n }\n if (!Number.isInteger(n) || !Number.isInteger(d)) {\n throw new Error('Fraction requires integer arguments');\n }\n if (d === 0) {\n throw new Error('Fraction denominator cannot be zero');\n }\n if (d < 0) {\n n = -n;\n d = -d;\n }\n const g = gcd(n, d);\n return { n: n / g, d: d / g };\n}\n\n/**\n * @param {any} v\n */\nexport function isFraction(v) {\n return v && typeof v === 'object' && 'n' in v && 'd' in v && !('re' in v) && !('unit' in v);\n}\n\n/**\n * @param {{ n: number; d: number; }} a\n * @param {{ d: number; n: number; }} b\n */\nexport function addFrac(a, b) {\n return fraction(a.n * b.d + b.n * a.d, a.d * b.d);\n}\n\n/**\n * @param {{ n: number; d: number; }} a\n * @param {{ d: number; n: number; }} b\n */\nexport function subFrac(a, b) {\n return fraction(a.n * b.d - b.n * a.d, a.d * b.d);\n}\n\n/**\n * @param {{ n: number; d: number; }} a\n * @param {{ n: number; d: number; }} b\n */\nexport function mulFrac(a, b) {\n return fraction(a.n * b.n, a.d * b.d);\n}\n\n/**\n * @param {{ n: number; d: number; }} a\n * @param {{ d: number; n: number; }} b\n */\nexport function divFrac(a, b) {\n return fraction(a.n * b.d, a.d * b.n);\n}\n\n/**\n * @param {{ n: number; d: number; }} a\n * @param {any} exp\n */\nexport function powFrac(a, exp) {\n if (!Number.isInteger(exp) || exp < 0) {\n return null;\n }\n return fraction(a.n ** exp, a.d ** exp);\n}\n\n/**\n * @param {{ n: any; }} v\n */\nexport function numer(v) {\n if (!isFraction(v)) {\n throw new Error('numer() expects a fraction');\n }\n return v.n;\n}\n\n/**\n * @param {{ d: any; }} v\n */\nexport function denom(v) {\n if (!isFraction(v)) {\n throw new Error('denom() expects a fraction');\n }\n return v.d;\n}\n\n/**\n * @param {{ d: number; n: any; }} v\n */\nexport function formatFraction(v) {\n if (!isFraction(v)) {\n return String(v);\n }\n if (v.d === 1) {\n return String(v.n);\n }\n return `${v.n}/${v.d}`;\n}\n","const MAX_SAFE_DP = 100;\n\nexport class ExprDecimal {\n static DP = 20;\n\n #sign;\n #int;\n #dp;\n\n constructor(value) {\n if (value instanceof ExprDecimal) {\n this.#sign = value.#sign;\n this.#int = value.#int;\n this.#dp = value.#dp;\n return;\n }\n\n if (typeof value === 'bigint') {\n this.#sign = value >= 0n ? 1 : -1;\n this.#int = value >= 0n ? value : -value;\n this.#dp = 0;\n return;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`Cannot create ExprDecimal from ${value}`);\n }\n value = String(value);\n }\n\n if (typeof value !== 'string') {\n throw new Error('ExprDecimal expects a number, string, bigint, or ExprDecimal');\n }\n\n let s = value.trim();\n if (s === '') {\n throw new Error('Cannot create ExprDecimal from empty string');\n }\n\n this.#sign = 1;\n if (s[0] === '-') {\n this.#sign = -1;\n s = s.slice(1);\n } else if (s[0] === '+') {\n s = s.slice(1);\n }\n\n let exp = 0;\n const eIdx = s.search(/[eE]/);\n if (eIdx !== -1) {\n exp = parseInt(s.slice(eIdx + 1), 10);\n s = s.slice(0, eIdx);\n }\n\n const dotIdx = s.indexOf('.');\n if (dotIdx === -1) {\n this.#int = BigInt(s || '0');\n this.#dp = 0;\n } else {\n const intPart = s.slice(0, dotIdx) || '0';\n const fracPart = s.slice(dotIdx + 1);\n const combined = intPart + fracPart;\n this.#int = BigInt(combined || '0');\n this.#dp = fracPart.length;\n }\n\n this.#dp -= exp;\n if (this.#dp < 0) {\n this.#int *= 10n ** BigInt(-this.#dp);\n this.#dp = 0;\n }\n\n this.#normalize();\n }\n\n #normalize() {\n while (this.#dp > 0 && this.#int % 10n === 0n) {\n this.#int /= 10n;\n this.#dp--;\n }\n if (this.#int === 0n) {\n this.#sign = 1;\n this.#dp = 0;\n }\n }\n\n #align(other) {\n if (this.#dp === other.#dp) {\n return [this.#int * BigInt(this.#sign), other.#int * BigInt(other.#sign), this.#dp];\n }\n if (this.#dp < other.#dp) {\n const factor = 10n ** BigInt(other.#dp - this.#dp);\n return [this.#int * factor * BigInt(this.#sign), other.#int * BigInt(other.#sign), other.#dp];\n }\n const factor = 10n ** BigInt(this.#dp - other.#dp);\n return [this.#int * BigInt(this.#sign), other.#int * factor * BigInt(other.#sign), this.#dp];\n }\n\n #fromParts(sign, int, dp) {\n const d = new ExprDecimal(0);\n d.#sign = sign;\n d.#int = int < 0n ? -int : int;\n if (int < 0n) {\n d.#sign = -sign;\n }\n d.#dp = dp;\n d.#normalize();\n return d;\n }\n\n plus(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const [a, b, dp] = this.#align(other);\n return this.#fromParts(1, a + b, dp);\n }\n\n minus(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const [a, b, dp] = this.#align(other);\n return this.#fromParts(1, a - b, dp);\n }\n\n times(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const int = this.#int * other.#int;\n const dp = this.#dp + other.#dp;\n return this.#fromParts(this.#sign * other.#sign, int, dp);\n }\n\n div(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n if (other.#int === 0n) {\n throw new Error('Division by zero');\n }\n const targetDp = Math.min(ExprDecimal.DP, MAX_SAFE_DP);\n const scale = 10n ** BigInt(targetDp + other.#dp);\n const dividend = this.#int * scale;\n const quotient = dividend / other.#int;\n const sign = this.#sign * other.#sign;\n if (quotient === 0n) {\n return new ExprDecimal(0);\n }\n return this.#fromParts(sign, quotient, targetDp);\n }\n\n mod(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const quotient = this.div(other);\n const truncated = quotient.#fromParts(\n quotient.#sign,\n quotient.#int - (quotient.#int % 10n ** BigInt(quotient.#dp > 0 ? 1 : 0)),\n 0\n );\n return this.minus(truncated.times(other));\n }\n\n pow(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n if (other.#dp > 0 || other.#sign !== 1) {\n throw new Error('ExprDecimal pow() supports non-negative integer exponents only');\n }\n const exp = Number(other.#int);\n if (exp > 100) {\n throw new Error('ExprDecimal pow() exponent too large');\n }\n let result = new ExprDecimal(1);\n for (let i = 0; i < exp; i++) {\n result = result.times(this);\n }\n return result;\n }\n\n negated() {\n const d = new ExprDecimal(this);\n d.#sign = -d.#sign;\n if (d.#int === 0n) {\n d.#sign = 1;\n }\n return d;\n }\n\n eq(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const [a, b] = this.#align(other);\n return a === b;\n }\n\n gt(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const [a, b] = this.#align(other);\n return a > b;\n }\n\n lt(other) {\n other = other instanceof ExprDecimal ? other : new ExprDecimal(other);\n const [a, b] = this.#align(other);\n return a < b;\n }\n\n gte(other) {\n return this.gt(other) || this.eq(other);\n }\n\n lte(other) {\n return this.lt(other) || this.eq(other);\n }\n\n toString() {\n let s = this.#int.toString();\n const edp = this.#dp;\n\n const toScientific = (intStr, exponent) => {\n const coeffInt = intStr[0];\n const coeffFrac = intStr.slice(1).replace(/0+$/, '');\n let r = coeffInt;\n if (coeffFrac) {\n r += `.${coeffFrac}`;\n }\n r += 'e';\n r += exponent >= 0 ? '+' : '';\n r += exponent;\n return this.#sign === -1 ? `-${r}` : r;\n };\n\n if (edp === 0) {\n if (s.length > 15) {\n return toScientific(s, s.length - 1);\n }\n return this.#sign === -1 ? `-${s}` : s;\n }\n\n while (s.length <= edp) {\n s = `0${s}`;\n }\n const dotPos = s.length - edp;\n const intPartRaw = s.slice(0, dotPos);\n const intTrimmed = intPartRaw.replace(/^0+/, '') || '0';\n const fracRaw = s.slice(dotPos);\n\n if (intTrimmed.length > 15 || (intTrimmed === '0' && fracRaw.replace(/0+$/, '').length > 15)) {\n const normalized = s.replace(/^0+/, '') || '0';\n const leadZeros = s.length - normalized.length;\n return toScientific(normalized, dotPos - leadZeros - 1);\n }\n\n const intPart = intPartRaw || '0';\n const fracPart = fracRaw.replace(/0+$/, '');\n if (fracPart === '') {\n return this.#sign === -1 ? `-${intPart}` : intPart;\n }\n return `${this.#sign === -1 ? '-' : ''}${intPart}.${fracPart}`;\n }\n\n toNumber() {\n return Number(this.toString());\n }\n\n static isDecimal(value) {\n return value instanceof ExprDecimal;\n }\n}\n\nexport default ExprDecimal;\n","import { ExprDecimal } from '../utils/decimal.js';\n\n/**\n * @param {any} value\n */\nexport function bigNumber(value) {\n if (ExprDecimal.isDecimal(value)) {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'bigint') {\n return new ExprDecimal(value);\n }\n throw new Error('bignumber() expects a number, string, or bigint');\n}\n\n/**\n * @param {unknown} v\n */\nexport function isBigNumber(v) {\n return ExprDecimal.isDecimal(v);\n}\n\n/**\n * @param {ExprDecimal} v\n */\nexport function formatBigNumber(v) {\n if (!ExprDecimal.isDecimal(v)) {\n return String(v);\n }\n return v.toString();\n}\n","import { unwrapDenseMatrix, wrapDenseMatrix, isDenseMatrixWrapper } from '../utils/matrix.js';\nimport {\n isFraction,\n fraction as createFrac,\n addFrac,\n subFrac,\n mulFrac,\n divFrac,\n powFrac,\n} from '../math/fraction.js';\nimport { isBigNumber, bigNumber as createBN } from '../math/bignumber.js';\n\n/** @param {any } node*/\nexport function evaluateAST(node, context = {}) {\n const vars = context.variables;\n const fns = context.functions;\n const units = context.units;\n\n const isUnitObj = (/** @type {any} */ v) =>\n v && typeof v === 'object' && 'value' in v && 'unit' in v;\n const isComplex = (/** @type {any} */ v) => v && typeof v === 'object' && 're' in v && 'im' in v;\n const isSliceNode = (/** @type {any} */ v) =>\n v && typeof v === 'object' && v.type === 'SliceExpression';\n const isMatrix = (/** @type {any[]} */ v) =>\n Array.isArray(v) && v.length > 0 && v.every(Array.isArray);\n const isMatrixLike = (/** @type {any} */ v) => isMatrix(v) || isDenseMatrixWrapper(v);\n\n const normalizeMatrix = (/** @type {any[]} */ value) => {\n value = unwrapDenseMatrix(value);\n if (isMatrix(value)) {\n return value.map((/** @type {any} */ row) => [...row]);\n }\n if (Array.isArray(value)) {\n return [value];\n }\n throw new Error('Expected matrix-compatible value');\n };\n\n const nodeError = (/** @type {string} */ msg) => {\n const pos = node && node.pos !== undefined ? ` at position ${node.pos}` : '';\n return new Error(`${msg}${pos}`);\n };\n\n const toOneBasedIndex = (/** @type {unknown} */ value) => {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n throw new Error('Matrix indices must be positive integers');\n }\n\n return value - 1;\n };\n\n const resolveSelector = (\n /** @type {{ start: null | undefined; end: null | undefined; }} */ selector,\n /** @type {number} */ contextLength\n ) => {\n if (isSliceNode(selector)) {\n const startValue =\n selector.start === null || selector.start === undefined\n ? 1\n : evaluateAST(selector.start, context);\n const endValue =\n selector.end === null || selector.end === undefined\n ? contextLength\n : evaluateAST(selector.end, context);\n const start = toOneBasedIndex(startValue);\n const end = toOneBasedIndex(endValue);\n\n if (end < start) {\n return [];\n }\n\n const result = [];\n for (let index = start; index <= end; index++) {\n result.push(index);\n }\n return result;\n }\n\n return [toOneBasedIndex(evaluateAST(selector, context))];\n };\n\n const indexMatrix = (/** @type {any} */ matrix, /** @type {string | any[]} */ selectors) => {\n const target = normalizeMatrix(matrix);\n\n if (selectors.length === 1) {\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const rows = rowIndexes.map((/** @type {number} */ rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error('Row index out of range');\n }\n return [...target[rowIndex]];\n });\n\n return rows.length === 1 ? rows[0] : rows;\n }\n\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const colIndexes = resolveSelector(selectors[1], target[0]?.length || 0);\n\n const values = rowIndexes.map((/** @type {number} */ rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error('Row index out of range');\n }\n\n return colIndexes.map((/** @type {number} */ colIndex) => {\n if (colIndex >= target[rowIndex].length) {\n throw new Error('Column index out of range');\n }\n return target[rowIndex][colIndex];\n });\n });\n\n if (rowIndexes.length === 1 && colIndexes.length === 1) {\n return values[0][0];\n }\n\n if (rowIndexes.length === 1) {\n return values[0];\n }\n\n if (colIndexes.length === 1) {\n return values.map((/** @type {any[]} */ row) => [row[0]]);\n }\n\n return values;\n };\n\n const assignMatrixIndex = (\n /** @type {any[]} */ matrix,\n /** @type {string | any[]} */ selectors,\n /** @type {any} */ value\n ) => {\n const target = isMatrix(matrix)\n ? matrix.map((/** @type {any} */ row) => [...row])\n : Array.isArray(matrix)\n ? [matrix.slice()]\n : [];\n\n const rowSelector = selectors[0];\n const colSelector = selectors[1];\n\n if (!rowSelector) {\n throw new Error('Matrix assignment requires at least one index');\n }\n\n const rowContextLength = Math.max(target.length, 1);\n const rowIndexes = resolveSelector(rowSelector, rowContextLength);\n\n if (selectors.length === 1) {\n const rowsValue = isMatrix(value) ? value : normalizeMatrix(value);\n\n if (rowsValue.length !== rowIndexes.length) {\n throw new Error('Assigned row count does not match slice');\n }\n\n rowIndexes.forEach(\n (/** @type {string | number} */ rowIndex, /** @type {string | number} */ index) => {\n target[rowIndex] = [...rowsValue[index]];\n }\n );\n\n return {\n updatedMatrix: target,\n selectionResult:\n rowIndexes.length === 1\n ? [target[rowIndexes[0]]]\n : rowIndexes.map((/** @type {string | number} */ rowIndex) => [target[rowIndex]]),\n };\n }\n\n const maxCols = Math.max(\n ...target.map((/** @type {string | any[]} */ row) => row.length),\n 0,\n 1\n );\n const colIndexes = resolveSelector(colSelector, maxCols);\n const normalizedValue = normalizeMatrix(value);\n\n if (normalizedValue.length !== rowIndexes.length) {\n throw new Error('Assigned row count does not match matrix slice');\n }\n\n normalizedValue.forEach((/** @type {string | any[]} */ row, /** @type {any} */ _rowOffset) => {\n if (row.length !== colIndexes.length) {\n throw new Error('Assigned column count does not match matrix slice');\n }\n });\n\n rowIndexes.forEach(\n (/** @type {string | number} */ rowIndex, /** @type {string | number} */ rowOffset) => {\n if (!target[rowIndex]) {\n target[rowIndex] = [];\n }\n\n colIndexes.forEach(\n (/** @type {string | number} */ colIndex, /** @type {string | number} */ colOffset) => {\n target[rowIndex][colIndex] = normalizedValue[rowOffset][colOffset];\n }\n );\n }\n );\n\n return {\n updatedMatrix: target,\n selectionResult:\n rowIndexes.length === 1\n ? [\n colIndexes.map(\n (/** @type {string | number} */ colIndex) => target[rowIndexes[0]][colIndex]\n ),\n ]\n : rowIndexes.map((/** @type {string | number} */ rowIndex) =>\n colIndexes.map(\n (/** @type {string | number} */ colIndex) => target[rowIndex][colIndex]\n )\n ),\n };\n };\n\n const isScalar = (/** @type {any} */ v) => typeof v === 'number' || typeof v === 'bigint';\n\n const multiplyMatrices = (/** @type {any} */ left, /** @type {any} */ right) => {\n if (isScalar(left)) {\n const b = normalizeMatrix(right);\n return b.map((/** @type {any[]} */ row) =>\n row.map((/** @type {number} */ v) => Number(left) * v)\n );\n }\n if (isScalar(right)) {\n const a = normalizeMatrix(left);\n return a.map((/** @type {any[]} */ row) =>\n row.map((/** @type {number} */ v) => v * Number(right))\n );\n }\n const a = normalizeMatrix(left);\n const b = normalizeMatrix(right);\n\n if (a[0].length !== b.length) {\n throw new Error('Matrix dimensions do not allow multiplication');\n }\n\n return a.map((/** @type {any[]} */ row) =>\n b[0].map((/** @type {any} */ _, /** @type {string | number} */ colIndex) =>\n row.reduce(\n (\n /** @type {number} */ sum,\n /** @type {number} */ value,\n /** @type {string | number} */ rowIndex\n ) => sum + value * b[rowIndex][colIndex],\n 0\n )\n )\n );\n };\n\n const addMatrices = (/** @type {any} */ left, /** @type {any} */ right) => {\n const a = normalizeMatrix(left);\n const b = normalizeMatrix(right);\n if (a.length !== b.length || a[0].length !== b[0].length) {\n throw new Error('Matrix dimensions must match for addition');\n }\n return a.map((/** @type {any[]} */ row, /** @type {string | number} */ i) =>\n row.map((/** @type {any} */ v, /** @type {string | number} */ j) => v + b[i][j])\n );\n };\n\n const subtractMatrices = (/** @type {any} */ left, /** @type {any} */ right) => {\n const a = normalizeMatrix(left);\n const b = normalizeMatrix(right);\n if (a.length !== b.length || a[0].length !== b[0].length) {\n throw new Error('Matrix dimensions must match for subtraction');\n }\n return a.map((/** @type {any[]} */ row, /** @type {string | number} */ i) =>\n row.map((/** @type {number} */ v, /** @type {string | number} */ j) => v - b[i][j])\n );\n };\n\n const identityMatrix = (/** @type {any} */ n) =>\n Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)));\n\n const powerMatrix = (/** @type {any} */ left, /** @type {any} */ right) => {\n const a = normalizeMatrix(left);\n if (a.length !== a[0].length) {\n throw new Error('Matrix power requires a square matrix');\n }\n if (!Number.isInteger(right) || right < 0) {\n throw new Error('Matrix power requires a non-negative integer exponent');\n }\n if (right === 0) {\n return identityMatrix(a.length);\n }\n let result = a;\n for (let i = 1; i < right; i++) {\n result = multiplyMatrices(result, a);\n }\n return result;\n };\n\n const toComplex = (/** @type {any} */ value) => {\n if (isComplex(value)) {\n return value;\n }\n if (typeof value === 'number') {\n return { re: value, im: 0 };\n }\n throw new Error('Complex arithmetic only supports numbers');\n };\n\n const fromImaginary = (/** @type {any} */ value) => ({ re: 0, im: value });\n\n const simplifyComplex = (/** @type {{ re: any; im: any; }} */ value) =>\n value.im === 0 ? value.re : value;\n\n const createFunctionScope = (/** @type {any[]} */ params, /** @type {any[]} */ args) => {\n const scopedValues = {};\n\n params.forEach((/** @type {string | number} */ param, /** @type {string | number} */ index) => {\n scopedValues[param] = args[index];\n });\n\n return scopedValues;\n };\n\n const evalComplexBinary = (\n /** @type {any} */ operator,\n /** @type {any} */ left,\n /** @type {any} */ right\n ) => {\n const a = toComplex(left);\n const b = toComplex(right);\n\n switch (operator) {\n case '+':\n return simplifyComplex({ re: a.re + b.re, im: a.im + b.im });\n case '-':\n return simplifyComplex({ re: a.re - b.re, im: a.im - b.im });\n case '*':\n return simplifyComplex({\n re: a.re * b.re - a.im * b.im,\n im: a.re * b.im + a.im * b.re,\n });\n case '/': {\n const denominator = b.re ** 2 + b.im ** 2;\n\n if (denominator === 0) {\n throw new Error('Division by zero');\n }\n\n return simplifyComplex({\n re: (a.re * b.re + a.im * b.im) / denominator,\n im: (a.im * b.re - a.re * b.im) / denominator,\n });\n }\n default:\n throw new Error(`Operator ${operator} is not supported for complex numbers`);\n }\n };\n\n // EVALUATOR\n switch (node.type) {\n case 'Literal':\n return node.value;\n\n case 'ImaginaryLiteral':\n return fromImaginary(node.value);\n\n case 'UnitLiteral':\n return { value: node.value, unit: node.unit };\n\n // VARIABLE\n case 'Identifier':\n return vars.get(node.name);\n\n // Assignment with optional compound operator (+=, -=, *=, /=): read current, apply, write\n case 'AssignmentExpression': {\n let value;\n if (node.operator !== '=') {\n const current = vars.get(node.left.name);\n const right = evaluateAST(node.right, context);\n const op = node.operator.slice(0, -1);\n switch (op) {\n case '+':\n value = current + right;\n break;\n case '-':\n value = current - right;\n break;\n case '*':\n value = current * right;\n break;\n case '/':\n value = current / right;\n break;\n case '%':\n value = current % right;\n break;\n default:\n throw nodeError(`Unknown compound operator ${node.operator}`);\n }\n } else {\n value = evaluateAST(node.right, context);\n }\n\n if (node.left.type === 'Identifier') {\n vars.set(node.left.name, value);\n if (node.right.type === 'ArrayExpression') {\n return wrapDenseMatrix(unwrapDenseMatrix(value));\n }\n return value;\n }\n\n if (node.left.type === 'IndexExpression' && node.left.object.type === 'Identifier') {\n const currentValue = vars.get(node.left.object.name);\n const assigned = assignMatrixIndex(currentValue, node.left.selectors, value);\n vars.set(node.left.object.name, assigned.updatedMatrix);\n return assigned.selectionResult;\n }\n\n throw nodeError('Invalid assignment target');\n }\n\n // User-defined function via f(a,b)=expr: closure evaluates body in a new scope with params bound\n case 'FunctionAssignmentExpression': {\n if (node.operator !== '=') {\n throw nodeError(`Operator ${node.operator} is not supported for function definitions`);\n }\n\n const fn = (/** @type {any} */ ...args) => {\n const scopedContext = context.withScope(createFunctionScope(node.params, args));\n return evaluateAST(node.right, scopedContext);\n };\n\n fns.register(node.left.name, fn);\n return fn;\n }\n\n // UNARY\n case 'UnaryExpression': {\n const val = evaluateAST(node.argument, context);\n\n switch (node.operator) {\n case '-':\n if (isBigNumber(val)) {\n return val.negated();\n }\n if (isComplex(val)) {\n return simplifyComplex({ re: -val.re, im: -val.im });\n }\n return -val;\n case '!':\n return !val;\n }\n\n throw nodeError(`Unknown unary operator ${node.operator}`);\n }\n\n // Dispatch order: unit arithmetic -> matrix arithmetic -> complex arithmetic -> scalar arithmetic\n case 'BinaryExpression': {\n const left = evaluateAST(node.left, context);\n const right = evaluateAST(node.right, context);\n\n // UNIT handling\n if (isUnitObj(left) || isUnitObj(right)) {\n if (!units) {\n throw new Error('Unit system not available');\n }\n\n return units.compute(node.operator, left, right);\n }\n\n if (\n isMatrixLike(left) ||\n isMatrixLike(right) ||\n (node.operator === '*' && (Array.isArray(left) || Array.isArray(right)))\n ) {\n switch (node.operator) {\n case '+':\n return addMatrices(left, right);\n case '-':\n return subtractMatrices(left, right);\n case '*':\n return multiplyMatrices(left, right);\n case '^':\n return powerMatrix(left, right);\n default:\n throw nodeError(`Operator ${node.operator} not supported for matrices`);\n }\n }\n\n if (isFraction(left) || isFraction(right)) {\n const a = isFraction(left) ? left : createFrac(left, 1);\n const b = isFraction(right) ? right : createFrac(right, 1);\n switch (node.operator) {\n case '+':\n return addFrac(a, b);\n case '-':\n return subFrac(a, b);\n case '*':\n return mulFrac(a, b);\n case '/':\n return divFrac(a, b);\n case '^': {\n const p = powFrac(a, right);\n if (p) {\n return p;\n }\n throw nodeError('Fraction power requires non-negative integer exponent');\n }\n default:\n throw nodeError(`Operator ${node.operator} not supported for fractions`);\n }\n }\n\n if (isBigNumber(left) || isBigNumber(right)) {\n const a = isBigNumber(left) ? left : createBN(left);\n const b = isBigNumber(right) ? right : createBN(right);\n switch (node.operator) {\n case '+':\n return a.plus(b);\n case '-':\n return a.minus(b);\n case '*':\n return a.times(b);\n case '/':\n return a.div(b);\n case '%':\n return a.mod(b);\n case '^':\n return a.pow(b);\n case '>':\n return a.gt(b);\n case '<':\n return a.lt(b);\n case '>=':\n return a.gte(b);\n case '<=':\n return a.lte(b);\n case '==':\n return a.eq(b);\n default:\n throw nodeError(`Operator ${node.operator} not supported for BigNumber`);\n }\n }\n\n if (isComplex(left) || isComplex(right)) {\n return evalComplexBinary(node.operator, left, right);\n }\n\n switch (node.operator) {\n case '+':\n return left + right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n case '^':\n return left ** right;\n\n case '>':\n return left > right;\n case '<':\n return left < right;\n case '>=':\n return left >= right;\n case '<=':\n return left <= right;\n case '==':\n return left === right;\n }\n\n throw nodeError(`Unknown operator ${node.operator}`);\n }\n\n // Short-circuit: && returns first falsy, || returns first truthy, ?? returns first non-nullish\n case 'LogicalExpression': {\n const left = evaluateAST(node.left, context);\n\n if (node.operator === '&&') {\n return left && evaluateAST(node.right, context);\n }\n\n if (node.operator === '||') {\n return left || evaluateAST(node.right, context);\n }\n\n if (node.operator === '??') {\n return left ?? evaluateAST(node.right, context);\n }\n\n throw nodeError(`Unknown logical operator ${node.operator}`);\n }\n\n // Range [start..end] inclusive: returns array of integers from floor(start) to floor(end)\n case 'RangeExpression': {\n const start = evaluateAST(node.start, context);\n const end = evaluateAST(node.end, context);\n if (typeof start !== 'number' || typeof end !== 'number') {\n throw nodeError('Range requires numeric bounds');\n }\n const result = [];\n for (let i = Math.floor(start); i <= Math.floor(end); i++) {\n result.push(i);\n }\n return result;\n }\n\n // Lambda: return a callable function evaluating the body with params bound in a new scope\n case 'ArrowFunctionExpression': {\n const fn = (/** @type {any[]} */ ...args) => {\n const scopedContext = context.withScope(createFunctionScope(node.params, args));\n return evaluateAST(node.body, scopedContext);\n };\n return fn;\n }\n\n // Function call: flatten spread (...array) arguments, then invoke\n case 'CallExpression': {\n const fnName = node.callee.name;\n const fn = fns.get(fnName);\n\n const rawArgs = node.arguments.map((/** @type {{ type: string; argument: any; }} */ arg) => {\n if (arg.type === 'SpreadElement') {\n const val = evaluateAST(arg.argument, context);\n if (!Array.isArray(val)) {\n throw new Error('Spread operator requires an array');\n }\n return { spread: true, values: val };\n }\n return { spread: false, value: evaluateAST(arg, context) };\n });\n const args = [];\n for (const arg of rawArgs) {\n if (arg.spread) {\n args.push(...arg.values);\n } else {\n args.push(arg.value);\n }\n }\n\n return fn(...args);\n }\n\n // Pipeline: left value is passed as first argument to the right function/expression\n case 'PipelineExpression': {\n const leftVal = evaluateAST(node.left, context);\n\n // right must be function\n if (node.right.type === 'CallExpression') {\n const fnName = node.right.callee.name;\n const fn = fns.get(fnName);\n\n const args = [\n leftVal,\n ...node.right.arguments.map((/** @type {any} */ arg) => evaluateAST(arg, context)),\n ];\n\n return fn(...args);\n }\n\n if (node.right.type === 'Identifier') {\n const fn = fns.get(node.right.name);\n return fn(leftVal);\n }\n\n throw nodeError('Invalid pipeline target');\n }\n\n // Unit conversion: value fromUnit -> toUnit\n case 'UnitConversion': {\n const from = evaluateAST(node.from, context);\n\n if (!isUnitObj(from)) {\n throw nodeError('Left side must be a unit value');\n }\n\n if (!units) {\n throw nodeError('Unit system not available');\n }\n\n return units.convert(from.value, from.unit, node.to);\n }\n\n // ARRAY\n case 'ArrayExpression':\n return node.elements.map((/** @type {any} */ el) => evaluateAST(el, context));\n\n // Matrix/array indexing: target[selector1, selector2] with 1-based and slice support\n case 'IndexExpression': {\n const target = evaluateAST(node.object, context);\n return indexMatrix(target, node.selectors);\n }\n\n // OBJECT\n case 'ObjectExpression': {\n const obj = {};\n for (const p of node.properties) {\n obj[p.key] = evaluateAST(p.value, context);\n }\n return obj;\n }\n\n // Property access: obj.prop; optional chaining (?.) returns undefined if obj is null/undefined\n case 'MemberExpression': {\n const obj = evaluateAST(node.object, context);\n\n if (node.optional && (obj === null || obj === undefined)) {\n return undefined;\n }\n\n return obj[node.property.name];\n }\n\n default:\n throw nodeError(`Unknown AST node type: ${node.type}`);\n }\n}\n","export function createContext({ variables, functions, units, evaluate }) {\n if (!variables) {\n throw new Error('Variable store missing');\n }\n if (!functions) {\n throw new Error('Function registry missing');\n }\n if (!units) {\n throw new Error('Units list missing');\n }\n if (!evaluate) {\n throw new Error('evaluate function missing');\n }\n\n return {\n variables: variables,\n functions: functions,\n units: units,\n evaluate,\n\n withScope(scope = {}) {\n const tempVars = {\n ...variables.all?.(),\n ...scope,\n };\n return createContext({\n functions: functions,\n evaluate,\n units,\n variables: {\n get: (/** @type {string | number} */ k) => tempVars[k],\n set: (/** @type {string | number} */ k, /** @type {any} */ v) => (tempVars[k] = v),\n all: () => tempVars,\n },\n });\n },\n };\n}\n","const isValidNumberPair = (/** @type {any} */ a, /** @type {any} */ b) =>\n typeof a === typeof b && (typeof a === 'number' || typeof a === 'bigint');\n\nexport const mathOperations = Object.freeze({\n power: function (/** @type {number} */ a, /** @type {number} */ b) {\n if (isValidNumberPair(a, b)) {\n return a ** b;\n }\n throw new Error('Invalid types for ^');\n },\n\n multiply: function (/** @type {number} */ a, /** @type {number} */ b) {\n if (isValidNumberPair(a, b)) {\n return a * b;\n }\n throw new Error('Invalid types for *');\n },\n\n divide: function (/** @type {number} */ a, /** @type {number} */ b) {\n if (isValidNumberPair(a, b)) {\n if (b === 0) {\n throw new Error('Division by zero');\n }\n return a / b;\n }\n throw new Error('Invalid types for /');\n },\n\n add: function (/** @type {string} */ a, /** @type {string} */ b) {\n if (isValidNumberPair(a, b)) {\n return a + b;\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a + b;\n }\n throw new Error('Invalid types for +');\n },\n\n subtract: function (/** @type {number} */ a, /** @type {number} */ b) {\n if (isValidNumberPair(a, b)) {\n return a - b;\n }\n throw new Error('Invalid types for -');\n },\n\n modulus: function (/** @type {number} */ a, /** @type {number} */ b) {\n if (isValidNumberPair(a, b)) {\n return a % b;\n }\n throw new Error('Invalid types for %');\n },\n});\n","export const globalUnits = {\n length: {\n m: { value: 1, unit: 'meter', symbol: 'm' },\n cm: { value: 0.01, unit: 'centimeter', symbol: 'cm' },\n mm: { value: 0.001, unit: 'millimeter', symbol: 'mm' },\n km: { value: 1000, unit: 'kilometer', symbol: 'km' },\n um: { value: 0.000001, unit: 'micrometer', symbol: 'um', note: 'also called micron' },\n nm: { value: 0.000000001, unit: 'nanometer', symbol: 'nm' },\n px: { value: 0.000264583, unit: 'pixel', symbol: 'px', note: '96dpi standard' },\n em: { value: 0.000264583 * 16, unit: 'em', symbol: 'em', note: '1em = 16px by default' },\n rem: { value: 0.000264583 * 16, unit: 'rem', symbol: 'rem', note: 'root em = 16px by default' },\n pt: { value: 0.000352778, unit: 'point', symbol: 'pt', note: '1pt = 1/72 inch' },\n pica: { value: 0.00423333, unit: 'pica', symbol: 'pc', note: '1pc = 12pt' },\n inch: { value: 0.0254, unit: 'inch', symbol: 'in' },\n ft: { value: 0.3048, unit: 'foot', symbol: 'ft' },\n yd: { value: 0.9144, unit: 'yard', symbol: 'yd' },\n mi: { value: 1609.344, unit: 'mile', symbol: 'mi' },\n thou: { value: 0.0000254, unit: 'mil', symbol: 'thou', note: 'thousandth of an inch' },\n furlong: { value: 201.168, unit: 'furlong', symbol: 'fur', note: '220 yards' },\n nmi: { value: 1852, unit: 'nautical mile', symbol: 'nmi' },\n fathom: { value: 1.8288, unit: 'fathom', symbol: 'fathom' },\n au: { value: 1.496e11, unit: 'astronomical unit', symbol: 'AU' },\n ly: { value: 9.4607e15, unit: 'light year', symbol: 'ly' },\n pc: { value: 3.0857e16, unit: 'parsec', symbol: 'pc' },\n },\n\n // Weight / Mass\n weight: {\n mg: { value: 1e-6, unit: 'milligram', symbol: 'mg' },\n g: { value: 0.001, unit: 'gram', symbol: 'g' },\n kg: { value: 1, unit: 'kilogram', symbol: 'kg' },\n t: { value: 1000, unit: 'tonne', symbol: 't', note: 'metric ton' },\n lb: { value: 0.453592, unit: 'pound', symbol: 'lb' },\n oz: { value: 0.0283495, unit: 'ounce', symbol: 'oz' },\n stone: { value: 6.35029, unit: 'stone', symbol: 'st', note: '1 stone = 14 lb' },\n },\n\n // Time\n time: {\n s: { value: 1, unit: 'second', symbol: 's' },\n min: { value: 60, unit: 'minute', symbol: 'min' },\n h: { value: 3600, unit: 'hour', symbol: 'h' },\n day: { value: 86400, unit: 'day', symbol: 'd' },\n week: { value: 604800, unit: 'week', symbol: 'wk' },\n month: { value: 2629800, unit: 'month', symbol: 'mo', note: 'average month = 30.44 days' },\n year: { value: 31557600, unit: 'year', symbol: 'yr', note: 'average year = 365.25 days' },\n },\n\n // Voltage\n voltage: {\n V: { value: 1, unit: 'volt', symbol: 'V' },\n mV: { value: 0.001, unit: 'millivolt', symbol: 'mV' },\n kV: { value: 1000, unit: 'kilovolt', symbol: 'kV' },\n MV: { value: 1e6, unit: 'megavolt', symbol: 'MV' },\n GV: { value: 1e9, unit: 'gigavolt', symbol: 'GV' },\n statV: { value: 299.792458, unit: 'statvolt', symbol: 'statV', note: 'CGS unit' },\n abV: { value: 1e-8, unit: 'abvolt', symbol: 'abV', note: 'CGS electromagnetic unit' },\n },\n\n // Frequency\n frequency: {\n Hz: { value: 1, unit: 'hertz', symbol: 'Hz', note: '1 cycle per second' },\n kHz: { value: 1e3, unit: 'kilohertz', symbol: 'kHz' },\n MHz: { value: 1e6, unit: 'megahertz', symbol: 'MHz' },\n GHz: { value: 1e9, unit: 'gigahertz', symbol: 'GHz' },\n THz: { value: 1e12, unit: 'terahertz', symbol: 'THz' },\n },\n\n // Power\n power: {\n W: { value: 1, unit: 'watt', symbol: 'W', note: '1 joule per second' },\n mW: { value: 0.001, unit: 'milliwatt', symbol: 'mW' },\n kW: { value: 1000, unit: 'kilowatt', symbol: 'kW' },\n MW: { value: 1e6, unit: 'megawatt', symbol: 'MW' },\n GW: { value: 1e9, unit: 'gigawatt', symbol: 'GW' },\n HP: { value: 745.7, unit: 'horsepower', symbol: 'HP', note: 'mechanical HP = 745.7 W' },\n 'kcal/h': { value: 1.163, unit: 'kilocalorie per hour', symbol: 'kcal/h', note: '= 1.163 W' },\n 'BTU/h': { value: 0.29307107, unit: 'BTU per hour', symbol: 'BTU/h', note: '= 0.293 W' },\n },\n\n // Sound\n sound: {\n dB: { value: 1, unit: 'decibel', symbol: 'dB', note: 'logarithmic unit of sound intensity' },\n dBA: {\n value: 1,\n unit: 'A-weighted decibel',\n symbol: 'dBA',\n note: 'Adjusted for human hearing',\n },\n dBC: {\n value: 1,\n unit: 'C-weighted decibel',\n symbol: 'dBC',\n note: 'Flat weighting for high-level sounds',\n },\n },\n\n // Temperature\n temperature: {\n K: { value: 1, unit: 'kelvin', symbol: 'K' },\n C: { value: 1, unit: 'Celsius', symbol: '°C', note: '°C → K: add 273.15' },\n F: { value: 1, unit: 'Fahrenheit', symbol: '°F', note: '°F → K: (°F - 32) * 5/9 + 273.15' },\n },\n\n // Pressure\n pressure: {\n Pa: { value: 1, unit: 'pascal', symbol: 'Pa' },\n kPa: { value: 1000, unit: 'kilopascal', symbol: 'kPa' },\n MPa: { value: 1e6, unit: 'megapascal', symbol: 'MPa' },\n bar: { value: 1e5, unit: 'bar', symbol: 'bar' },\n atm: { value: 101325, unit: 'atmosphere', symbol: 'atm' },\n psi: { value: 6894.757, unit: 'pound per square inch', symbol: 'psi' },\n mmHg: { value: 133.322, unit: 'millimeter of mercury', symbol: 'mmHg' },\n },\n\n // Energy\n energy: {\n J: { value: 1, unit: 'joule', symbol: 'J' },\n kJ: { value: 1000, unit: 'kilojoule', symbol: 'kJ' },\n cal: { value: 4.184, unit: 'calorie', symbol: 'cal' },\n kcal: { value: 4184, unit: 'kilocalorie', symbol: 'kcal' },\n eV: { value: 1.60218e-19, unit: 'electronvolt', symbol: 'eV' },\n BTU: { value: 1055.06, unit: 'BTU', symbol: 'BTU' },\n },\n\n // Force\n force: {\n N: { value: 1, unit: 'newton', symbol: 'N' },\n kN: { value: 1000, unit: 'kilonewton', symbol: 'kN' },\n lbf: { value: 4.44822, unit: 'pound-force', symbol: 'lbf' },\n kgf: { value: 9.80665, unit: 'kilogram-force', symbol: 'kgf' },\n dyne: { value: 1e-5, unit: 'dyne', symbol: 'dyn' },\n },\n\n // Area\n area: {\n m2: { value: 1, unit: 'square meter', symbol: 'm²' },\n cm2: { value: 0.0001, unit: 'square centimeter', symbol: 'cm²' },\n km2: { value: 1e6, unit: 'square kilometer', symbol: 'km²' },\n acre: { value: 4046.856, unit: 'acre', symbol: 'acre' },\n hectare: { value: 10000, unit: 'hectare', symbol: 'ha' },\n ft2: { value: 0.092903, unit: 'square foot', symbol: 'ft²' },\n yd2: { value: 0.836127, unit: 'square yard', symbol: 'yd²' },\n },\n\n // Volume\n volume: {\n m3: { value: 1, unit: 'cubic meter', symbol: 'm³' },\n L: { value: 0.001, unit: 'liter', symbol: 'L' },\n mL: { value: 1e-6, unit: 'milliliter', symbol: 'mL' },\n gallon: { value: 0.00378541, unit: 'US gallon', symbol: 'gal' },\n pint: { value: 0.000473176, unit: 'US pint', symbol: 'pt' },\n floz: { value: 2.9574e-5, unit: 'US fluid ounce', symbol: 'fl oz' },\n },\n\n // Electrical Current\n current: {\n A: { value: 1, unit: 'ampere', symbol: 'A' },\n mA: { value: 0.001, unit: 'milliampere', symbol: 'mA' },\n uA: { value: 0.000001, unit: 'microampere', symbol: 'uA' },\n kA: { value: 1000, unit: 'kiloampere', symbol: 'kA' },\n },\n\n // Resistance / Conductance\n resistance: {\n ohm: { value: 1, unit: 'ohm' },\n kohm: { value: 1000, unit: 'kiloohm' },\n megaohm: { value: 1e6, unit: 'megaohm' },\n S: { value: 1, unit: 'siemens', symbol: 'S', note: 'conductance' },\n },\n\n // Capacitance / Inductance\n capacitance: {\n F: { value: 1, unit: 'farad', symbol: 'F' },\n mF: { value: 0.001, unit: 'millifarad' },\n uF: { value: 0.000001, unit: 'microfarad' },\n },\n inductance: {\n H: { value: 1, unit: 'henry', symbol: 'H' },\n mH: { value: 0.001, unit: 'millihenry', symbol: 'mH' },\n uH: { value: 0.000001, unit: 'microhenry', symbol: 'uH' },\n },\n\n // Luminous Intensity / Illuminance\n light: {\n cd: { value: 1, unit: 'candela', symbol: 'cd' },\n lm: { value: 1, unit: 'lumen', symbol: 'lm' },\n lx: { value: 1, unit: 'lux', symbol: 'lx' },\n },\n\n // Data / Digital Storage\n data: {\n bit: { value: 1, unit: 'bit', symbol: 'bit' },\n B: { value: 8, unit: 'byte', symbol: 'B' },\n KB: { value: 8e3, unit: 'kilobyte', symbol: 'KB' },\n MB: { value: 8e6, unit: 'megabyte', symbol: 'MB' },\n GB: { value: 8e9, unit: 'gigabyte', symbol: 'GB' },\n TB: { value: 8e12, unit: 'terabyte', symbol: 'TB' },\n },\n\n // Angle\n angle: {\n deg: { value: 1, unit: 'degree', symbol: '°' },\n rad: { value: 57.2958, unit: 'radian', symbol: 'rad', note: '1 rad = 57.2958°' },\n grad: { value: 0.9, unit: 'grad', symbol: 'grad', note: '1 grad = 0.9°' },\n },\n radiation: {\n Gy: { value: 1, unit: 'gray', symbol: 'Gy', note: 'Absorbed dose: 1 Gy = 1 J/kg' },\n mGy: { value: 0.001, unit: 'milligray', symbol: 'mGy' },\n rad: { value: 0.01, unit: 'rad', symbol: 'rad', note: '1 rad = 0.01 Gy' },\n\n // Dose Equivalent\n Sv: { value: 1, unit: 'sievert', symbol: 'Sv', note: 'Biological effect dose equivalent' },\n mSv: { value: 0.001, unit: 'millisievert', symbol: 'mSv' },\n rem: { value: 0.01, unit: 'rem', symbol: 'rem', note: '1 rem = 0.01 Sv' },\n\n // Radioactivity\n Bq: { value: 1, unit: 'becquerel', symbol: 'Bq', note: '1 decay per second' },\n kBq: { value: 1e3, unit: 'kilobecquerel', symbol: 'kBq' },\n MBq: { value: 1e6, unit: 'megabecquerel', symbol: 'MBq' },\n GBq: { value: 1e9, unit: 'gigabecquerel', symbol: 'GBq' },\n Ci: { value: 3.7e10, unit: 'curie', symbol: 'Ci', note: '1 Ci = 3.7 x 10¹⁰ decays per second' },\n mCi: { value: 3.7e7, unit: 'millicurie', symbol: 'mCi' },\n },\n};\n","const validVarName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\nexport function createVarStore(initial = {}) {\n let store = Object.create(null);\n\n for (const key in initial) {\n store[key] = initial[key];\n }\n\n return {\n /**\n * @param {string} name\n * @param {number | undefined} value\n */\n set(name, value, { override = true } = {}) {\n if (typeof name !== 'string' || !name) {\n throw new Error('Variable name must be a non-empty string');\n }\n\n if (!validVarName.test(name)) {\n throw new Error(`Variable Name Error: '${name}' is not a valid variable name`);\n }\n\n // Value validation\n if (value === undefined) {\n throw new Error(`Variable Value Error: '${name}' cannot be undefined`);\n }\n\n // Prevent overwrite (optional)\n if (!override && name in store) {\n throw new Error(`Variable '${name}' already exists`);\n }\n\n store[name] = value;\n },\n\n /**\n * @param {string | number} name\n */\n get(name) {\n return store[name];\n },\n\n /**\n * @param {any} name\n */\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n /**\n * @param {string | number} name\n */\n remove(name) {\n delete store[name];\n },\n\n all() {\n return { ...store };\n },\n\n clear() {\n store = Object.create(null);\n },\n\n merge(obj = {}) {\n for (const key in obj) {\n store[key] = obj[key];\n }\n },\n\n clone() {\n return createVarStore(store);\n },\n };\n}\n\nexport default { createVarStore };\n","export function createFunctionRegistry(initial = {}) {\n // Object.create(null) avoids prototype pollution (no inherited properties)\n const store = Object.create(null);\n\n for (const key in initial) {\n if (typeof initial[key] === 'function') {\n store[key] = initial[key];\n }\n }\n\n return {\n getAllFunctionsName() {\n return Object.keys(store);\n },\n\n /**\n * @param {string} name\n * @param {any} fn\n */\n register(name, fn) {\n if (typeof name !== 'string' || !name) {\n throw new Error('Formula name must be a non-empty string');\n }\n\n if (typeof fn !== 'function') {\n throw new Error(`Formula \"${name}\" must be callable`);\n }\n\n store[name] = fn;\n },\n\n /**\n * @param {string} name\n */\n get(name) {\n return store[name];\n },\n\n /**\n * @param {any} name\n */\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n /**\n * @param {string | number} name\n */\n remove(name) {\n delete store[name];\n },\n\n all() {\n return { ...store };\n },\n\n clear() {\n for (const key in store) {\n delete store[key];\n }\n },\n\n extend(formulas = {}) {\n for (const name in formulas) {\n if (typeof formulas[name] === 'function') {\n store[name] = formulas[name];\n }\n }\n },\n\n clone() {\n return createFunctionRegistry(store);\n },\n };\n}\n","import { unwrapDenseMatrix, wrapDenseMatrix } from '../utils/matrix.js';\nimport { fraction as makeFrac, isFraction, numer, denom } from '../math/fraction.js';\nimport { bigNumber as makeBN, isBigNumber } from '../math/bignumber.js';\n\n/** @param {any[]} matrix */\nfunction validateSquareMatrix(matrix) {\n matrix = unwrapDenseMatrix(matrix);\n if (!Array.isArray(matrix) || matrix.length === 0) {\n throw new Error('det() expects a non-empty matrix');\n }\n\n if (!matrix.every(Array.isArray)) {\n throw new Error('det() expects a 2D matrix');\n }\n\n const size = matrix.length;\n if (!matrix.every((row) => row.length === size)) {\n throw new Error('det() expects a square matrix');\n }\n\n for (const row of matrix) {\n for (const value of row) {\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error('det() matrix values must be numeric');\n }\n }\n }\n}\n\n/** @param {any[]} matrix */\nfunction determinant(matrix) {\n matrix = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n\n if (matrix.length === 1) {\n return matrix[0][0];\n }\n\n if (matrix.length === 2) {\n return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];\n }\n\n // Laplace expansion: sum of (-1)^col * M[0][col] * det(minor)\n return matrix[0].reduce(\n (/** @type {number} */ sum, /** @type {number} */ value, /** @type {number} */ columnIndex) => {\n const minor = matrix\n .slice(1)\n .map((row) =>\n row.filter((/** @type {any} */ _, /** @type {number} */ index) => index !== columnIndex)\n );\n const cofactor = columnIndex % 2 === 0 ? value : -value;\n return sum + cofactor * determinant(minor);\n },\n 0\n );\n}\n\n/** @param {any} value */\nfunction asMatrixData(value) {\n const data = unwrapDenseMatrix(value);\n if (!Array.isArray(data)) {\n throw new Error('Expected matrix data');\n }\n return data;\n}\n\n/**\n * @param {any[]} coefficients\n * @param {number[]} constants\n */\nfunction solveLinearSystem(coefficients, constants) {\n const n = coefficients.length;\n const augmented = coefficients.map((row, rowIndex) => [...row, constants[rowIndex]]);\n\n for (let pivot = 0; pivot < n; pivot++) {\n let maxRow = pivot;\n let maxValue = Math.abs(augmented[pivot][pivot]);\n\n for (let row = pivot + 1; row < n; row++) {\n const current = Math.abs(augmented[row][pivot]);\n if (current > maxValue) {\n maxValue = current;\n maxRow = row;\n }\n }\n\n if (maxValue === 0) {\n throw new Error('Linear system is singular');\n }\n\n if (maxRow !== pivot) {\n [augmented[pivot], augmented[maxRow]] = [augmented[maxRow], augmented[pivot]];\n }\n\n const pivotValue = augmented[pivot][pivot];\n for (let col = pivot; col <= n; col++) {\n augmented[pivot][col] /= pivotValue;\n }\n\n for (let row = 0; row < n; row++) {\n if (row === pivot) {\n continue;\n }\n const factor = augmented[row][pivot];\n for (let col = pivot; col <= n; col++) {\n augmented[row][col] -= factor * augmented[pivot][col];\n }\n }\n }\n\n return augmented.map((row) => row[n]);\n}\n\n/** @param {any} input */\nfunction lupDecomposition(input) {\n const matrix = asMatrixData(input).map((row) => [...row]);\n validateSquareMatrix(matrix);\n\n const n = matrix.length;\n const permutation = Array.from({ length: n }, (_, index) => index);\n\n for (let pivot = 0; pivot < n; pivot++) {\n let maxRow = pivot;\n let maxValue = Math.abs(matrix[pivot][pivot]);\n\n for (let row = pivot + 1; row < n; row++) {\n const current = Math.abs(matrix[row][pivot]);\n if (current > maxValue) {\n maxValue = current;\n maxRow = row;\n }\n }\n\n if (maxValue === 0) {\n throw new Error('Matrix is singular');\n }\n\n if (maxRow !== pivot) {\n [matrix[pivot], matrix[maxRow]] = [matrix[maxRow], matrix[pivot]];\n [permutation[pivot], permutation[maxRow]] = [permutation[maxRow], permutation[pivot]];\n }\n\n for (let row = pivot + 1; row < n; row++) {\n matrix[row][pivot] /= matrix[pivot][pivot];\n for (let col = pivot + 1; col < n; col++) {\n matrix[row][col] -= matrix[row][pivot] * matrix[pivot][col];\n }\n }\n }\n\n const L = matrix.map((row, rowIndex) =>\n row.map((value, colIndex) => {\n if (rowIndex === colIndex) {\n return 1;\n }\n if (rowIndex > colIndex) {\n return value;\n }\n return 0;\n })\n );\n\n const U = matrix.map((row, rowIndex) =>\n row.map((value, colIndex) => (rowIndex <= colIndex ? value : 0))\n );\n\n return {\n L: wrapDenseMatrix(L),\n U: wrapDenseMatrix(U),\n p: permutation,\n };\n}\n\n/**\n * @param {any} aInput\n * @param {{ exprify: string; data: any; size: number[]; }} bInput\n */\nfunction linearSolve(aInput, bInput) {\n const { L, U, p } = lupDecomposition(aInput);\n const a = asMatrixData(aInput);\n const bData = asMatrixData(bInput);\n const bVector = Array.isArray(bData[0]) ? bData.map((row) => row[0]) : bData;\n\n if (a.length !== bVector.length) {\n throw new Error('Right-hand side dimension mismatch');\n }\n\n const permutedB = p.map((index) => bVector[index]);\n const y = new Array(a.length).fill(0);\n\n for (let row = 0; row < a.length; row++) {\n y[row] = permutedB[row];\n for (let col = 0; col < row; col++) {\n y[row] -= L.data[row][col] * y[col];\n }\n }\n\n const x = new Array(a.length).fill(0);\n for (let row = a.length - 1; row >= 0; row--) {\n x[row] = y[row];\n for (let col = row + 1; col < a.length; col++) {\n x[row] -= U.data[row][col] * x[col];\n }\n x[row] /= U.data[row][row];\n }\n\n return wrapDenseMatrix(x.map((value) => [value]));\n}\n\n/**\n * @param {any} aInput\n * @param {any} qInput\n */\nfunction solveLyapunov(aInput, qInput) {\n const A = asMatrixData(aInput).map((row) => [...row]);\n const Q = asMatrixData(qInput).map((row) => [...row]);\n validateSquareMatrix(A);\n validateSquareMatrix(Q);\n\n const n = A.length;\n if (Q.length !== n) {\n throw new Error('A and Q must have the same dimensions');\n }\n\n const coefficients = [];\n const constants = [];\n\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n const equation = new Array(n * n).fill(0);\n\n for (let k = 0; k < n; k++) {\n equation[k * n + col] += A[row][k];\n equation[row * n + k] += A[col][k];\n }\n\n coefficients.push(equation);\n constants.push(-Q[row][col]);\n }\n }\n\n const solution = solveLinearSystem(coefficients, constants);\n const X = [];\n\n for (let row = 0; row < n; row++) {\n X.push(solution.slice(row * n, (row + 1) * n));\n }\n\n return wrapDenseMatrix(X);\n}\n\n/**\n * @param {any[]} coefficients\n * @param {number} x\n */\nfunction evaluatePolynomial(coefficients, x) {\n return coefficients.reduce((sum, coefficient, index) => sum + coefficient * x ** index, 0);\n}\n\n/**\n * @param {any[]} coefficients\n * @param {number} root\n */\nfunction syntheticDivide(coefficients, root) {\n const descending = [...coefficients].reverse();\n const quotient = [descending[0]];\n\n for (let index = 1; index < descending.length - 1; index++) {\n quotient.push(descending[index] + quotient[index - 1] * root);\n }\n\n const remainder = descending[descending.length - 1] + quotient[quotient.length - 1] * root;\n return {\n quotient: quotient.reverse(),\n remainder,\n };\n}\n\n/**\n * @param {any[]} coefficients\n */\nfunction solveQuadratic(coefficients) {\n const [c, b, a] = coefficients;\n const discriminant = b ** 2 - 4 * a * c;\n if (discriminant < 0) {\n throw new Error('Only real roots are supported');\n }\n\n const sqrtDisc = Math.sqrt(discriminant);\n return [(-b + sqrtDisc) / (2 * a), (-b - sqrtDisc) / (2 * a)];\n}\n\n/**\n * @param {any[]} coefficients\n */\nfunction polynomialRoots(...coefficients) {\n while (coefficients.length > 1 && coefficients[coefficients.length - 1] === 0) {\n coefficients.pop();\n }\n\n const degree = coefficients.length - 1;\n if (degree < 1) {\n throw new Error('polynomialRoot() expects at least a linear polynomial');\n }\n\n if (degree === 1) {\n const [b, a] = coefficients;\n return [-b / a];\n }\n\n if (degree === 2) {\n return solveQuadratic(coefficients);\n }\n\n // Rational root theorem: possible roots are divisors of the constant term\n if (degree === 3) {\n const constant = coefficients[0];\n const candidates = [];\n const limit = Math.abs(constant);\n\n for (let divisor = 1; divisor <= Math.max(1, limit); divisor++) {\n if (limit % divisor === 0) {\n candidates.push(divisor, -divisor);\n }\n }\n\n for (const candidate of candidates) {\n if (evaluatePolynomial(coefficients, candidate) === 0) {\n const reduced = syntheticDivide(coefficients, candidate);\n const remainingRoots = solveQuadratic(reduced.quotient);\n return [candidate, ...remainingRoots];\n }\n }\n }\n\n throw new Error('polynomialRoot() currently supports degree up to 3');\n}\n\n/**\n * @param {any[]} a\n * @param {any[]} b\n */\nfunction dotProduct(a, b) {\n return a.reduce((sum, value, index) => sum + value * b[index], 0);\n}\n\n/**\n * @param {any[]} vector\n */\nfunction vectorNorm(vector) {\n return Math.sqrt(dotProduct(vector, vector));\n}\n\n/**\n * @param {any[]} vector\n * @param {number} scalar\n */\nfunction scaleVector(vector, scalar) {\n return vector.map((value) => value * scalar);\n}\n\n/**\n * @param {any} a\n * @param {any} b\n */\nfunction subtractVectors(a, b) {\n return a.map(\n (/** @type {number} */ value, /** @type {string | number} */ index) => value - b[index]\n );\n}\n\n/**\n * @param {any[]} matrix\n */\nfunction transpose(matrix) {\n return matrix[0].map((/** @type {any} */ _, /** @type {string | number} */ colIndex) =>\n matrix.map((row) => row[colIndex])\n );\n}\n\n/**\n * @param {any} input\n */\nfunction qrDecomposition(input) {\n const A = asMatrixData(input).map((row) => [...row]);\n if (!A.length || !A.every((row) => row.length === A[0].length)) {\n throw new Error('qr() expects a rectangular matrix');\n }\n\n const rowCount = A.length;\n const colCount = A[0].length;\n const columns = transpose(A);\n const qColumns = [];\n\n for (let col = 0; col < colCount; col++) {\n let vector = [...columns[col]];\n\n for (let existing = 0; existing < qColumns.length; existing++) {\n const projection = dotProduct(qColumns[existing], columns[col]);\n vector = subtractVectors(vector, scaleVector(qColumns[existing], projection));\n }\n\n const norm = vectorNorm(vector);\n if (norm === 0) {\n throw new Error('qr() requires linearly independent columns');\n }\n\n qColumns.push(scaleVector(vector, 1 / norm));\n }\n\n for (let basisIndex = 0; qColumns.length < rowCount && basisIndex < rowCount; basisIndex++) {\n let candidate = Array.from({ length: rowCount }, (_, index) => (index === basisIndex ? 1 : 0));\n\n for (const column of qColumns) {\n const projection = dotProduct(column, candidate);\n candidate = subtractVectors(candidate, scaleVector(column, projection));\n }\n\n const norm = vectorNorm(candidate);\n if (norm > 1e-10) {\n qColumns.push(scaleVector(candidate, 1 / norm));\n }\n }\n\n const Q = Array.from({ length: rowCount }, (_, rowIndex) =>\n qColumns.map((column) => column[rowIndex])\n );\n\n const fullR = Array.from({ length: rowCount }, () => Array(colCount).fill(0));\n for (let row = 0; row < rowCount; row++) {\n for (let col = 0; col < colCount; col++) {\n fullR[row][col] = dotProduct(qColumns[row], columns[col]);\n }\n }\n\n return {\n Q: wrapDenseMatrix(Q),\n R: wrapDenseMatrix(fullR),\n };\n}\n\n/**\n * @param {string} expression\n */\nfunction splitTerms(expression) {\n const normalized = expression.replace(/\\s+/g, '');\n if (!normalized) {\n return [];\n }\n\n return normalized.replace(/-/g, '+-').split('+').filter(Boolean);\n}\n\n/**\n * @param {string} expression\n * @param {string} variable\n */\nfunction parsePolynomial(expression, variable) {\n const terms = splitTerms(expression);\n const coefficients = new Map();\n\n for (const term of terms) {\n if (term.includes(variable)) {\n const [rawCoeff, rawPower] = term.split(variable);\n let coefficient;\n\n if (rawCoeff === '' || rawCoeff === '+') {\n coefficient = 1;\n } else if (rawCoeff === '-') {\n coefficient = -1;\n } else {\n const cleaned = rawCoeff.endsWith('*') ? rawCoeff.slice(0, -1) : rawCoeff;\n coefficient = Number(cleaned);\n }\n\n if (!Number.isFinite(coefficient)) {\n throw new Error('Unsupported algebra term');\n }\n\n let power = 1;\n if (rawPower) {\n if (!rawPower.startsWith('^')) {\n throw new Error('Unsupported algebra term');\n }\n\n power = Number(rawPower.slice(1));\n }\n\n if (!Number.isInteger(power) || power < 0) {\n throw new Error('Only non-negative integer powers are supported');\n }\n\n coefficients.set(power, (coefficients.get(power) || 0) + coefficient);\n } else {\n const constant = Number(term);\n if (!Number.isFinite(constant)) {\n throw new Error('Unsupported algebra term');\n }\n coefficients.set(0, (coefficients.get(0) || 0) + constant);\n }\n }\n\n return coefficients;\n}\n\n/**\n * @param {any[] | Map<any, any>} coefficients\n * @param {string} variable\n */\nfunction formatPolynomial(coefficients, variable) {\n const ordered = [...coefficients.entries()]\n .filter(([, coefficient]) => coefficient !== 0)\n .sort((a, b) => b[0] - a[0]);\n\n if (!ordered.length) {\n return '0';\n }\n\n return ordered\n .map(([power, coefficient], index) => {\n const negative = coefficient < 0;\n const absCoeff = Math.abs(coefficient);\n let body;\n\n if (power === 0) {\n body = `${absCoeff}`;\n } else if (power === 1) {\n body = absCoeff === 1 ? variable : `${absCoeff} * ${variable}`;\n } else {\n body = absCoeff === 1 ? `${variable}^${power}` : `${absCoeff} * ${variable}^${power}`;\n }\n\n if (index === 0) {\n return negative ? `-${body}` : body;\n }\n\n return negative ? `- ${body}` : `+ ${body}`;\n })\n .join(' ');\n}\n\n/**\n * @param {string} expression\n */\nfunction simplifyExpression(expression) {\n const compact = expression.replace(/\\s+/g, '');\n const variableMatch = compact.match(/[a-zA-Z]+/);\n const variable = variableMatch?.[0] || 'x';\n const coefficients = parsePolynomial(expression, variable);\n return formatPolynomial(coefficients, variable);\n}\n\n/**\n * @param {string} expression\n * @param {string} variable\n */\nfunction derivativeExpression(expression, variable) {\n const coefficients = parsePolynomial(expression, variable);\n const derived = new Map();\n\n for (const [power, coefficient] of coefficients.entries()) {\n if (power === 0) {\n continue;\n }\n derived.set(power - 1, (derived.get(power - 1) || 0) + coefficient * power);\n }\n\n return formatPolynomial(derived, variable);\n}\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction _gcd(a, b) {\n a = Math.abs(a);\n b = Math.abs(b);\n while (b) {\n [a, b] = [b, a % b];\n }\n return a;\n}\n\n/**\n * @param {any} n\n */\nfunction _gamma(n) {\n if (n === 0) {\n throw new Error('gamma(0) is undefined');\n }\n if (Number.isInteger(n) && n < 0) {\n throw new Error('gamma() undefined for negative integers');\n }\n if (Number.isInteger(n) && n > 0) {\n let r = 1;\n for (let i = 2; i < n; i++) {\n r *= i;\n }\n return r;\n }\n const g = 7;\n const c = [\n 0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313,\n -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6,\n 1.5056327351493116e-7,\n ];\n // Euler's reflection formula: Gamma(z) = pi / (sin(pi*z) * Gamma(1-z))\n if (n < 0.5) {\n return Math.PI / (Math.sin(Math.PI * n) * _gamma(1 - n));\n }\n n -= 1;\n let x = c[0];\n for (let i = 1; i < g + 2; i++) {\n x += c[i] / (n + i);\n }\n const t = n + g + 0.5;\n return Math.sqrt(2 * Math.PI) * t ** (n + 0.5) * Math.exp(-t) * x;\n}\n\n/**\n * @param {any} n\n */\nfunction _identity(n) {\n return Array.from({ length: n }, (_, i) =>\n Array.from({ length: n }, (_, j) => (i === j ? 1 : 0))\n );\n}\n\n/**\n * @param {any[]} matrix\n */\nfunction _inverse(matrix) {\n const data = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n const n = data.length;\n\n if (n === 2) {\n const det = data[0][0] * data[1][1] - data[0][1] * data[1][0];\n if (det === 0) {\n throw new Error('Matrix is singular');\n }\n return wrapDenseMatrix([\n [data[1][1] / det, -data[0][1] / det],\n [-data[1][0] / det, data[0][0] / det],\n ]);\n }\n\n const result = Array.from({ length: n }, () => Array(n).fill(0));\n for (let col = 0; col < n; col++) {\n const b = Array.from({ length: n }, (_, i) => (i === col ? 1 : 0));\n const x = linearSolve(data, wrapDenseMatrix(b.map((v) => [v])));\n const xData = unwrapDenseMatrix(x);\n for (let row = 0; row < n; row++) {\n result[row][col] = xData[row][0];\n }\n }\n return wrapDenseMatrix(result);\n}\n\n/**\n * @param {any} matrix\n */\nfunction _rref(matrix) {\n const data = unwrapDenseMatrix(matrix).map((/** @type {any} */ row) => [...row]);\n let lead = 0;\n const rowCount = data.length;\n const colCount = data[0].length;\n\n for (let r = 0; r < rowCount; r++) {\n if (lead >= colCount) {\n break;\n }\n let i = r;\n while (Math.abs(data[i][lead]) < 1e-12) {\n i++;\n if (i === rowCount) {\n i = r;\n lead++;\n if (lead >= colCount) {\n break;\n }\n }\n }\n if (lead >= colCount) {\n break;\n }\n [data[r], data[i]] = [data[i], data[r]];\n const pivot = data[r][lead];\n for (let j = 0; j < colCount; j++) {\n data[r][j] /= pivot;\n }\n for (let i = 0; i < rowCount; i++) {\n if (i !== r) {\n const factor = data[i][lead];\n for (let j = 0; j < colCount; j++) {\n data[i][j] -= factor * data[r][j];\n }\n }\n }\n lead++;\n }\n return wrapDenseMatrix(data);\n}\n\n/**\n * @param {any[]} a\n * @param {any[]} b\n */\nfunction _cross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n/**\n * @param {any} matrix\n */\nfunction _eig2x2(matrix) {\n const data = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n const [[a, b], [c, d]] = data;\n const trace = a + d;\n const det = a * d - b * c;\n const disc = trace * trace - 4 * det;\n if (disc < 0) {\n throw new Error('Complex eigenvalues not supported');\n }\n const sqrtDisc = Math.sqrt(disc);\n const lambda1 = (trace + sqrtDisc) / 2;\n const lambda2 = (trace - sqrtDisc) / 2;\n\n // Solve (A - lambda*I)v = 0: pick non-zero row to solve for v1:v2 ratio\n const eigenvec = (/** @type {number} */ lambda) => {\n if (Math.abs(b) > 1e-12) {\n return [1, (lambda - a) / b];\n }\n if (Math.abs(c) > 1e-12) {\n return [(lambda - d) / c, 1];\n }\n return [1, 0];\n };\n\n const v1 = eigenvec(lambda1);\n const norm1 = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1]);\n const v2 = eigenvec(lambda2);\n const norm2 = Math.sqrt(v2[0] * v2[0] + v2[1] * v2[1]);\n\n return {\n values: [lambda1, lambda2],\n vectors: wrapDenseMatrix([\n [v1[0] / norm1, v2[0] / norm2],\n [v1[1] / norm1, v2[1] / norm2],\n ]),\n };\n}\n\n/**\n * @param {any[]} matrix\n */\nfunction _cholesky(matrix) {\n const data = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n const n = data.length;\n const L = Array.from({ length: n }, () => Array(n).fill(0));\n\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let k = 0; k < j; k++) {\n sum += L[j][k] * L[j][k];\n }\n const val = data[j][j] - sum;\n if (val <= 0) {\n throw new Error('Matrix is not positive definite');\n }\n L[j][j] = Math.sqrt(val);\n for (let i = j + 1; i < n; i++) {\n sum = 0;\n for (let k = 0; k < j; k++) {\n sum += L[i][k] * L[j][k];\n }\n L[i][j] = (data[i][j] - sum) / L[j][j];\n }\n }\n return wrapDenseMatrix(L);\n}\n\n/**\n * @param {any} matrix\n */\nfunction _svd(matrix) {\n const data = unwrapDenseMatrix(matrix);\n const m = data.length;\n const n = data[0].length;\n\n if (m !== 2 || n !== 2) {\n throw new Error('svd() currently supports 2x2 matrices only');\n }\n\n const ata = [\n [\n data[0][0] * data[0][0] + data[1][0] * data[1][0],\n data[0][0] * data[0][1] + data[1][0] * data[1][1],\n ],\n [\n data[0][1] * data[0][0] + data[1][1] * data[1][0],\n data[0][1] * data[0][1] + data[1][1] * data[1][1],\n ],\n ];\n\n const eigResult = _eig2x2(wrapDenseMatrix(ata));\n const S = [\n Math.sqrt(Math.max(0, eigResult.values[0])),\n Math.sqrt(Math.max(0, eigResult.values[1])),\n ];\n const vecData = unwrapDenseMatrix(eigResult.vectors);\n const V = vecData;\n\n const U = [\n [\n (data[0][0] * V[0][0] + data[0][1] * V[1][0]) / (S[0] || 1),\n (data[0][0] * V[0][1] + data[0][1] * V[1][1]) / (S[1] || 1),\n ],\n [\n (data[1][0] * V[0][0] + data[1][1] * V[1][0]) / (S[0] || 1),\n (data[1][0] * V[0][1] + data[1][1] * V[1][1]) / (S[1] || 1),\n ],\n ];\n\n return {\n U: wrapDenseMatrix(U),\n S: wrapDenseMatrix([\n [S[0], 0],\n [0, S[1]],\n ]),\n V: wrapDenseMatrix(V),\n };\n}\n\nexport const internalFunctions = {\n fraction: (/** @type {number} */ n, /** @type {number} */ d) => makeFrac(n, d),\n\n numer: (/** @type {any} */ v) => numer(v),\n\n denom: (/** @type {any} */ v) => denom(v),\n\n isFraction: (/** @type {any} */ v) => isFraction(v),\n\n bignumber: (/** @type {any} */ n) => makeBN(n),\n\n isBigNumber: (/** @type {any} */ v) => isBigNumber(v),\n\n max: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('max() requires arguments');\n }\n return Math.max(...args);\n },\n\n min: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('min() requires arguments');\n }\n return Math.min(...args);\n },\n\n abs: (/** @type {number} */ x) => Math.abs(x),\n\n round: (/** @type {number} */ x) => Math.round(x),\n\n floor: (/** @type {number} */ x) => Math.floor(x),\n\n ceil: (/** @type {number} */ x) => Math.ceil(x),\n\n sqrt: (/** @type {number} */ x) => {\n if (x < 0) {\n throw new Error('sqrt() domain error');\n }\n return Math.sqrt(x);\n },\n\n pow: (/** @type {number} */ a, /** @type {number} */ b) => a ** b,\n\n det: (/** @type {any[]} */ matrix) => determinant(matrix),\n\n polynomialRoot: (/** @type {any} */ ...coefficients) => polynomialRoots(...coefficients),\n\n lsolve: (\n /** @type {any} */ a,\n /** @type {{ exprify: string; data: any; size: number[]; }} */ b\n ) => linearSolve(a, b),\n\n lup: (/** @type {any} */ matrix) => lupDecomposition(matrix),\n\n lyap: (/** @type {any} */ a, /** @type {any} */ q) => solveLyapunov(a, q),\n\n qr: (/** @type {any} */ matrix) => qrDecomposition(matrix),\n\n transpose: (/** @type {any} */ matrix) => wrapDenseMatrix(transpose(unwrapDenseMatrix(matrix))),\n\n inverse: (/** @type {any[]} */ matrix) => _inverse(matrix),\n\n trace: (/** @type {any[]} */ matrix) => {\n const data = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n return data.reduce(\n (\n /** @type {any} */ sum,\n /** @type {{ [x: string]: any; }} */ row,\n /** @type {string | number} */ i\n ) => sum + row[i],\n 0\n );\n },\n\n rank: (/** @type {any} */ matrix) => {\n const rrefData = unwrapDenseMatrix(_rref(matrix));\n return rrefData.filter((/** @type {any[]} */ row) => row.some((v) => Math.abs(v) > 1e-10))\n .length;\n },\n\n rref: (/** @type {any} */ matrix) => _rref(matrix),\n\n minor: (/** @type {any[]} */ matrix, /** @type {any} */ i, /** @type {any} */ j) => {\n const data = unwrapDenseMatrix(matrix);\n validateSquareMatrix(matrix);\n const sub = data\n .filter((/** @type {any} */ _, /** @type {any} */ ri) => ri !== i)\n .map((/** @type {any[]} */ row) => row.filter((_, cj) => cj !== j));\n return determinant(sub);\n },\n\n cofactor: (/** @type {any} */ matrix, /** @type {any} */ i, /** @type {any} */ j) => {\n const data = unwrapDenseMatrix(matrix);\n const sub = data\n .filter((/** @type {any} */ _, /** @type {any} */ ri) => ri !== i)\n .map((/** @type {any[]} */ row) =>\n row.filter((/** @type {any} */ _, /** @type {any} */ cj) => cj !== j)\n );\n return ((i + j) % 2 === 0 ? 1 : -1) * determinant(sub);\n },\n\n cross: (/** @type {any} */ a, /** @type {any} */ b) => {\n const v1 = unwrapDenseMatrix(a);\n const v2 = unwrapDenseMatrix(b);\n if (!Array.isArray(v1) || !Array.isArray(v2) || v1.length !== 3 || v2.length !== 3) {\n throw new Error('cross() requires two 3D vectors');\n }\n return _cross(v1, v2);\n },\n\n normalize: (/** @type {any} */ v) => {\n const data = unwrapDenseMatrix(v);\n if (!Array.isArray(data)) {\n throw new Error('normalize() expects a vector');\n }\n const norm = vectorNorm(data);\n if (norm === 0) {\n throw new Error('Cannot normalize zero vector');\n }\n return scaleVector(data, 1 / norm);\n },\n\n angle: (/** @type {any} */ a, /** @type {any} */ b) => {\n const v1 = unwrapDenseMatrix(a);\n const v2 = unwrapDenseMatrix(b);\n if (!Array.isArray(v1) || !Array.isArray(v2)) {\n throw new Error('angle() expects vectors');\n }\n const dot = dotProduct(v1, v2);\n const norms = vectorNorm(v1) * vectorNorm(v2);\n if (norms === 0) {\n throw new Error('Zero vector angle is undefined');\n }\n return Math.acos(Math.max(-1, Math.min(1, dot / norms)));\n },\n\n projection: (/** @type {any} */ a, /** @type {any} */ b) => {\n const v1 = unwrapDenseMatrix(a);\n const v2 = unwrapDenseMatrix(b);\n if (!Array.isArray(v1) || !Array.isArray(v2)) {\n throw new Error('projection() expects vectors');\n }\n const dot = dotProduct(v1, v2);\n const normB = vectorNorm(v2);\n if (normB === 0) {\n throw new Error('Zero vector projection undefined');\n }\n return dot / normB;\n },\n\n identity: (/** @type {any} */ n) => wrapDenseMatrix(_identity(n)),\n\n eye: (/** @type {any} */ n) => wrapDenseMatrix(_identity(n)),\n\n zeros: (/** @type {any} */ n, /** @type {undefined} */ m) => {\n if (m === undefined) {\n m = n;\n }\n return wrapDenseMatrix(Array.from({ length: n }, () => Array(m).fill(0)));\n },\n\n ones: (/** @type {any} */ n, /** @type {undefined} */ m) => {\n if (m === undefined) {\n m = n;\n }\n return wrapDenseMatrix(Array.from({ length: n }, () => Array(m).fill(1)));\n },\n\n diag: (/** @type {any} */ x) => {\n const arr = unwrapDenseMatrix(x);\n if (!Array.isArray(arr)) {\n throw new Error('diag() expects an array');\n }\n return wrapDenseMatrix(\n Array.from({ length: arr.length }, (_, i) =>\n Array.from({ length: arr.length }, (_, j) => (i === j ? arr[i] : 0))\n )\n );\n },\n\n cholesky: (/** @type {any[]} */ matrix) => _cholesky(matrix),\n\n eig: (/** @type {any[]} */ matrix) => _eig2x2(matrix),\n\n svd: (/** @type {any} */ matrix) => _svd(matrix),\n\n simplify: (/** @type {string} */ expression) => {\n if (typeof expression !== 'string') {\n throw new Error('simplify() expects an expression string');\n }\n return simplifyExpression(expression);\n },\n\n derivative: (/** @type {string} */ expression, variable = 'x') => {\n if (typeof expression !== 'string' || typeof variable !== 'string') {\n throw new Error('derivative() expects expression and variable strings');\n }\n return derivativeExpression(expression, variable);\n },\n\n sin: (/** @type {number} */ x) => Math.sin(x),\n\n cos: (/** @type {number} */ x) => Math.cos(x),\n\n tan: (/** @type {number} */ x) => Math.tan(x),\n\n sind: (/** @type {number} */ x) => Math.sin((x * Math.PI) / 180),\n\n cosd: (/** @type {number} */ x) => Math.cos((x * Math.PI) / 180),\n\n tand: (/** @type {number} */ x) => Math.tan((x * Math.PI) / 180),\n\n asind: (/** @type {number} */ x) => (Math.asin(x) * 180) / Math.PI,\n\n acosd: (/** @type {number} */ x) => (Math.acos(x) * 180) / Math.PI,\n\n atand: (/** @type {number} */ x) => (Math.atan(x) * 180) / Math.PI,\n\n atand2: (/** @type {number} */ y, /** @type {number} */ x) => (Math.atan2(y, x) * 180) / Math.PI,\n\n asin: (/** @type {number} */ x) => Math.asin(x),\n\n acos: (/** @type {number} */ x) => Math.acos(x),\n\n atan: (/** @type {number} */ x) => Math.atan(x),\n\n log: (/** @type {number} */ x) => {\n if (x <= 0) {\n throw new Error('log() domain error');\n }\n return Math.log(x);\n },\n\n log10: (/** @type {number} */ x) => {\n if (x <= 0) {\n throw new Error('log10() domain error');\n }\n return Math.log10(x);\n },\n\n exp: (/** @type {number} */ x) => Math.exp(x),\n\n random: () => Math.random(),\n\n and: (/** @type {any} */ a, /** @type {any} */ b) => Boolean(a && b),\n\n or: (/** @type {any} */ a, /** @type {any} */ b) => Boolean(a || b),\n\n not: (/** @type {any} */ a) => !a,\n '!': (/** @type {any} */ a) => !a,\n\n eq: (/** @type {any} */ a, /** @type {any} */ b) => a === b,\n\n neq: (/** @type {any} */ a, /** @type {any} */ b) => a !== b,\n notEqual: (/** @type {any} */ a, /** @type {any} */ b) => a !== b,\n\n gt: (/** @type {number} */ a, /** @type {number} */ b) => a > b,\n greaterThan: (/** @type {number} */ a, /** @type {number} */ b) => a > b,\n\n lt: (/** @type {number} */ a, /** @type {number} */ b) => a < b,\n lessThan: (/** @type {number} */ a, /** @type {number} */ b) => a < b,\n\n gte: (/** @type {number} */ a, /** @type {number} */ b) => a >= b,\n greaterThanOrEqual: (/** @type {number} */ a, /** @type {number} */ b) => a >= b,\n\n lte: (/** @type {number} */ a, /** @type {number} */ b) => a <= b,\n lessThanOrEqual: (/** @type {number} */ a, /** @type {number} */ b) => a <= b,\n\n clamp: (/** @type {number} */ x, /** @type {number} */ min, /** @type {number} */ max) => {\n if (min > max) {\n throw new Error('clamp(): min > max');\n }\n return Math.min(Math.max(x, min), max);\n },\n\n if: (/** @type {any} */ condition, /** @type {any} */ a, /** @type {any} */ b) =>\n condition ? a : b,\n\n typeof: (/** @type {any} */ x) => typeof x,\n\n length: (/** @type {string | any[]} */ x) => {\n if (typeof x === 'string' || Array.isArray(x)) {\n return x.length;\n }\n throw new Error('length() expects string or array');\n },\n\n sum: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('sum() requires at least one argument');\n }\n return args.reduce((a, b) => a + b, 0);\n },\n\n prod: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('prod() requires at least one argument');\n }\n return args.reduce((a, b) => a * b, 1);\n },\n\n mean: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('mean() requires at least one argument');\n }\n return args.reduce((a, b) => a + b, 0) / args.length;\n },\n\n median: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('median() requires at least one argument');\n }\n const sorted = [...args].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n },\n\n mode: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('mode() requires at least one argument');\n }\n const freq = new Map();\n args.forEach((v) => freq.set(v, (freq.get(v) || 0) + 1));\n let maxCount = 0;\n let result = args[0];\n for (const [val, count] of freq) {\n if (count > maxCount) {\n maxCount = count;\n result = val;\n }\n }\n return result;\n },\n\n std: (/** @type {any[]} */ ...args) => {\n if (args.length < 2) {\n throw new Error('std() requires at least two values');\n }\n const m = args.reduce((a, b) => a + b, 0) / args.length;\n return Math.sqrt(args.reduce((sum, v) => sum + (v - m) ** 2, 0) / (args.length - 1));\n },\n\n variance: (/** @type {any[]} */ ...args) => {\n if (args.length < 2) {\n throw new Error('variance() requires at least two values');\n }\n const m = args.reduce((a, b) => a + b, 0) / args.length;\n return args.reduce((sum, v) => sum + (v - m) ** 2, 0) / (args.length - 1);\n },\n\n range: (/** @type {any[]} */ ...args) => {\n if (!args.length) {\n throw new Error('range() requires at least one argument');\n }\n return Math.max(...args) - Math.min(...args);\n },\n\n gcd: (/** @type {number} */ a, /** @type {number} */ b) => _gcd(a, b),\n\n lcm: (/** @type {number} */ a, /** @type {number} */ b) => {\n if (a === 0 || b === 0) {\n return 0;\n }\n return Math.abs((a / _gcd(a, b)) * b);\n },\n\n factorial: (/** @type {any} */ n) => {\n if (!Number.isInteger(n) || n < 0) {\n throw new Error('factorial() requires a non-negative integer');\n }\n if (n === 0 || n === 1) {\n return 1;\n }\n let r = 1;\n for (let i = 2; i <= n; i++) {\n r *= i;\n }\n return r;\n },\n\n isPrime: (/** @type {any} */ n) => {\n if (!Number.isInteger(n) || n < 2) {\n return false;\n }\n if (n === 2) {\n return true;\n }\n if (n % 2 === 0) {\n return false;\n }\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n return true;\n },\n\n primeFactors: (/** @type {any} */ n) => {\n if (!Number.isInteger(n) || n < 2) {\n throw new Error('primeFactors() requires an integer >= 2');\n }\n const factors = [];\n let m = n;\n for (let i = 2; i * i <= m; i++) {\n while (m % i === 0) {\n factors.push(i);\n m /= i;\n }\n }\n if (m > 1) {\n factors.push(m);\n }\n return factors;\n },\n\n fibonacci: (/** @type {any} */ n) => {\n if (!Number.isInteger(n) || n < 0) {\n throw new Error('fibonacci() requires a non-negative integer');\n }\n if (n <= 1) {\n return n;\n }\n let a = 0;\n let b = 1;\n for (let i = 2; i <= n; i++) {\n const t = a + b;\n a = b;\n b = t;\n }\n return b;\n },\n\n nCr: (/** @type {any} */ n, /** @type {any} */ r) => {\n if (!Number.isInteger(n) || !Number.isInteger(r) || n < 0 || r < 0) {\n throw new Error('nCr() requires non-negative integers');\n }\n if (r > n) {\n return 0;\n }\n if (r === 0 || r === n) {\n return 1;\n }\n r = Math.min(r, n - r);\n let result = 1;\n for (let i = 1; i <= r; i++) {\n result = (result * (n - r + i)) / i;\n }\n return result;\n },\n\n nPr: (/** @type {any} */ n, /** @type {any} */ r) => {\n if (!Number.isInteger(n) || !Number.isInteger(r) || n < 0 || r < 0) {\n throw new Error('nPr() requires non-negative integers');\n }\n if (r > n) {\n return 0;\n }\n let result = 1;\n for (let i = 0; i < r; i++) {\n result *= n - i;\n }\n return result;\n },\n\n gamma: (/** @type {any} */ n) => _gamma(n),\n\n sinh: (/** @type {number} */ x) => Math.sinh(x),\n\n cosh: (/** @type {number} */ x) => Math.cosh(x),\n\n tanh: (/** @type {number} */ x) => Math.tanh(x),\n\n asinh: (/** @type {number} */ x) => Math.asinh(x),\n\n acosh: (/** @type {number} */ x) => Math.acosh(x),\n\n atanh: (/** @type {number} */ x) => Math.atanh(x),\n\n sec: (/** @type {number} */ x) => {\n const c = Math.cos(x);\n if (Math.abs(c) < 1e-15) {\n throw new Error('sec() undefined for this input');\n }\n return 1 / c;\n },\n\n csc: (/** @type {number} */ x) => {\n const s = Math.sin(x);\n if (Math.abs(s) < 1e-15) {\n throw new Error('csc() undefined for this input');\n }\n return 1 / s;\n },\n\n cot: (/** @type {number} */ x) => {\n const s = Math.sin(x);\n if (Math.abs(s) < 1e-15) {\n throw new Error('cot() undefined for this input');\n }\n return Math.cos(x) / s;\n },\n\n trunc: (/** @type {number} */ x) => Math.trunc(x),\n\n sign: (/** @type {number} */ x) => Math.sign(x),\n\n frac: (/** @type {number} */ x) => x - Math.trunc(x),\n\n split: (\n /** @type {string} */ str,\n /** @type {{ [Symbol.split](string: string, limit?: number): string[]; }} */ sep\n ) => {\n if (typeof str !== 'string') {\n throw new Error('split() expects a string');\n }\n return str.split(sep);\n },\n\n join: (/** @type {any[]} */ arr, /** @type {string | undefined} */ sep) => {\n if (!Array.isArray(arr)) {\n throw new Error('join() expects an array');\n }\n return arr.join(sep);\n },\n\n upper: (/** @type {string} */ str) => {\n if (typeof str !== 'string') {\n throw new Error('upper() expects a string');\n }\n return str.toUpperCase();\n },\n\n lower: (/** @type {string} */ str) => {\n if (typeof str !== 'string') {\n throw new Error('lower() expects a string');\n }\n return str.toLowerCase();\n },\n\n trim: (/** @type {string} */ str) => {\n if (typeof str !== 'string') {\n throw new Error('trim() expects a string');\n }\n return str.trim();\n },\n\n replace: (\n /** @type {string} */ str,\n /** @type {{ [Symbol.replace](string: string, replaceValue: string): string; }} */ pattern,\n /** @type {string} */ replacement\n ) => {\n if (typeof str !== 'string') {\n throw new Error('replace() expects a string');\n }\n return str.replace(pattern, replacement);\n },\n\n substring: (\n /** @type {string} */ str,\n /** @type {number} */ start,\n /** @type {number | undefined} */ end\n ) => {\n if (typeof str !== 'string') {\n throw new Error('substring() expects a string');\n }\n return str.substring(start, end);\n },\n\n // ---- Reciprocal trig ----\n acot: (/** @type {number} */ x) => {\n if (x === 0) {\n return Math.PI / 2;\n }\n return Math.atan(1 / x);\n },\n\n asec: (/** @type {number} */ x) => {\n if (x < 1 && x > -1) {\n throw new Error('asec() domain error');\n }\n return Math.acos(1 / x);\n },\n\n acsc: (/** @type {number} */ x) => {\n if (x < 1 && x > -1) {\n throw new Error('acsc() domain error');\n }\n return Math.asin(1 / x);\n },\n\n acoth: (/** @type {number} */ x) => {\n if (Math.abs(x) <= 1) {\n throw new Error('acoth() domain error');\n }\n return Math.atanh(1 / x);\n },\n\n asech: (/** @type {number} */ x) => {\n if (x <= 0 || x > 1) {\n throw new Error('asech() domain error');\n }\n return Math.acosh(1 / x);\n },\n\n acsch: (/** @type {number} */ x) => {\n if (x === 0) {\n throw new Error('acsch() domain error');\n }\n return Math.asinh(1 / x);\n },\n\n // ---- Stats ----\n quantile: (/** @type {any[]} */ arr, /** @type {number} */ p) => {\n if (!Array.isArray(arr) || arr.length === 0) {\n throw new Error('quantile() expects a non-empty array');\n }\n if (p < 0 || p > 1) {\n throw new Error('quantile() p must be between 0 and 1');\n }\n const sorted = [...arr].sort((a, b) => a - b);\n const idx = p * (sorted.length - 1);\n const lo = Math.floor(idx);\n const hi = Math.ceil(idx);\n return lo === hi ? sorted[lo] : sorted[lo] + (idx - lo) * (sorted[hi] - sorted[lo]);\n },\n\n percentile: (/** @type {any[]} */ arr, /** @type {number} */ p) => {\n if (p < 0 || p > 100) {\n throw new Error('percentile() p must be between 0 and 100');\n }\n return internalFunctions.quantile(arr, p / 100);\n },\n\n covariance: (/** @type {number[]} */ x, /** @type {number[]} */ y) => {\n if (!Array.isArray(x) || !Array.isArray(y) || x.length < 2 || x.length !== y.length) {\n throw new Error('covariance() expects two arrays of equal length >= 2');\n }\n const mx = x.reduce((s, v) => s + v, 0) / x.length;\n const my = y.reduce((s, v) => s + v, 0) / y.length;\n return x.reduce((s, v, i) => s + (v - mx) * (y[i] - my), 0) / (x.length - 1);\n },\n\n corr: (/** @type {number[]} */ x, /** @type {number[]} */ y) => {\n const cov = internalFunctions.covariance(x, y);\n const sx = Math.sqrt(internalFunctions.covariance(x, x));\n const sy = Math.sqrt(internalFunctions.covariance(y, y));\n if (sx === 0 || sy === 0) {\n throw new Error('corr() zero variance');\n }\n return cov / (sx * sy);\n },\n\n randomInt: (/** @type {number} */ min, /** @type {number} */ max) => {\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new Error('randomInt() expects integers');\n }\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n randomNormal: (/** @type {number} */ mean, /** @type {number} */ std) => {\n if (std <= 0) {\n throw new Error('randomNormal() std must be > 0');\n }\n let u = 0;\n let v = 0;\n while (u === 0) {\n u = Math.random();\n }\n while (v === 0) {\n v = Math.random();\n }\n return mean + std * Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n },\n\n // ---- Special functions ----\n erf: (/** @type {number} */ x) => {\n if (x === 0) {\n return 0;\n }\n // Abramowitz & Stegun approximation (max error 1.5e-7)\n const t = 1 / (1 + 0.3275911 * Math.abs(x));\n const a = [0.254829592, -0.284496736, 1.421413741, -1.453152027, 1.061405429];\n let p = a[4] * t + a[3];\n p = p * t + a[2];\n p = p * t + a[1];\n p = p * t + a[0];\n p = p * t;\n const result = 1 - p * Math.exp(-x * x);\n return x >= 0 ? result : -result;\n },\n\n lgamma: (/** @type {number} */ x) => {\n if (x <= 0) {\n throw new Error('lgamma() domain error (x > 0 required)');\n }\n // Stirling's approximation\n if (x < 12) {\n // Use recurrence: lgamma(x) = lgamma(x+1) - ln(x)\n let v = x;\n let r = 0;\n while (v < 12) {\n r -= Math.log(v);\n v += 1;\n }\n return r + internalFunctions.lgamma(v);\n }\n const inv = 1 / x;\n const s = (1 / 12 - (inv * inv) / 360 + (inv * inv * inv * inv) / 1260) * inv;\n return (x - 0.5) * Math.log(x) - x + 0.9189385332046727 + s;\n },\n\n beta: (/** @type {number} */ a, /** @type {number} */ b) => {\n if (a <= 0 || b <= 0) {\n throw new Error('beta() domain error');\n }\n return Math.exp(\n internalFunctions.lgamma(a) + internalFunctions.lgamma(b) - internalFunctions.lgamma(a + b)\n );\n },\n\n // ---- Numeric helpers ----\n hypot: (.../** @type {number[]} */ args) => Math.hypot(...args),\n\n cbrt: (/** @type {number} */ x) => Math.cbrt(x),\n\n log2: (/** @type {number} */ x) => {\n if (x <= 0) {\n throw new Error('log2() domain error');\n }\n return Math.log2(x);\n },\n\n log1p: (/** @type {number} */ x) => {\n if (x <= -1) {\n throw new Error('log1p() domain error');\n }\n return Math.log1p(x);\n },\n\n expm1: (/** @type {number} */ x) => Math.expm1(x),\n\n // ---- Bitwise ----\n bitAnd: (/** @type {number} */ a, /** @type {number} */ b) => {\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n throw new Error('bitAnd() expects integers');\n }\n return a & b;\n },\n\n bitOr: (/** @type {number} */ a, /** @type {number} */ b) => {\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n throw new Error('bitOr() expects integers');\n }\n return a | b;\n },\n\n bitXor: (/** @type {number} */ a, /** @type {number} */ b) => {\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n throw new Error('bitXor() expects integers');\n }\n return a ^ b;\n },\n\n bitNot: (/** @type {number} */ a) => {\n if (!Number.isInteger(a)) {\n throw new Error('bitNot() expects an integer');\n }\n return ~a;\n },\n};\n","/** @param {string | any[]} tokens */\nexport function buildAST(tokens) {\n let current = 0;\n\n const peek = () => tokens[current];\n const consume = () => tokens[current++];\n const lastPos = () => {\n const t = current > 0 ? tokens[current - 1] : null;\n return t && t.pos !== undefined ? t.pos : -1;\n };\n const tokenPos = () => {\n const t = peek();\n return t && t.pos !== undefined ? t.pos : -1;\n };\n\n const nodeAt = (/** @type {any} */ node) => {\n const pos = lastPos();\n if (pos >= 0) {\n node.pos = pos;\n }\n return node;\n };\n\n const syntaxError = (/** @type {string} */ msg) => {\n const pos = tokenPos() >= 0 ? tokenPos() : lastPos();\n const at = pos >= 0 ? ` at position ${pos}` : '';\n throw new Error(`${msg}${at}`);\n };\n\n const match = (/** @type {string} */ type, /** @type {string | undefined} */ value) => {\n const t = peek();\n if (!t) {\n return false;\n }\n\n if (t.type !== type) {\n return false;\n }\n\n if (value !== undefined && t.value !== value) {\n return false;\n }\n\n current++;\n return true;\n };\n\n const parseSliceOrIndex = () => {\n let start = null;\n\n if (!(peek()?.type === 'Colon' || peek()?.type === 'Comma' || peek()?.type === 'ArrayEnd')) {\n start = parseExpression();\n }\n\n if (match('Colon', undefined)) {\n let end = null;\n\n if (!(peek()?.type === 'Comma' || peek()?.type === 'ArrayEnd')) {\n end = parseExpression();\n }\n\n return {\n type: 'SliceExpression',\n start,\n end,\n };\n }\n\n return start;\n };\n\n function parsePrimary() {\n const token = consume();\n if (!token) {\n syntaxError('Unexpected end of input');\n }\n\n const withPos = (/** @type {any} */ node) => {\n if (token.pos !== undefined) {\n node.pos = token.pos;\n }\n return node;\n };\n\n switch (token.type) {\n case 'Number':\n case 'BigInt':\n case 'Boolean':\n case 'String':\n return withPos({ type: 'Literal', value: token.value });\n\n case 'ImaginaryLiteral':\n return withPos({ type: 'ImaginaryLiteral', value: token.value });\n\n case 'NumberWithUnit':\n return withPos({\n type: 'UnitLiteral',\n value: token.value,\n unit: token.unit,\n });\n\n case 'Identifier':\n return withPos({ type: 'Identifier', name: token.name });\n\n case 'Function':\n return withPos({\n type: 'Identifier',\n name: token.name,\n });\n\n case 'Parenthesis':\n if (token.value === '(') {\n const expr = parseExpression();\n\n if (!match('Parenthesis', ')')) {\n syntaxError(\"Expected ')'\");\n }\n\n return expr;\n }\n\n // falls through\n\n case 'ArrayStart': {\n const rows = [];\n let currentRow = [];\n\n if (!match('ArrayEnd', undefined)) {\n while (true) {\n currentRow.push(parseExpression());\n\n if (match('Comma', undefined)) {\n continue;\n }\n\n if (match('Semicolon', undefined)) {\n rows.push(currentRow);\n currentRow = [];\n continue;\n }\n\n if (match('ArrayEnd', undefined)) {\n rows.push(currentRow);\n break;\n }\n\n syntaxError(\"Expected ',', ';', or ']'\");\n }\n }\n\n if (!rows.length) {\n return withPos({ type: 'ArrayExpression', elements: [] });\n }\n\n if (rows.length === 1) {\n return withPos({ type: 'ArrayExpression', elements: rows[0] });\n }\n\n return withPos({\n type: 'ArrayExpression',\n elements: rows.map((elements) => ({\n type: 'ArrayExpression',\n elements,\n })),\n });\n }\n\n case 'BlockStart': {\n const properties = [];\n\n if (!match('BlockEnd', undefined)) {\n do {\n const keyToken = consume();\n\n if (keyToken.type !== 'Identifier' && keyToken.type !== 'String') {\n syntaxError('Invalid object key');\n }\n\n if (!match('Colon', undefined)) {\n syntaxError(\"Expected ':' after key\");\n }\n\n const value = parseExpression();\n\n properties.push({\n key: keyToken.value,\n value,\n });\n } while (match('Comma', undefined));\n\n if (!match('BlockEnd', undefined)) {\n syntaxError(\"Expected '}'\");\n }\n }\n\n return withPos({ type: 'ObjectExpression', properties });\n }\n }\n\n syntaxError(`Unexpected token: ${JSON.stringify(token.value || token.name || token.type)}`);\n }\n\n function parseMember() {\n let object = parsePrimary();\n\n while (true) {\n if (match('ArrayStart', undefined)) {\n const selectors = [];\n\n if (!match('ArrayEnd', undefined)) {\n do {\n selectors.push(parseSliceOrIndex());\n } while (match('Comma', undefined));\n\n if (!match('ArrayEnd', undefined)) {\n syntaxError(\"Expected ']'\");\n }\n }\n\n object = nodeAt({\n type: 'IndexExpression',\n object,\n selectors,\n });\n continue;\n }\n\n if (match('Dot', undefined)) {\n const property = consume();\n\n if (property.type !== 'Identifier') {\n syntaxError(\"Expected property after '.'\");\n }\n\n object = nodeAt({\n type: 'MemberExpression',\n object,\n property: { type: 'Identifier', name: property.value },\n optional: false,\n });\n continue;\n }\n\n if (match('Operator', '?.')) {\n const property = consume();\n\n object = nodeAt({\n type: 'MemberExpression',\n object,\n property: { type: 'Identifier', name: property.value },\n optional: true,\n });\n continue;\n }\n\n break;\n }\n\n return object;\n }\n\n function parseCallChain() {\n let expr = parseMember();\n\n while (peek()?.type === 'Parenthesis' && peek()?.value === '(') {\n consume();\n\n const args = [];\n\n if (!(peek()?.type === 'Parenthesis' && peek()?.value === ')')) {\n do {\n if (match('Spread', undefined)) {\n const arg = parseExpression();\n args.push({ type: 'SpreadElement', argument: arg });\n } else {\n args.push(parseExpression());\n }\n } while (match('Comma', undefined));\n }\n\n if (!match('Parenthesis', ')')) {\n syntaxError(\"Expected ')'\");\n }\n\n expr = nodeAt({\n type: 'CallExpression',\n callee: expr,\n arguments: args,\n });\n }\n\n return expr;\n }\n\n function parseUnary() {\n if (match('UnaryOperator', undefined)) {\n const operator = tokens[current - 1].value;\n\n return nodeAt({\n type: 'UnaryExpression',\n operator,\n argument: parseUnary(),\n });\n }\n\n return parseCallChain();\n }\n\n function parsePower() {\n const left = parseUnary();\n\n if (match('Operator', '^')) {\n const right = parsePower();\n return nodeAt({\n type: 'BinaryExpression',\n operator: '^',\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseMultiplication() {\n let left = parsePower();\n\n while (match('Operator', '*') || match('Operator', '/') || match('Operator', '%')) {\n const operator = tokens[current - 1].value;\n const right = parsePower();\n\n left = nodeAt({\n type: 'BinaryExpression',\n operator,\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseAddition() {\n let left = parseMultiplication();\n\n while (match('Operator', '+') || match('Operator', '-')) {\n const operator = tokens[current - 1].value;\n const right = parseMultiplication();\n\n left = nodeAt({\n type: 'BinaryExpression',\n operator,\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseUnitConversion() {\n const left = parseAddition();\n\n const nextKeyword = peek();\n if (nextKeyword?.type === 'Keyword' && ['to', 'in'].includes(nextKeyword.value)) {\n consume();\n const next = consume();\n\n if (!next || next.type !== 'Unit') {\n syntaxError(`Expected unit after '${nextKeyword.value}'`);\n }\n\n return nodeAt({\n type: 'UnitConversion',\n from: left,\n to: next.value,\n });\n }\n\n return left;\n }\n\n function parseComparison() {\n let left = parseUnitConversion();\n\n while (\n match('Operator', '>') ||\n match('Operator', '<') ||\n match('Operator', '>=') ||\n match('Operator', '<=') ||\n match('Operator', '==')\n ) {\n const operator = tokens[current - 1].value;\n const right = parseUnitConversion();\n\n left = nodeAt({\n type: 'BinaryExpression',\n operator,\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseLogical() {\n let left = parseComparison();\n\n while (match('Operator', '&&') || match('Operator', '||')) {\n const operator = tokens[current - 1].value;\n const right = parseComparison();\n\n left = nodeAt({\n type: 'LogicalExpression',\n operator,\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseNullish() {\n let left = parseLogical();\n\n while (match('Operator', '??')) {\n const right = parseLogical();\n\n left = nodeAt({\n type: 'LogicalExpression',\n operator: '??',\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseTernary() {\n const test = parseNullish();\n\n if (match('Ternary', '?')) {\n const consequent = parseExpression();\n\n if (!match('Ternary', ':')) {\n syntaxError(\"Expected ':' in ternary\");\n }\n\n const alternate = parseExpression();\n\n return nodeAt({\n type: 'ConditionalExpression',\n test,\n consequent,\n alternate,\n });\n }\n\n if (match('Colon', undefined)) {\n const end = parseNullish();\n\n return nodeAt({\n type: 'RangeExpression',\n start: test,\n end,\n });\n }\n\n return test;\n }\n\n function parseLambda() {\n const left = parsePipeline();\n\n if (match('Operator', '->')) {\n let params;\n if (left.type === 'Identifier') {\n params = [left.name];\n } else if (left.type === 'ArrayExpression') {\n params = left.elements.map((/** @type {{ type: string; name: any; }} */ el) => {\n if (el.type !== 'Identifier') {\n syntaxError('Lambda parameter must be an identifier');\n }\n return el.name;\n });\n } else {\n syntaxError('Invalid lambda parameter');\n }\n\n const body = parseLambda();\n\n return nodeAt({\n type: 'ArrowFunctionExpression',\n params,\n body,\n });\n }\n\n return left;\n }\n\n function parsePipeline() {\n let left = parseTernary();\n\n while (match('Operator', '|>')) {\n const right = parseTernary();\n\n left = nodeAt({\n type: 'PipelineExpression',\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseAssignment() {\n const left = parseLambda();\n\n if (\n match('Operator', '=') ||\n match('Operator', '+=') ||\n match('Operator', '-=') ||\n match('Operator', '*=') ||\n match('Operator', '/=')\n ) {\n const operator = tokens[current - 1].value;\n\n // f(a,b) = expr: treat as function definition, not assignment\n if (left.type === 'CallExpression') {\n const isFunctionTarget =\n left.callee?.type === 'Identifier' &&\n left.arguments.every((/** @type {{ type: string; }} */ arg) => arg.type === 'Identifier');\n\n if (!isFunctionTarget) {\n syntaxError('Invalid function definition');\n }\n\n const right = parseAssignment();\n\n return nodeAt({\n type: 'FunctionAssignmentExpression',\n operator,\n left: {\n type: 'Identifier',\n name: left.callee.name,\n },\n params: left.arguments.map((/** @type {{ name: any; }} */ arg) => arg.name),\n right,\n });\n }\n\n if (\n left.type !== 'Identifier' &&\n left.type !== 'MemberExpression' &&\n left.type !== 'IndexExpression'\n ) {\n syntaxError('Invalid assignment target');\n }\n\n const right = parseAssignment();\n\n return nodeAt({\n type: 'AssignmentExpression',\n operator,\n left,\n right,\n });\n }\n\n return left;\n }\n\n function parseExpression() {\n return parseAssignment();\n }\n\n const ast = parseExpression();\n\n if (current < tokens.length) {\n const t = peek();\n const pos = t && t.pos !== undefined ? ` at position ${t.pos}` : '';\n throw new Error(\n `Unexpected token \"${t ? JSON.stringify(t.value || t.name || t.type) : '?'}\"${pos}`\n );\n }\n\n return ast;\n}\n","import { tokenize } from '../parser/tokenizer.js';\nimport { evaluateAST } from '../parser/evaluator.js';\nimport { createContext } from './context.js';\nimport { mathOperations } from '../math/operations.js';\nimport { createUnitsStore } from '../utils/store.js';\nimport { globalUnits } from '../utils/globalUnits.js';\nimport { createVarStore } from '../variables/store.js';\nimport { createFunctionRegistry } from '../function/registry.js';\nimport { internalFunctions } from '../function/internal.js';\nimport { isDenseMatrixWrapper, serializeExprifyValue, wrapDenseMatrix } from '../utils/matrix.js';\nimport { buildAST } from '../parser/astBuild.js';\nimport { isFraction, formatFraction } from '../math/fraction.js';\nimport { isBigNumber, formatBigNumber } from '../math/bignumber.js';\n\nconst isComplex = (/** @type {any} */ value) =>\n value && typeof value === 'object' && 're' in value && 'im' in value;\n\nconst isUnitValue = (/** @type {any} */ value) =>\n value && typeof value === 'object' && 'value' in value && 'unit' in value;\n\nconst isMatrix = (/** @type {any[]} */ value) =>\n Array.isArray(value) && value.length > 0 && value.every(Array.isArray);\n\nconst formatComplex = (/** @type {{ re: any; im: number; }} */ value) => {\n if (!isComplex(value)) {\n return value;\n }\n\n const real = value.re;\n const imaginary = Math.abs(value.im);\n const sign = value.im < 0 ? '-' : '+';\n\n if (real === 0) {\n if (value.im === 1) {\n return 'i';\n }\n if (value.im === -1) {\n return '-i';\n }\n return `${value.im}i`;\n }\n\n const imagPart = imaginary === 1 ? 'i' : `${imaginary}i`;\n return `${real} ${sign} ${imagPart}`;\n};\n\nconst formatScalar = (/** @type {unknown} */ value) => {\n if (isBigNumber(value)) {\n return formatBigNumber(value);\n }\n if (typeof value !== 'number') {\n return String(value);\n }\n\n if (Number.isInteger(value)) {\n return String(value);\n }\n\n return Number(value.toFixed(14)).toString();\n};\n\nconst formatResult = (/** @type {any} */ value) => {\n if (isFraction(value)) {\n return formatFraction(value);\n }\n\n if (isBigNumber(value)) {\n return formatBigNumber(value);\n }\n\n if (isComplex(value)) {\n return formatComplex(value);\n }\n\n if (isUnitValue(value)) {\n return `${value.value} ${value.unit}`;\n }\n\n if (isDenseMatrixWrapper(value)) {\n return serializeExprifyValue(value);\n }\n\n if (isMatrix(value)) {\n return value.map((/** @type {unknown[]} */ row) => row.map(formatScalar).join('\\t')).join('\\n');\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (value && typeof value === 'object') {\n return serializeExprifyValue(value);\n }\n\n return value;\n};\n\nclass exprify {\n constructor() {\n this.math = mathOperations;\n this.units = createUnitsStore(globalUnits);\n this.functions = createFunctionRegistry(internalFunctions);\n this.variables = createVarStore();\n this._cache = new Map();\n this.variables.set('pi', Math.PI);\n this.variables.set('e', Math.E);\n this.variables.set('PHI', (1 + Math.sqrt(5)) / 2);\n this.variables.set('TAU', 2 * Math.PI);\n this.variables.set('INFINITY', Infinity);\n this.variables.set('NaN', NaN);\n this.addFunction('parse', (/** @type {any} */ expression) => {\n if (typeof expression !== 'string') {\n throw new Error('parse() expects an expression string');\n }\n return expression;\n });\n this.addFunction('leafCount', (/** @type {string} */ value) => {\n const countLeafTokens = (/** @type {string} */ expression) => {\n const strippedKeys = expression.replace(/(^|[{,]\\s*)[a-zA-Z_][a-zA-Z0-9_]*\\s*:/g, '$1');\n const matches = strippedKeys.match(/\\d+(\\.\\d+)?(e[+-]?\\d+)?n?|[a-zA-Z_][a-zA-Z0-9_]*/gi);\n return matches ? matches.length : 0;\n };\n\n let ast = value;\n if (typeof value === 'string') {\n try {\n ast = this.parse(value).ast;\n } catch {\n return countLeafTokens(value);\n }\n }\n\n const countLeaves = (/** @type {any} */ node) => {\n if (!node || typeof node !== 'object') {\n return 0;\n }\n\n switch (node.type) {\n case 'Literal':\n case 'ImaginaryLiteral':\n case 'UnitLiteral':\n case 'Identifier':\n return 1;\n default:\n return Object.values(node).reduce((sum, child) => {\n if (Array.isArray(child)) {\n return sum + child.reduce((inner, item) => inner + countLeaves(item), 0);\n }\n\n return sum + countLeaves(child);\n }, 0);\n }\n };\n\n return countLeaves(ast);\n });\n this.addFunction('matrix', (/** @type {any} */ value) => wrapDenseMatrix(value));\n this.addFunction('sparse', (/** @type {any} */ value) => wrapDenseMatrix(value));\n\n // --- rationalize(): polynomial/rational arithmetic using Map<JSON-power-tuple, coefficient> ---\n this.addFunction('rationalize', (/** @type {string} */ expression, withDetails = false) => {\n if (typeof expression !== 'string') {\n throw new Error('rationalize() expects an expression string');\n }\n\n const normalizedExpression = expression\n .replace(/\\s+/g, '')\n .replace(/(\\d)([a-zA-Z(])/g, '$1*$2')\n .replace(/([a-zA-Z)])(\\d)/g, '$1*$2');\n\n const polyKey = (powers) =>\n JSON.stringify(Object.entries(powers).sort(([a], [b]) => a.localeCompare(b)));\n const keyToPowers = (/** @type {string} */ key) => Object.fromEntries(JSON.parse(key));\n const constPoly = (/** @type {number} */ value) => new Map([[polyKey({}), value]]);\n const varPoly = (/** @type {any} */ name) => new Map([[polyKey({ [name]: 1 }), 1]]);\n const cleanPoly = (/** @type {any[] | Map<any, any>} */ poly) =>\n new Map([...poly.entries()].filter(([, coeff]) => coeff !== 0));\n const addPoly = (\n /** @type {Iterable<readonly [any, any]> | null | undefined} */ a,\n /** @type {any[] | Map<any, any>} */ b,\n sign = 1\n ) => {\n const result = new Map(a);\n for (const [key, coeff] of b.entries()) {\n result.set(key, (result.get(key) || 0) + sign * coeff);\n }\n return cleanPoly(result);\n };\n const multiplyPoly = (/** @type {any} */ a, /** @type {any} */ b) => {\n const result = new Map();\n for (const [keyA, coeffA] of a.entries()) {\n const powersA = keyToPowers(keyA);\n for (const [keyB, coeffB] of b.entries()) {\n const powersB = keyToPowers(keyB);\n const merged = { ...powersA };\n for (const [name, power] of Object.entries(powersB)) {\n merged[name] = (merged[name] || 0) + power;\n }\n const key = polyKey(merged);\n result.set(key, (result.get(key) || 0) + coeffA * coeffB);\n }\n }\n return cleanPoly(result);\n };\n const powPoly = (/** @type {any} */ poly, /** @type {number} */ exponent) => {\n let result = constPoly(1);\n for (let index = 0; index < exponent; index++) {\n result = multiplyPoly(result, poly);\n }\n return result;\n };\n const rational = (/** @type {Map<any, any>} */ num, den = constPoly(1)) => ({ num, den });\n const addRat = (\n /** @type {{ num: any; den: any; }} */ a,\n /** @type {{ den: any; num: any; }} */ b,\n sign = 1\n ) =>\n rational(\n addPoly(multiplyPoly(a.num, b.den), multiplyPoly(b.num, a.den), sign),\n multiplyPoly(a.den, b.den)\n );\n const mulRat = (\n /** @type {{ num: any; den: any; }} */ a,\n /** @type {{ num: any; den: any; }} */ b\n ) => rational(multiplyPoly(a.num, b.num), multiplyPoly(a.den, b.den));\n const divRat = (\n /** @type {{ num: any; den: any; }} */ a,\n /** @type {{ den: any; num: any; }} */ b\n ) => rational(multiplyPoly(a.num, b.den), multiplyPoly(a.den, b.num));\n const negRat = (\n /** @type {{ num: any[] | Map<any, any>; den: Map<string, number> | undefined; }} */ value\n ) => rational(addPoly(new Map(), value.num, -1), value.den);\n const astToRat = (/** @type {any} */ node) => {\n switch (node.type) {\n case 'Literal':\n return rational(constPoly(node.value));\n case 'Identifier':\n return rational(varPoly(node.name));\n case 'UnaryExpression':\n if (node.operator === '-') {\n return negRat(astToRat(node.argument));\n }\n throw new Error('Unsupported unary operator');\n case 'BinaryExpression': {\n const left = astToRat(node.left);\n const right = astToRat(node.right);\n switch (node.operator) {\n case '+':\n return addRat(left, right);\n case '-':\n return addRat(left, right, -1);\n case '*':\n return mulRat(left, right);\n case '/':\n return divRat(left, right);\n case '^': {\n if (\n node.right.type !== 'Literal' ||\n !Number.isInteger(node.right.value) ||\n node.right.value < 0\n ) {\n throw new Error('Unsupported exponent');\n }\n return rational(\n powPoly(left.num, node.right.value),\n powPoly(left.den, node.right.value)\n );\n }\n default:\n throw new Error('Unsupported operator in rationalize()');\n }\n }\n default:\n throw new Error('Unsupported expression in rationalize()');\n }\n };\n const formatPoly = (/** @type {any} */ poly) => {\n const entries = [...poly.entries()]\n .filter(([, coeff]) => coeff !== 0)\n .sort(([keyA], [keyB]) => {\n const powersA = keyToPowers(keyA);\n const powersB = keyToPowers(keyB);\n const firstVarA = Object.keys(powersA).sort()[0] || '';\n const firstVarB = Object.keys(powersB).sort()[0] || '';\n\n if (firstVarA !== firstVarB) {\n return firstVarA.localeCompare(firstVarB);\n }\n\n const degreeA = Object.values(powersA).reduce((sum, value) => sum + value, 0);\n const degreeB = Object.values(powersB).reduce((sum, value) => sum + value, 0);\n return degreeB - degreeA;\n });\n\n if (!entries.length) {\n return '0';\n }\n\n return entries\n .map(([key, coeff], index) => {\n const powers = keyToPowers(key);\n const absCoeff = Math.abs(coeff);\n const variablePart = Object.entries(powers)\n .map(([name, power]) => (power === 1 ? name : `${name} ^ ${power}`))\n .join(' * ');\n let body = variablePart;\n\n if (!body) {\n body = `${absCoeff}`;\n } else if (absCoeff !== 1) {\n body = `${absCoeff} * ${body}`;\n }\n\n if (index === 0) {\n return coeff < 0 ? `- ${body}`.replace('- ', '-') : body;\n }\n\n return coeff < 0 ? `- ${body}` : `+ ${body}`;\n })\n .join(' ');\n };\n\n const ast = this.parse(normalizedExpression).ast;\n const result = astToRat(ast);\n const numerator = formatPoly(result.num);\n const denominator = formatPoly(result.den);\n const variableSet = new Set();\n\n for (const poly of [result.num, result.den]) {\n for (const key of poly.keys()) {\n for (const name of Object.keys(keyToPowers(key))) {\n variableSet.add(name);\n }\n }\n }\n\n if (!withDetails) {\n return `(${numerator}) / (${denominator})`;\n }\n\n return {\n numerator,\n denominator,\n coefficients: [],\n variables: [...variableSet].sort(),\n expression: `(${numerator}) / (${denominator})`,\n };\n });\n\n this.addFunction('map', (/** @type {any[]} */ arr, /** @type {any} */ fnOrName) => {\n if (!Array.isArray(arr)) {\n throw new Error('map() expects an array');\n }\n const fn = typeof fnOrName === 'string' ? this.functions.get(fnOrName) : fnOrName;\n if (typeof fn !== 'function') {\n throw new Error('map() requires a function or function name');\n }\n return arr.map((x) => fn(x));\n });\n\n this.addFunction('filter', (/** @type {any[]} */ arr, /** @type {any} */ fnOrName) => {\n if (!Array.isArray(arr)) {\n throw new Error('filter() expects an array');\n }\n const fn = typeof fnOrName === 'string' ? this.functions.get(fnOrName) : fnOrName;\n if (typeof fn !== 'function') {\n throw new Error('filter() requires a function or function name');\n }\n return arr.filter((x) => fn(x));\n });\n\n // Numeric integration via Simpson's 1/3 rule with 100 subintervals\n this.addFunction(\n 'integral',\n (/** @type {any} */ expr, /** @type {number} */ a, /** @type {number} */ b) => {\n if (typeof expr !== 'string') {\n throw new Error('integral() expects an expression string');\n }\n const compiled = this.compile(expr);\n const n = 100;\n const h = (b - a) / n;\n let sum = compiled({ x: a }) + compiled({ x: b });\n for (let i = 1; i < n; i++) {\n const x = a + i * h;\n const f = compiled({ x });\n sum += i % 2 === 0 ? 2 * f : 4 * f;\n }\n return (h / 3) * sum;\n }\n );\n\n // Summation: evaluate expr for variable = start..end\n this.addFunction(\n 'sigma',\n (\n /** @type {any} */ variable,\n /** @type {any} */ start,\n /** @type {number} */ end,\n /** @type {any} */ expr\n ) => {\n if (typeof expr !== 'string') {\n throw new Error('sigma() expects an expression string');\n }\n const compiled = this.compile(expr);\n let total = 0;\n for (let i = start; i <= end; i++) {\n total += compiled({ [variable]: i });\n }\n return total;\n }\n );\n\n // Product: multiply expr for variable = start..end\n this.addFunction(\n 'pi',\n (\n /** @type {any} */ variable,\n /** @type {any} */ start,\n /** @type {number} */ end,\n /** @type {any} */ expr\n ) => {\n if (typeof expr !== 'string') {\n throw new Error('pi() expects an expression string');\n }\n const compiled = this.compile(expr);\n let total = 1;\n for (let i = start; i <= end; i++) {\n total *= compiled({ [variable]: i });\n }\n return total;\n }\n );\n\n this.addFunction(\n 'substitute',\n (/** @type {any} */ expr, /** @type {any} */ variable, /** @type {any} */ value) => {\n if (typeof expr !== 'string') {\n throw new Error('substitute() expects an expression string');\n }\n const compiled = this.compile(expr);\n return compiled({ [variable]: value });\n }\n );\n\n // Numeric limit: evaluate at progressively smaller epsilon until convergence\n this.addFunction(\n 'limit',\n (\n /** @type {any} */ expr,\n /** @type {any} */ variable,\n /** @type {number} */ approach,\n /** @type {string} */ direction\n ) => {\n if (typeof expr !== 'string') {\n throw new Error('limit() expects an expression string');\n }\n const compiled = this.compile(expr);\n const epsilons = [1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9, 1e-10];\n let lastVal = NaN;\n for (const eps of epsilons) {\n let x;\n if (direction === 'right') {\n x = approach + eps;\n } else if (direction === 'left') {\n x = approach - eps;\n } else {\n x = approach + eps;\n }\n const val = compiled({ [variable]: x });\n if (isFinite(val)) {\n lastVal = val;\n }\n }\n return lastVal;\n }\n );\n\n // --- expand(): detect polynomial degree via forward differences, solve Vandermonde system for coefficients ---\n this.addFunction('expand', (/** @type {string} */ expr) => {\n if (typeof expr !== 'string') {\n throw new Error('expand() expects an expression string');\n }\n const variableMatch = expr.match(/[a-zA-Z_][a-zA-Z0-9_]*/);\n if (!variableMatch) {\n throw new Error('expand() could not identify variable');\n }\n const v = variableMatch[0];\n const cleaned = expr.replace(/\\s+/g, '').replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const addStar = (/** @type {string} */ s) => s.replace(/(\\d)([a-zA-Z_])/g, '$1*$2');\n const evalAt = (/** @type {number} */ x) =>\n this.evaluate(`substitute(\"${addStar(cleaned)}\", \"${v}\", ${x})`);\n\n const maxDegree = 10;\n const vals = [];\n for (let i = 0; i <= maxDegree; i++) {\n vals.push(evalAt(i));\n }\n\n let degree = 0;\n let diffs = [...vals];\n for (let d = 0; d <= maxDegree; d++) {\n if (Math.abs(diffs[0]) > 1e-10) {\n degree = d;\n }\n const next = [];\n for (let i = 0; i < diffs.length - 1; i++) {\n next.push(diffs[i + 1] - diffs[i]);\n }\n diffs = next;\n if (diffs.every((x) => Math.abs(x) < 1e-10)) {\n break;\n }\n }\n\n const n = degree + 1;\n const m = Array.from({ length: n }, (_, i) => {\n const row = Array.from({ length: n }, (_, j) => i ** j);\n row.push(vals[i]);\n return row;\n });\n for (let col = 0; col < n; col++) {\n let pivot = col;\n while (pivot < n && Math.abs(m[pivot][col]) < 1e-12) {\n pivot++;\n }\n if (pivot === n) {\n continue;\n }\n [m[col], m[pivot]] = [m[pivot], m[col]];\n const pv = m[col][col];\n for (let j = col; j <= n; j++) {\n m[col][j] /= pv;\n }\n for (let row = 0; row < n; row++) {\n if (row !== col) {\n const f = m[row][col];\n for (let j = col; j <= n; j++) {\n m[row][j] -= f * m[col][j];\n }\n }\n }\n }\n const coeffs = m.map((row) => (Math.abs(row[n]) < 1e-10 ? 0 : row[n]));\n const terms = [];\n for (let i = degree; i >= 0; i--) {\n const c = coeffs[i];\n if (Math.abs(c) < 1e-10) {\n continue;\n }\n const sign = terms.length === 0 ? (c < 0 ? '-' : '') : c < 0 ? ' - ' : ' + ';\n const absC = Math.abs(c);\n const cStr = i === 0 ? `${absC}` : absC === 1 ? '' : `${absC}`;\n const pStr = i === 0 ? '' : i === 1 ? v : `${v}^${i}`;\n terms.push(`${sign}${cStr}${pStr}`);\n }\n return terms.join('') || '0';\n });\n\n // --- factor(): detect degree, solve coefficients, apply rational root theorem + synthetic division ---\n this.addFunction('factor', (/** @type {string} */ poly) => {\n if (typeof poly !== 'string') {\n throw new Error('factor() expects an expression string');\n }\n const cleaned = poly.replace(/\\s+/g, '');\n const variableMatch = cleaned.match(/[a-zA-Z_][a-zA-Z0-9_]*/);\n if (!variableMatch) {\n throw new Error('factor() could not identify variable');\n }\n const variable = variableMatch[0];\n const addStar = (/** @type {string} */ s) =>\n s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/(\\d)([a-zA-Z_])/g, '$1*$2');\n const cleanedExpr = addStar(cleaned);\n const maxPower = 6;\n const vals = [];\n for (let power = 0; power <= maxPower; power++) {\n vals.push(this.evaluate(`substitute(\"${cleanedExpr}\", \"${variable}\", ${power})`));\n }\n let diff = vals.slice();\n let degree = 0;\n for (let d = 0; d <= maxPower; d++) {\n if (diff.every((x) => Math.abs(x) < 1e-10)) {\n degree = Math.max(0, d - 1);\n break;\n }\n if (d < maxPower) {\n const next = [];\n for (let i = 0; i < diff.length - 1; i++) {\n next.push(diff[i + 1] - diff[i]);\n }\n diff = next;\n }\n }\n if (degree === 0) {\n return `(${poly})`;\n }\n const n = degree + 1;\n const m = Array.from({ length: n }, (_, i) => {\n const row = Array.from({ length: n }, (_, j) => i ** j);\n row.push(vals[i]);\n return row;\n });\n for (let col = 0; col < n; col++) {\n let pivot = col;\n while (pivot < n && Math.abs(m[pivot][col]) < 1e-12) {\n pivot++;\n }\n if (pivot === n) {\n continue;\n }\n [m[col], m[pivot]] = [m[pivot], m[col]];\n const pv = m[col][col];\n for (let j = col; j <= n; j++) {\n m[col][j] /= pv;\n }\n for (let row = 0; row < n; row++) {\n if (row !== col) {\n const f = m[row][col];\n for (let j = col; j <= n; j++) {\n m[row][j] -= f * m[col][j];\n }\n }\n }\n }\n const coeffs = m.map((r) => (Math.abs(r[n]) < 1e-10 ? 0 : r[n]));\n if (degree >= 1 && degree <= 3) {\n const polyRootFn = this.functions.get('polynomialRoot');\n const rootArr = polyRootFn(...coeffs);\n const rootArrFlat = Array.isArray(rootArr) ? rootArr : [rootArr];\n const unique = [\n ...new Set(\n rootArrFlat.map((r) => (Number.isInteger(r) ? r : Math.round(r * 1e10) / 1e10))\n ),\n ].sort((a, b) => a - b);\n if (unique.length === degree) {\n const lead = coeffs[degree];\n const leadStr =\n Math.abs(lead - 1) > 1e-10 ? (Math.abs(lead + 1) < 1e-10 ? '-' : `${lead}`) : '';\n const factors = unique.map((r) => {\n if (Math.abs(r) < 1e-10) {\n return variable;\n }\n return r > 0 ? `(${variable} - ${r})` : `(${variable} + ${Math.abs(r)})`;\n });\n return `${leadStr}${factors.join('')}`;\n }\n }\n return `(${poly})`;\n });\n\n // --- solve(): split on '=', form f(x)=0, detect polynomial degree, find roots ---\n this.addFunction('solve', (/** @type {string} */ eqn, /** @type {string} */ variable) => {\n if (typeof eqn !== 'string') {\n throw new Error('solve() expects an equation string');\n }\n const parts = eqn.split('=');\n if (parts.length !== 2) {\n throw new Error('solve() expects an equation with =');\n }\n const lhs = parts[0].trim();\n const rhs = parts[1].trim();\n const expr = `(${lhs}) - (${rhs})`;\n const cleaned = expr.replace(/\\s+/g, '');\n const variableMatch = cleaned.match(/[a-zA-Z_][a-zA-Z0-9_]*/);\n const v = variable || (variableMatch ? variableMatch[0] : 'x');\n const addStar = (/** @type {string} */ s) =>\n s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/(\\d)([a-zA-Z_])/g, '$1*$2');\n const cleanedExpr = addStar(cleaned);\n const maxPower = 6;\n const vals = [];\n for (let power = 0; power <= maxPower; power++) {\n vals.push(this.evaluate(`substitute(\"${cleanedExpr}\", \"${v}\", ${power})`));\n }\n let diff = vals.slice();\n let degree = 0;\n for (let d = 0; d <= maxPower; d++) {\n if (diff.every((x) => Math.abs(x) < 1e-10)) {\n degree = Math.max(0, d - 1);\n break;\n }\n if (d < maxPower) {\n const next = [];\n for (let i = 0; i < diff.length - 1; i++) {\n next.push(diff[i + 1] - diff[i]);\n }\n diff = next;\n }\n }\n if (degree === 0) {\n throw new Error('No solution found');\n }\n const n = degree + 1;\n const m = Array.from({ length: n }, (_, i) => {\n const row = Array.from({ length: n }, (_, j) => i ** j);\n row.push(vals[i]);\n return row;\n });\n for (let col = 0; col < n; col++) {\n let pivot = col;\n while (pivot < n && Math.abs(m[pivot][col]) < 1e-12) {\n pivot++;\n }\n if (pivot === n) {\n continue;\n }\n [m[col], m[pivot]] = [m[pivot], m[col]];\n const pv = m[col][col];\n for (let j = col; j <= n; j++) {\n m[col][j] /= pv;\n }\n for (let row = 0; row < n; row++) {\n if (row !== col) {\n const f = m[row][col];\n for (let j = col; j <= n; j++) {\n m[row][j] -= f * m[col][j];\n }\n }\n }\n }\n const coeffs = m.map((r) => (Math.abs(r[n]) < 1e-10 ? 0 : r[n]));\n if (degree >= 1 && degree <= 3) {\n const polyRootFn = this.functions.get('polynomialRoot');\n const rootArr = polyRootFn(...coeffs);\n const rootArrFlat = Array.isArray(rootArr) ? rootArr : [rootArr];\n return rootArrFlat.sort((a, b) => a - b);\n }\n throw new Error('solve() currently supports degree up to 3');\n });\n }\n\n /**\n * @param {any} name\n * @param {any} value\n */\n setVariable(name, value) {\n this.variables.set(name, value);\n }\n\n /**\n * @param {any} name\n */\n getVariable(name) {\n return this.variables.get(name);\n }\n\n /**\n * @param {string} name\n * @param {any} fn\n */\n addFunction(name, fn) {\n this.functions.register(name, fn);\n }\n\n _createContext() {\n return createContext({\n functions: this.functions,\n variables: this.variables,\n units: this.units,\n evaluate: this.evaluate.bind(this),\n });\n }\n\n /**\n * @param {any} expr\n */\n tokenize(expr) {\n if (typeof expr !== 'string') {\n throw new Error('Expression must be a string');\n }\n return tokenize(expr, this._createContext());\n }\n\n /**\n * @param {string} expr\n */\n parse(expr) {\n const tokens = this.tokenize(expr);\n const ast = buildAST(tokens);\n return { tokens, ast };\n }\n\n /**\n * @param {string} expr\n * @param {object} [scope]\n */\n evaluate(expr, scope = {}) {\n return formatResult(this._evaluateRaw(expr, scope));\n }\n\n /**\n * @param {string} expr\n * @param {object} [scope]\n */\n _evaluateRaw(expr, scope = {}) {\n const { ast } = this.parse(expr);\n const ctx = this._createContext();\n const mergedCtx = Object.keys(scope).length > 0 ? ctx.withScope(scope) : ctx;\n return evaluateAST(ast, mergedCtx);\n }\n\n /**\n * @param {string} expr\n */\n compile(expr) {\n if (this._cache.has(expr)) {\n return this._cache.get(expr);\n }\n\n const { ast } = this.parse(expr);\n\n const compiledFn = (scope = {}) => {\n const baseContext = this._createContext();\n const scopedContext = baseContext.withScope(scope);\n return formatResult(evaluateAST(ast, scopedContext));\n };\n\n this._cache.set(expr, compiledFn);\n return compiledFn;\n }\n\n clearCache() {\n this._cache.clear();\n }\n\n exportState() {\n return {\n variables: this.variables.all(),\n functions: this.functions.getAllFunctionsName(),\n units: this.units.getUnits(),\n };\n }\n\n importState(state) {\n if (state.variables) {\n this.variables.merge(state.variables);\n }\n if (state.units) {\n this.units.setUnits(state.units);\n }\n if (state.functions) {\n for (const name of state.functions) {\n if (!this.functions.has(name)) {\n // warn: function could not be restored (built-in only)\n }\n }\n }\n return this;\n }\n\n chain() {\n return new Chain(this);\n }\n}\n\nclass Chain {\n /** @param {exprify} exprifyInstance */\n constructor(exprifyInstance) {\n this._expr = exprifyInstance;\n this._rawResult = undefined;\n }\n\n evaluate(expr, scope = {}) {\n this._rawResult = this._expr._evaluateRaw(expr, { ...scope, ans: this._rawResult });\n return this;\n }\n\n setVariable(name, value) {\n this._expr.setVariable(name, value);\n return this;\n }\n\n compile(expr) {\n return this._expr.compile(expr);\n }\n\n done() {\n return formatResult(this._rawResult);\n }\n}\n\nexport default exprify;\n","export function createUnitsStore(initial = {}) {\n let units = { ...initial };\n\n // Helpers\n function getAllUnitsFlat() {\n const result = new Set();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n const keyLower = key.toLowerCase();\n result.add(keyLower);\n\n // Unit name\n if (u.unit) {\n const unitLower = u.unit.toLowerCase();\n\n // Avoid duplicate like \"m\" vs \"meter\"\n if (unitLower !== keyLower) {\n if (unitLower.split(/\\s+/).length === 1) {\n result.add(unitLower);\n }\n }\n }\n\n // Symbol\n if (u.symbol) {\n const symbolLower = u.symbol.toLowerCase();\n\n // Avoid duplicate with unit name\n if (!u.unit || symbolLower !== u.unit.toLowerCase()) {\n result.add(symbolLower);\n }\n }\n }\n }\n\n return Array.from(result);\n }\n\n /**\n * @param {string} input\n */\n function findUnit(input) {\n input = input.toLowerCase();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n if (\n key.toLowerCase() === input ||\n u.unit?.toLowerCase() === input ||\n u.symbol?.toLowerCase() === input\n ) {\n return { type, key, data: u };\n }\n }\n }\n\n return null;\n }\n\n /**\n * @param {number} value\n * @param {any} fromUnit\n * @param {any} toUnit\n */\n function convert(value, fromUnit, toUnit) {\n const from = findUnit(fromUnit);\n const to = findUnit(toUnit);\n\n if (!from) {\n throw new Error(`Unknown unit: ${fromUnit}`);\n }\n if (!to) {\n throw new Error(`Unknown unit: ${toUnit}`);\n }\n\n if (from.type !== to.type) {\n throw new Error(\n `Cannot convert ${fromUnit} to ${toUnit} (${to.data.unit || to.key}). ${from.data.unit || from.key} conversion units like ${Object.keys(units[from.type]).join(', ')}`\n );\n }\n\n const result = value * (from.data.value / to.data.value);\n\n return { value: result, unit: to.key };\n }\n\n // Public API\n return {\n // Get all units\n getUnits: () => units,\n\n setUnits: (/** @type {{}} */ newUnits) => {\n units = { ...newUnits };\n },\n\n updateType: (/** @type {string | number} */ type, /** @type {any} */ data) => {\n units[type] = { ...units[type], ...data };\n },\n\n addUnit: (\n /** @type {string | number} */ type,\n /** @type {string | number} */ key,\n /** @type {any} */ unitObj\n ) => {\n if (!units[type]) {\n units[type] = {};\n }\n units[type][key] = unitObj;\n },\n // Unit-aware arithmetic: unify operands to same unit type, then apply operator\n /**\n * @param {string} op\n * @param {{ unit: any; value: any; }} left\n * @param {{ unit: any; value: number; }} right\n */\n compute(op, left, right) {\n const isUnit = (/** @type {any} */ v) =>\n v && typeof v === 'object' && 'value' in v && 'unit' in v;\n\n const apply = (/** @type {any} */ a, /** @type {any} */ b) => {\n switch (op) {\n case '+':\n return a + b;\n case '-':\n return a - b;\n case '*':\n return a * b;\n case '/':\n return a / b;\n case '%':\n return a % b;\n case '^':\n return Math.pow(a, b);\n }\n };\n\n // BOTH UNIT\n if (isUnit(left) && isUnit(right)) {\n const from = this.findUnit(right.unit);\n const to = this.findUnit(left.unit);\n\n if (!from || !to || from.type !== to.type) {\n throw new Error(`Cannot operate on different unit types`);\n }\n\n // convert right → left unit\n const r = right.value * (from.data.value / to.data.value);\n\n const result = apply(left.value, r);\n\n // multiplication/division produce compound units\n if (op === '*') {\n return { value: result, unit: left.unit };\n }\n\n if (op === '/') {\n return { value: result, unit: left.unit };\n }\n\n if (op === '^') {\n return { value: result, unit: left.unit };\n }\n\n return { value: result, unit: left.unit };\n }\n\n // LEFT UNIT\n if (isUnit(left) && !isUnit(right)) {\n const result = apply(left.value, right);\n\n return { value: result, unit: left.unit };\n }\n\n // RIGHT UNIT\n if (!isUnit(left) && isUnit(right)) {\n const result = apply(left, right.value);\n\n if (op === '/') {\n return { value: result, unit: right.unit };\n }\n\n return { value: result, unit: right.unit };\n }\n\n // NORMAL\n return apply(left, right);\n },\n\n convert,\n\n // Search helpers\n getAllUnitsFlat,\n findUnit,\n };\n}\n","/** @param {string | any[]} expr */\nexport function tokenize(expr, context = {}) {\n const tokens = [];\n let current = '';\n let quote = '';\n\n const operators = ['+', '-', '*', '/', '%', '^', '=', '>', '<', '!', '&', '|'];\n // Two-char operators checked before single-char to avoid ambiguity (e.g., == vs =)\n const multiOps = [\n '==',\n '>=',\n '<=',\n '&&',\n '||',\n '+=',\n '-=',\n '*=',\n '/=',\n '%=',\n '?.',\n '??',\n '|>',\n '->',\n ];\n\n const parentheses = '()';\n const comma = ',';\n const semicolon = ';';\n const keywords = ['to', 'in'];\n\n const units = context.units?.getAllUnitsFlat?.() || [];\n const isIdentifier = (/** @type {string} */ s) => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s);\n\n /**\n * @param {any} str\n * @param {number} charIndex\n */\n function getContext(str, charIndex) {\n const words = str.match(/[a-z0-9]+/gi) || [];\n\n // 2. Identify the current character and the one immediately before it\n const currentChar = str[charIndex] || null;\n const prevChar = charIndex > 0 ? str[charIndex - 1] : null;\n\n // 3. Find the word that contains the current charIndex\n let start = charIndex;\n\n while (start > 0 && /[a-z0-9]/i.test(str[start - 1])) {\n start--;\n }\n\n let end = charIndex;\n\n while (end < str.length && /[a-z0-9]/i.test(str[end])) {\n end++;\n }\n\n const currentWord = str.substring(start, end);\n\n // 4. Find the word that appears before the currentWord in the sequence\n const currentWordIdx = words.indexOf(currentWord);\n const prevWord = currentWordIdx > 0 ? words[currentWordIdx - 1] : null;\n\n // 5. Find the word that appears after the currentWord\n const nextWord =\n currentWordIdx !== -1 && currentWordIdx < words.length - 1 ? words[currentWordIdx + 1] : null;\n\n return {\n prevWord: prevWord,\n prevChar: prevChar,\n currentWord: currentWord,\n currentChar: currentChar,\n nextWord: nextWord,\n };\n }\n\n const isUnaryContext = (\n /** @type {{ type: string; value: any; pos: number; } | { type: string; value: string; pos?: undefined; } | { type: string; value?: undefined; pos?: undefined; } | { type: string; pos: number; value?: undefined; }} */ prev\n ) =>\n !prev ||\n prev.type === 'Operator' ||\n prev.type === 'UnaryOperator' ||\n (prev.type === 'Parenthesis' && prev.value !== ')') ||\n prev.type === 'ArrayStart' ||\n prev.type === 'Semicolon' ||\n prev.type === 'Comma' ||\n prev.type === 'Ternary';\n\n const flushCurrent = (/** @type {string | null} */ nextChar, /** @type {number} */ index) => {\n if (!current) {\n return;\n }\n\n // BOOLEAN\n if (/^(true|false)$/i.test(current)) {\n tokens.push({ type: 'Boolean', value: current.toLowerCase() === 'true' });\n current = '';\n return;\n }\n\n // KEYWORD\n if (keywords.includes(current)) {\n tokens.push({ type: 'Keyword', value: current, pos: index });\n current = '';\n return;\n }\n\n // BIGINT\n if (/^\\d+n$/.test(current)) {\n tokens.push({ type: 'BigInt', value: BigInt(current.slice(0, -1)), pos: index });\n current = '';\n return;\n }\n\n // HEX\n if (/^0x[0-9a-fA-F]+$/.test(current)) {\n tokens.push({ type: 'Number', value: parseInt(current, 16), pos: index });\n current = '';\n return;\n }\n\n // BINARY\n if (/^0b[01]+$/.test(current)) {\n tokens.push({ type: 'Number', value: parseInt(current, 2), pos: index });\n current = '';\n return;\n }\n\n // NUMBER (including scientific)\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?$/i.test(current)) {\n tokens.push({ type: 'Number', value: parseFloat(current), pos: index });\n current = '';\n return;\n }\n\n // IMAGINARY NUMBER\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?i$/i.test(current)) {\n tokens.push({\n type: 'ImaginaryLiteral',\n value: parseFloat(current.slice(0, -1)),\n pos: index,\n });\n current = '';\n return;\n }\n\n // IMAGINARY UNIT\n if (/^[+-]?i$/i.test(current)) {\n const sign = current[0] === '-' ? -1 : 1;\n tokens.push({\n type: 'ImaginaryLiteral',\n value: sign,\n pos: index,\n });\n current = '';\n return;\n }\n\n // NUMBER + UNIT\n const numUnit = current.match(/^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]+)$/);\n if (numUnit) {\n const value = parseFloat(numUnit[1]);\n const unit = numUnit[3];\n\n tokens.push({\n type: units.includes(unit) ? 'NumberWithUnit' : 'UnknownUnit',\n value,\n unit,\n pos: index,\n });\n\n current = '';\n return;\n }\n\n // UNIT\n if (units.includes(current)) {\n const { prevWord } = getContext(expr, index);\n if (nextChar !== '(') {\n if (prevWord) {\n if (!isNaN(parseFloat(prevWord)) || prevWord === 'to' || prevWord === 'in') {\n // console.log(\"Context for unit detection:\", {current, prevWord, nextChar});\n\n tokens.push({ type: 'Unit', value: current, pos: index });\n current = '';\n return;\n }\n }\n }\n }\n\n // IDENTIFIER\n if (isIdentifier(current)) {\n if (nextChar === '(') {\n tokens.push({\n type: 'Function',\n name: current,\n pos: index,\n });\n } else {\n tokens.push({\n type: 'Identifier',\n name: current,\n pos: index,\n });\n }\n\n current = '';\n return;\n }\n\n throw new Error(`Invalid token \"${current}\" at index ${index}`);\n };\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i];\n const next = expr[i + 1];\n\n // comments\n if (char === '/' && next === '/') {\n while (i < expr.length && expr[i] !== '\\n') {\n i++;\n }\n continue;\n }\n\n if (char === '/' && next === '*') {\n i += 2;\n while (i < expr.length && !(expr[i] === '*' && expr[i + 1] === '/')) {\n i++;\n }\n i++;\n continue;\n }\n\n // string\n if (`\"'`.includes(char)) {\n if (!quote) {\n quote = char;\n current += char;\n } else if (quote === char) {\n current += char;\n tokens.push({\n type: 'String',\n value: current.slice(1, -1),\n pos: i,\n });\n current = '';\n quote = '';\n } else {\n current += char;\n }\n continue;\n }\n\n if (quote) {\n if (char === '\\\\') {\n current += char + expr[++i];\n } else {\n current += char;\n }\n continue;\n }\n\n // multi operators\n const twoChar = char + next;\n if (multiOps.includes(twoChar)) {\n flushCurrent(char, i);\n tokens.push({ type: 'Operator', value: twoChar, pos: i });\n i++;\n continue;\n }\n\n if (char === '?') {\n tokens.push({ type: 'Ternary', value: '?' });\n continue;\n }\n\n // Colon after '?' is ternary separator; otherwise standalone (range, object key)\n if (char === ':') {\n flushCurrent(char, i);\n const prev = tokens[tokens.length - 1];\n\n if (prev && prev.type === 'Ternary') {\n tokens.push({ type: 'Ternary', value: ':' });\n } else {\n tokens.push({ type: 'Colon' });\n }\n continue;\n }\n\n // Three dots form the spread operator (...)\n if (char === '.' && next === '.' && expr[i + 2] === '.') {\n flushCurrent(char, i);\n tokens.push({ type: 'Spread', pos: i });\n i += 2;\n continue;\n }\n\n // Dot between digits is a decimal separator, not property access\n if (char === '.' && /\\d/.test(current) && /\\d/.test(next)) {\n current += char;\n continue;\n }\n\n if (char === '.') {\n flushCurrent(char, i);\n tokens.push({ type: 'Dot', pos: i });\n continue;\n }\n\n // operators\n if (operators.includes(char)) {\n flushCurrent(char, i);\n\n const prev = tokens[tokens.length - 1];\n if ((char === '-' || char === '!') && isUnaryContext(prev)) {\n tokens.push({ type: 'UnaryOperator', value: char, pos: i });\n } else {\n tokens.push({ type: 'Operator', value: char, pos: i });\n }\n continue;\n }\n\n // parenthesis\n if (parentheses.includes(char)) {\n flushCurrent(char, i);\n tokens.push({ type: 'Parenthesis', value: char, pos: i });\n continue;\n }\n\n // array\n if (char === '[') {\n flushCurrent(char, i);\n tokens.push({ type: 'ArrayStart', pos: i });\n continue;\n }\n\n if (char === ']') {\n flushCurrent(char, i);\n tokens.push({ type: 'ArrayEnd', pos: i });\n continue;\n }\n\n // OBJECT START\n if (char === '{') {\n flushCurrent(char, i);\n tokens.push({ type: 'BlockStart', pos: i });\n continue;\n }\n\n // OBJECT END\n if (char === '}') {\n flushCurrent(char, i);\n tokens.push({ type: 'BlockEnd', pos: i });\n continue;\n }\n\n // comma\n if (char === comma) {\n flushCurrent(char, i);\n tokens.push({ type: 'Comma', pos: i });\n continue;\n }\n\n // semicolon\n if (char === semicolon) {\n flushCurrent(char, i);\n tokens.push({ type: 'Semicolon', pos: i });\n continue;\n }\n\n // space\n if (char === ' ') {\n flushCurrent(next, i);\n continue;\n }\n\n // build token\n current += char;\n\n if (i === expr.length - 1) {\n flushCurrent(null, i);\n }\n }\n\n if (quote) {\n throw new Error('Unclosed string literal');\n }\n\n // merge number + unit\n const merged = [];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n const next = tokens[i + 1];\n\n if (t?.type === 'Number' && next?.type === 'Unit') {\n merged.push({\n type: 'NumberWithUnit',\n value: t.value,\n unit: next.value,\n pos: t.pos,\n });\n i++;\n continue;\n }\n\n merged.push(t);\n }\n\n // Insert implicit * between tokens where multiplication is implied (e.g., \"2x\" -> \"2*x\", \")(a)\" -> \")*(a)\")\n const final = [];\n for (let i = 0; i < merged.length; i++) {\n const a = merged[i];\n const b = merged[i + 1];\n\n final.push(a);\n\n if (\n a &&\n b &&\n (['Number', 'Identifier'].includes(a.type) ||\n (a.type === 'Parenthesis' && a.value === ')') ||\n a.type === 'ArrayEnd') &&\n (['Identifier', 'Function'].includes(b.type) || (b.type === 'Parenthesis' && b.value === '('))\n ) {\n final.push({ type: 'Operator', value: '*', implicit: true });\n }\n }\n\n return final;\n}\n"],"names":["isDenseMatrixWrapper","value","exprify","cloneMatrixData","Array","isArray","map","getMatrixSize","data","every","length","Error","wrapDenseMatrix","size","unwrapDenseMatrix","serializeExprifyValue","JSON","stringify","_","current","fraction","n","d","Number","isInteger","g","a","b","Math","abs","gcd","isFraction","v","ExprDecimal","static","sign","int","dp","constructor","this","isFinite","String","s","trim","slice","exp","eIdx","search","parseInt","dotIdx","indexOf","BigInt","intPart","fracPart","combined","normalize","align","other","factor","fromParts","plus","minus","times","div","targetDp","min","DP","scale","quotient","mod","truncated","pow","result","i","negated","eq","gt","lt","gte","lte","toString","edp","toScientific","intStr","exponent","coeffInt","coeffFrac","replace","r","dotPos","intPartRaw","intTrimmed","fracRaw","normalized","toNumber","isDecimal","bigNumber","isBigNumber","formatBigNumber","evaluateAST","node","context","vars","variables","fns","functions","units","isUnitObj","isComplex","isMatrix","isMatrixLike","normalizeMatrix","row","nodeError","msg","pos","undefined","toOneBasedIndex","resolveSelector","selector","contextLength","type","startValue","start","endValue","end","index","push","isScalar","multiplyMatrices","left","right","colIndex","reduce","sum","rowIndex","powerMatrix","from","j","toComplex","re","im","simplifyComplex","createFunctionScope","params","args","scopedValues","forEach","param","unit","get","name","operator","set","object","assigned","matrix","selectors","target","rowSelector","colSelector","rowContextLength","max","rowIndexes","rowsValue","updatedMatrix","selectionResult","maxCols","colIndexes","normalizedValue","_rowOffset","rowOffset","colOffset","assignMatrixIndex","fn","scopedContext","withScope","register","val","argument","compute","addMatrices","subtractMatrices","createFrac","addFrac","subFrac","mulFrac","divFrac","p","powFrac","createBN","denominator","evalComplexBinary","floor","body","fnName","callee","rawArgs","arguments","arg","spread","values","leftVal","convert","to","elements","el","rows","indexMatrix","obj","properties","key","optional","property","createContext","evaluate","scope","tempVars","all","k","isValidNumberPair","mathOperations","Object","freeze","power","multiply","divide","add","subtract","modulus","globalUnits","m","symbol","cm","mm","km","um","note","nm","px","em","rem","pt","pica","inch","ft","yd","mi","thou","furlong","nmi","fathom","au","ly","pc","weight","mg","kg","t","lb","oz","stone","time","h","day","week","month","year","voltage","V","mV","kV","MV","GV","statV","abV","frequency","Hz","kHz","MHz","GHz","THz","W","mW","kW","MW","GW","HP","sound","dB","dBA","dBC","temperature","K","C","F","pressure","Pa","kPa","MPa","bar","atm","psi","mmHg","energy","J","kJ","cal","kcal","eV","BTU","force","N","kN","lbf","kgf","dyne","area","m2","cm2","km2","acre","hectare","ft2","yd2","volume","m3","L","mL","gallon","pint","floz","A","mA","uA","kA","resistance","ohm","kohm","megaohm","S","capacitance","mF","uF","inductance","H","mH","uH","light","cd","lm","lx","bit","B","KB","MB","GB","TB","angle","deg","rad","grad","radiation","Gy","mGy","Sv","mSv","Bq","kBq","MBq","GBq","Ci","mCi","validVarName","createVarStore","initial","store","create","override","test","has","prototype","hasOwnProperty","call","remove","clear","merge","clone","createFunctionRegistry","getAllFunctionsName","keys","extend","formulas","validateSquareMatrix","determinant","columnIndex","minor","filter","asMatrixData","lupDecomposition","input","permutation","pivot","maxRow","maxValue","col","U","linearSolve","aInput","bInput","bData","bVector","permutedB","y","fill","x","solveLyapunov","qInput","Q","coefficients","constants","equation","solution","augmented","pivotValue","solveLinearSystem","X","evaluatePolynomial","coefficient","syntheticDivide","root","descending","reverse","remainder","solveQuadratic","c","discriminant","sqrtDisc","sqrt","dotProduct","vectorNorm","vector","scaleVector","scalar","subtractVectors","transpose","parsePolynomial","expression","variable","terms","split","Boolean","splitTerms","Map","term","includes","rawCoeff","rawPower","cleaned","endsWith","startsWith","constant","formatPolynomial","ordered","entries","sort","negative","absCoeff","join","_gcd","_gamma","PI","sin","_identity","_rref","lead","rowCount","colCount","_eig2x2","trace","disc","lambda1","lambda2","eigenvec","lambda","v1","norm1","v2","norm2","vectors","internalFunctions","makeFrac","numer","denom","bignumber","makeBN","round","ceil","det","polynomialRoot","pop","degree","candidates","limit","divisor","candidate","polynomialRoots","lsolve","lup","lyap","q","qr","columns","qColumns","existing","projection","norm","basisIndex","column","fullR","R","qrDecomposition","inverse","xData","_inverse","rank","some","rref","ri","cj","cofactor","sub","cross","_cross","dot","norms","acos","normB","identity","eye","zeros","ones","diag","arr","cholesky","_cholesky","eig","svd","ata","eigResult","_svd","simplify","variableMatch","match","simplifyExpression","derivative","derived","derivativeExpression","cos","tan","sind","cosd","tand","asind","asin","acosd","atand","atan","atand2","atan2","log","log10","random","and","or","not","neq","notEqual","greaterThan","lessThan","greaterThanOrEqual","lessThanOrEqual","clamp","if","condition","typeof","prod","mean","median","sorted","mid","mode","freq","maxCount","count","std","variance","range","lcm","factorial","isPrime","primeFactors","factors","fibonacci","nCr","nPr","gamma","sinh","cosh","tanh","asinh","acosh","atanh","sec","csc","cot","trunc","frac","str","sep","upper","toUpperCase","lower","toLowerCase","pattern","replacement","substring","acot","asec","acsc","acoth","asech","acsch","quantile","idx","lo","hi","percentile","covariance","mx","my","corr","cov","sx","sy","randomInt","randomNormal","u","erf","lgamma","inv","beta","hypot","cbrt","log2","log1p","expm1","bitAnd","bitOr","bitXor","bitNot","buildAST","tokens","peek","consume","lastPos","tokenPos","nodeAt","syntaxError","parseSliceOrIndex","parseExpression","parseMember","token","withPos","expr","currentRow","keyToken","parsePrimary","parseUnary","parseCallChain","parsePower","parseMultiplication","parseUnitConversion","parseAddition","nextKeyword","next","parseComparison","parseLogical","parseNullish","parseTernary","consequent","alternate","parseLambda","parsePipeline","parseAssignment","ast","formatScalar","toFixed","formatResult","real","imaginary","formatComplex","isUnitValue","Chain","exprifyInstance","_expr","_rawResult","_evaluateRaw","ans","setVariable","compile","done","math","findUnit","getUnits","setUnits","newUnits","updateType","addUnit","unitObj","op","isUnit","apply","fromUnit","toUnit","getAllUnitsFlat","Set","keyLower","unitLower","symbolLower","createUnitsStore","_cache","E","Infinity","NaN","addFunction","parse","matches","countLeafTokens","countLeaves","child","inner","item","withDetails","normalizedExpression","polyKey","powers","localeCompare","keyToPowers","fromEntries","constPoly","cleanPoly","poly","coeff","addPoly","multiplyPoly","keyA","coeffA","powersA","keyB","coeffB","powersB","merged","powPoly","rational","num","den","addRat","astToRat","divRat","formatPoly","firstVarA","firstVarB","degreeA","numerator","variableSet","fnOrName","compiled","f","total","approach","direction","epsilons","lastVal","eps","evalAt","vals","diffs","pv","coeffs","absC","cStr","pStr","cleanedExpr","diff","rootArr","polyRootFn","rootArrFlat","unique","eqn","parts","getVariable","_createContext","bind","tokenize","quote","operators","multiOps","keywords","isUnaryContext","prev","flushCurrent","nextChar","parseFloat","numUnit","prevWord","charIndex","words","currentChar","prevChar","currentWord","currentWordIdx","nextWord","getContext","isNaN","char","twoChar","final","implicit","ctx","compiledFn","clearCache","exportState","importState","state","chain"],"mappings":"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"}