use of org.matheclipse.core.eval.exception.WrongArgumentType in project symja_android_library by axkr.
the class LinearProgramming method numericEval.
@Override
public IExpr numericEval(final IAST ast, EvalEngine engine) {
Validate.checkSize(ast, 4);
try {
if (ast.arg1().isList() && ast.arg2().isList() && ast.arg3().isList()) {
double[] arg1D = Expr2Object.toDoubleVector((IAST) ast.arg1());
LinearObjectiveFunction f = new LinearObjectiveFunction(arg1D, 0);
Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
IAST arg2 = (IAST) ast.arg2();
IAST arg3 = (IAST) ast.arg3();
if (arg2.size() != arg3.size()) {
return F.NIL;
}
double[] arg2D;
double[] arg3D;
for (int i = 1; i < arg2.size(); i++) {
arg2D = Expr2Object.toDoubleVector((IAST) arg2.get(i));
if (arg2.get(i).isList()) {
if (arg3.get(i).isList()) {
arg3D = Expr2Object.toDoubleVector((IAST) arg3.get(i));
if (arg3D.length >= 2) {
double val = arg3D[1];
if (val == 0.0) {
constraints.add(new LinearConstraint(arg2D, Relationship.EQ, arg3D[0]));
} else if (val < 0.0) {
constraints.add(new LinearConstraint(arg2D, Relationship.LEQ, arg3D[0]));
} else if (val > 0.0) {
constraints.add(new LinearConstraint(arg2D, Relationship.GEQ, arg3D[0]));
}
} else if (arg3D.length == 1) {
constraints.add(new LinearConstraint(arg2D, Relationship.GEQ, arg3D[0]));
}
} else {
ISignedNumber sn = arg3.get(i).evalSignedNumber();
if (sn != null) {
constraints.add(new LinearConstraint(arg2D, Relationship.GEQ, sn.doubleValue()));
} else {
throw new WrongArgumentType(arg3, arg3.get(i), i, "Numeric vector or number expected!");
}
}
} else {
throw new WrongArgumentType(ast, ast.get(i), i, "Numeric vector expected!");
}
}
SimplexSolver solver = new SimplexSolver();
// PointValuePair solution = solver.optimize(f, constraints, GoalType.MINIMIZE, true);
PointValuePair solution = solver.optimize(f, new LinearConstraintSet(constraints), GoalType.MINIMIZE, new NonNegativeConstraint(true), PivotSelectionRule.BLAND);
double[] values = solution.getPointRef();
return F.List(values);
}
} catch (MathIllegalStateException oe) {
throw new WrappedException(oe);
// if (Config.SHOW_STACKTRACE) {
// oe.printStackTrace();
// }
}
return F.NIL;
}
use of org.matheclipse.core.eval.exception.WrongArgumentType in project symja_android_library by axkr.
the class Limit method evaluate.
@Override
public IExpr evaluate(final IAST ast, EvalEngine engine) {
Validate.checkRange(ast, 3, 4);
if (!ast.arg2().isRuleAST()) {
throw new WrongArgumentType(ast, ast.arg2(), 2, "Limit: rule definition expected!");
}
IAST rule = (IAST) ast.arg2();
if (!(rule.arg1().isSymbol())) {
throw new WrongArgumentType(ast, ast.arg1(), 2, "Limit: variable symbol for rule definition expected!");
}
// no direction as default
int direction = DIRECTION_AUTOMATIC;
if (ast.isAST3()) {
final Options options = new Options(ast.topHead(), ast, 2, engine);
IExpr option = options.getOption("Direction");
if (option.isPresent()) {
if (option.isOne()) {
direction = DIRECTION_FROM_SMALLER_VALUES;
} else if (option.isMinusOne()) {
direction = DIRECTION_FROM_LARGER_VALUES;
} else if (option.equals(F.Automatic)) {
direction = DIRECTION_AUTOMATIC;
} else {
throw new WrongArgumentType(ast, ast.arg2(), 2, "Limit: direction option expected!");
}
} else {
throw new WrongArgumentType(ast, ast.arg2(), 2, "Limit: direction option expected!");
}
}
ISymbol symbol = (ISymbol) rule.arg1();
IExpr limit = null;
if (rule.isFreeAt(2, symbol)) {
limit = rule.arg2();
} else {
throw new WrongArgumentType(ast, ast.arg2(), 2, "Limit: limit value contains variable symbol for rule definition!");
}
if (ast.isAST2() && direction == DIRECTION_AUTOMATIC) {
// check if there's a direction specific rule available in the rule database
IExpr temp = engine.evalLoop(F.Limit(ast.arg1(), ast.arg2(), F.Rule(F.Direction, F.CN1)));
if (temp.isPresent()) {
return temp;
}
}
LimitData data = new LimitData(symbol, limit, rule, direction);
return evalLimit(ast.arg1(), data, true);
}
use of org.matheclipse.core.eval.exception.WrongArgumentType in project symja_android_library by axkr.
the class Interval method evaluate.
@Override
public IExpr evaluate(final IAST ast, EvalEngine engine) {
Validate.checkRange(ast, 2);
if (ast.isInterval1()) {
IAST list = (IAST) ast.arg1();
try {
ISignedNumber min = (ISignedNumber) list.arg1();
ISignedNumber max = (ISignedNumber) list.arg2();
if (min.greaterThan(max).isTrue()) {
throw new WrongArgumentType(ast, ast.get(1), 1, "Min > Mac in interval");
}
} catch (ClassCastException cca) {
// do nothing
}
}
return F.NIL;
}
use of org.matheclipse.core.eval.exception.WrongArgumentType in project symja_android_library by axkr.
the class Functors method rules.
/**
* Create a functor from the given rules. If <code>astRules</code> is a
* <code>List[]</code> object, the elements of the list are taken as the
* rules of the form <code>Rule[lhs, rhs]</code>, otherwise the
* <code>astRules</code> itself is taken as the <code>Rule[lhs, rhs]</code>.
*
* @param astRules
* @return
* @throws WrongArgumentType
*/
public static Function<IExpr, IExpr> rules(@Nonnull IAST astRules) throws WrongArgumentType {
final Map<IExpr, IExpr> equalRules;
List<PatternMatcherAndEvaluator> matchers = new ArrayList<PatternMatcherAndEvaluator>();
if (astRules.isList()) {
// assuming multiple rules in a list
IAST rule;
int size = astRules.size() - 1;
if (size <= 5) {
equalRules = new OpenFixedSizeMap<IExpr, IExpr>(size * 3 - 1);
} else {
equalRules = new HashMap<IExpr, IExpr>();
}
for (final IExpr expr : astRules) {
if (expr.isRuleAST()) {
rule = (IAST) expr;
addRuleToCollection(equalRules, matchers, rule);
} else {
throw new WrongArgumentType(astRules, astRules, -1, "Rule expression (x->y) expected: ");
}
}
} else {
if (astRules.isRuleAST()) {
equalRules = new OpenFixedSizeMap<IExpr, IExpr>(3);
addRuleToCollection(equalRules, matchers, astRules);
} else {
throw new WrongArgumentType(astRules, astRules, -1, "Rule expression (x->y) expected: ");
}
}
if (matchers.size() > 0) {
return new RulesPatternFunctor(equalRules, matchers);
}
return rules(equalRules);
}
use of org.matheclipse.core.eval.exception.WrongArgumentType in project symja_android_library by axkr.
the class ExprParser method convertN.
private IExpr convertN(final IAST function) {
try {
int precision = Validate.checkIntType(function.arg2());
if (EvalEngine.isApfloat(precision)) {
NVisitorExpr nve = new NVisitorExpr(precision);
IExpr temp = function.arg1().accept(nve);
if (temp.isPresent()) {
function.set(1, temp);
}
}
} catch (WrongArgumentType wat) {
}
return function;
}
Aggregations