mathjslab
Version:
MathJSLab - An interpreter with language syntax like MATLAB®/Octave. ISBN 978-65-00-82338-7
228 lines (193 loc) • 8.31 kB
text/typescript
import { ComplexDecimal, TBinaryOperationName, TUnaryOperationLeftName } from './complex-decimal';
import { MultiArray } from './multi-array';
import { LinearAlgebra } from './linear-algebra';
export abstract class MathObject {
public static unaryOpFunction: { [name: string]: Function } = {
uplus: MathObject.uplus,
uminus: MathObject.uminus,
not: MathObject.not,
transpose: MathObject.transpose,
ctranspose: MathObject.ctranspose,
};
public static binaryOpFunction: { [name: string]: Function } = {
minus: MathObject.minus,
mod: MathObject.mod,
rem: MathObject.rem,
rdivide: MathObject.rdivide,
mrdivide: MathObject.mrdivide,
ldivide: MathObject.ldivide,
mldivide: MathObject.mldivide,
power: MathObject.power,
mpower: MathObject.mpower,
le: MathObject.le,
ge: MathObject.ge,
gt: MathObject.gt,
eq: MathObject.eq,
ne: MathObject.ne,
};
public static twoMoreOpFunction: { [name: string]: Function } = {
plus: MathObject.plus,
times: MathObject.times,
mtimes: MathObject.mtimes,
and: MathObject.and,
or: MathObject.or,
xor: MathObject.xor,
};
public static copy(right: any): any {
if ('re' in right) {
return ComplexDecimal.copy(right);
} else if ('array' in right) {
return MultiArray.copy(right);
}
}
public static elementWiseOperation(op: TBinaryOperationName, left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal[op](left, right);
} else if ('re' in left && 'array' in right) {
return MultiArray.scalarOpMultiArray(op, left, right);
} else if ('array' in left && 're' in right) {
return MultiArray.MultiArrayOpScalar(op, left, right);
} else if ('array' in left && 'array' in right) {
return MultiArray.elementWiseOperation(op, left, right);
}
}
public static leftOperation(op: TUnaryOperationLeftName, right: any): any {
if ('re' in right) {
return ComplexDecimal[op](right);
} else if ('array' in right) {
return MultiArray.leftOperation(op, right);
}
}
public static plus(left: any, right: any): any {
return MathObject.elementWiseOperation('add', left, right);
}
public static minus(left: any, right: any): any {
return MathObject.elementWiseOperation('sub', left, right);
}
public static mod(left: any, right: any): any {
return MathObject.elementWiseOperation('mod', left, right);
}
public static rem(left: any, right: any): any {
return MathObject.elementWiseOperation('rem', left, right);
}
public static times(left: any, right: any): any {
return MathObject.elementWiseOperation('mul', left, right);
}
public static mtimes(left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal.mul(left, right);
} else if ('re' in left && 'array' in right) {
return MultiArray.scalarOpMultiArray('mul', left, right);
} else if ('array' in left && 're' in right) {
return MultiArray.MultiArrayOpScalar('mul', left, right);
} else if ('array' in left && 'array' in right) {
return LinearAlgebra.mul(left, right);
}
}
public static rdivide(left: any, right: any): any {
return MathObject.elementWiseOperation('rdiv', left, right);
}
public static mrdivide(left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal.rdiv(left, right);
} else if ('re' in left && 'array' in right) {
return MultiArray.scalarOpMultiArray('mul', left, LinearAlgebra.inv(right));
} else if ('array' in left && 're' in right) {
return MultiArray.scalarOpMultiArray('mul', ComplexDecimal.inv(right), left);
} else if ('array' in left && 'array' in right) {
return LinearAlgebra.mul(left, LinearAlgebra.inv(right));
}
}
public static ldivide(left: any, right: any): any {
return MathObject.elementWiseOperation('ldiv', left, right);
}
public static mldivide(left: any, right: any): any {}
public static power(left: any, right: any): any {
return MathObject.elementWiseOperation('power', left, right);
}
public static mpower(left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal.power(left, right);
} else if ('array' in left && 're' in right) {
return LinearAlgebra.power(left, right);
} else {
throw new Error("invalid exponent in '^'.");
}
}
public static uplus(right: any): any {
return MathObject.leftOperation('copy', right);
}
public static uminus(right: any): any {
return MathObject.leftOperation('neg', right);
}
public static transpose(left: any): any {
if ('re' in left) {
return Object.assign({}, left);
} else if ('array' in left) {
return LinearAlgebra.transpose(left);
}
}
public static ctranspose(left: any): any {
if ('re' in left) {
return ComplexDecimal.conj(left);
} else if ('array' in left) {
return LinearAlgebra.ctranspose(left);
}
}
public static lt(left: any, right: any): any {
return MathObject.elementWiseOperation('lt', left, right);
}
public static le(left: any, right: any): any {
return MathObject.elementWiseOperation('le', left, right);
}
public static eq(left: any, right: any): any {
return MathObject.elementWiseOperation('eq', left, right);
}
public static ge(left: any, right: any): any {
return MathObject.elementWiseOperation('ge', left, right);
}
public static gt(left: any, right: any): any {
return MathObject.elementWiseOperation('gt', left, right);
}
public static ne(left: any, right: any): any {
return MathObject.elementWiseOperation('ne', left, right);
}
public static mand(left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal.and(left, right);
} else if ('re' in left && 'array' in right) {
return ComplexDecimal.and(left, MultiArray.toLogical(right));
} else if ('array' in left && 're' in right) {
return ComplexDecimal.and(MultiArray.toLogical(left), right);
} else if ('array' in left && 'array' in right) {
return ComplexDecimal.and(MultiArray.toLogical(left), MultiArray.toLogical(right));
}
}
public static mor(left: any, right: any): any {
if ('re' in left && 're' in right) {
return ComplexDecimal.or(left, right);
} else if ('re' in left && 'array' in right) {
return ComplexDecimal.or(left, MultiArray.toLogical(right));
} else if ('array' in left && 're' in right) {
return ComplexDecimal.or(MultiArray.toLogical(left), right);
} else if ('array' in left && 'array' in right) {
return ComplexDecimal.or(MultiArray.toLogical(left), MultiArray.toLogical(right));
}
}
public static not(right: any): any {
if ('re' in right) {
return ComplexDecimal.not(right);
} else if ('array' in right) {
return ComplexDecimal.not(MultiArray.toLogical(right));
}
}
public static and(left: any, right: any): any {
return MathObject.elementWiseOperation('and', left, right);
}
public static or(left: any, right: any): any {
return MathObject.elementWiseOperation('or', left, right);
}
public static xor(left: any, right: any): any {
return MathObject.elementWiseOperation('xor', left, right);
}
}