Newer
Older
ResourceDependencyLogic / src / inference / InferenceOrderConstraint.java
package inference;
import java.util.Map;

import exceptions.IllegalTypeException;
import lombok.Getter;
import models.algebra.Constant;
import models.algebra.Expression;
import models.algebra.Variable;
import models.terms.meta.OrderConstraint;
import models.terms.meta.OrderVariableConstraint;

@Getter
public class InferenceOrderConstraint {
	
	private final Variable leftSideHandVariable;
	private final int leftSideHandConstant;
	private final OrderConstraint operator;
	private final Variable rightSideHandVariable;
	private final int rightSideHandConstant;
	
	public InferenceOrderConstraint(Expression left, OrderConstraint operator, Expression right) {
		if ((left instanceof Constant) && (right instanceof Constant)) {
			throw new IllegalTypeException("Both left and right can't be Constant");
		}
		if (left instanceof Constant) {
			leftSideHandConstant = Integer.parseInt(((Constant) left).toString());
			leftSideHandVariable = null;
		} else if (left instanceof Variable) {
			leftSideHandConstant = -1;
			leftSideHandVariable = (Variable) left;
		} else {
			throw new IllegalTypeException("Left must be Constant or Variable");
		}
		
		this.operator = operator;
		
		if (right instanceof Constant) {
			rightSideHandConstant = Integer.parseInt(((Constant) right).toString());
			rightSideHandVariable = null;
		} else if (right instanceof Variable) {
			rightSideHandConstant = -1;
			rightSideHandVariable = (Variable) right;
		} else {
			throw new IllegalTypeException("Right must be Constant or Variable");
		}
	}
	
	public boolean check(Map<Variable, OrderVariableConstraint> orderConstraints) {
		switch(this.operator) {
		case EQ:
			return getLeftValue(orderConstraints) == getRightValue(orderConstraints);
		case GE:
			return getLeftValue(orderConstraints) >= getRightValue(orderConstraints);
		case GT:
			return getLeftValue(orderConstraints) > getRightValue(orderConstraints);
		case LE:
			return getLeftValue(orderConstraints) <= getRightValue(orderConstraints);
		case LT:
			return getLeftValue(orderConstraints) < getRightValue(orderConstraints);
		default:
			return false;
		}
	}
	
	private int getLeftValue(Map<Variable, OrderVariableConstraint> orderConstraints) {
		if (this.leftSideHandVariable != null) {
			OrderVariableConstraint constraint = orderConstraints.get(this.leftSideHandVariable);
			return constraint.getLower();
		} else {
			return this.leftSideHandConstant;
		}
	}
	
	private int getRightValue(Map<Variable, OrderVariableConstraint> orderConstraints) {
		if (this.rightSideHandVariable != null) {
			OrderVariableConstraint constraint = orderConstraints.get(this.rightSideHandVariable);
			return constraint.getLower();
		} else {
			return this.rightSideHandConstant;
		}
	}
	
}