RationalExpression.java
package edu.udel.cis.vsl.tass.symbolic.rational;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF.SymbolicTypeKind;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;
import edu.udel.cis.vsl.tass.symbolic.factorpoly.FactoredPolynomial;
/**
* A rational expression is the quotient of two polynomials (or instances of
* FactoredPolynomial). To put into canonical form, the denominator is made
* monic by dividing numerator and denominator by the leading coefficient of the
* denominator.
*/
public class RationalExpression extends SymbolicExpression implements
TreeExpressionIF {
private FactoredPolynomial numerator;
private FactoredPolynomial denominator;
RationalExpression(FactoredPolynomial numerator,
FactoredPolynomial denominator) {
super(numerator.type());
assert numerator.type().kind() == SymbolicTypeKind.REAL;
assert numerator.type().equals(denominator.type());
this.numerator = numerator;
this.denominator = denominator;
}
public FactoredPolynomial numerator() {
return numerator;
}
public FactoredPolynomial denominator() {
return denominator;
}
protected int intrinsicHashCode() {
return RationalExpression.class.hashCode() + numerator.hashCode()
+ denominator.hashCode();
}
protected boolean intrinsicEquals(SymbolicExpression expression) {
if (expression instanceof RationalExpression) {
RationalExpression that = (RationalExpression) expression;
return numerator.equals(that.numerator)
&& denominator.equals(that.denominator);
}
return false;
}
public String toString() {
String denominatorString = denominator.toString();
if (denominatorString.equals("1") || denominatorString.equals("1.0")) {
return numerator.toString();
} else {
return numerator.atomString() + "/" + denominator.atomString();
}
}
public String atomString() {
String denominatorString = denominator.toString();
if (denominatorString.equals("1") || denominatorString.equals("1.0")) {
return numerator.atomString();
} else {
return "(" + numerator.atomString() + "/"
+ denominator.atomString() + ")";
}
}
public boolean isZero() {
return numerator.isZero();
}
public boolean isOne() {
return numerator.equals(denominator);
}
public TreeExpressionIF argument(int index) {
switch (index) {
case 0:
return numerator;
case 1:
return denominator;
default:
throw new IllegalArgumentException("numArguments=" + 2 + ", index="
+ index);
}
}
public SymbolicKind kind() {
return SymbolicKind.DIVIDE;
}
public int numArguments() {
return 2;
}
}