All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.chocosolver.solver.expression.continuous.arithmetic.UnCArExpression Maven / Gradle / Ivy

There is a newer version: 4.10.17
Show newest version
/*
 * This file is part of choco-solver, http://choco-solver.org/
 *
 * Copyright (c) 2019, IMT Atlantique. All rights reserved.
 *
 * Licensed under the BSD 4-clause license.
 *
 * See LICENSE file in the project root for full license information.
 */
package org.chocosolver.solver.expression.continuous.arithmetic;

import org.chocosolver.solver.Model;
import org.chocosolver.solver.variables.RealVar;

/**
 * Unary arithmetic continuous expression
 * 

* Project: choco-solver. * * @author Charles Prud'homme * @since 28/04/2016. */ public class UnCArExpression implements CArExpression { /** * The model in which the expression is declared */ Model model; /** * Lazy creation of the underlying variable */ RealVar me = null; /** * Operator of the arithmetic expression */ Operator op; /** * The expression this expression relies on */ private CArExpression e; /** * Builds a unary expression * * @param op operator * @param exp an continuous arithmetic expression */ public UnCArExpression(Operator op, CArExpression exp) { this.op = op; this.e = exp; this.model = e.getModel(); } @Override public Model getModel() { return model; } @Override public RealVar realVar(double p) { if (me == null) { RealVar v = e.realVar(p); switch (op) { case NEG: me = model.realVar(-v.getUB(), -v.getLB(), p); model.realIbexGenericConstraint("{0}=-{1}", me, v).post(); break; case ABS: me = model.realVar(0.0, Math.max(Math.abs(v.getLB()), Math.abs(v.getUB())) , p); model.realIbexGenericConstraint("{0}=abs({1})", me, v).post(); break; case EXP: me = model.realVar(Math.min(Math.exp(v.getLB()), Math.exp(v.getUB())), Math.max(Math.exp(v.getLB()), Math.exp(v.getUB())), p); model.realIbexGenericConstraint("{0}=exp({1})", me, v).post(); break; case LN: me = model.realVar(Math.min(Math.log(v.getLB()), Math.log(v.getUB())), Math.max(Math.log(v.getLB()), Math.log(v.getUB())), p); model.realIbexGenericConstraint("{0}=ln({1})", me, v).post(); break; case SQRT: me = model.realVar(Math.min(Math.sqrt(v.getLB()), Math.sqrt(v.getUB())), Math.max(Math.sqrt(v.getLB()), Math.sqrt(v.getUB())), p); model.realIbexGenericConstraint("{0}=sqrt({1})", me, v).post(); break; case COS: me = model.realVar(-1.0, 1.0, p); model.realIbexGenericConstraint("{0}=cos({1})", me, v).post(); break; case SIN: me = model.realVar(0.0, 1.0, p); model.realIbexGenericConstraint("{0}=sin({1})", me, v).post(); break; case TAN: me = model.realVar(0.0, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=tan({1})", me, v).post(); break; case ACOS: me = model.realVar(0.0, Math.PI, p); model.realIbexGenericConstraint("{0}=acos({1})", me, v).post(); break; case ASIN: me = model.realVar(-Math.PI / 2, Math.PI / 2, p); model.realIbexGenericConstraint("{0}=asin({1})", me, v).post(); break; case ATAN: me = model.realVar(-Math.PI / 2, Math.PI / 2, p); model.realIbexGenericConstraint("{0}=atan({1})", me, v).post(); break; case COSH: me = model.realVar(0.0, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=cosh({1})", me, v).post(); break; case SINH: me = model.realVar(0.0, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=sinh({1})", me, v).post(); break; case TANH: me = model.realVar(0.0, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=tanh({1})", me, v).post(); break; case ACOSH: me = model.realVar(0.0, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=acosh({1})", me, v).post(); break; case ASINH: me = model.realVar(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=asinh({1})", me, v).post(); break; case ATANH: me = model.realVar(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, p); model.realIbexGenericConstraint("{0}=atanh({1})", me, v).post(); break; default: throw new UnsupportedOperationException("Unary arithmetic expressions does not support "+op.name()); } } return me; } @Override public String toString() { return op.name() + "(" + e.toString() + ")"; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy