Delay math registry initialization
This commit is contained in:
parent
b6945f17e7
commit
fd0dc88c64
@ -37,7 +37,5 @@ public interface EntitiesRegistry<E extends MathEntity> extends MathRegistry<E>
|
||||
@Nullable
|
||||
Category getCategory(@Nonnull E entity);
|
||||
|
||||
void init();
|
||||
|
||||
void save();
|
||||
}
|
||||
|
@ -23,9 +23,9 @@
|
||||
package org.solovyev.android.calculator;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.function.IConstant;
|
||||
|
||||
import org.simpleframework.xml.Serializer;
|
||||
import org.simpleframework.xml.core.Persister;
|
||||
import org.solovyev.android.Check;
|
||||
@ -39,12 +39,16 @@ import org.solovyev.android.calculator.variables.OldVars;
|
||||
import org.solovyev.android.calculator.variables.VariableCategory;
|
||||
import org.solovyev.android.io.FileSaver;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.function.IConstant;
|
||||
|
||||
@Singleton
|
||||
public class VariablesRegistry extends BaseEntitiesRegistry<IConstant> {
|
||||
@ -82,23 +86,20 @@ public class VariablesRegistry extends BaseEntitiesRegistry<IConstant> {
|
||||
bus.post(new RemovedEvent(variable));
|
||||
}
|
||||
|
||||
public void init() {
|
||||
@Override
|
||||
protected void onInit() {
|
||||
Check.isNotMainThread();
|
||||
|
||||
try {
|
||||
migrateOldVariables();
|
||||
migrateOldVariables();
|
||||
|
||||
for (CppVariable variable : loadEntities(CppVariable.JSON_CREATOR)) {
|
||||
addSafely(variable.toJsclConstant());
|
||||
}
|
||||
|
||||
addSafely("x");
|
||||
addSafely("y");
|
||||
addSafely("t");
|
||||
addSafely("j");
|
||||
} finally {
|
||||
setInitialized();
|
||||
for (CppVariable variable : loadEntities(CppVariable.JSON_CREATOR)) {
|
||||
addSafely(variable.toJsclConstant());
|
||||
}
|
||||
|
||||
addSafely("x");
|
||||
addSafely("y");
|
||||
addSafely("t");
|
||||
addSafely("j");
|
||||
}
|
||||
|
||||
private void migrateOldVariables() {
|
||||
|
@ -27,7 +27,9 @@ import android.content.SharedPreferences;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.StringRes;
|
||||
|
||||
import com.squareup.otto.Bus;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.solovyev.android.Check;
|
||||
@ -41,14 +43,19 @@ import org.solovyev.android.io.FileSystem;
|
||||
import org.solovyev.common.math.MathEntity;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
public abstract class BaseEntitiesRegistry<T extends MathEntity> implements EntitiesRegistry<T> {
|
||||
|
||||
@ -103,8 +110,16 @@ public abstract class BaseEntitiesRegistry<T extends MathEntity> implements Enti
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
setInitialized();
|
||||
public final void init() {
|
||||
try {
|
||||
mathRegistry.init();
|
||||
onInit();
|
||||
} finally {
|
||||
setInitialized();
|
||||
}
|
||||
}
|
||||
|
||||
protected void onInit() {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@ -121,7 +136,7 @@ public abstract class BaseEntitiesRegistry<T extends MathEntity> implements Enti
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
protected final void setInitialized() {
|
||||
private final void setInitialized() {
|
||||
synchronized (lock) {
|
||||
Check.isTrue(!initialized);
|
||||
initialized = true;
|
||||
|
@ -22,11 +22,10 @@
|
||||
|
||||
package org.solovyev.android.calculator.functions;
|
||||
|
||||
import static android.text.TextUtils.isEmpty;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.function.CustomFunction;
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.function.IFunction;
|
||||
|
||||
import org.simpleframework.xml.Serializer;
|
||||
import org.simpleframework.xml.core.Persister;
|
||||
import org.solovyev.android.Check;
|
||||
@ -39,14 +38,22 @@ import org.solovyev.android.calculator.json.Jsonable;
|
||||
import org.solovyev.android.io.FileSaver;
|
||||
import org.solovyev.common.text.Strings;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
import static android.text.TextUtils.isEmpty;
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.function.CustomFunction;
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.function.IFunction;
|
||||
|
||||
@Singleton
|
||||
public class FunctionsRegistry extends BaseEntitiesRegistry<Function> {
|
||||
@ -95,26 +102,27 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
protected void onInit() {
|
||||
Check.isNotMainThread();
|
||||
try {
|
||||
migrateOldFunctions();
|
||||
migrateOldFunctions();
|
||||
|
||||
final List<CustomFunction.Builder> functions = new ArrayList<>();
|
||||
functions.add(new CustomFunction.Builder(true, "log", Arrays.asList("base", "x"), "ln(x)/ln(base)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√3", Collections.singletonList("x"), "x^(1/3)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√4", Collections.singletonList("x"), "x^(1/4)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√n", Arrays.asList("x", "n"), "x^(1/n)"));
|
||||
functions.add(new CustomFunction.Builder(true, "re", Collections.singletonList("x"), "(x+conjugate(x))/2"));
|
||||
functions.add(new CustomFunction.Builder(true, "im", Collections.singletonList("x"), "(x-conjugate(x))/(2*i)"));
|
||||
final List<CustomFunction.Builder> functions = new ArrayList<>();
|
||||
functions.add(new CustomFunction.Builder(true, "log", Arrays.asList("base", "x"),
|
||||
"ln(x)/ln(base)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√3", Collections.singletonList("x"),
|
||||
"x^(1/3)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√4", Collections.singletonList("x"),
|
||||
"x^(1/4)"));
|
||||
functions.add(new CustomFunction.Builder(true, "√n", Arrays.asList("x", "n"), "x^(1/n)"));
|
||||
functions.add(new CustomFunction.Builder(true, "re", Collections.singletonList("x"),
|
||||
"(x+conjugate(x))/2"));
|
||||
functions.add(new CustomFunction.Builder(true, "im", Collections.singletonList("x"),
|
||||
"(x-conjugate(x))/(2*i)"));
|
||||
|
||||
for (CppFunction function : loadEntities(CppFunction.JSON_CREATOR)) {
|
||||
functions.add(function.toJsclBuilder());
|
||||
}
|
||||
addSafely(functions);
|
||||
} finally {
|
||||
setInitialized();
|
||||
for (CppFunction function : loadEntities(CppFunction.JSON_CREATOR)) {
|
||||
functions.add(function.toJsclBuilder());
|
||||
}
|
||||
addSafely(functions);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,34 +1,33 @@
|
||||
package jscl;
|
||||
|
||||
import static midpcalc.Real.NumberFormat.FSE_ENG;
|
||||
import static midpcalc.Real.NumberFormat.FSE_NONE;
|
||||
import static midpcalc.Real.NumberFormat.FSE_SCI;
|
||||
|
||||
import org.solovyev.common.NumberFormatter;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
import org.solovyev.common.msg.MessageRegistry;
|
||||
import org.solovyev.common.msg.Messages;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import jscl.math.Expression;
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.NotIntegerException;
|
||||
import jscl.math.function.Constants;
|
||||
import jscl.math.function.ConstantsRegistry;
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.function.FunctionsRegistry;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.math.function.PostfixFunctionsRegistry;
|
||||
import jscl.math.function.*;
|
||||
import jscl.math.operator.Operator;
|
||||
import jscl.math.operator.Percent;
|
||||
import jscl.math.operator.Rand;
|
||||
import jscl.math.operator.matrix.OperatorsRegistry;
|
||||
import jscl.text.ParseException;
|
||||
import org.solovyev.common.NumberFormatter;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
import org.solovyev.common.msg.MessageRegistry;
|
||||
import org.solovyev.common.msg.Messages;
|
||||
|
||||
import static midpcalc.Real.NumberFormat.FSE_ENG;
|
||||
import static midpcalc.Real.NumberFormat.FSE_NONE;
|
||||
import static midpcalc.Real.NumberFormat.FSE_SCI;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
import static midpcalc.Real.NumberFormat.*;
|
||||
|
||||
public class JsclMathEngine implements MathEngine {
|
||||
|
||||
@ -38,8 +37,6 @@ public class JsclMathEngine implements MathEngine {
|
||||
@Nonnull
|
||||
private static JsclMathEngine instance = new JsclMathEngine();
|
||||
@Nonnull
|
||||
private final ConstantsRegistry constantsRegistry = new ConstantsRegistry();
|
||||
@Nonnull
|
||||
private final ThreadLocal<NumberFormatter> numberFormatter = new ThreadLocal<NumberFormatter>() {
|
||||
@Override
|
||||
protected NumberFormatter initialValue() {
|
||||
@ -104,17 +101,17 @@ public class JsclMathEngine implements MathEngine {
|
||||
|
||||
@Nonnull
|
||||
public MathRegistry<Function> getFunctionsRegistry() {
|
||||
return FunctionsRegistry.getInstance();
|
||||
return FunctionsRegistry.lazyInstance();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public MathRegistry<Operator> getOperatorsRegistry() {
|
||||
return OperatorsRegistry.getInstance();
|
||||
return OperatorsRegistry.lazyInstance();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public MathRegistry<Operator> getPostfixFunctionsRegistry() {
|
||||
return PostfixFunctionsRegistry.getInstance();
|
||||
return PostfixFunctionsRegistry.lazyInstance();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ -137,7 +134,7 @@ public class JsclMathEngine implements MathEngine {
|
||||
|
||||
@Nonnull
|
||||
public MathRegistry<IConstant> getConstantsRegistry() {
|
||||
return constantsRegistry;
|
||||
return ConstantsRegistry.lazyInstance();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ -202,11 +199,12 @@ public class JsclMathEngine implements MathEngine {
|
||||
|
||||
@Nullable
|
||||
private IConstant findConstant(double value) {
|
||||
final IConstant constant = findConstant(constantsRegistry.getSystemEntities(), value);
|
||||
final MathRegistry<IConstant> constants = ConstantsRegistry.getInstance();
|
||||
final IConstant constant = findConstant(constants.getSystemEntities(), value);
|
||||
if (constant != null) {
|
||||
return constant;
|
||||
}
|
||||
final IConstant piInv = constantsRegistry.get(Constants.PI_INV.getName());
|
||||
final IConstant piInv = constants.get(Constants.PI_INV.getName());
|
||||
if (piInv != null) {
|
||||
final Double piInvValue = piInv.getDoubleValue();
|
||||
if (piInvValue != null && piInvValue == value) {
|
||||
|
@ -1,17 +1,22 @@
|
||||
package jscl.math;
|
||||
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.function.Constant;
|
||||
import jscl.math.function.Constants;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.math.numeric.*;
|
||||
import jscl.mathml.MathML;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import jscl.math.function.Constant;
|
||||
import jscl.math.function.Constants;
|
||||
import jscl.math.function.ConstantsRegistry;
|
||||
import jscl.math.function.IConstant;
|
||||
import jscl.math.numeric.Complex;
|
||||
import jscl.math.numeric.INumeric;
|
||||
import jscl.math.numeric.Numeric;
|
||||
import jscl.math.numeric.Real;
|
||||
import jscl.math.numeric.Vector;
|
||||
import jscl.mathml.MathML;
|
||||
|
||||
public final class NumericWrapper extends Generic implements INumeric<NumericWrapper> {
|
||||
|
||||
@Nonnull
|
||||
@ -48,7 +53,7 @@ public final class NumericWrapper extends Generic implements INumeric<NumericWra
|
||||
}
|
||||
|
||||
public NumericWrapper(@Nonnull Constant constant) {
|
||||
final IConstant constantFromRegistry = JsclMathEngine.getInstance().getConstantsRegistry().get(constant.getName());
|
||||
final IConstant constantFromRegistry = ConstantsRegistry.getInstance().get(constant.getName());
|
||||
|
||||
if (constantFromRegistry != null) {
|
||||
if (constantFromRegistry.getName().equals(Constants.I.getName())) {
|
||||
|
@ -1,15 +1,19 @@
|
||||
package jscl.math.function;
|
||||
|
||||
import jscl.JsclMathEngine;
|
||||
import jscl.math.*;
|
||||
import jscl.mathml.MathML;
|
||||
import jscl.util.ArrayComparator;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.JsclInteger;
|
||||
import jscl.math.NotIntegrableException;
|
||||
import jscl.math.NumericWrapper;
|
||||
import jscl.math.Variable;
|
||||
import jscl.mathml.MathML;
|
||||
import jscl.util.ArrayComparator;
|
||||
|
||||
public class Constant extends Variable {
|
||||
|
||||
public static final int PRIME_CHARS = 3;
|
||||
@ -182,7 +186,7 @@ public class Constant extends Variable {
|
||||
}
|
||||
|
||||
public String toJava() {
|
||||
final IConstant constantFromRegistry = JsclMathEngine.getInstance().getConstantsRegistry().get(getName());
|
||||
final IConstant constantFromRegistry = ConstantsRegistry.getInstance().get(getName());
|
||||
|
||||
if (constantFromRegistry != null) {
|
||||
return constantFromRegistry.toJava();
|
||||
|
@ -1,8 +1,10 @@
|
||||
package jscl.math.function;
|
||||
|
||||
import org.solovyev.common.math.AbstractMathRegistry;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
public class ConstantsRegistry extends AbstractMathRegistry<IConstant> {
|
||||
private static final ConstantsRegistry INSTANCE = new ConstantsRegistry();
|
||||
|
||||
public static final String E = "e";
|
||||
public static final String C = "c";
|
||||
@ -14,15 +16,28 @@ public class ConstantsRegistry extends AbstractMathRegistry<IConstant> {
|
||||
public final static String NAN = "NaN";
|
||||
|
||||
public ConstantsRegistry() {
|
||||
this.add(new PiConstant());
|
||||
this.add(new ExtendedConstant(Constants.PI_INV, Math.PI, null));
|
||||
this.add(new ExtendedConstant(Constants.INF, Double.POSITIVE_INFINITY, "JsclDouble.valueOf(Double.POSITIVE_INFINITY)"));
|
||||
this.add(new ExtendedConstant(Constants.INF_2, Double.POSITIVE_INFINITY, "JsclDouble.valueOf(Double.POSITIVE_INFINITY)"));
|
||||
this.add(new ExtendedConstant(Constants.I, "√(-1)", null));
|
||||
this.add(new ExtendedConstant(new Constant(E), Math.E, null));
|
||||
this.add(new ExtendedConstant(new Constant(C), C_VALUE, null));
|
||||
this.add(new ExtendedConstant(new Constant(G), G_VALUE, null));
|
||||
this.add(new ExtendedConstant(new Constant(H_REDUCED), H_REDUCED_VALUE, null));
|
||||
this.add(new ExtendedConstant(new Constant(NAN), Double.NaN, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
add(new PiConstant());
|
||||
add(new ExtendedConstant(Constants.PI_INV, Math.PI, null));
|
||||
add(new ExtendedConstant(Constants.INF, Double.POSITIVE_INFINITY, "JsclDouble.valueOf(Double.POSITIVE_INFINITY)"));
|
||||
add(new ExtendedConstant(Constants.INF_2, Double.POSITIVE_INFINITY, "JsclDouble.valueOf(Double.POSITIVE_INFINITY)"));
|
||||
add(new ExtendedConstant(Constants.I, "√(-1)", null));
|
||||
add(new ExtendedConstant(new Constant(E), Math.E, null));
|
||||
add(new ExtendedConstant(new Constant(C), C_VALUE, null));
|
||||
add(new ExtendedConstant(new Constant(G), G_VALUE, null));
|
||||
add(new ExtendedConstant(new Constant(H_REDUCED), H_REDUCED_VALUE, null));
|
||||
add(new ExtendedConstant(new Constant(NAN), Double.NaN, null));
|
||||
}
|
||||
|
||||
public static MathRegistry<IConstant> getInstance() {
|
||||
INSTANCE.init();
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public static MathRegistry<IConstant> lazyInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,27 @@
|
||||
package jscl.math.function;
|
||||
|
||||
import jscl.math.Variable;
|
||||
import jscl.math.function.hyperbolic.*;
|
||||
import jscl.math.function.trigonometric.*;
|
||||
import org.solovyev.common.math.AbstractMathRegistry;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import jscl.math.Variable;
|
||||
import jscl.math.function.hyperbolic.Acosh;
|
||||
import jscl.math.function.hyperbolic.Acoth;
|
||||
import jscl.math.function.hyperbolic.Asinh;
|
||||
import jscl.math.function.hyperbolic.Atanh;
|
||||
import jscl.math.function.hyperbolic.Cosh;
|
||||
import jscl.math.function.hyperbolic.Coth;
|
||||
import jscl.math.function.hyperbolic.Sinh;
|
||||
import jscl.math.function.hyperbolic.Tanh;
|
||||
import jscl.math.function.trigonometric.Acos;
|
||||
import jscl.math.function.trigonometric.Acot;
|
||||
import jscl.math.function.trigonometric.Asin;
|
||||
import jscl.math.function.trigonometric.Atan;
|
||||
import jscl.math.function.trigonometric.Cos;
|
||||
import jscl.math.function.trigonometric.Cot;
|
||||
import jscl.math.function.trigonometric.Sin;
|
||||
import jscl.math.function.trigonometric.Tan;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 10/29/11
|
||||
@ -16,50 +31,14 @@ public class FunctionsRegistry extends AbstractMathRegistry<Function> {
|
||||
|
||||
private final static FunctionsRegistry instance = new FunctionsRegistry();
|
||||
|
||||
static {
|
||||
instance.add(new Deg(null));
|
||||
instance.add(new Rad(null, null, null));
|
||||
instance.add(new Dms(null, null, null));
|
||||
|
||||
instance.add(new Sin(null));
|
||||
instance.add(new Cos(null));
|
||||
instance.add(new Tan(null));
|
||||
instance.add(new Cot(null));
|
||||
|
||||
instance.add(new Asin(null));
|
||||
instance.add(new Acos(null));
|
||||
instance.add(new Atan(null));
|
||||
instance.add(new Acot(null));
|
||||
|
||||
instance.add(new Ln(null));
|
||||
instance.add(new Lg(null));
|
||||
instance.add(new Exp(null));
|
||||
instance.add(new Sqrt(null));
|
||||
instance.add(new Cubic(null));
|
||||
|
||||
instance.add(new Sinh(null));
|
||||
instance.add(new Cosh(null));
|
||||
instance.add(new Tanh(null));
|
||||
instance.add(new Coth(null));
|
||||
|
||||
instance.add(new Asinh(null));
|
||||
instance.add(new Acosh(null));
|
||||
instance.add(new Atanh(null));
|
||||
instance.add(new Acoth(null));
|
||||
|
||||
instance.add(new Abs(null));
|
||||
instance.add(new Sgn(null));
|
||||
|
||||
instance.add(new Conjugate(null));
|
||||
|
||||
for (String name : Comparison.names) {
|
||||
instance.add(new Comparison(name, null, null));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Nonnull
|
||||
public static FunctionsRegistry getInstance() {
|
||||
instance.init();
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static FunctionsRegistry lazyInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
@ -78,4 +57,46 @@ public class FunctionsRegistry extends AbstractMathRegistry<Function> {
|
||||
final Function function = super.get(name);
|
||||
return function == null ? null : copy(function);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
add(new Deg(null));
|
||||
add(new Rad(null, null, null));
|
||||
add(new Dms(null, null, null));
|
||||
|
||||
add(new Sin(null));
|
||||
add(new Cos(null));
|
||||
add(new Tan(null));
|
||||
add(new Cot(null));
|
||||
|
||||
add(new Asin(null));
|
||||
add(new Acos(null));
|
||||
add(new Atan(null));
|
||||
add(new Acot(null));
|
||||
|
||||
add(new Ln(null));
|
||||
add(new Lg(null));
|
||||
add(new Exp(null));
|
||||
add(new Sqrt(null));
|
||||
add(new Cubic(null));
|
||||
|
||||
add(new Sinh(null));
|
||||
add(new Cosh(null));
|
||||
add(new Tanh(null));
|
||||
add(new Coth(null));
|
||||
|
||||
add(new Asinh(null));
|
||||
add(new Acosh(null));
|
||||
add(new Atanh(null));
|
||||
add(new Acoth(null));
|
||||
|
||||
add(new Abs(null));
|
||||
add(new Sgn(null));
|
||||
|
||||
add(new Conjugate(null));
|
||||
|
||||
for (String name : Comparison.names) {
|
||||
add(new Comparison(name, null, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,17 @@
|
||||
package jscl.math.function;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.operator.*;
|
||||
import org.solovyev.common.math.AbstractMathRegistry;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.operator.Degree;
|
||||
import jscl.math.operator.DoubleFactorial;
|
||||
import jscl.math.operator.Factorial;
|
||||
import jscl.math.operator.Operator;
|
||||
import jscl.math.operator.Percent;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 10/31/11
|
||||
@ -16,15 +21,14 @@ public class PostfixFunctionsRegistry extends AbstractMathRegistry<Operator> {
|
||||
|
||||
private final static PostfixFunctionsRegistry instance = new PostfixFunctionsRegistry();
|
||||
|
||||
static {
|
||||
instance.add(new DoubleFactorial(null));
|
||||
instance.add(new Factorial(null));
|
||||
instance.add(new Degree(null));
|
||||
instance.add(new Percent(null, null));
|
||||
@Nonnull
|
||||
public static PostfixFunctionsRegistry getInstance() {
|
||||
instance.init();
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static PostfixFunctionsRegistry getInstance() {
|
||||
public static PostfixFunctionsRegistry lazyInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
@ -40,4 +44,11 @@ public class PostfixFunctionsRegistry extends AbstractMathRegistry<Operator> {
|
||||
return operator == null ? null : FunctionsRegistry.copy(operator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
add(new DoubleFactorial(null));
|
||||
add(new Factorial(null));
|
||||
add(new Degree(null));
|
||||
add(new Percent(null, null));
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,20 @@
|
||||
package jscl.math.operator.matrix;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.function.FunctionsRegistry;
|
||||
import jscl.math.operator.*;
|
||||
import org.solovyev.common.math.AbstractMathRegistry;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.function.FunctionsRegistry;
|
||||
import jscl.math.operator.Derivative;
|
||||
import jscl.math.operator.IndefiniteIntegral;
|
||||
import jscl.math.operator.Integral;
|
||||
import jscl.math.operator.Modulo;
|
||||
import jscl.math.operator.Operator;
|
||||
import jscl.math.operator.Product;
|
||||
import jscl.math.operator.Sum;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 11/17/11
|
||||
@ -17,91 +24,14 @@ public class OperatorsRegistry extends AbstractMathRegistry<Operator> {
|
||||
|
||||
private final static OperatorsRegistry instance = new OperatorsRegistry();
|
||||
|
||||
static {
|
||||
instance.add(new Derivative(null, null, null, null));
|
||||
//instance.add(new Grad(null, null));
|
||||
//instance.add(new Divergence(null, null));
|
||||
//instance.add(new Curl(null, null));
|
||||
//instance.add(new Jacobian(null, null));
|
||||
//instance.add(new Laplacian(null, null));
|
||||
//instance.add(new Dalembertian(null, null));
|
||||
//instance.add(new Del(null, null, null));
|
||||
//instance.add(new VectorProduct(null, null));
|
||||
//instance.add(new ComplexProduct(null, null));
|
||||
//instance.add(new QuaternionProduct(null, null));
|
||||
//instance.add(new GeometricProduct(null, null, null));
|
||||
//instance.add(new MatrixProduct(null, null));
|
||||
//instance.add(new TensorProduct(null, null));
|
||||
//instance.add(new Transpose(null));
|
||||
//instance.add(new Trace(null));
|
||||
//instance.add(new Determinant(null));
|
||||
//instance.add(new Coefficient(null, null));
|
||||
//instance.add(new Solve(null, null, null));
|
||||
//instance.add(new Substitute(null, null, null));
|
||||
//instance.add(new Limit(null, null, null, null));
|
||||
instance.add(new Sum(null, null, null, null));
|
||||
instance.add(new Product(null, null, null, null));
|
||||
//instance.add(new Groebner(null, null, null, null));
|
||||
//instance.add(new Division(null, null));
|
||||
instance.add(new Modulo(null, null));
|
||||
//instance.add(new ModPow(null, null, null));
|
||||
//instance.add(new ModInverse(null, null));
|
||||
//instance.add(new EulerPhi(null));
|
||||
instance.add(new Integral(null, null, null, null));
|
||||
instance.add(new IndefiniteIntegral(null, null));
|
||||
//instance.add(new Rand());
|
||||
//instance.add(new Mean(null));
|
||||
//instance.add(new Min(null));
|
||||
//instance.add(new Max(null));
|
||||
//instance.add(new MeanSquareDeviation(null));
|
||||
//instance.add(new StandardDeviation(null));
|
||||
//instance.add(new PrimitiveRoots(null));
|
||||
}
|
||||
|
||||
/* if (operatorName.compareTo("d") == 0)
|
||||
v = new Derivative(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : parameters[1], parameters.length > 3 ? parameters[3] : JsclInteger.valueOf(1));
|
||||
else if (operatorName.compareTo("grad") == 0) v = new Grad(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("diverg") == 0) v = new Divergence(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("curl") == 0) v = new Curl(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("jacobian") == 0) v = new Jacobian(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("laplacian") == 0) v = new Laplacian(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("dalembertian") == 0) v = new Dalembertian(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("del") == 0)
|
||||
v = new Del(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
|
||||
else if (operatorName.compareTo("vector") == 0) v = new VectorProduct(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("complex") == 0) v = new ComplexProduct(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("quaternion") == 0) v = new QuaternionProduct(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("geometric") == 0)
|
||||
v = new GeometricProduct(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
|
||||
else if (operatorName.compareTo("matrix") == 0) v = new MatrixProduct(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("tensor") == 0) v = new TensorProduct(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("tran") == 0) v = new Transpose(parameters[0]);
|
||||
else if (operatorName.compareTo("trace") == 0) v = new Trace(parameters[0]);
|
||||
else if (operatorName.compareTo("det") == 0) v = new Determinant(parameters[0]);
|
||||
else if (operatorName.compareTo("coef") == 0) v = new Coefficient(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("solve") == 0)
|
||||
v = new Solve(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
|
||||
else if (operatorName.compareTo("subst") == 0)
|
||||
v = new Substitute(parameters[0], parameters[1], parameters[2]).transmute();
|
||||
else if (operatorName.compareTo("lim") == 0)
|
||||
v = new Limit(parameters[0], parameters[1], parameters[2], parameters.length > 3 && (parameters[2].compareTo(Constant.infinity) != 0 && parameters[2].compareTo(Constant.infinity.negate()) != 0) ? JsclInteger.valueOf(parameters[3].signum()) : JsclInteger.valueOf(0));
|
||||
else if (operatorName.compareTo("sum") == 0)
|
||||
v = new Sum(parameters[0], parameters[1], parameters[2], parameters[3]);
|
||||
else if (operatorName.compareTo("prod") == 0)
|
||||
v = new Product(parameters[0], parameters[1], parameters[2], parameters[3]);
|
||||
else if (operatorName.compareTo("integral") == 0)
|
||||
v = parameters.length > 2 ? new Integral(parameters[0], parameters[1], parameters[2], parameters[3]) : new IndefiniteIntegral(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("groebner") == 0)
|
||||
v = new Groebner(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : Expression.valueOf("lex"), parameters.length > 3 ? parameters[3] : JsclInteger.valueOf(0)).transmute();
|
||||
else if (operatorName.compareTo("div") == 0) v = new Division(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("mod") == 0) v = new Modulo(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("modpow") == 0) v = new ModPow(parameters[0], parameters[1], parameters[2]);
|
||||
else if (operatorName.compareTo("modinv") == 0) v = new ModInverse(parameters[0], parameters[1]);
|
||||
else if (operatorName.compareTo("eulerphi") == 0) v = new EulerPhi(parameters[0]);
|
||||
else if (operatorName.compareTo("primitiveroots") == 0) v = new PrimitiveRoots(parameters[0]);*/
|
||||
|
||||
@Nonnull
|
||||
public static OperatorsRegistry getInstance() {
|
||||
instance.init();
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static OperatorsRegistry lazyInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
@ -124,4 +54,14 @@ public class OperatorsRegistry extends AbstractMathRegistry<Operator> {
|
||||
final Operator operator = super.get(name);
|
||||
return operator == null ? null : FunctionsRegistry.copy(operator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
add(new Derivative(null, null, null, null));
|
||||
add(new Sum(null, null, null, null));
|
||||
add(new Product(null, null, null, null));
|
||||
add(new Modulo(null, null));
|
||||
add(new Integral(null, null, null, null));
|
||||
add(new IndefiniteIntegral(null, null));
|
||||
}
|
||||
}
|
||||
|
@ -52,10 +52,27 @@ public abstract class AbstractMathRegistry<T extends MathEntity> implements Math
|
||||
@GuardedBy("this")
|
||||
@Nonnull
|
||||
protected final SortedList<T> systemEntities = SortedList.newInstance(new ArrayList<T>(30), MATH_ENTITY_COMPARATOR);
|
||||
private volatile boolean initialized;
|
||||
|
||||
protected AbstractMathRegistry() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void init() {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
synchronized (this) {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
onInit();
|
||||
initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void onInit();
|
||||
|
||||
@Nonnull
|
||||
private static synchronized Integer count() {
|
||||
final Integer result = counter;
|
||||
|
@ -22,9 +22,10 @@
|
||||
|
||||
package org.solovyev.common.math;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
public interface MathRegistry<T extends MathEntity> {
|
||||
|
||||
@ -48,4 +49,6 @@ public interface MathRegistry<T extends MathEntity> {
|
||||
|
||||
@Nullable
|
||||
T getById(@Nonnull Integer id);
|
||||
|
||||
void init();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user