@mojir/lits 2.2.2 → 2.2.4
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.
- package/README.md +0 -8
- package/dist/cli/cli.js +1145 -1105
- package/dist/cli/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/cli/src/builtin/bindingNode.d.ts +3 -3
- package/dist/cli/src/builtin/index.d.ts +0 -1
- package/dist/cli/src/builtin/interface.d.ts +3 -4
- package/dist/cli/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/cli/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/cli/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/cli/src/builtin/utils.d.ts +2 -2
- package/dist/cli/src/evaluator/index.d.ts +2 -2
- package/dist/cli/src/evaluator/interface.d.ts +4 -3
- package/dist/cli/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/cli/src/parser/ParserContext.d.ts +20 -0
- package/dist/cli/src/parser/helpers.d.ts +19 -0
- package/dist/cli/src/parser/index.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/cli/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/cli/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/cli/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/cli/src/parser/types.d.ts +19 -26
- package/dist/cli/src/testFramework/index.d.ts +3 -2
- package/dist/cli/src/tokenizer/token.d.ts +0 -2
- package/dist/cli/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/cli/src/typeGuards/astNode.d.ts +18 -19
- package/dist/cli/src/typeGuards/index.d.ts +0 -1
- package/dist/cli/src/typeGuards/lits.d.ts +0 -1
- package/dist/full.esm.js +1 -1
- package/dist/full.esm.js.map +1 -1
- package/dist/full.js +1 -1
- package/dist/full.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lits.iife.js +1 -1
- package/dist/lits.iife.js.map +1 -1
- package/dist/modules/assert.esm.js.map +1 -1
- package/dist/modules/assert.js.map +1 -1
- package/dist/modules/bitwise.esm.js.map +1 -1
- package/dist/modules/bitwise.js.map +1 -1
- package/dist/modules/collection.esm.js.map +1 -1
- package/dist/modules/collection.js.map +1 -1
- package/dist/modules/functional.esm.js.map +1 -1
- package/dist/modules/functional.js.map +1 -1
- package/dist/modules/grid.esm.js.map +1 -1
- package/dist/modules/grid.js.map +1 -1
- package/dist/modules/linear-algebra.esm.js.map +1 -1
- package/dist/modules/linear-algebra.js.map +1 -1
- package/dist/modules/matrix.esm.js.map +1 -1
- package/dist/modules/matrix.js.map +1 -1
- package/dist/modules/number-theory.esm.js.map +1 -1
- package/dist/modules/number-theory.js.map +1 -1
- package/dist/modules/random.esm.js.map +1 -1
- package/dist/modules/random.js.map +1 -1
- package/dist/modules/sequence.esm.js.map +1 -1
- package/dist/modules/sequence.js.map +1 -1
- package/dist/modules/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/modules/src/builtin/bindingNode.d.ts +3 -3
- package/dist/modules/src/builtin/index.d.ts +0 -1
- package/dist/modules/src/builtin/interface.d.ts +3 -4
- package/dist/modules/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/modules/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/modules/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/modules/src/builtin/utils.d.ts +2 -2
- package/dist/modules/src/evaluator/index.d.ts +2 -2
- package/dist/modules/src/evaluator/interface.d.ts +4 -3
- package/dist/modules/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/modules/src/parser/ParserContext.d.ts +20 -0
- package/dist/modules/src/parser/helpers.d.ts +19 -0
- package/dist/modules/src/parser/index.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/modules/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/modules/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/modules/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/modules/src/parser/types.d.ts +19 -26
- package/dist/modules/src/testFramework/index.d.ts +3 -2
- package/dist/modules/src/tokenizer/token.d.ts +0 -2
- package/dist/modules/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/modules/src/typeGuards/astNode.d.ts +18 -19
- package/dist/modules/src/typeGuards/index.d.ts +0 -1
- package/dist/modules/src/typeGuards/lits.d.ts +0 -1
- package/dist/modules/string.esm.js.map +1 -1
- package/dist/modules/string.js.map +1 -1
- package/dist/modules/vector.esm.js.map +1 -1
- package/dist/modules/vector.js.map +1 -1
- package/dist/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/src/builtin/bindingNode.d.ts +3 -3
- package/dist/src/builtin/index.d.ts +0 -1
- package/dist/src/builtin/interface.d.ts +3 -4
- package/dist/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/src/builtin/utils.d.ts +2 -2
- package/dist/src/evaluator/index.d.ts +2 -2
- package/dist/src/evaluator/interface.d.ts +4 -3
- package/dist/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/src/parser/ParserContext.d.ts +20 -0
- package/dist/src/parser/helpers.d.ts +19 -0
- package/dist/src/parser/index.d.ts +3 -0
- package/dist/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/src/parser/types.d.ts +19 -26
- package/dist/src/testFramework/index.d.ts +3 -2
- package/dist/src/tokenizer/token.d.ts +0 -2
- package/dist/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/src/typeGuards/astNode.d.ts +18 -19
- package/dist/src/typeGuards/index.d.ts +0 -1
- package/dist/src/typeGuards/lits.d.ts +0 -1
- package/dist/testFramework.esm.js +1 -1
- package/dist/testFramework.esm.js.map +1 -1
- package/dist/testFramework.js +1 -1
- package/dist/testFramework.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/src/parser/Parser.d.ts +0 -58
- package/dist/modules/src/parser/Parser.d.ts +0 -58
- package/dist/src/parser/Parser.d.ts +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.esm.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/typeGuards/number.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/annotatedArrays.ts","../../src/utils/index.ts","../../src/utils/arity.ts","../../src/builtin/modules/matrix/docs.ts","../../src/builtin/modules/matrix/helpers/determinant.ts","../../src/builtin/modules/matrix/helpers/minor.ts","../../src/builtin/modules/matrix/helpers/adjugate.ts","../../src/builtin/modules/matrix/helpers/isSquare.ts","../../src/builtin/modules/matrix/helpers/isIdentity.ts","../../src/builtin/modules/matrix/helpers/matrixMultiply.ts","../../src/builtin/modules/matrix/index.ts","../../src/builtin/modules/matrix/helpers/inverse.ts","../../src/builtin/modules/matrix/helpers/cofactor.ts","../../src/builtin/modules/matrix/helpers/trace.ts","../../src/builtin/modules/matrix/helpers/isSymetric.ts","../../src/builtin/modules/matrix/helpers/isTriangular.ts","../../src/builtin/modules/matrix/helpers/isDiagonal.ts","../../src/builtin/modules/matrix/helpers/isOrthogonal.ts","../../src/builtin/modules/grid/transpose.ts","../../src/builtin/modules/matrix/helpers/band.ts","../../src/builtin/modules/matrix/helpers/isBanded.ts","../../src/builtin/modules/linear-algebra/helpers/gaussJordanElimination.ts","../../src/builtin/modules/matrix/helpers/norm1.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { LitsFunction, Node } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is Node {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { Any } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isNumber } from './number'\n\nconst annotatedArrays = new WeakSet<unknown[]>()\nconst vectors = new WeakSet<unknown[]>()\nconst notVectors = new WeakSet<unknown[]>()\nconst matrices = new WeakSet<unknown[]>()\nconst notMatrices = new WeakSet<unknown[]>()\nconst grids = new WeakSet<unknown[]>()\nconst notGrids = new WeakSet<unknown[]>()\n\nexport function annotate<T>(value: T): T {\n if (!Array.isArray(value)) {\n return value\n }\n if (annotatedArrays.has(value)) {\n return value\n }\n isVector(value)\n if (!isMatrix(value)) {\n isGrid(value)\n }\n\n return value\n}\nexport function isVector(vector: unknown): vector is number[] {\n if (!Array.isArray(vector)) {\n return false\n }\n\n if (vectors.has(vector)) {\n return true\n }\n if (notVectors.has(vector)) {\n return false\n }\n\n if (vector.every(elem => isNumber(elem))) {\n annotatedArrays.add(vector)\n vectors.add(vector)\n return true\n }\n notVectors.add(vector)\n return false\n}\n\nexport function assertVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is number[] {\n if (!isVector(vector)) {\n throw new LitsError(`Expected a vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function is2dVector(vector: unknown): vector is [number, number] {\n if (!isVector(vector)) {\n return false\n }\n return vector.length === 2\n}\nexport function assert2dVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is [number, number] {\n if (!is2dVector(vector)) {\n throw new LitsError(`Expected a 2d vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function is3dVector(vector: unknown): vector is [number, number, number] {\n if (!isVector(vector)) {\n return false\n }\n return vector.length === 3\n}\nexport function assert3dVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is [number, number, number] {\n if (!is3dVector(vector)) {\n throw new LitsError(`Expected a 3d vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function assertNonEmptyVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is number[] {\n assertVector(vector, sourceCodeInfo)\n if (vector.length === 0) {\n throw new LitsError(`Expected a non empty vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function isGrid(grid: unknown): grid is unknown[][] {\n if (!Array.isArray(grid)) {\n return false\n }\n if (grids.has(grid)) {\n return true\n }\n if (notGrids.has(grid)) {\n return false\n }\n if (grid.length === 0) {\n notGrids.add(grid)\n return false\n }\n if (!Array.isArray(grid[0])) {\n notGrids.add(grid)\n return false\n }\n const nbrOfCols = grid[0].length\n for (const row of grid.slice(1)) {\n if (!Array.isArray(row)) {\n notGrids.add(grid)\n return false\n }\n if (row.length !== nbrOfCols) {\n notGrids.add(grid)\n return false\n }\n }\n annotatedArrays.add(grid)\n grids.add(grid)\n return true\n}\n\nexport function assertGrid(grid: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts grid is Any[][] {\n if (!isGrid(grid)) {\n throw new LitsError(`Expected a grid, but got ${grid}`, sourceCodeInfo)\n }\n}\n\nexport function isMatrix(matrix: unknown): matrix is number[][] {\n if (!Array.isArray(matrix)) {\n return false\n }\n if (matrices.has(matrix)) {\n return true\n }\n if (notMatrices.has(matrix)) {\n return false\n }\n if (matrix.length === 0) {\n notMatrices.add(matrix)\n return false\n }\n if (!Array.isArray(matrix[0]) || matrix[0].length === 0) {\n notMatrices.add(matrix)\n return false\n }\n const nbrOfCols = matrix[0].length\n for (const row of matrix) {\n if (!Array.isArray(row) || row.length !== nbrOfCols || row.some(cell => !isNumber(cell))) {\n notMatrices.add(matrix)\n return false\n }\n }\n annotatedArrays.add(matrix)\n grids.add(matrix)\n matrices.add(matrix)\n return true\n}\n\nexport function assertMatrix(matrix: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts matrix is number[][] {\n if (!isMatrix(matrix)) {\n throw new LitsError(`Expected a matrix, but got ${matrix}`, sourceCodeInfo)\n }\n}\n\nexport function assertSquareMatrix(matrix: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts matrix is number[][] {\n if (!isMatrix(matrix)) {\n throw new LitsError(`Expected a matrix, but got ${matrix}`, sourceCodeInfo)\n }\n if (matrix.length !== matrix[0]!.length) {\n throw new LitsError(`Expected square matrix, but got ${matrix.length} and ${matrix[0]!.length}`, sourceCodeInfo)\n }\n}\n\nexport function isSquareMatrix(matrix: unknown): matrix is number[][] {\n if (!isMatrix(matrix)) {\n return false\n }\n if (matrix.length !== matrix[0]!.length) {\n return false\n }\n return true\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import type { FunctionDocs } from '../../interface'\n\nexport const moduleDocs: Record<string, FunctionDocs> = {\n 'mul': {\n category: 'matrix',\n description: 'Multiplies two `matrices` using standard `matrix` multiplication based on **dot products** of rows and columns.',\n returns: {\n type: 'matrix',\n },\n args: {\n a: {\n type: 'matrix',\n },\n b: {\n type: 'matrix',\n },\n },\n variants: [\n {\n argumentNames: [\n 'a',\n 'b',\n ],\n },\n ],\n examples: [\n 'let { mul } = import(\"matrix\");\\nmul([[1, 2], [3, 4]], [[5, 6], [7, 8]])',\n 'let { mul } = import(\"matrix\");\\nmul([[1, 2, 3], [4, 5, 6]], [[7, 8], [9, 10], [11, 12]])',\n ],\n seeAlso: ['matrix.det', 'matrix.inv'],\n },\n 'det': {\n category: 'matrix',\n description: 'Calculates the **determinant** of a square matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the determinant of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { det } = import(\"matrix\");\\ndet([[1, 2], [3, 4]])',\n 'let { det } = import(\"matrix\");\\ndet([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.inv', 'matrix.cofactor', 'matrix.adj', 'matrix.trace', 'matrix.rank', 'matrix.invertible?', 'matrix.mul', 'matrix.minor'],\n },\n 'inv': {\n category: 'matrix',\n description: 'Calculates the **inverse** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the inverse of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { inv } = import(\"matrix\");\\ninv([[1, 2], [3, 4]])',\n 'let { inv } = import(\"matrix\");\\ninv([[1, 2, 3], [4, 5, 7], [7, 8, 10]])',\n ],\n seeAlso: ['matrix.det', 'matrix.adj', 'matrix.invertible?', 'linear-algebra.solve', 'matrix.mul', 'matrix.orthogonal?'],\n },\n 'adj': {\n category: 'matrix',\n description: 'Calculates the **adjugate** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the adjugate of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2], [3, 4]])',\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2, 3], [7, 8, 9], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.cofactor', 'matrix.det', 'matrix.inv'],\n },\n 'cofactor': {\n category: 'matrix',\n description: 'Calculates the **cofactor** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the cofactor of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2], [3, 4]])',\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2, 3], [7, 8, 9], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.adj', 'matrix.minor', 'matrix.det'],\n },\n 'minor': {\n category: 'matrix',\n description: 'Calculates the **minor** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the minor of.',\n },\n row: {\n type: 'integer',\n description: 'The row index of the element to calculate the minor for.',\n },\n col: {\n type: 'integer',\n description: 'The column index of the element to calculate the minor for.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n 'row',\n 'col',\n ],\n },\n ],\n examples: [\n 'let { minor } = import(\"matrix\");\\nminor([[1, 2], [3, 4]], 0, 1)',\n 'let { minor } = import(\"matrix\");\\nminor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 1, 1)',\n ],\n seeAlso: ['matrix.cofactor', 'matrix.det'],\n },\n 'trace': {\n category: 'matrix',\n description: 'Calculates the **trace** of a square matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the trace of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { trace } = import(\"matrix\");\\ntrace([[1, 2], [3, 4]])',\n 'let { trace } = import(\"matrix\");\\ntrace([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.det', 'matrix.diagonal?'],\n },\n 'symmetric?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **symmetric**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for symmetry.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { symmetric? } = import(\"matrix\");\\nsymmetric?([[1, 2], [2, 1]])',\n 'let { symmetric? } = import(\"matrix\");\\nsymmetric?([[1, 2, 3], [2, 1, 4], [3, 4, 1]])',\n ],\n seeAlso: ['matrix.orthogonal?', 'matrix.diagonal?', 'matrix.square?', 'matrix.hilbert'],\n },\n 'triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { triangular? } = import(\"matrix\");\\ntriangular?([[2, 0], [0, 1]])',\n 'let { triangular? } = import(\"matrix\");\\ntriangular?([[1, 2, 3], [0, 4, 5], [0, 0, 6]])',\n ],\n seeAlso: ['matrix.upper-triangular?', 'matrix.lower-triangular?', 'matrix.diagonal?', 'matrix.banded?'],\n },\n 'upper-triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **upper triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for upper triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { upper-triangular? } = import(\"matrix\");\\nupper-triangular?([[1, 2], [0, 3]])',\n 'let { upper-triangular? } = import(\"matrix\");\\nupper-triangular?([[1, 2, 3], [0, 4, 5], [0, 0, 6]])',\n ],\n seeAlso: ['matrix.lower-triangular?', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'lower-triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **lower triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for lower triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { lower-triangular? } = import(\"matrix\");\\nlower-triangular?([[1, 0], [2, 3]])',\n 'let { lower-triangular? } = import(\"matrix\");\\nlower-triangular?([[1, 0, 0], [2, 3, 0], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.upper-triangular?', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'diagonal?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **diagonal**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for diagonal property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0], [0, 2]])',\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0, 0], [0, 2, 0], [0, 0, 3]])',\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0, 0], [2, 2, 2], [0, 0, 3]])',\n ],\n seeAlso: ['matrix.identity?', 'matrix.symmetric?', 'matrix.triangular?', 'matrix.trace', 'matrix.upper-triangular?', 'matrix.lower-triangular?', 'matrix.band', 'matrix.banded?'],\n },\n 'square?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **square**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for square property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2], [3, 4]])',\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2, 3], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.symmetric?', 'matrix.identity?', 'matrix.invertible?'],\n },\n 'orthogonal?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **orthogonal**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for **orthogonality**.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 0], [0, 1]])',\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 0], [0, -1]])',\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 2], [3, 4]])',\n ],\n seeAlso: ['matrix.symmetric?', 'matrix.inv', 'matrix.identity?', 'linear-algebra.orthogonal?'],\n },\n 'identity?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is an **identity matrix**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for identity property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0], [0, 1]])',\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0, 0], [0, 1, 0], [0, 0, 1]])',\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0, 0], [0, 1, 0], [0, 0, 0]])',\n ],\n seeAlso: ['matrix.diagonal?', 'matrix.square?', 'matrix.orthogonal?'],\n },\n 'invertible?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **invertible**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for invertibility.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2], [3, 4]])',\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2], [2, 4]])',\n ],\n seeAlso: ['matrix.det', 'matrix.inv', 'matrix.rank', 'matrix.square?'],\n },\n 'hilbert': {\n category: 'matrix',\n description: 'Generates a **Hilbert matrix** of size `n`.',\n returns: {\n type: 'matrix',\n },\n args: {\n n: {\n type: 'integer',\n description: 'The size of the Hilbert matrix.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'n',\n ],\n },\n ],\n examples: [\n 'let { hilbert } = import(\"matrix\");\\nhilbert(3)',\n 'let { hilbert } = import(\"matrix\");\\nhilbert(4)',\n ],\n seeAlso: ['matrix.vandermonde', 'matrix.symmetric?'],\n },\n 'vandermonde': {\n category: 'matrix',\n description: 'Generates a **Vandermonde matrix** from a vector.',\n returns: {\n type: 'matrix',\n },\n args: {\n v: {\n type: 'vector',\n description: 'The vector to generate the Vandermonde matrix from.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'v',\n ],\n },\n ],\n examples: [\n 'let { vandermonde } = import(\"matrix\");\\nvandermonde([1, 2, 3])',\n 'let { vandermonde } = import(\"matrix\");\\nvandermonde([1, 0, 1])',\n ],\n seeAlso: ['matrix.hilbert', 'matrix.band'],\n },\n 'band': {\n category: 'matrix',\n description: 'Generates a **banded matrix** of size `n` with lower band index `lband` and upper band index `uband`.',\n returns: {\n type: 'matrix',\n },\n args: {\n n: {\n type: 'integer',\n description: 'The size of the banded matrix.',\n },\n lband: {\n type: 'integer',\n description: 'The lower band index.',\n },\n uband: {\n type: 'integer',\n description: 'The upper band index.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'n',\n 'lband',\n 'uband',\n ],\n },\n ],\n examples: [\n 'let { band } = import(\"matrix\");\\nband(3, 1, 1)',\n 'let { band } = import(\"matrix\");\\nband(4, 1, 2)',\n ],\n seeAlso: ['matrix.banded?', 'matrix.diagonal?', 'matrix.vandermonde'],\n },\n 'banded?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **banded** with lower band index `lband` and upper band index `uband`.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for **banded** property.',\n },\n lband: {\n type: 'integer',\n description: 'The lower band index.',\n },\n uband: {\n type: 'integer',\n description: 'The upper band index.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n 'lband',\n 'uband',\n ],\n },\n ],\n examples: [\n 'let { banded? } = import(\"matrix\");\\nbanded?([\\n [1, 1, 1, 0],\\n [1, 1, 1, 1],\\n [1, 1, 1, 1],\\n [0, 1, 1, 1],\\n], 2, 2)',\n 'let { banded? } = import(\"matrix\");\\nbanded?([\\n [1, 1, 1, 0],\\n [1, 1, 1, 1],\\n [1, 1, 1, 1],\\n [0, 1, 1, 1],\\n], 1, 1)',\n ],\n seeAlso: ['matrix.band', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'rank': {\n category: 'matrix',\n description: 'Calculates the **rank** of a matrix using **Gaussian elimination**.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the rank of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { rank } = import(\"matrix\");\\nrank([[1, 0, 0], [0, 1, 0], [0, 0, 1]])',\n 'let { rank } = import(\"matrix\");\\nrank([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { rank } = import(\"matrix\");\\nrank([[2, 4, 6], [3, 6, 9], [4, 8, 12]])',\n ],\n seeAlso: ['matrix.det', 'matrix.invertible?', 'linear-algebra.rref'],\n },\n 'frobenius-norm': {\n category: 'matrix',\n description: 'Calculates the **Frobenius norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the Frobenius norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { frobenius-norm } = import(\"matrix\");\\nfrobenius-norm([[1, 2], [3, 4]])',\n 'let { frobenius-norm } = import(\"matrix\");\\nfrobenius-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.one-norm', 'matrix.inf-norm', 'matrix.max-norm'],\n },\n 'one-norm': {\n category: 'matrix',\n description: 'Calculates the **one-norm** (column norm) of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the one-norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { one-norm } = import(\"matrix\");\\none-norm([[1, 2], [3, 4]])',\n 'let { one-norm } = import(\"matrix\");\\none-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.inf-norm', 'matrix.max-norm'],\n },\n 'inf-norm': {\n category: 'matrix',\n description: 'Calculates the **infinity norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the infinity norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { inf-norm } = import(\"matrix\");\\ninf-norm([[1, 2], [3, 4]])',\n 'let { inf-norm } = import(\"matrix\");\\ninf-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.one-norm', 'matrix.max-norm'],\n },\n 'max-norm': {\n category: 'matrix',\n description: 'Calculates the **max norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the max norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { max-norm } = import(\"matrix\");\\nmax-norm([[1, 2], [3, 4]])',\n 'let { max-norm } = import(\"matrix\");\\nmax-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.one-norm', 'matrix.inf-norm'],\n },\n}\n","import { approxZero } from '../../../../utils'\n\n/**\n * Calculates the determinant of a matrix using Gaussian Elimination\n * @param matrix A square matrix represented as a 2D array\n * @returns The determinant of the matrix\n */\nexport function determinant(matrix: number[][]): number {\n // First, make a deep copy of the matrix to avoid modifying the original\n const n = matrix.length\n const A: number[][] = []\n\n for (let i = 0; i < n; i++) {\n A[i] = [...matrix[i]!]\n }\n\n // Handle special cases for small matrices\n if (n === 1) {\n return A[0]![0]!\n }\n\n if (n === 2) {\n return A[0]![0]! * A[1]![1]! - A[0]![1]! * A[1]![0]!\n }\n\n // For larger matrices, use Gaussian elimination\n let sign = 1 // Track sign changes from row swaps\n\n // Perform Gaussian elimination to get an upper triangular matrix\n for (let i = 0; i < n - 1; i += 1) {\n // Find pivot (maximum element in current column)\n let maxRow = i\n\n for (let j = i + 1; j < n; j += 1) {\n if (Math.abs(A[j]![i]!) > Math.abs(A[maxRow]![i]!)) {\n maxRow = j\n }\n }\n\n // If the pivot is zero, the determinant is zero\n if (approxZero(A[maxRow]![i]!)) {\n return 0\n }\n\n // Swap rows if necessary\n if (maxRow !== i) {\n [A[i], A[maxRow]] = [A[maxRow]!, A[i]!] // ES6 array destructuring for swap\n sign = -sign // Each row swap changes the sign\n }\n\n // Eliminate entries below the pivot\n for (let j = i + 1; j < n; j += 1) {\n const factor = A[j]![i]! / A[i]![i]!\n\n // Subtract (factor * pivot row) from current row\n for (let k = i; k < n; k++) {\n A[j]![k]! -= factor * A[i]![k]!\n }\n }\n }\n\n // Calculate determinant as the product of diagonal elements\n let det = sign\n for (let i = 0; i < n; i++) {\n det *= A[i]![i]!\n }\n\n return det\n}\n","export function minor(matrix: number[][], row: number, col: number): number[][] {\n const n = matrix.length\n const result: number[][] = []\n\n for (let i = 0; i < n; i++) {\n if (i !== row) {\n const minorRow: number[] = []\n for (let j = 0; j < n; j++) {\n if (j !== col) {\n minorRow.push(matrix[i]![j]!)\n }\n }\n result.push(minorRow)\n }\n }\n\n return result\n}\n","import { determinant } from './determinant'\nimport { minor } from './minor'\n\nexport function adjugate(matrix: number[][]): number[][] {\n const n = matrix.length\n const adj: number[][] = []\n for (let i = 0; i < n; i++) {\n adj[i] = []\n for (let j = 0; j < n; j++) {\n const min = minor(matrix, j, i)\n const sign = (-1) ** (i + j)\n const cofactor = sign * determinant(min)\n adj[i]![j] = cofactor\n }\n }\n return adj\n}\n","export function isSquare(matrix: number[][]): boolean {\n return matrix.length === matrix[0]!.length\n}\n","import { approxEqual, approxZero } from '../../../../utils'\nimport { isSquare } from './isSquare'\n\nexport function isIdentity(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const n = matrix.length\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i === j) {\n if (!approxEqual(matrix[i]![j]!, 1)) {\n return false\n }\n }\n else {\n if (!approxZero(matrix[i]![j]!)) {\n return false\n }\n }\n }\n }\n\n return true\n}\n","/**\n * Performs cache-optimized matrix multiplication.\n * @param A The first input matrix (m x n)\n * @param B The second input matrix (n x p)\n * @returns The result matrix C (m x p) where C = A × B\n */\nexport function matrixMultiply(A: number[][], B: number[][]): number[][] {\n // Check if matrices can be multiplied\n if (A.length === 0 || B.length === 0 || A[0]!.length !== B.length) {\n throw new Error('Matrix dimensions do not match for multiplication')\n }\n\n const m = A.length // Number of rows in A\n const n = A[0]!.length // Number of columns in A / Number of rows in B\n const p = B[0]!.length // Number of columns in B\n\n // Initialize result matrix C with zeros\n const C: number[][] = (Array(m).fill(0) as number[]).map(() => Array(p).fill(0) as number[])\n\n // Perform multiplication with cache-optimized loop order (i-k-j)\n for (let i = 0; i < m; i++) {\n for (let k = 0; k < n; k++) {\n const aik = A[i]![k]! // Cache this value to avoid repeated lookups\n for (let j = 0; j < p; j++) {\n C[i]![j]! += aik * B[k]![j]!\n }\n }\n }\n\n return C\n}\n","import { LitsError } from '../../../errors'\nimport { assertMatrix, assertSquareMatrix, assertVector, isSquareMatrix } from '../../../typeGuards/annotatedArrays'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { approxZero } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../../builtin/interface'\nimport type { LitsModule } from '../interface'\nimport { gaussJordanElimination } from '../linear-algebra/helpers/gaussJordanElimination'\nimport { moduleDocs } from './docs'\nimport { adjugate } from './helpers/adjugate'\nimport { band } from './helpers/band'\nimport { cofactor } from './helpers/cofactor'\nimport { determinant } from './helpers/determinant'\nimport { inverse } from './helpers/inverse'\nimport { isBanded } from './helpers/isBanded'\nimport { isDiagonal } from './helpers/isDiagonal'\nimport { isIdentity } from './helpers/isIdentity'\nimport { isOrthogonal } from './helpers/isOrthogonal'\nimport { isSquare } from './helpers/isSquare'\nimport { isSymetric } from './helpers/isSymetric'\nimport { isTriangular, isTriangularLower, isTriangularUpper } from './helpers/isTriangular'\nimport { matrixMultiply } from './helpers/matrixMultiply'\nimport { minor } from './helpers/minor'\nimport { norm1 } from './helpers/norm1'\nimport { trace } from './helpers/trace'\n\nexport const matrixNormalExpression: BuiltinNormalExpressions = {\n 'mul': {\n evaluate: ([matrix1, matrix2], sourceCodeInfo): number[][] => {\n assertMatrix(matrix1, sourceCodeInfo)\n assertMatrix(matrix2, sourceCodeInfo)\n try {\n return matrixMultiply(matrix1, matrix2)\n }\n catch (error) {\n throw new LitsError(`The number of columns in the first matrix must be equal to the number of rows in the second matrix, but got ${matrix1[0]!.length} and ${matrix2.length}`, sourceCodeInfo)\n }\n },\n arity: toFixedArity(2),\n },\n 'det': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return determinant(matrix)\n },\n arity: toFixedArity(1),\n },\n 'inv': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n const result = inverse(matrix)\n if (result === null) {\n throw new LitsError('The matrix must be invertible', sourceCodeInfo)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'adj': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return adjugate(matrix)\n },\n arity: toFixedArity(1),\n },\n 'cofactor': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return cofactor(matrix)\n },\n arity: toFixedArity(1),\n },\n 'minor': {\n evaluate: ([matrix, row, col], sourceCodeInfo): number[][] => {\n assertMatrix(matrix, sourceCodeInfo)\n assertNumber(row, sourceCodeInfo, { integer: true, nonNegative: true, lte: matrix.length })\n assertNumber(col, sourceCodeInfo, { integer: true, nonNegative: true, lte: matrix[0]!.length })\n\n return minor(matrix, row, col)\n },\n arity: toFixedArity(3),\n },\n 'trace': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return trace(matrix)\n },\n arity: toFixedArity(1),\n },\n 'symmetric?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isSymetric(matrix)\n },\n arity: toFixedArity(1),\n },\n 'triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangular(matrix)\n },\n arity: toFixedArity(1),\n },\n 'upper-triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangularUpper(matrix)\n },\n arity: toFixedArity(1),\n },\n 'lower-triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangularLower(matrix)\n },\n arity: toFixedArity(1),\n },\n 'diagonal?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isDiagonal(matrix)\n },\n arity: toFixedArity(1),\n },\n 'square?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isSquare(matrix)\n },\n arity: toFixedArity(1),\n },\n 'orthogonal?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isOrthogonal(matrix)\n },\n arity: toFixedArity(1),\n },\n 'identity?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isIdentity(matrix)\n },\n arity: toFixedArity(1),\n },\n 'invertible?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n if (!isSquareMatrix(matrix)) {\n return false\n }\n return !approxZero(determinant(matrix))\n },\n arity: toFixedArity(1),\n },\n 'hilbert': {\n evaluate: ([size], sourceCodeInfo): number[][] => {\n assertNumber(size, sourceCodeInfo, { integer: true, positive: true })\n const result: number[][] = []\n for (let i = 0; i < size; i += 1) {\n const row: number[] = []\n for (let j = 0; j < size; j += 1) {\n row.push(1 / (i + j + 1))\n }\n result.push(row)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'vandermonde': {\n evaluate: ([vector], sourceCodeInfo): number[][] => {\n assertVector(vector, sourceCodeInfo)\n const result: number[][] = []\n for (let i = 0; i < vector.length; i += 1) {\n const row: number[] = []\n for (let j = 0; j < vector.length; j += 1) {\n row.push((vector[i]!) ** j)\n }\n result.push(row)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'band': {\n evaluate: ([n, lband, uband], sourceCodeInfo): number[][] => {\n assertNumber(n, sourceCodeInfo, { integer: true, positive: true })\n assertNumber(lband, sourceCodeInfo, { integer: true, nonNegative: true, lt: n })\n assertNumber(uband, sourceCodeInfo, { integer: true, nonNegative: true, lte: n })\n return band(n, lband, uband)\n },\n arity: toFixedArity(3),\n },\n 'banded?': {\n evaluate: ([matrix, lband, uband], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n const maxBand = Math.max(matrix.length, matrix[0]!.length)\n assertNumber(lband, sourceCodeInfo, { integer: true, nonNegative: true, lt: maxBand })\n assertNumber(uband, sourceCodeInfo, { integer: true, nonNegative: true, lt: maxBand })\n return isBanded(matrix, lband, uband)\n },\n arity: toFixedArity(3),\n },\n 'rank': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n const [, result] = gaussJordanElimination(matrix)\n return result\n },\n arity: toFixedArity(1),\n },\n // Frobenius norm\n 'frobenius-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return Math.sqrt(matrix.reduce((sum, row) => sum + row.reduce((rowSum, cell) => rowSum + cell * cell, 0), 0))\n },\n arity: toFixedArity(1),\n },\n // one-norm (column norm)\n 'one-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return norm1(matrix)\n },\n arity: toFixedArity(1),\n },\n // Infinity norm\n 'inf-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return matrix.reduce((max, row) => Math.max(max, row.reduce((sum, cell) => sum + Math.abs(cell), 0)), 0)\n },\n arity: toFixedArity(1),\n },\n // Max norm\n 'max-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return matrix.reduce((maxVal, row) => {\n const rowMax = row.reduce((max, val) => Math.max(max, Math.abs(val)), 0)\n return Math.max(maxVal, rowMax)\n }, 0)\n },\n arity: toFixedArity(1),\n },\n}\n\nfor (const [key, docs] of Object.entries(moduleDocs)) {\n if (matrixNormalExpression[key])\n matrixNormalExpression[key].docs = docs\n}\n\nexport const matrixModule: LitsModule = {\n name: 'matrix',\n functions: matrixNormalExpression,\n}\n","/**\n * Calculate the inverse of a matrix using the adjugate method\n * @param matrix The input matrix\n * @returns The inverse matrix or null if the matrix is not invertible\n */\n\nimport { approxZero } from '../../../../utils'\nimport { adjugate } from './adjugate'\nimport { determinant } from './determinant'\n\nexport function inverse(matrix: number[][]): number[][] | null {\n const n = matrix.length\n\n // Special case for 1x1 matrix - handle it directly\n if (n === 1) {\n const element = matrix[0]![0]!\n if (approxZero(element)) {\n return null // Not invertible\n }\n return [[1 / element]]\n }\n\n // Calculate determinant\n const det = determinant(matrix)\n\n // Check if matrix is invertible\n if (approxZero(det)) {\n return null // Matrix is not invertible\n }\n\n // Get the adjugate matrix\n const adj = adjugate(matrix)\n\n // Calculate the inverse: inverse = adjugate / determinant\n const inverseMatrix: number[][] = []\n for (let i = 0; i < n; i++) {\n inverseMatrix[i] = []\n for (let j = 0; j < n; j++) {\n inverseMatrix[i]![j] = adj[i]![j]! / det\n }\n }\n\n return inverseMatrix\n}\n","import { determinant } from './determinant'\nimport { minor } from './minor'\n\nexport function cofactor(matrix: number[][]): number[][] {\n const n = matrix.length\n const cofactors: number[][] = []\n\n // Create a new matrix to store cofactors\n for (let i = 0; i < n; i++) {\n cofactors[i] = []\n for (let j = 0; j < n; j++) {\n // Get the minor by removing row i and column j\n const min = minor(matrix, i, j)\n const sign = (-1) ** (i + j)\n cofactors[i]![j] = sign * determinant(min)\n }\n }\n\n return cofactors\n}\n","/**\n * Calculates the trace of a square matrix.\n * The trace is defined as the sum of the elements on the main diagonal.\n *\n * @param matrix - A 2D array representing a square matrix.\n * @returns The trace of the matrix.\n */\nexport function trace(matrix: number[][]): number {\n return matrix.reduce((sum, row, i) => sum + row[i]!, 0)\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Checks if a given matrix is symmetric.\n * A matrix is symmetric if it is square and its transpose is equal to itself.\n *\n * @param matrix - A 2D array representing the matrix.\n * @returns `true` if the matrix is symmetric, otherwise `false`.\n */\nexport function isSymetric(matrix: number[][]): boolean {\n const rows = matrix.length\n\n // Check if the matrix is square\n if (!isSquare(matrix)) {\n return false\n }\n\n // Check symmetry\n for (let i = 0; i < rows; i += 1) {\n for (let j = 0; j < i; j += 1) {\n if (matrix[i]![j]! !== matrix[j]![i]!) {\n return false\n }\n }\n }\n\n return true\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Determines whether a given matrix is triangular.\n *\n * A triangular matrix is a square matrix where all elements\n * below or above the main diagonal are zero. This function\n * checks if the matrix is square and symmetric.\n *\n * @param matrix - A two-dimensional array of numbers representing the matrix.\n * @returns `true` if the matrix is triangular, otherwise `false`.\n */\nexport function isTriangular(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n\n const rows = matrix.length\n\n let isUpperTriangular = true\n let isLowerTriangular = true\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < rows; j++) {\n if (i > j && matrix[i]![j] !== 0) {\n isUpperTriangular = false\n if (!isLowerTriangular) {\n return false\n }\n }\n if (i < j && matrix[i]![j] !== 0) {\n isLowerTriangular = false\n }\n }\n }\n\n return isUpperTriangular || isLowerTriangular\n}\n\nexport function isTriangularUpper(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < i; j++) {\n if (matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n\nexport function isTriangularLower(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n // Check if the matrix is square\n if (!matrix.every(row => row.length === rows)) {\n return false\n }\n\n for (let i = 0; i < rows; i++) {\n for (let j = i + 1; j < rows; j++) {\n if (matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Checks if a given matrix is diagonal.\n *\n * A matrix is considered diagonal if it is square (i.e., the number of rows equals the number of columns)\n * and all elements outside the main diagonal are zero.\n *\n * @param matrix - A two-dimensional array of numbers representing the matrix to check.\n * @returns `true` if the matrix is diagonal, otherwise `false`.\n */\nexport function isDiagonal(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n for (let i = 0; i < rows; i += 1) {\n for (let j = 0; j < rows; j += 1) {\n if (i !== j && matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n","import { transpose } from '../../../modules/grid/transpose'\nimport { matrixMultiply } from './matrixMultiply'\nimport { isIdentity } from './isIdentity'\nimport { isSquare } from './isSquare'\n\nexport function isOrthogonal(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n\n // Calculate matrix transpose\n const transposed = transpose(matrix)\n\n // Check if matrix * transpose = Identity\n const product = matrixMultiply(matrix, transposed)\n\n // Check if the product is an identity matrix\n return isIdentity(product)\n}\n","import type { Any } from '../../../interface'\n\nexport function transpose<T extends Any>(grid: T[][]): T[][] {\n const result: T[][] = []\n\n for (let i = 0; i < grid[0]!.length; i += 1) {\n const row: T[] = []\n for (let j = 0; j < grid.length; j += 1) {\n row.push(grid[j]![i]!)\n }\n result.push(row)\n }\n return result\n}\n","/**\n * Creates a band matrix with specified lower and upper bandwidths\n *\n * @param n Size of the square matrix\n * @param lband Lower bandwidth (number of non-zero diagonals below main diagonal)\n * @param uband Upper bandwidth (number of non-zero diagonals above main diagonal)\n * @returns A 2D array representing the band matrix with 1s in the band and 0s elsewhere\n */\nexport function band(n: number, lband: number, uband: number): number[][] {\n // Create an n×n matrix filled with zeros\n const matrix: number[][] = Array.from({ length: n }, () => Array.from({ length: n }, () => 0))\n\n // Fill the band with 1s\n for (let i = 0; i < n; i++) {\n for (let j = Math.max(0, i - lband); j <= Math.min(n - 1, i + uband); j++) {\n matrix[i]![j] = 1\n }\n }\n\n return matrix\n}\n","/**\n * Checks if a matrix is banded with the given lower and upper bandwidth.\n * A matrix is banded if all non-zero elements are within 'lower' diagonals\n * below the main diagonal and 'upper' diagonals above the main diagonal.\n *\n * @param matrix - The matrix to check, represented as a 2D array of numbers\n * @param lower - Number of non-zero diagonals below the main diagonal\n * @param upper - Number of non-zero diagonals above the main diagonal\n * @returns true if the matrix is banded with the given parameters, false otherwise\n */\nexport function isBanded(matrix: number[][], lower: number, upper: number): boolean {\n const rows = matrix.length\n const cols = matrix[0]!.length\n\n // Check each element in the matrix\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n // If we find a non-zero element outside the band, return false\n if (matrix[i]![j] !== 0 && (i - j > lower || j - i > upper)) {\n return false\n }\n }\n }\n\n // All elements outside the band are zero\n return true\n}\n","import { approxZero } from '../../../../utils'\n\n/**\n * Performs Gauss-Jordan elimination on a matrix, transforming it to reduced row echelon form\n *\n * @param matrix - The input matrix\n * @returns A tuple containing the reduced row echelon form matrix and the rank\n */\nexport function gaussJordanElimination(matrix: number[][]): [number[][], number] {\n // Create a copy of the matrix to avoid modifying the original\n const m = matrix.map(row => [...row])\n const rows = m.length\n const cols = m[0]!.length\n\n let rank = 0\n let rowsProcessed = 0\n\n // Row reduction to reduced row echelon form\n for (let col = 0; col < cols; col++) {\n // Find the pivot\n let pivotRow = -1\n\n for (let row = rowsProcessed; row < rows; row++) {\n if (!approxZero(m[row]![col]!)) {\n pivotRow = row\n break\n }\n }\n\n if (pivotRow === -1)\n continue // No pivot in this column\n\n // Increase rank\n rank += 1\n\n // Swap rows\n if (pivotRow !== rowsProcessed) {\n [m[pivotRow], m[rowsProcessed]] = [m[rowsProcessed]!, m[pivotRow]!]\n }\n\n // Get the pivot value\n const pivotValue = m[rowsProcessed]![col]!\n\n // Normalize the pivot row (always, for RREF)\n for (let j = col; j < cols; j++) {\n m[rowsProcessed]![j]! /= pivotValue\n }\n\n // Eliminate above and below (full Gauss-Jordan)\n for (let row = 0; row < rows; row++) {\n if (row !== rowsProcessed && !approxZero(m[row]![col]!)) {\n const factor = m[row]![col]!\n for (let j = col; j < cols; j++) {\n m[row]![j]! -= factor * m[rowsProcessed]![j]!\n }\n }\n }\n\n rowsProcessed++\n if (rowsProcessed === rows)\n break\n }\n\n return [m, rank]\n}\n","// Assuming a matrix is represented as a 2D array\nexport function norm1(matrix: number[][]): number {\n const numRows = matrix.length\n const numCols = matrix[0]!.length\n\n let maxColSum = 0\n\n // Iterate through each column\n for (let j = 0; j < numCols; j += 1) {\n let colSum = 0\n\n // Sum the absolute values of all elements in this column\n for (let i = 0; i < numRows; i += 1) {\n colSum += Math.abs(matrix[i]![j]!)\n }\n\n // Update the maximum column sum if necessary\n maxColSum = Math.max(maxColSum, colSum)\n }\n\n return maxColSum\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","isNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","assertNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","anyValue","getSourceCodeInfo","annotatedArrays","WeakSet","vectors","notVectors","matrices","notMatrices","grids","assertVector","vector","every","elem","add","isVector","isMatrix","matrix","nbrOfCols","row","some","cell","assertMatrix","assertSquareMatrix","approxEqual","a","b","epsilon","diff","abs","approxZero","toFixedArity","arity","min","moduleDocs","mul","category","description","returns","args","variants","argumentNames","examples","seeAlso","det","m","inv","adj","cofactor","minor","col","trace","hilbert","n","vandermonde","v","band","lband","uband","rank","determinant","A","i","maxRow","j","factor","k","result","minorRow","push","adjugate","isSquare","isIdentity","matrixMultiply","B","p","C","fill","map","aik","matrixNormalExpression","evaluate","matrix1","matrix2","error","element","inverseMatrix","inverse","cofactors","reduce","sum","rows","isSymetric","isUpperTriangular","isLowerTriangular","isTriangular","isTriangularUpper","isTriangularLower","isDiagonal","grid","transpose","isOrthogonal","isSquareMatrix","size","from","maxBand","lower","upper","cols","isBanded","rowsProcessed","pivotRow","pivotValue","gaussJordanElimination","sqrt","rowSum","numRows","numCols","maxColSum","colSum","norm1","maxVal","rowMax","val","docs","entries","matrixModule","functions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"matrix.esm.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/typeGuards/number.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/annotatedArrays.ts","../../src/utils/index.ts","../../src/utils/arity.ts","../../src/builtin/modules/matrix/docs.ts","../../src/builtin/modules/matrix/helpers/determinant.ts","../../src/builtin/modules/matrix/helpers/minor.ts","../../src/builtin/modules/matrix/helpers/adjugate.ts","../../src/builtin/modules/matrix/helpers/isSquare.ts","../../src/builtin/modules/matrix/helpers/isIdentity.ts","../../src/builtin/modules/matrix/helpers/matrixMultiply.ts","../../src/builtin/modules/matrix/index.ts","../../src/builtin/modules/matrix/helpers/inverse.ts","../../src/builtin/modules/matrix/helpers/cofactor.ts","../../src/builtin/modules/matrix/helpers/trace.ts","../../src/builtin/modules/matrix/helpers/isSymetric.ts","../../src/builtin/modules/matrix/helpers/isTriangular.ts","../../src/builtin/modules/matrix/helpers/isDiagonal.ts","../../src/builtin/modules/matrix/helpers/isOrthogonal.ts","../../src/builtin/modules/grid/transpose.ts","../../src/builtin/modules/matrix/helpers/band.ts","../../src/builtin/modules/matrix/helpers/isBanded.ts","../../src/builtin/modules/linear-algebra/helpers/gaussJordanElimination.ts","../../src/builtin/modules/matrix/helpers/norm1.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { AstNode, LitsFunction } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is AstNode {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { Any } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isNumber } from './number'\n\nconst annotatedArrays = new WeakSet<unknown[]>()\nconst vectors = new WeakSet<unknown[]>()\nconst notVectors = new WeakSet<unknown[]>()\nconst matrices = new WeakSet<unknown[]>()\nconst notMatrices = new WeakSet<unknown[]>()\nconst grids = new WeakSet<unknown[]>()\nconst notGrids = new WeakSet<unknown[]>()\n\nexport function annotate<T>(value: T): T {\n if (!Array.isArray(value)) {\n return value\n }\n if (annotatedArrays.has(value)) {\n return value\n }\n isVector(value)\n if (!isMatrix(value)) {\n isGrid(value)\n }\n\n return value\n}\nexport function isVector(vector: unknown): vector is number[] {\n if (!Array.isArray(vector)) {\n return false\n }\n\n if (vectors.has(vector)) {\n return true\n }\n if (notVectors.has(vector)) {\n return false\n }\n\n if (vector.every(elem => isNumber(elem))) {\n annotatedArrays.add(vector)\n vectors.add(vector)\n return true\n }\n notVectors.add(vector)\n return false\n}\n\nexport function assertVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is number[] {\n if (!isVector(vector)) {\n throw new LitsError(`Expected a vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function is2dVector(vector: unknown): vector is [number, number] {\n if (!isVector(vector)) {\n return false\n }\n return vector.length === 2\n}\nexport function assert2dVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is [number, number] {\n if (!is2dVector(vector)) {\n throw new LitsError(`Expected a 2d vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function is3dVector(vector: unknown): vector is [number, number, number] {\n if (!isVector(vector)) {\n return false\n }\n return vector.length === 3\n}\nexport function assert3dVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is [number, number, number] {\n if (!is3dVector(vector)) {\n throw new LitsError(`Expected a 3d vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function assertNonEmptyVector(vector: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts vector is number[] {\n assertVector(vector, sourceCodeInfo)\n if (vector.length === 0) {\n throw new LitsError(`Expected a non empty vector, but got ${vector}`, sourceCodeInfo)\n }\n}\n\nexport function isGrid(grid: unknown): grid is unknown[][] {\n if (!Array.isArray(grid)) {\n return false\n }\n if (grids.has(grid)) {\n return true\n }\n if (notGrids.has(grid)) {\n return false\n }\n if (grid.length === 0) {\n notGrids.add(grid)\n return false\n }\n if (!Array.isArray(grid[0])) {\n notGrids.add(grid)\n return false\n }\n const nbrOfCols = grid[0].length\n for (const row of grid.slice(1)) {\n if (!Array.isArray(row)) {\n notGrids.add(grid)\n return false\n }\n if (row.length !== nbrOfCols) {\n notGrids.add(grid)\n return false\n }\n }\n annotatedArrays.add(grid)\n grids.add(grid)\n return true\n}\n\nexport function assertGrid(grid: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts grid is Any[][] {\n if (!isGrid(grid)) {\n throw new LitsError(`Expected a grid, but got ${grid}`, sourceCodeInfo)\n }\n}\n\nexport function isMatrix(matrix: unknown): matrix is number[][] {\n if (!Array.isArray(matrix)) {\n return false\n }\n if (matrices.has(matrix)) {\n return true\n }\n if (notMatrices.has(matrix)) {\n return false\n }\n if (matrix.length === 0) {\n notMatrices.add(matrix)\n return false\n }\n if (!Array.isArray(matrix[0]) || matrix[0].length === 0) {\n notMatrices.add(matrix)\n return false\n }\n const nbrOfCols = matrix[0].length\n for (const row of matrix) {\n if (!Array.isArray(row) || row.length !== nbrOfCols || row.some(cell => !isNumber(cell))) {\n notMatrices.add(matrix)\n return false\n }\n }\n annotatedArrays.add(matrix)\n grids.add(matrix)\n matrices.add(matrix)\n return true\n}\n\nexport function assertMatrix(matrix: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts matrix is number[][] {\n if (!isMatrix(matrix)) {\n throw new LitsError(`Expected a matrix, but got ${matrix}`, sourceCodeInfo)\n }\n}\n\nexport function assertSquareMatrix(matrix: unknown, sourceCodeInfo: SourceCodeInfo | undefined): asserts matrix is number[][] {\n if (!isMatrix(matrix)) {\n throw new LitsError(`Expected a matrix, but got ${matrix}`, sourceCodeInfo)\n }\n if (matrix.length !== matrix[0]!.length) {\n throw new LitsError(`Expected square matrix, but got ${matrix.length} and ${matrix[0]!.length}`, sourceCodeInfo)\n }\n}\n\nexport function isSquareMatrix(matrix: unknown): matrix is number[][] {\n if (!isMatrix(matrix)) {\n return false\n }\n if (matrix.length !== matrix[0]!.length) {\n return false\n }\n return true\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import type { FunctionDocs } from '../../interface'\n\nexport const moduleDocs: Record<string, FunctionDocs> = {\n 'mul': {\n category: 'matrix',\n description: 'Multiplies two `matrices` using standard `matrix` multiplication based on **dot products** of rows and columns.',\n returns: {\n type: 'matrix',\n },\n args: {\n a: {\n type: 'matrix',\n },\n b: {\n type: 'matrix',\n },\n },\n variants: [\n {\n argumentNames: [\n 'a',\n 'b',\n ],\n },\n ],\n examples: [\n 'let { mul } = import(\"matrix\");\\nmul([[1, 2], [3, 4]], [[5, 6], [7, 8]])',\n 'let { mul } = import(\"matrix\");\\nmul([[1, 2, 3], [4, 5, 6]], [[7, 8], [9, 10], [11, 12]])',\n ],\n seeAlso: ['matrix.det', 'matrix.inv'],\n },\n 'det': {\n category: 'matrix',\n description: 'Calculates the **determinant** of a square matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the determinant of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { det } = import(\"matrix\");\\ndet([[1, 2], [3, 4]])',\n 'let { det } = import(\"matrix\");\\ndet([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.inv', 'matrix.cofactor', 'matrix.adj', 'matrix.trace', 'matrix.rank', 'matrix.invertible?', 'matrix.mul', 'matrix.minor'],\n },\n 'inv': {\n category: 'matrix',\n description: 'Calculates the **inverse** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the inverse of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { inv } = import(\"matrix\");\\ninv([[1, 2], [3, 4]])',\n 'let { inv } = import(\"matrix\");\\ninv([[1, 2, 3], [4, 5, 7], [7, 8, 10]])',\n ],\n seeAlso: ['matrix.det', 'matrix.adj', 'matrix.invertible?', 'linear-algebra.solve', 'matrix.mul', 'matrix.orthogonal?'],\n },\n 'adj': {\n category: 'matrix',\n description: 'Calculates the **adjugate** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the adjugate of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2], [3, 4]])',\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { adj } = import(\"matrix\");\\nadj([[1, 2, 3], [7, 8, 9], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.cofactor', 'matrix.det', 'matrix.inv'],\n },\n 'cofactor': {\n category: 'matrix',\n description: 'Calculates the **cofactor** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the cofactor of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2], [3, 4]])',\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { cofactor } = import(\"matrix\");\\ncofactor([[1, 2, 3], [7, 8, 9], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.adj', 'matrix.minor', 'matrix.det'],\n },\n 'minor': {\n category: 'matrix',\n description: 'Calculates the **minor** of a square matrix.',\n returns: {\n type: 'matrix',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the minor of.',\n },\n row: {\n type: 'integer',\n description: 'The row index of the element to calculate the minor for.',\n },\n col: {\n type: 'integer',\n description: 'The column index of the element to calculate the minor for.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n 'row',\n 'col',\n ],\n },\n ],\n examples: [\n 'let { minor } = import(\"matrix\");\\nminor([[1, 2], [3, 4]], 0, 1)',\n 'let { minor } = import(\"matrix\");\\nminor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 1, 1)',\n ],\n seeAlso: ['matrix.cofactor', 'matrix.det'],\n },\n 'trace': {\n category: 'matrix',\n description: 'Calculates the **trace** of a square matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the trace of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { trace } = import(\"matrix\");\\ntrace([[1, 2], [3, 4]])',\n 'let { trace } = import(\"matrix\");\\ntrace([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.det', 'matrix.diagonal?'],\n },\n 'symmetric?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **symmetric**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for symmetry.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { symmetric? } = import(\"matrix\");\\nsymmetric?([[1, 2], [2, 1]])',\n 'let { symmetric? } = import(\"matrix\");\\nsymmetric?([[1, 2, 3], [2, 1, 4], [3, 4, 1]])',\n ],\n seeAlso: ['matrix.orthogonal?', 'matrix.diagonal?', 'matrix.square?', 'matrix.hilbert'],\n },\n 'triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { triangular? } = import(\"matrix\");\\ntriangular?([[2, 0], [0, 1]])',\n 'let { triangular? } = import(\"matrix\");\\ntriangular?([[1, 2, 3], [0, 4, 5], [0, 0, 6]])',\n ],\n seeAlso: ['matrix.upper-triangular?', 'matrix.lower-triangular?', 'matrix.diagonal?', 'matrix.banded?'],\n },\n 'upper-triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **upper triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for upper triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { upper-triangular? } = import(\"matrix\");\\nupper-triangular?([[1, 2], [0, 3]])',\n 'let { upper-triangular? } = import(\"matrix\");\\nupper-triangular?([[1, 2, 3], [0, 4, 5], [0, 0, 6]])',\n ],\n seeAlso: ['matrix.lower-triangular?', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'lower-triangular?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **lower triangular**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for lower triangularity.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { lower-triangular? } = import(\"matrix\");\\nlower-triangular?([[1, 0], [2, 3]])',\n 'let { lower-triangular? } = import(\"matrix\");\\nlower-triangular?([[1, 0, 0], [2, 3, 0], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.upper-triangular?', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'diagonal?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **diagonal**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for diagonal property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0], [0, 2]])',\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0, 0], [0, 2, 0], [0, 0, 3]])',\n 'let { diagonal? } = import(\"matrix\");\\ndiagonal?([[1, 0, 0], [2, 2, 2], [0, 0, 3]])',\n ],\n seeAlso: ['matrix.identity?', 'matrix.symmetric?', 'matrix.triangular?', 'matrix.trace', 'matrix.upper-triangular?', 'matrix.lower-triangular?', 'matrix.band', 'matrix.banded?'],\n },\n 'square?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **square**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for square property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2], [3, 4]])',\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { square? } = import(\"matrix\");\\nsquare?([[1, 2, 3], [4, 5, 6]])',\n ],\n seeAlso: ['matrix.symmetric?', 'matrix.identity?', 'matrix.invertible?'],\n },\n 'orthogonal?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **orthogonal**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for **orthogonality**.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 0], [0, 1]])',\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 0], [0, -1]])',\n 'let { orthogonal? } = import(\"matrix\");\\northogonal?([[1, 2], [3, 4]])',\n ],\n seeAlso: ['matrix.symmetric?', 'matrix.inv', 'matrix.identity?', 'linear-algebra.orthogonal?'],\n },\n 'identity?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is an **identity matrix**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for identity property.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0], [0, 1]])',\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0, 0], [0, 1, 0], [0, 0, 1]])',\n 'let { identity? } = import(\"matrix\");\\nidentity?([[1, 0, 0], [0, 1, 0], [0, 0, 0]])',\n ],\n seeAlso: ['matrix.diagonal?', 'matrix.square?', 'matrix.orthogonal?'],\n },\n 'invertible?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **invertible**.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for invertibility.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2], [3, 4]])',\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { invertible? } = import(\"matrix\");\\ninvertible?([[1, 2], [2, 4]])',\n ],\n seeAlso: ['matrix.det', 'matrix.inv', 'matrix.rank', 'matrix.square?'],\n },\n 'hilbert': {\n category: 'matrix',\n description: 'Generates a **Hilbert matrix** of size `n`.',\n returns: {\n type: 'matrix',\n },\n args: {\n n: {\n type: 'integer',\n description: 'The size of the Hilbert matrix.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'n',\n ],\n },\n ],\n examples: [\n 'let { hilbert } = import(\"matrix\");\\nhilbert(3)',\n 'let { hilbert } = import(\"matrix\");\\nhilbert(4)',\n ],\n seeAlso: ['matrix.vandermonde', 'matrix.symmetric?'],\n },\n 'vandermonde': {\n category: 'matrix',\n description: 'Generates a **Vandermonde matrix** from a vector.',\n returns: {\n type: 'matrix',\n },\n args: {\n v: {\n type: 'vector',\n description: 'The vector to generate the Vandermonde matrix from.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'v',\n ],\n },\n ],\n examples: [\n 'let { vandermonde } = import(\"matrix\");\\nvandermonde([1, 2, 3])',\n 'let { vandermonde } = import(\"matrix\");\\nvandermonde([1, 0, 1])',\n ],\n seeAlso: ['matrix.hilbert', 'matrix.band'],\n },\n 'band': {\n category: 'matrix',\n description: 'Generates a **banded matrix** of size `n` with lower band index `lband` and upper band index `uband`.',\n returns: {\n type: 'matrix',\n },\n args: {\n n: {\n type: 'integer',\n description: 'The size of the banded matrix.',\n },\n lband: {\n type: 'integer',\n description: 'The lower band index.',\n },\n uband: {\n type: 'integer',\n description: 'The upper band index.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'n',\n 'lband',\n 'uband',\n ],\n },\n ],\n examples: [\n 'let { band } = import(\"matrix\");\\nband(3, 1, 1)',\n 'let { band } = import(\"matrix\");\\nband(4, 1, 2)',\n ],\n seeAlso: ['matrix.banded?', 'matrix.diagonal?', 'matrix.vandermonde'],\n },\n 'banded?': {\n category: 'matrix',\n description: 'Checks if a `matrix` is **banded** with lower band index `lband` and upper band index `uband`.',\n returns: {\n type: 'boolean',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to check for **banded** property.',\n },\n lband: {\n type: 'integer',\n description: 'The lower band index.',\n },\n uband: {\n type: 'integer',\n description: 'The upper band index.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n 'lband',\n 'uband',\n ],\n },\n ],\n examples: [\n 'let { banded? } = import(\"matrix\");\\nbanded?([\\n [1, 1, 1, 0],\\n [1, 1, 1, 1],\\n [1, 1, 1, 1],\\n [0, 1, 1, 1],\\n], 2, 2)',\n 'let { banded? } = import(\"matrix\");\\nbanded?([\\n [1, 1, 1, 0],\\n [1, 1, 1, 1],\\n [1, 1, 1, 1],\\n [0, 1, 1, 1],\\n], 1, 1)',\n ],\n seeAlso: ['matrix.band', 'matrix.triangular?', 'matrix.diagonal?'],\n },\n 'rank': {\n category: 'matrix',\n description: 'Calculates the **rank** of a matrix using **Gaussian elimination**.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the rank of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { rank } = import(\"matrix\");\\nrank([[1, 0, 0], [0, 1, 0], [0, 0, 1]])',\n 'let { rank } = import(\"matrix\");\\nrank([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n 'let { rank } = import(\"matrix\");\\nrank([[2, 4, 6], [3, 6, 9], [4, 8, 12]])',\n ],\n seeAlso: ['matrix.det', 'matrix.invertible?', 'linear-algebra.rref'],\n },\n 'frobenius-norm': {\n category: 'matrix',\n description: 'Calculates the **Frobenius norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the Frobenius norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { frobenius-norm } = import(\"matrix\");\\nfrobenius-norm([[1, 2], [3, 4]])',\n 'let { frobenius-norm } = import(\"matrix\");\\nfrobenius-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.one-norm', 'matrix.inf-norm', 'matrix.max-norm'],\n },\n 'one-norm': {\n category: 'matrix',\n description: 'Calculates the **one-norm** (column norm) of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the one-norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { one-norm } = import(\"matrix\");\\none-norm([[1, 2], [3, 4]])',\n 'let { one-norm } = import(\"matrix\");\\none-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.inf-norm', 'matrix.max-norm'],\n },\n 'inf-norm': {\n category: 'matrix',\n description: 'Calculates the **infinity norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the infinity norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { inf-norm } = import(\"matrix\");\\ninf-norm([[1, 2], [3, 4]])',\n 'let { inf-norm } = import(\"matrix\");\\ninf-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.one-norm', 'matrix.max-norm'],\n },\n 'max-norm': {\n category: 'matrix',\n description: 'Calculates the **max norm** of a matrix.',\n returns: {\n type: 'number',\n },\n args: {\n m: {\n type: 'matrix',\n description: 'The `matrix` to calculate the max norm of.',\n },\n },\n variants: [\n {\n argumentNames: [\n 'm',\n ],\n },\n ],\n examples: [\n 'let { max-norm } = import(\"matrix\");\\nmax-norm([[1, 2], [3, 4]])',\n 'let { max-norm } = import(\"matrix\");\\nmax-norm([[1, 2, 3], [4, 5, 6], [7, 8, 9]])',\n ],\n seeAlso: ['matrix.frobenius-norm', 'matrix.one-norm', 'matrix.inf-norm'],\n },\n}\n","import { approxZero } from '../../../../utils'\n\n/**\n * Calculates the determinant of a matrix using Gaussian Elimination\n * @param matrix A square matrix represented as a 2D array\n * @returns The determinant of the matrix\n */\nexport function determinant(matrix: number[][]): number {\n // First, make a deep copy of the matrix to avoid modifying the original\n const n = matrix.length\n const A: number[][] = []\n\n for (let i = 0; i < n; i++) {\n A[i] = [...matrix[i]!]\n }\n\n // Handle special cases for small matrices\n if (n === 1) {\n return A[0]![0]!\n }\n\n if (n === 2) {\n return A[0]![0]! * A[1]![1]! - A[0]![1]! * A[1]![0]!\n }\n\n // For larger matrices, use Gaussian elimination\n let sign = 1 // Track sign changes from row swaps\n\n // Perform Gaussian elimination to get an upper triangular matrix\n for (let i = 0; i < n - 1; i += 1) {\n // Find pivot (maximum element in current column)\n let maxRow = i\n\n for (let j = i + 1; j < n; j += 1) {\n if (Math.abs(A[j]![i]!) > Math.abs(A[maxRow]![i]!)) {\n maxRow = j\n }\n }\n\n // If the pivot is zero, the determinant is zero\n if (approxZero(A[maxRow]![i]!)) {\n return 0\n }\n\n // Swap rows if necessary\n if (maxRow !== i) {\n [A[i], A[maxRow]] = [A[maxRow]!, A[i]!] // ES6 array destructuring for swap\n sign = -sign // Each row swap changes the sign\n }\n\n // Eliminate entries below the pivot\n for (let j = i + 1; j < n; j += 1) {\n const factor = A[j]![i]! / A[i]![i]!\n\n // Subtract (factor * pivot row) from current row\n for (let k = i; k < n; k++) {\n A[j]![k]! -= factor * A[i]![k]!\n }\n }\n }\n\n // Calculate determinant as the product of diagonal elements\n let det = sign\n for (let i = 0; i < n; i++) {\n det *= A[i]![i]!\n }\n\n return det\n}\n","export function minor(matrix: number[][], row: number, col: number): number[][] {\n const n = matrix.length\n const result: number[][] = []\n\n for (let i = 0; i < n; i++) {\n if (i !== row) {\n const minorRow: number[] = []\n for (let j = 0; j < n; j++) {\n if (j !== col) {\n minorRow.push(matrix[i]![j]!)\n }\n }\n result.push(minorRow)\n }\n }\n\n return result\n}\n","import { determinant } from './determinant'\nimport { minor } from './minor'\n\nexport function adjugate(matrix: number[][]): number[][] {\n const n = matrix.length\n const adj: number[][] = []\n for (let i = 0; i < n; i++) {\n adj[i] = []\n for (let j = 0; j < n; j++) {\n const min = minor(matrix, j, i)\n const sign = (-1) ** (i + j)\n const cofactor = sign * determinant(min)\n adj[i]![j] = cofactor\n }\n }\n return adj\n}\n","export function isSquare(matrix: number[][]): boolean {\n return matrix.length === matrix[0]!.length\n}\n","import { approxEqual, approxZero } from '../../../../utils'\nimport { isSquare } from './isSquare'\n\nexport function isIdentity(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const n = matrix.length\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i === j) {\n if (!approxEqual(matrix[i]![j]!, 1)) {\n return false\n }\n }\n else {\n if (!approxZero(matrix[i]![j]!)) {\n return false\n }\n }\n }\n }\n\n return true\n}\n","/**\n * Performs cache-optimized matrix multiplication.\n * @param A The first input matrix (m x n)\n * @param B The second input matrix (n x p)\n * @returns The result matrix C (m x p) where C = A × B\n */\nexport function matrixMultiply(A: number[][], B: number[][]): number[][] {\n // Check if matrices can be multiplied\n if (A.length === 0 || B.length === 0 || A[0]!.length !== B.length) {\n throw new Error('Matrix dimensions do not match for multiplication')\n }\n\n const m = A.length // Number of rows in A\n const n = A[0]!.length // Number of columns in A / Number of rows in B\n const p = B[0]!.length // Number of columns in B\n\n // Initialize result matrix C with zeros\n const C: number[][] = (Array(m).fill(0) as number[]).map(() => Array(p).fill(0) as number[])\n\n // Perform multiplication with cache-optimized loop order (i-k-j)\n for (let i = 0; i < m; i++) {\n for (let k = 0; k < n; k++) {\n const aik = A[i]![k]! // Cache this value to avoid repeated lookups\n for (let j = 0; j < p; j++) {\n C[i]![j]! += aik * B[k]![j]!\n }\n }\n }\n\n return C\n}\n","import { LitsError } from '../../../errors'\nimport { assertMatrix, assertSquareMatrix, assertVector, isSquareMatrix } from '../../../typeGuards/annotatedArrays'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { approxZero } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../../builtin/interface'\nimport type { LitsModule } from '../interface'\nimport { gaussJordanElimination } from '../linear-algebra/helpers/gaussJordanElimination'\nimport { moduleDocs } from './docs'\nimport { adjugate } from './helpers/adjugate'\nimport { band } from './helpers/band'\nimport { cofactor } from './helpers/cofactor'\nimport { determinant } from './helpers/determinant'\nimport { inverse } from './helpers/inverse'\nimport { isBanded } from './helpers/isBanded'\nimport { isDiagonal } from './helpers/isDiagonal'\nimport { isIdentity } from './helpers/isIdentity'\nimport { isOrthogonal } from './helpers/isOrthogonal'\nimport { isSquare } from './helpers/isSquare'\nimport { isSymetric } from './helpers/isSymetric'\nimport { isTriangular, isTriangularLower, isTriangularUpper } from './helpers/isTriangular'\nimport { matrixMultiply } from './helpers/matrixMultiply'\nimport { minor } from './helpers/minor'\nimport { norm1 } from './helpers/norm1'\nimport { trace } from './helpers/trace'\n\nexport const matrixNormalExpression: BuiltinNormalExpressions = {\n 'mul': {\n evaluate: ([matrix1, matrix2], sourceCodeInfo): number[][] => {\n assertMatrix(matrix1, sourceCodeInfo)\n assertMatrix(matrix2, sourceCodeInfo)\n try {\n return matrixMultiply(matrix1, matrix2)\n }\n catch (error) {\n throw new LitsError(`The number of columns in the first matrix must be equal to the number of rows in the second matrix, but got ${matrix1[0]!.length} and ${matrix2.length}`, sourceCodeInfo)\n }\n },\n arity: toFixedArity(2),\n },\n 'det': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return determinant(matrix)\n },\n arity: toFixedArity(1),\n },\n 'inv': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n const result = inverse(matrix)\n if (result === null) {\n throw new LitsError('The matrix must be invertible', sourceCodeInfo)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'adj': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return adjugate(matrix)\n },\n arity: toFixedArity(1),\n },\n 'cofactor': {\n evaluate: ([matrix], sourceCodeInfo): number[][] => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return cofactor(matrix)\n },\n arity: toFixedArity(1),\n },\n 'minor': {\n evaluate: ([matrix, row, col], sourceCodeInfo): number[][] => {\n assertMatrix(matrix, sourceCodeInfo)\n assertNumber(row, sourceCodeInfo, { integer: true, nonNegative: true, lte: matrix.length })\n assertNumber(col, sourceCodeInfo, { integer: true, nonNegative: true, lte: matrix[0]!.length })\n\n return minor(matrix, row, col)\n },\n arity: toFixedArity(3),\n },\n 'trace': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertSquareMatrix(matrix, sourceCodeInfo)\n return trace(matrix)\n },\n arity: toFixedArity(1),\n },\n 'symmetric?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isSymetric(matrix)\n },\n arity: toFixedArity(1),\n },\n 'triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangular(matrix)\n },\n arity: toFixedArity(1),\n },\n 'upper-triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangularUpper(matrix)\n },\n arity: toFixedArity(1),\n },\n 'lower-triangular?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isTriangularLower(matrix)\n },\n arity: toFixedArity(1),\n },\n 'diagonal?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isDiagonal(matrix)\n },\n arity: toFixedArity(1),\n },\n 'square?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isSquare(matrix)\n },\n arity: toFixedArity(1),\n },\n 'orthogonal?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isOrthogonal(matrix)\n },\n arity: toFixedArity(1),\n },\n 'identity?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n return isIdentity(matrix)\n },\n arity: toFixedArity(1),\n },\n 'invertible?': {\n evaluate: ([matrix], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n if (!isSquareMatrix(matrix)) {\n return false\n }\n return !approxZero(determinant(matrix))\n },\n arity: toFixedArity(1),\n },\n 'hilbert': {\n evaluate: ([size], sourceCodeInfo): number[][] => {\n assertNumber(size, sourceCodeInfo, { integer: true, positive: true })\n const result: number[][] = []\n for (let i = 0; i < size; i += 1) {\n const row: number[] = []\n for (let j = 0; j < size; j += 1) {\n row.push(1 / (i + j + 1))\n }\n result.push(row)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'vandermonde': {\n evaluate: ([vector], sourceCodeInfo): number[][] => {\n assertVector(vector, sourceCodeInfo)\n const result: number[][] = []\n for (let i = 0; i < vector.length; i += 1) {\n const row: number[] = []\n for (let j = 0; j < vector.length; j += 1) {\n row.push((vector[i]!) ** j)\n }\n result.push(row)\n }\n return result\n },\n arity: toFixedArity(1),\n },\n 'band': {\n evaluate: ([n, lband, uband], sourceCodeInfo): number[][] => {\n assertNumber(n, sourceCodeInfo, { integer: true, positive: true })\n assertNumber(lband, sourceCodeInfo, { integer: true, nonNegative: true, lt: n })\n assertNumber(uband, sourceCodeInfo, { integer: true, nonNegative: true, lte: n })\n return band(n, lband, uband)\n },\n arity: toFixedArity(3),\n },\n 'banded?': {\n evaluate: ([matrix, lband, uband], sourceCodeInfo): boolean => {\n assertMatrix(matrix, sourceCodeInfo)\n const maxBand = Math.max(matrix.length, matrix[0]!.length)\n assertNumber(lband, sourceCodeInfo, { integer: true, nonNegative: true, lt: maxBand })\n assertNumber(uband, sourceCodeInfo, { integer: true, nonNegative: true, lt: maxBand })\n return isBanded(matrix, lband, uband)\n },\n arity: toFixedArity(3),\n },\n 'rank': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n const [, result] = gaussJordanElimination(matrix)\n return result\n },\n arity: toFixedArity(1),\n },\n // Frobenius norm\n 'frobenius-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return Math.sqrt(matrix.reduce((sum, row) => sum + row.reduce((rowSum, cell) => rowSum + cell * cell, 0), 0))\n },\n arity: toFixedArity(1),\n },\n // one-norm (column norm)\n 'one-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return norm1(matrix)\n },\n arity: toFixedArity(1),\n },\n // Infinity norm\n 'inf-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return matrix.reduce((max, row) => Math.max(max, row.reduce((sum, cell) => sum + Math.abs(cell), 0)), 0)\n },\n arity: toFixedArity(1),\n },\n // Max norm\n 'max-norm': {\n evaluate: ([matrix], sourceCodeInfo): number => {\n assertMatrix(matrix, sourceCodeInfo)\n return matrix.reduce((maxVal, row) => {\n const rowMax = row.reduce((max, val) => Math.max(max, Math.abs(val)), 0)\n return Math.max(maxVal, rowMax)\n }, 0)\n },\n arity: toFixedArity(1),\n },\n}\n\nfor (const [key, docs] of Object.entries(moduleDocs)) {\n if (matrixNormalExpression[key])\n matrixNormalExpression[key].docs = docs\n}\n\nexport const matrixModule: LitsModule = {\n name: 'matrix',\n functions: matrixNormalExpression,\n}\n","/**\n * Calculate the inverse of a matrix using the adjugate method\n * @param matrix The input matrix\n * @returns The inverse matrix or null if the matrix is not invertible\n */\n\nimport { approxZero } from '../../../../utils'\nimport { adjugate } from './adjugate'\nimport { determinant } from './determinant'\n\nexport function inverse(matrix: number[][]): number[][] | null {\n const n = matrix.length\n\n // Special case for 1x1 matrix - handle it directly\n if (n === 1) {\n const element = matrix[0]![0]!\n if (approxZero(element)) {\n return null // Not invertible\n }\n return [[1 / element]]\n }\n\n // Calculate determinant\n const det = determinant(matrix)\n\n // Check if matrix is invertible\n if (approxZero(det)) {\n return null // Matrix is not invertible\n }\n\n // Get the adjugate matrix\n const adj = adjugate(matrix)\n\n // Calculate the inverse: inverse = adjugate / determinant\n const inverseMatrix: number[][] = []\n for (let i = 0; i < n; i++) {\n inverseMatrix[i] = []\n for (let j = 0; j < n; j++) {\n inverseMatrix[i]![j] = adj[i]![j]! / det\n }\n }\n\n return inverseMatrix\n}\n","import { determinant } from './determinant'\nimport { minor } from './minor'\n\nexport function cofactor(matrix: number[][]): number[][] {\n const n = matrix.length\n const cofactors: number[][] = []\n\n // Create a new matrix to store cofactors\n for (let i = 0; i < n; i++) {\n cofactors[i] = []\n for (let j = 0; j < n; j++) {\n // Get the minor by removing row i and column j\n const min = minor(matrix, i, j)\n const sign = (-1) ** (i + j)\n cofactors[i]![j] = sign * determinant(min)\n }\n }\n\n return cofactors\n}\n","/**\n * Calculates the trace of a square matrix.\n * The trace is defined as the sum of the elements on the main diagonal.\n *\n * @param matrix - A 2D array representing a square matrix.\n * @returns The trace of the matrix.\n */\nexport function trace(matrix: number[][]): number {\n return matrix.reduce((sum, row, i) => sum + row[i]!, 0)\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Checks if a given matrix is symmetric.\n * A matrix is symmetric if it is square and its transpose is equal to itself.\n *\n * @param matrix - A 2D array representing the matrix.\n * @returns `true` if the matrix is symmetric, otherwise `false`.\n */\nexport function isSymetric(matrix: number[][]): boolean {\n const rows = matrix.length\n\n // Check if the matrix is square\n if (!isSquare(matrix)) {\n return false\n }\n\n // Check symmetry\n for (let i = 0; i < rows; i += 1) {\n for (let j = 0; j < i; j += 1) {\n if (matrix[i]![j]! !== matrix[j]![i]!) {\n return false\n }\n }\n }\n\n return true\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Determines whether a given matrix is triangular.\n *\n * A triangular matrix is a square matrix where all elements\n * below or above the main diagonal are zero. This function\n * checks if the matrix is square and symmetric.\n *\n * @param matrix - A two-dimensional array of numbers representing the matrix.\n * @returns `true` if the matrix is triangular, otherwise `false`.\n */\nexport function isTriangular(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n\n const rows = matrix.length\n\n let isUpperTriangular = true\n let isLowerTriangular = true\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < rows; j++) {\n if (i > j && matrix[i]![j] !== 0) {\n isUpperTriangular = false\n if (!isLowerTriangular) {\n return false\n }\n }\n if (i < j && matrix[i]![j] !== 0) {\n isLowerTriangular = false\n }\n }\n }\n\n return isUpperTriangular || isLowerTriangular\n}\n\nexport function isTriangularUpper(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < i; j++) {\n if (matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n\nexport function isTriangularLower(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n // Check if the matrix is square\n if (!matrix.every(row => row.length === rows)) {\n return false\n }\n\n for (let i = 0; i < rows; i++) {\n for (let j = i + 1; j < rows; j++) {\n if (matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n","import { isSquare } from './isSquare'\n\n/**\n * Checks if a given matrix is diagonal.\n *\n * A matrix is considered diagonal if it is square (i.e., the number of rows equals the number of columns)\n * and all elements outside the main diagonal are zero.\n *\n * @param matrix - A two-dimensional array of numbers representing the matrix to check.\n * @returns `true` if the matrix is diagonal, otherwise `false`.\n */\nexport function isDiagonal(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n const rows = matrix.length\n\n for (let i = 0; i < rows; i += 1) {\n for (let j = 0; j < rows; j += 1) {\n if (i !== j && matrix[i]![j] !== 0) {\n return false\n }\n }\n }\n\n return true\n}\n","import { transpose } from '../../../modules/grid/transpose'\nimport { matrixMultiply } from './matrixMultiply'\nimport { isIdentity } from './isIdentity'\nimport { isSquare } from './isSquare'\n\nexport function isOrthogonal(matrix: number[][]): boolean {\n if (!isSquare(matrix)) {\n return false\n }\n\n // Calculate matrix transpose\n const transposed = transpose(matrix)\n\n // Check if matrix * transpose = Identity\n const product = matrixMultiply(matrix, transposed)\n\n // Check if the product is an identity matrix\n return isIdentity(product)\n}\n","import type { Any } from '../../../interface'\n\nexport function transpose<T extends Any>(grid: T[][]): T[][] {\n const result: T[][] = []\n\n for (let i = 0; i < grid[0]!.length; i += 1) {\n const row: T[] = []\n for (let j = 0; j < grid.length; j += 1) {\n row.push(grid[j]![i]!)\n }\n result.push(row)\n }\n return result\n}\n","/**\n * Creates a band matrix with specified lower and upper bandwidths\n *\n * @param n Size of the square matrix\n * @param lband Lower bandwidth (number of non-zero diagonals below main diagonal)\n * @param uband Upper bandwidth (number of non-zero diagonals above main diagonal)\n * @returns A 2D array representing the band matrix with 1s in the band and 0s elsewhere\n */\nexport function band(n: number, lband: number, uband: number): number[][] {\n // Create an n×n matrix filled with zeros\n const matrix: number[][] = Array.from({ length: n }, () => Array.from({ length: n }, () => 0))\n\n // Fill the band with 1s\n for (let i = 0; i < n; i++) {\n for (let j = Math.max(0, i - lband); j <= Math.min(n - 1, i + uband); j++) {\n matrix[i]![j] = 1\n }\n }\n\n return matrix\n}\n","/**\n * Checks if a matrix is banded with the given lower and upper bandwidth.\n * A matrix is banded if all non-zero elements are within 'lower' diagonals\n * below the main diagonal and 'upper' diagonals above the main diagonal.\n *\n * @param matrix - The matrix to check, represented as a 2D array of numbers\n * @param lower - Number of non-zero diagonals below the main diagonal\n * @param upper - Number of non-zero diagonals above the main diagonal\n * @returns true if the matrix is banded with the given parameters, false otherwise\n */\nexport function isBanded(matrix: number[][], lower: number, upper: number): boolean {\n const rows = matrix.length\n const cols = matrix[0]!.length\n\n // Check each element in the matrix\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n // If we find a non-zero element outside the band, return false\n if (matrix[i]![j] !== 0 && (i - j > lower || j - i > upper)) {\n return false\n }\n }\n }\n\n // All elements outside the band are zero\n return true\n}\n","import { approxZero } from '../../../../utils'\n\n/**\n * Performs Gauss-Jordan elimination on a matrix, transforming it to reduced row echelon form\n *\n * @param matrix - The input matrix\n * @returns A tuple containing the reduced row echelon form matrix and the rank\n */\nexport function gaussJordanElimination(matrix: number[][]): [number[][], number] {\n // Create a copy of the matrix to avoid modifying the original\n const m = matrix.map(row => [...row])\n const rows = m.length\n const cols = m[0]!.length\n\n let rank = 0\n let rowsProcessed = 0\n\n // Row reduction to reduced row echelon form\n for (let col = 0; col < cols; col++) {\n // Find the pivot\n let pivotRow = -1\n\n for (let row = rowsProcessed; row < rows; row++) {\n if (!approxZero(m[row]![col]!)) {\n pivotRow = row\n break\n }\n }\n\n if (pivotRow === -1)\n continue // No pivot in this column\n\n // Increase rank\n rank += 1\n\n // Swap rows\n if (pivotRow !== rowsProcessed) {\n [m[pivotRow], m[rowsProcessed]] = [m[rowsProcessed]!, m[pivotRow]!]\n }\n\n // Get the pivot value\n const pivotValue = m[rowsProcessed]![col]!\n\n // Normalize the pivot row (always, for RREF)\n for (let j = col; j < cols; j++) {\n m[rowsProcessed]![j]! /= pivotValue\n }\n\n // Eliminate above and below (full Gauss-Jordan)\n for (let row = 0; row < rows; row++) {\n if (row !== rowsProcessed && !approxZero(m[row]![col]!)) {\n const factor = m[row]![col]!\n for (let j = col; j < cols; j++) {\n m[row]![j]! -= factor * m[rowsProcessed]![j]!\n }\n }\n }\n\n rowsProcessed++\n if (rowsProcessed === rows)\n break\n }\n\n return [m, rank]\n}\n","// Assuming a matrix is represented as a 2D array\nexport function norm1(matrix: number[][]): number {\n const numRows = matrix.length\n const numCols = matrix[0]!.length\n\n let maxColSum = 0\n\n // Iterate through each column\n for (let j = 0; j < numCols; j += 1) {\n let colSum = 0\n\n // Sum the absolute values of all elements in this column\n for (let i = 0; i < numRows; i += 1) {\n colSum += Math.abs(matrix[i]![j]!)\n }\n\n // Update the maximum column sum if necessary\n maxColSum = Math.max(maxColSum, colSum)\n }\n\n return maxColSum\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","isNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","assertNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","anyValue","getSourceCodeInfo","annotatedArrays","WeakSet","vectors","notVectors","matrices","notMatrices","grids","assertVector","vector","every","elem","add","isVector","isMatrix","matrix","nbrOfCols","row","some","cell","assertMatrix","assertSquareMatrix","approxEqual","a","b","epsilon","diff","abs","approxZero","toFixedArity","arity","min","moduleDocs","mul","category","description","returns","args","variants","argumentNames","examples","seeAlso","det","m","inv","adj","cofactor","minor","col","trace","hilbert","n","vandermonde","v","band","lband","uband","rank","determinant","A","i","maxRow","j","factor","k","result","minorRow","push","adjugate","isSquare","isIdentity","matrixMultiply","B","p","C","fill","map","aik","matrixNormalExpression","evaluate","matrix1","matrix2","error","element","inverseMatrix","inverse","cofactors","reduce","sum","rows","isSymetric","isUpperTriangular","isLowerTriangular","isTriangular","isTriangularUpper","isTriangularLower","isDiagonal","grid","transpose","isOrthogonal","isSquareMatrix","size","from","maxBand","lower","upper","cols","isBanded","rowsProcessed","pivotRow","pivotValue","gaussJordanElimination","sqrt","rowSum","numRows","numCols","maxColSum","colSum","norm1","maxVal","rowMax","val","docs","entries","matrixModule","functions"],"mappings":"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"}
|