diff --git a/src/Main.java b/src/Main.java index 2d14cbb..f17ba0d 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,14 +1,14 @@ import lombok.SneakyThrows; -import models.EvaluatableTerm; -import models.ResourceVariable; import models.algebra.Expression; import models.algebra.Type; import models.algebra.Variable; import models.dataConstraintModel.DataConstraintModel; import models.dataFlowModel.DataTransferModel; -import models.meta.MetaRDLTerm; -import models.meta.MetaResourceVariable; -import models.meta.OrderConstraint; +import models.terms.EvaluatableTerm; +import models.terms.ResourceVariable; +import models.terms.meta.MetaRDLTerm; +import models.terms.meta.MetaResourceVariable; +import models.terms.meta.OrderConstraint; import parser.Parser; import parser.Parser.TokenStream; diff --git a/src/models/Dependency.java b/src/models/Dependency.java deleted file mode 100644 index 90762dd..0000000 --- a/src/models/Dependency.java +++ /dev/null @@ -1,126 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class Dependency extends RDLTerm{ - - private RDLTerm dependingTerm; - private ResourceVariable dependedVariable; - private Dependency dependency; - private boolean isListType; - - public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder()); - this.dependingTerm = dependingTerm; - this.dependedVariable = dependedVariable; - this.dependency = null; - this.addChild(dependingTerm); - this.addChild(dependedVariable); - this.isListType = false; - } - - public Dependency(Dependency dependency) { - super(new Symbol(":", 1), dependency.getOrder() - 1); - this.dependency = dependency; - this.dependingTerm = null; - this.dependedVariable = null; - this.addChild(dependency); - this.isListType = true; - } - - public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable, int order) { - super(new Symbol(":", order == dependedVariable.order ? 2 : 1), order); - if(order == dependedVariable.order) { - this.dependingTerm = dependingTerm; - this.dependedVariable = dependedVariable; - this.addChild(dependingTerm); - this.addChild(dependedVariable); - this.dependency = null; - this.isListType = false; - } else { - this.dependency = new Dependency(dependingTerm, dependedVariable, order+1); - this.dependingTerm = null; - this.dependedVariable = null; - this.addChild(dependency); - this.isListType = true; - } - } - - public Dependency getDependency() { - return this.dependency; - } - - @Override - public int getTermOrder() { - return getOrder() - 1; - } - - public boolean isDependeingTermEvaluatable() { - return dependingTerm instanceof EvaluatableTerm; - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if(dependency == null) { - sb.append(dependingTerm.toString()); - sb.append(" : "); - sb.append(dependedVariable.toString()); - } else { - sb.append('['); - sb.append(dependency.toString()); - sb.append(']'); - } - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - if(dependency == null) { - sb.append(dependingTerm.toStringWithOrder()); - sb.append(" : "); - sb.append(dependedVariable.toStringWithOrder()); - } else { - sb.append('['); - sb.append(dependency.toStringWithOrder()); - sb.append(']'); - } - return sb.toString() + "(" + order + ")"; - } - - @Override - public String toTermString() { - return "[" + toString() + "]"; - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof Dependency)) { - return false; - } - Dependency anotherDep = (Dependency) another; - if(anotherDep.isListType() != isListType()) { - return false; - } - if(isListType()) { - return anotherDep.getDependency().equals(dependency); - } - return anotherDep.getDependingTerm().equals(dependingTerm) - && anotherDep.getDependedVariable().equals(dependedVariable); - } - - @Override - public int hashCode() { - return ("Dep" + toString()).hashCode(); - } - - @Override - public Object clone() { - return new Dependency((RDLTerm) dependingTerm.clone(), (ResourceVariable) dependedVariable.clone()); - } - -} diff --git a/src/models/DependencyTerm.java b/src/models/DependencyTerm.java deleted file mode 100644 index 3a437df..0000000 --- a/src/models/DependencyTerm.java +++ /dev/null @@ -1,144 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class DependencyTerm extends EvaluatableTerm{ - - private EvaluatableTerm dependingTerm; - private ResourceVariable dependedVariable; - private EvaluatableTerm argumentTerm; - - public DependencyTerm(int order) { - super(new Symbol(":", 3), order); - } - - public DependencyTerm(EvaluatableTerm dependingTerm, ResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), dependedVariable.getOrder() == argumentTerm.getOrder() ? dependedVariable.getOrder() : dependedVariable.getOrder() - 1); - this.dependingTerm = dependingTerm; - this.dependedVariable = dependedVariable; - this.argumentTerm = argumentTerm; - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - } - - @Override - public boolean isLinearRightNormal() { - return isLinearRightNormal(0); - } - - @Override - public EvaluatableTerm linearRightNormalize() { - DependencyTerm newTerm = (DependencyTerm) clone(); - newTerm.selfLinearRightNormalize(); - return newTerm; - } - - @Override - public void selfLinearRightNormalize() { - if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { - argumentTerm.selfLinearRightNormalize(); - return; - } - DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; - if(! dependencyTerm.isLinearRightNormal()) { - dependencyTerm.selfLinearRightNormalize(); - } - if(! isLinearRightNormal()) { - EvaluatableTerm childArgumentTerm = dependencyTerm.getArgumentTerm(); - DependencyTerm nextDependencyTerm = new DependencyTerm(childArgumentTerm, dependedVariable, argumentTerm); - this.dependingTerm = dependencyTerm.getDependingTerm(); - this.dependedVariable = dependencyTerm.getDependedVariable(); - this.argumentTerm = nextDependencyTerm; - this.setChild(3, nextDependencyTerm); - this.setChild(0, dependencyTerm.getDependingTerm()); - this.setChild(1, dependencyTerm.getDependedVariable()); - } - argumentTerm.selfLinearRightNormalize(); - - } - - private boolean isLinearRightNormal(int depth) { - if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { - return dependingTerm.getOrder() == dependedVariable.getOrder(); - } - DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; - if( - dependencyTerm.isLinearRightNormal(depth + 1) && - dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && - dependencyTerm.getOrder() == dependedVariable.getOrder() && - argumentTerm.getOrder() <= dependencyTerm.getOrder() && - depth == 0 - ) { - return true; - } - if( - dependencyTerm.isLinearRightNormal(depth + 1) && - dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && - dependencyTerm.getOrder() == dependedVariable.getOrder() && - argumentTerm.getOrder() < dependencyTerm.getOrder() - ) { - return true; - } - - return false; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - sb.append(getDependingTerm().toString()); - sb.append(" : "); - sb.append(getDependedVariable().toString()); - sb.append(" -> "); - sb.append(argumentTerm.toString()); - sb.append(']'); - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - sb.append(getDependingTerm().toStringWithOrder()); - sb.append(" : "); - sb.append(getDependedVariable().toStringWithOrder()); - sb.append(" -> "); - sb.append(argumentTerm.toStringWithOrder()); - sb.append(']'); - sb.append('('); - sb.append(order); - sb.append(')'); - return sb.toString(); - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof DependencyTerm)) { - return false; - } - DependencyTerm term = (DependencyTerm) another; - return dependingTerm.equals(term.getDependingTerm()) && - dependedVariable.equals(term.getDependedVariable()) && - argumentTerm.equals(term.getArgumentTerm()); - } - - @Override - public int hashCode() { - return ("DT" + toString()).hashCode(); - } - - @Override - public Object clone() { - return new DependencyTerm( - (EvaluatableTerm) dependingTerm.clone(), - (ResourceVariable) dependedVariable.clone(), - (EvaluatableTerm) argumentTerm.clone() - ); - } - - -} diff --git a/src/models/EvaluatableTerm.java b/src/models/EvaluatableTerm.java deleted file mode 100644 index 24d7e9e..0000000 --- a/src/models/EvaluatableTerm.java +++ /dev/null @@ -1,63 +0,0 @@ -package models; - -import exceptions.IllegalTypeException; -import models.algebra.Symbol; -import models.algebra.Type; - -public abstract class EvaluatableTerm extends RDLTerm{ - - public EvaluatableTerm(Symbol symbol, int order) { - super(symbol, order); - } - - public abstract boolean isLinearRightNormal(); - - public abstract EvaluatableTerm linearRightNormalize(); - public abstract void selfLinearRightNormalize(); - - public static ResourceVariable of(String name, Type type, int order) { - return new ResourceVariable(name, type, order); - } - - public static DependencyTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm) { - return new DependencyTerm(term, variable, valueTerm); - } - - public static EvaluatableTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm, int order) { - if(variable.getOrder() == valueTerm.getOrder() && variable.getOrder() == order) { - return new DependencyTerm(term, variable, valueTerm); - } else if(variable.getOrder() -1 == order) { - return new DependencyTerm(term, variable, valueTerm); - } else { - return new SetEvaluatableTerm(new DependencyTerm(term, variable, valueTerm), order); - } - } - - public static DependencyTerm of(Dependency dependency, EvaluatableTerm argumentTerm) { - RDLTerm term = dependency.getDependingTerm(); - if(! (term instanceof EvaluatableTerm)) { - throw new IllegalTypeException(); - } - return new DependencyTerm((EvaluatableTerm) term, dependency.getDependedVariable(), argumentTerm); - } - - public static EvaluatableTerm of(Dependency dependency, EvaluatableTerm argumentTerm, int order) { - RDLTerm term = dependency.getDependingTerm(); - if(! (term instanceof EvaluatableTerm)) { - throw new IllegalTypeException(); - } - ResourceVariable variable = dependency.getDependedVariable(); - if(variable.getOrder() == argumentTerm.getOrder() && variable.getOrder() == order) { - return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); - } else if(variable.getOrder() - 1 == order) { - return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); - } else { - return new SetEvaluatableTerm(new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm), order); - } - } - - public static SetEvaluatableTerm of(EvaluatableTerm term, int order) { - return new SetEvaluatableTerm(term, order); - } - -} diff --git a/src/models/RDLTerm.java b/src/models/RDLTerm.java deleted file mode 100644 index 570c725..0000000 --- a/src/models/RDLTerm.java +++ /dev/null @@ -1,41 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Term; - -@Getter -public abstract class RDLTerm extends Term{ - - protected int order; - - public RDLTerm(Symbol symbol, int order) { - super(symbol); - this.order = order; - } - - public int getTermOrder() { - return getOrder(); - } - - @Override - public abstract String toString(); - - public abstract String toStringWithOrder(); - - public String toTermString() { - return toString(); - } - - @Override - public boolean equals(Object another) { - return super.equals(another); - } - - @Override - public abstract int hashCode(); - - @Override - public abstract Object clone(); - -} diff --git a/src/models/ResourceConstant.java b/src/models/ResourceConstant.java deleted file mode 100644 index 3983644..0000000 --- a/src/models/ResourceConstant.java +++ /dev/null @@ -1,70 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Type; - -@Getter -public class ResourceConstant extends EvaluatableTerm{ - - private String name; - private Type type; - - public ResourceConstant(String name) { - super(new Symbol("", 0), 0); - this.name = name; - this.type = null; - } - - public ResourceConstant(String name, Type type) { - super(new Symbol("", 0), 0); - this.name = name; - this.type = type; - } - - @Override - public boolean isLinearRightNormal() { - return true; - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (ResourceConstant) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof ResourceConstant)) { - return false; - } - var cons = (ResourceConstant) another; - return cons.getOrder() == getOrder() && cons.getName().equals(getName()); - } - - @Override - public int hashCode() { - return ("Const" + toStringWithOrder()).hashCode(); - } - - @Override - public String toString() { - return this.name; - } - - @Override - public String toStringWithOrder() { - return this.name + "(" + order + ")"; - } - - @Override - public Object clone() { - return new ResourceConstant(name, type); - } - - -} diff --git a/src/models/ResourceVariable.java b/src/models/ResourceVariable.java deleted file mode 100644 index cd87365..0000000 --- a/src/models/ResourceVariable.java +++ /dev/null @@ -1,63 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; -import models.algebra.Type; - -@Getter -public class ResourceVariable extends EvaluatableTerm{ - - private String name; - private Type type; - - public ResourceVariable(String name, Type type, int order) { - super(new Symbol("", 0), order); - this.name = name; - this.type = type; - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (ResourceVariable) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - @Override - public boolean isLinearRightNormal() { - return true; - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof ResourceVariable)) { - return false; - } - var vari = (ResourceVariable) another; - return vari.getOrder() == getOrder() && vari.getName().equals(getName()) && vari.getType().equals(getType()); - } - - @Override - public int hashCode() { - return ("Vari" + toStringWithOrder()).hashCode(); - } - - @Override - public String toString() { - return this.name; - } - - @Override - public String toStringWithOrder() { - return this.name + "(" + order + ")"; - } - - @Override - public Object clone() { - return new ResourceVariable(name, type, order); - } - -} diff --git a/src/models/SetEvaluatableTerm.java b/src/models/SetEvaluatableTerm.java deleted file mode 100644 index 4adb243..0000000 --- a/src/models/SetEvaluatableTerm.java +++ /dev/null @@ -1,81 +0,0 @@ -package models; - -import lombok.Getter; -import models.algebra.Symbol; - -@Getter -public class SetEvaluatableTerm extends EvaluatableTerm{ - - private EvaluatableTerm term; - - public SetEvaluatableTerm(EvaluatableTerm term) { - super(new Symbol("", 1), term.getOrder() - 1); - this.term = term; - this.addChild(term); - } - - public SetEvaluatableTerm(EvaluatableTerm term, int order) { - super(new Symbol("", 1), order); - if(term.getOrder() > order + 1) { - var childTerm = new SetEvaluatableTerm(term, order+1); - this.term = childTerm; - this.addChild(childTerm); - } else { - this.term = term; - this.addChild(term); - } - } - - @Override - public EvaluatableTerm linearRightNormalize() { - return (SetEvaluatableTerm) clone(); - } - - @Override - public void selfLinearRightNormalize() { - } - - @Override - public boolean isLinearRightNormal() { - return term.isLinearRightNormal(); - } - - - @Override - public boolean equals(Object another) { - if(! (another instanceof SetEvaluatableTerm)) { - return false; - } - var term = (SetEvaluatableTerm) another; - return term.getTerm().equals(getTerm()); - } - - @Override - public int hashCode() { - return ("SET" + toString()).hashCode(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('{'); - sb.append(term.toString()); - sb.append('}'); - return sb.toString(); - } - - @Override - public String toStringWithOrder() { - StringBuilder sb = new StringBuilder(); - sb.append('{'); - sb.append(term.toStringWithOrder()); - sb.append('}'); - return sb.toString() + "(" + order + ")"; - } - - @Override - public Object clone() { - return new SetEvaluatableTerm((EvaluatableTerm) term.clone(), order); - } - -} diff --git a/src/models/meta/MetaDependencyTermVariable.java b/src/models/meta/MetaDependencyTermVariable.java deleted file mode 100644 index bbea73f..0000000 --- a/src/models/meta/MetaDependencyTermVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -package models.meta; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaDependencyTermVariable extends MetaVariable { - - public MetaDependencyTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, constraint, order); - } - - public MetaDependencyTermVariable(Variable variableName) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaDependencyTermVariable(Variable variableName, Expression order) { - super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/meta/MetaDependencyVariable.java b/src/models/meta/MetaDependencyVariable.java deleted file mode 100644 index 75aa7e7..0000000 --- a/src/models/meta/MetaDependencyVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -package models.meta; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaDependencyVariable extends MetaVariable { - - public MetaDependencyVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, constraint, order); - } - - public MetaDependencyVariable(Variable variableName) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaDependencyVariable(Variable variableName, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/meta/MetaEvaluatableTermVariable.java b/src/models/meta/MetaEvaluatableTermVariable.java deleted file mode 100644 index 5c36b1e..0000000 --- a/src/models/meta/MetaEvaluatableTermVariable.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.meta; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -public class MetaEvaluatableTermVariable extends MetaVariable { - - public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order); - } - - public MetaEvaluatableTermVariable(Variable variableName) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaEvaluatableTermVariable(Variable variableName, Expression order) { - super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/meta/MetaRDLTerm.java b/src/models/meta/MetaRDLTerm.java deleted file mode 100644 index 5647bc6..0000000 --- a/src/models/meta/MetaRDLTerm.java +++ /dev/null @@ -1,238 +0,0 @@ -package models.meta; - -import java.util.HashMap; -import java.util.Map; - -import exceptions.IllegalTypeException; -import lombok.Getter; -import models.Dependency; -import models.DependencyTerm; -import models.EvaluatableTerm; -import models.RDLTerm; -import models.ResourceVariable; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaRDLTerm extends RDLTerm { - - protected static enum TermType { - META_RDL_TERM(RDLTerm.class), - META_DEPENDENCY(Dependency.class), - META_DEPENDENCY_LIST(Dependency.class), - META_DEPENDENCY_VARIABLE(Dependency.class), - META_DEPENDENCY_TERM(DependencyTerm.class), - META_DEPENDENCY_TERM_VARIABLE(DependencyTerm.class), - META_EVALUATABLE_TERM_VARIABLE(EvaluatableTerm.class), - META_RESOURCE_VARIABLE(ResourceVariable.class); - - @Getter - private Class baseTermClass; - - private TermType(Class clazz) { - this.baseTermClass = clazz; - } - - } - - protected TermType termType; - - protected MetaRDLTerm(Symbol symbol, TermType termType) { - super(symbol, -1); - this.termType = termType; - } - - //dependency - public MetaRDLTerm(RDLTerm dependingTerm, MetaResourceVariable dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResourceVariable dependedVariable) { - super(new Symbol(":", 2), dependedVariable.getOrder()); - addChild(dependingTerm); - addChild(dependedVariable); - this.termType = TermType.META_DEPENDENCY; - } - - //list type dependency - public MetaRDLTerm(MetaRDLTerm dependency) { - super(new Symbol(":", 1), dependency.getOrder() - 1); - addChild(dependency); - this.termType = TermType.META_DEPENDENCY_LIST; - } - - //dependency term - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaRDLTerm dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { - super(new Symbol(":", 3), -1); - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - public MetaRDLTerm(EvaluatableTerm dependingTerm, ResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { - super(new Symbol(":", 3), -1); - if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { - throw new IllegalTypeException(); - } - addChild(dependingTerm); - addChild(dependedVariable); - addChild(argumentTerm); - this.termType = TermType.META_DEPENDENCY_TERM; - } - - - public boolean isVariable() { - return false; - } - - public boolean isMatchedBy(RDLTerm another) { - return isMatchedBy(another, new HashMap<>(), new HashMap<>()); - } - - public boolean isMatchedBy(RDLTerm another, Map binding, Map orderConstraint) { - if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { - return false; - } - if (this.getChildren().size() != another.getChildren().size()) { - return false; - } - for (int i = 0; i < this.getChildren().size(); i++) { - RDLTerm child = (RDLTerm) this.getChild(i); - RDLTerm anotherChild = (RDLTerm) another.getChild(i); - if (child instanceof MetaRDLTerm) { - MetaRDLTerm metaChild = (MetaRDLTerm) child; - if (! metaChild.isMatchedBy(anotherChild, binding, orderConstraint)) { - return false; - } - } else { - if (!(child.equals(anotherChild))) { - return false; - } - } - } - return true; - } - - - @Override - public String toString() { - switch(termType) { - case META_DEPENDENCY: - return "[" + getChild(0).toString() + " : " + getChild(1).toString() + "]"; - case META_DEPENDENCY_LIST: - return "[" + getChild(0).toString() + "]"; - case META_DEPENDENCY_TERM: - return "[" + getChild(0).toString() + " : " + getChild(1).toString() + " -> " + getChild(2).toString() + "]"; - default: - return ""; - } - } - - @Override - public String toStringWithOrder() { - switch(termType) { - case META_DEPENDENCY: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + ((RDLTerm) getChild(1)).toStringWithOrder() + "]"; - case META_DEPENDENCY_LIST: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + "]"; - case META_DEPENDENCY_TERM: - return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " - + ((RDLTerm) getChild(1)).toStringWithOrder() + " -> " + ((RDLTerm) getChild(2)).toStringWithOrder() + "]"; - default: - return ""; - } - } - - @Override - public boolean equals(Object another) { - if(! (another instanceof MetaRDLTerm)) { - return false; - } - MetaRDLTerm anotherTerm = (MetaRDLTerm) another; - return super.equals(another) && termType == anotherTerm.getTermType(); - } - - @Override - public int hashCode() { - return (termType.toString() + toStringWithOrder()).hashCode(); - } - - @Override - public Object clone() { - - return null; - } - -} diff --git a/src/models/meta/MetaRDLTermVariable.java b/src/models/meta/MetaRDLTermVariable.java deleted file mode 100644 index dd74db0..0000000 --- a/src/models/meta/MetaRDLTermVariable.java +++ /dev/null @@ -1,22 +0,0 @@ -package models.meta; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -public class MetaRDLTermVariable extends MetaVariable { - - public MetaRDLTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, constraint, order); - } - - public MetaRDLTermVariable(Variable variableName) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaRDLTermVariable(Variable variableName, Expression order) { - super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.EQ, order); - } - -} diff --git a/src/models/meta/MetaResourceVariable.java b/src/models/meta/MetaResourceVariable.java deleted file mode 100644 index c3534f7..0000000 --- a/src/models/meta/MetaResourceVariable.java +++ /dev/null @@ -1,23 +0,0 @@ -package models.meta; - -import lombok.Getter; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Variable; - -@Getter -public class MetaResourceVariable extends MetaVariable { - - public MetaResourceVariable(Variable variableName, OrderConstraint constraint, Expression order) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, constraint, order); - } - - public MetaResourceVariable(Variable variableName) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); - } - - public MetaResourceVariable(Variable variableName, Expression order) { - super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.EQ, order); - } -} diff --git a/src/models/meta/MetaVariable.java b/src/models/meta/MetaVariable.java deleted file mode 100644 index 6357c67..0000000 --- a/src/models/meta/MetaVariable.java +++ /dev/null @@ -1,208 +0,0 @@ -package models.meta; - -import java.util.HashMap; -import java.util.Map; - -import exceptions.CoefficientNotOneException; -import exceptions.NonLinearExpressionException; -import exceptions.TooManyVariablesException; -import lombok.Getter; -import models.RDLTerm; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Variable; -import models.dataConstraintModel.DataConstraintModel; - -@Getter -public abstract class MetaVariable extends MetaRDLTerm { - - protected Variable variableName; - protected OrderConstraint constraint; - protected Variable orderVariable; - protected int orderConstant; - protected Expression orderExpression; - - protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order) { - super(symbol, termType); - this.variableName = name; - this.constraint = constraint; - this.orderExpression = order; - Map coefficients = new HashMap<>(); - int constant = getCoefficientAndConstantsFromExpression(order, coefficients, 1); - if (coefficients.size() > 1) { - // todo: create exception - throw new TooManyVariablesException("Too many variables"); - } - if (coefficients.size() == 1) { - orderVariable = coefficients.keySet().iterator().next(); - if (coefficients.get(orderVariable) != 1) { - throw new CoefficientNotOneException(); - } - } else { - orderVariable = null; - } - orderConstant = constant; - } - - @Override - public boolean isVariable() { - return true; - } - - @Override - public boolean isMatchedBy(RDLTerm another, Map binding, - Map orderConstraint) { - if (! this.termType.getBaseTermClass().isAssignableFrom(another.getClass())) { - return false; - } - - if (! orderConstraintCheck(another, orderConstraint)) { - return false; - } - - if (! binding.containsKey(this.variableName)) { - binding.put(this.variableName, another); - return true; - } - return binding.get(this.variableName).equals(another); - } - - private boolean orderConstraintCheck(RDLTerm another, Map orderConstraints) { - if (orderVariable == null) { - switch (constraint) { - case ANY: - return true; - case EQ: - return another.getOrder() == orderConstant; - case GE: - return another.getOrder() >= orderConstant; - case GT: - return another.getOrder() > orderConstant; - case LE: - return another.getOrder() <= orderConstant; - case LT: - return another.getOrder() < orderConstant; - } - } else { - if (! orderConstraints.containsKey(orderVariable)) { - orderConstraints.put(orderVariable, new OrderVariableConstraint()); - } - var orderVarConst = orderConstraints.get(orderVariable); - return orderVarConst.setConstraint(another.getOrder() - orderConstant, constraint); - } - return false; - } - - private int getCoefficientAndConstantsFromExpression(Expression expression, Map coefficients, int curWeight) { - int res = 0; - if(expression instanceof Constant) { - return getConstantValue((Constant) expression) * curWeight; - } else if(expression instanceof Variable) { - coefficients.put((Variable) expression, coefficients.getOrDefault((Variable) expression, 0) + curWeight); - return 0; - } - Term term = (Term) expression; - Symbol symbol = term.getSymbol(); - if(symbol.equals(DataConstraintModel.add)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); - res += getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); - } else if(symbol.equals(DataConstraintModel.sub)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); - res += getCoefficientAndConstantsFromExpression(c2, coefficients, -curWeight); - } else if(symbol.equals(DataConstraintModel.mul)) { - Expression c1 = term.getChild(0); - Expression c2 = term.getChild(1); - if(c1.getVariables().size() == 0 && c2.getVariables().size() == 0) { - res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) * - getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); - } else if(c1.getVariables().size() == 0) { - res += getCoefficientAndConstantsFromExpression( - c2, - coefficients, - getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) - ); - } else if(c2.getVariables().size() == 0){ - res += getCoefficientAndConstantsFromExpression( - c1, - coefficients, - getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight) - ); - } else { - throw new NonLinearExpressionException("Order expression must be linear expression."); - } - } else if(symbol.equals(DataConstraintModel.minus)) { - Expression c1 = term.getChild(0); - res += getCoefficientAndConstantsFromExpression(c1, coefficients, -curWeight); - } else { - throw new NonLinearExpressionException("Order expression must be linear expression."); - } - return res; - - } - - private int getConstantValue(Constant constant) { - return Integer.parseInt((String) constant.getValue()); - } - - - @Override - public String toString() { - return variableName.toString(); - } - - @Override - public String toStringWithOrder() { - return toString() +getOrderString(); - } - - protected String getOrderString() { - switch(constraint) { - case ANY: - return "(*)"; - case EQ: - return "(= " + orderExpression.toString() + ")"; - case GE: - return "(>= " + orderExpression.toString() + ")"; - case GT: - return "(> " + orderExpression.toString() + ")"; - case LE: - return "(<= " + orderExpression.toString() + ")"; - case LT: - return "(< " + orderExpression.toString() + ")"; - } - return ""; - } - - @Override - public boolean equals(Object another) { - if (another instanceof MetaVariable) { - return false; - } - MetaVariable anotherVar = (MetaVariable) another; - return super.equals(another) - && variableName.equals(another) - && constraint == anotherVar.getConstraint() - && orderVariable.equals(anotherVar.getOrderVariable()) - && orderConstant == anotherVar.getOrderConstant(); - } - - @Override - public int hashCode() { - return (termType.name() + toString()).hashCode(); - } - - @Override - public Object clone() { - // TODO 自動生成されたメソッド・スタブ - return super.clone(); - } - - - -} diff --git a/src/models/meta/OrderConstraint.java b/src/models/meta/OrderConstraint.java deleted file mode 100644 index 000ca02..0000000 --- a/src/models/meta/OrderConstraint.java +++ /dev/null @@ -1,12 +0,0 @@ -package models.meta; - -public enum OrderConstraint { - - EQ, - LT, - LE, - GT, - GE, - ANY; - -} diff --git a/src/models/meta/OrderVariableConstraint.java b/src/models/meta/OrderVariableConstraint.java deleted file mode 100644 index e4a1342..0000000 --- a/src/models/meta/OrderVariableConstraint.java +++ /dev/null @@ -1,58 +0,0 @@ -package models.meta; - -import lombok.NoArgsConstructor; - -@NoArgsConstructor -public class OrderVariableConstraint { - - // lower <= x <= upper - private int upper = 100000000; - private int lower = -1; - private boolean isOk = true; - - public boolean setConstraint(int value, OrderConstraint constraint) { - switch (constraint) { - case ANY: - return true; - case EQ: - return setEq(value); - case GE: - return setUpper(value); - case GT: - return setUpper(value - 1); - case LE: - return setLower(value); - case LT: - return setLower(value + 1); - } - return false; - } - - public boolean isOk() { - return isOk; - } - - - private boolean setEq(int eq) { - return setUpper(eq) && setLower(eq); - } - - private boolean setUpper(int upper) { - if (isOk && this.lower <= upper && upper <= this.upper) { - this.upper = upper; - return true; - } - isOk = false; - return false; - } - - private boolean setLower(int lower) { - if (isOk && this.lower <= lower && lower <= this.upper) { - this.lower = lower; - return true; - } - isOk = false; - return false; - } - -} diff --git a/src/models/terms/Dependency.java b/src/models/terms/Dependency.java new file mode 100644 index 0000000..5972994 --- /dev/null +++ b/src/models/terms/Dependency.java @@ -0,0 +1,126 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class Dependency extends RDLTerm{ + + private RDLTerm dependingTerm; + private ResourceVariable dependedVariable; + private Dependency dependency; + private boolean isListType; + + public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder()); + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; + this.dependency = null; + this.addChild(dependingTerm); + this.addChild(dependedVariable); + this.isListType = false; + } + + public Dependency(Dependency dependency) { + super(new Symbol(":", 1), dependency.getOrder() - 1); + this.dependency = dependency; + this.dependingTerm = null; + this.dependedVariable = null; + this.addChild(dependency); + this.isListType = true; + } + + public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable, int order) { + super(new Symbol(":", order == dependedVariable.order ? 2 : 1), order); + if(order == dependedVariable.order) { + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; + this.addChild(dependingTerm); + this.addChild(dependedVariable); + this.dependency = null; + this.isListType = false; + } else { + this.dependency = new Dependency(dependingTerm, dependedVariable, order+1); + this.dependingTerm = null; + this.dependedVariable = null; + this.addChild(dependency); + this.isListType = true; + } + } + + public Dependency getDependency() { + return this.dependency; + } + + @Override + public int getTermOrder() { + return getOrder() - 1; + } + + public boolean isDependeingTermEvaluatable() { + return dependingTerm instanceof EvaluatableTerm; + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if(dependency == null) { + sb.append(dependingTerm.toString()); + sb.append(" : "); + sb.append(dependedVariable.toString()); + } else { + sb.append('['); + sb.append(dependency.toString()); + sb.append(']'); + } + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + if(dependency == null) { + sb.append(dependingTerm.toStringWithOrder()); + sb.append(" : "); + sb.append(dependedVariable.toStringWithOrder()); + } else { + sb.append('['); + sb.append(dependency.toStringWithOrder()); + sb.append(']'); + } + return sb.toString() + "(" + order + ")"; + } + + @Override + public String toTermString() { + return "[" + toString() + "]"; + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof Dependency)) { + return false; + } + Dependency anotherDep = (Dependency) another; + if(anotherDep.isListType() != isListType()) { + return false; + } + if(isListType()) { + return anotherDep.getDependency().equals(dependency); + } + return anotherDep.getDependingTerm().equals(dependingTerm) + && anotherDep.getDependedVariable().equals(dependedVariable); + } + + @Override + public int hashCode() { + return ("Dep" + toString()).hashCode(); + } + + @Override + public Object clone() { + return new Dependency((RDLTerm) dependingTerm.clone(), (ResourceVariable) dependedVariable.clone()); + } + +} diff --git a/src/models/terms/DependencyTerm.java b/src/models/terms/DependencyTerm.java new file mode 100644 index 0000000..20b90a4 --- /dev/null +++ b/src/models/terms/DependencyTerm.java @@ -0,0 +1,144 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class DependencyTerm extends EvaluatableTerm{ + + private EvaluatableTerm dependingTerm; + private ResourceVariable dependedVariable; + private EvaluatableTerm argumentTerm; + + public DependencyTerm(int order) { + super(new Symbol(":", 3), order); + } + + public DependencyTerm(EvaluatableTerm dependingTerm, ResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), dependedVariable.getOrder() == argumentTerm.getOrder() ? dependedVariable.getOrder() : dependedVariable.getOrder() - 1); + this.dependingTerm = dependingTerm; + this.dependedVariable = dependedVariable; + this.argumentTerm = argumentTerm; + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + } + + @Override + public boolean isLinearRightNormal() { + return isLinearRightNormal(0); + } + + @Override + public EvaluatableTerm linearRightNormalize() { + DependencyTerm newTerm = (DependencyTerm) clone(); + newTerm.selfLinearRightNormalize(); + return newTerm; + } + + @Override + public void selfLinearRightNormalize() { + if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { + argumentTerm.selfLinearRightNormalize(); + return; + } + DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; + if(! dependencyTerm.isLinearRightNormal()) { + dependencyTerm.selfLinearRightNormalize(); + } + if(! isLinearRightNormal()) { + EvaluatableTerm childArgumentTerm = dependencyTerm.getArgumentTerm(); + DependencyTerm nextDependencyTerm = new DependencyTerm(childArgumentTerm, dependedVariable, argumentTerm); + this.dependingTerm = dependencyTerm.getDependingTerm(); + this.dependedVariable = dependencyTerm.getDependedVariable(); + this.argumentTerm = nextDependencyTerm; + this.setChild(3, nextDependencyTerm); + this.setChild(0, dependencyTerm.getDependingTerm()); + this.setChild(1, dependencyTerm.getDependedVariable()); + } + argumentTerm.selfLinearRightNormalize(); + + } + + private boolean isLinearRightNormal(int depth) { + if(dependingTerm instanceof ResourceVariable || dependingTerm instanceof SetEvaluatableTerm) { + return dependingTerm.getOrder() == dependedVariable.getOrder(); + } + DependencyTerm dependencyTerm = (DependencyTerm) dependingTerm; + if( + dependencyTerm.isLinearRightNormal(depth + 1) && + dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && + dependencyTerm.getOrder() == dependedVariable.getOrder() && + argumentTerm.getOrder() <= dependencyTerm.getOrder() && + depth == 0 + ) { + return true; + } + if( + dependencyTerm.isLinearRightNormal(depth + 1) && + dependencyTerm.getDependedVariable().getOrder() - 1 == dependedVariable.getOrder() && + dependencyTerm.getOrder() == dependedVariable.getOrder() && + argumentTerm.getOrder() < dependencyTerm.getOrder() + ) { + return true; + } + + return false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append(getDependingTerm().toString()); + sb.append(" : "); + sb.append(getDependedVariable().toString()); + sb.append(" -> "); + sb.append(argumentTerm.toString()); + sb.append(']'); + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append(getDependingTerm().toStringWithOrder()); + sb.append(" : "); + sb.append(getDependedVariable().toStringWithOrder()); + sb.append(" -> "); + sb.append(argumentTerm.toStringWithOrder()); + sb.append(']'); + sb.append('('); + sb.append(order); + sb.append(')'); + return sb.toString(); + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof DependencyTerm)) { + return false; + } + DependencyTerm term = (DependencyTerm) another; + return dependingTerm.equals(term.getDependingTerm()) && + dependedVariable.equals(term.getDependedVariable()) && + argumentTerm.equals(term.getArgumentTerm()); + } + + @Override + public int hashCode() { + return ("DT" + toString()).hashCode(); + } + + @Override + public Object clone() { + return new DependencyTerm( + (EvaluatableTerm) dependingTerm.clone(), + (ResourceVariable) dependedVariable.clone(), + (EvaluatableTerm) argumentTerm.clone() + ); + } + + +} diff --git a/src/models/terms/EvaluatableTerm.java b/src/models/terms/EvaluatableTerm.java new file mode 100644 index 0000000..624f6f6 --- /dev/null +++ b/src/models/terms/EvaluatableTerm.java @@ -0,0 +1,63 @@ +package models.terms; + +import exceptions.IllegalTypeException; +import models.algebra.Symbol; +import models.algebra.Type; + +public abstract class EvaluatableTerm extends RDLTerm{ + + public EvaluatableTerm(Symbol symbol, int order) { + super(symbol, order); + } + + public abstract boolean isLinearRightNormal(); + + public abstract EvaluatableTerm linearRightNormalize(); + public abstract void selfLinearRightNormalize(); + + public static ResourceVariable of(String name, Type type, int order) { + return new ResourceVariable(name, type, order); + } + + public static DependencyTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm) { + return new DependencyTerm(term, variable, valueTerm); + } + + public static EvaluatableTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm, int order) { + if(variable.getOrder() == valueTerm.getOrder() && variable.getOrder() == order) { + return new DependencyTerm(term, variable, valueTerm); + } else if(variable.getOrder() -1 == order) { + return new DependencyTerm(term, variable, valueTerm); + } else { + return new SetEvaluatableTerm(new DependencyTerm(term, variable, valueTerm), order); + } + } + + public static DependencyTerm of(Dependency dependency, EvaluatableTerm argumentTerm) { + RDLTerm term = dependency.getDependingTerm(); + if(! (term instanceof EvaluatableTerm)) { + throw new IllegalTypeException(); + } + return new DependencyTerm((EvaluatableTerm) term, dependency.getDependedVariable(), argumentTerm); + } + + public static EvaluatableTerm of(Dependency dependency, EvaluatableTerm argumentTerm, int order) { + RDLTerm term = dependency.getDependingTerm(); + if(! (term instanceof EvaluatableTerm)) { + throw new IllegalTypeException(); + } + ResourceVariable variable = dependency.getDependedVariable(); + if(variable.getOrder() == argumentTerm.getOrder() && variable.getOrder() == order) { + return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); + } else if(variable.getOrder() - 1 == order) { + return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm); + } else { + return new SetEvaluatableTerm(new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm), order); + } + } + + public static SetEvaluatableTerm of(EvaluatableTerm term, int order) { + return new SetEvaluatableTerm(term, order); + } + +} diff --git a/src/models/terms/RDLTerm.java b/src/models/terms/RDLTerm.java new file mode 100644 index 0000000..0ec2003 --- /dev/null +++ b/src/models/terms/RDLTerm.java @@ -0,0 +1,41 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Term; + +@Getter +public abstract class RDLTerm extends Term{ + + protected int order; + + public RDLTerm(Symbol symbol, int order) { + super(symbol); + this.order = order; + } + + public int getTermOrder() { + return getOrder(); + } + + @Override + public abstract String toString(); + + public abstract String toStringWithOrder(); + + public String toTermString() { + return toString(); + } + + @Override + public boolean equals(Object another) { + return super.equals(another); + } + + @Override + public abstract int hashCode(); + + @Override + public abstract Object clone(); + +} diff --git a/src/models/terms/ResourceConstant.java b/src/models/terms/ResourceConstant.java new file mode 100644 index 0000000..1cdddfd --- /dev/null +++ b/src/models/terms/ResourceConstant.java @@ -0,0 +1,70 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Type; + +@Getter +public class ResourceConstant extends EvaluatableTerm{ + + private String name; + private Type type; + + public ResourceConstant(String name) { + super(new Symbol("", 0), 0); + this.name = name; + this.type = null; + } + + public ResourceConstant(String name, Type type) { + super(new Symbol("", 0), 0); + this.name = name; + this.type = type; + } + + @Override + public boolean isLinearRightNormal() { + return true; + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (ResourceConstant) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof ResourceConstant)) { + return false; + } + var cons = (ResourceConstant) another; + return cons.getOrder() == getOrder() && cons.getName().equals(getName()); + } + + @Override + public int hashCode() { + return ("Const" + toStringWithOrder()).hashCode(); + } + + @Override + public String toString() { + return this.name; + } + + @Override + public String toStringWithOrder() { + return this.name + "(" + order + ")"; + } + + @Override + public Object clone() { + return new ResourceConstant(name, type); + } + + +} diff --git a/src/models/terms/ResourceVariable.java b/src/models/terms/ResourceVariable.java new file mode 100644 index 0000000..909da7e --- /dev/null +++ b/src/models/terms/ResourceVariable.java @@ -0,0 +1,63 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Type; + +@Getter +public class ResourceVariable extends EvaluatableTerm{ + + private String name; + private Type type; + + public ResourceVariable(String name, Type type, int order) { + super(new Symbol("", 0), order); + this.name = name; + this.type = type; + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (ResourceVariable) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + @Override + public boolean isLinearRightNormal() { + return true; + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof ResourceVariable)) { + return false; + } + var vari = (ResourceVariable) another; + return vari.getOrder() == getOrder() && vari.getName().equals(getName()) && vari.getType().equals(getType()); + } + + @Override + public int hashCode() { + return ("Vari" + toStringWithOrder()).hashCode(); + } + + @Override + public String toString() { + return this.name; + } + + @Override + public String toStringWithOrder() { + return this.name + "(" + order + ")"; + } + + @Override + public Object clone() { + return new ResourceVariable(name, type, order); + } + +} diff --git a/src/models/terms/SetEvaluatableTerm.java b/src/models/terms/SetEvaluatableTerm.java new file mode 100644 index 0000000..1d0cc5f --- /dev/null +++ b/src/models/terms/SetEvaluatableTerm.java @@ -0,0 +1,81 @@ +package models.terms; + +import lombok.Getter; +import models.algebra.Symbol; + +@Getter +public class SetEvaluatableTerm extends EvaluatableTerm{ + + private EvaluatableTerm term; + + public SetEvaluatableTerm(EvaluatableTerm term) { + super(new Symbol("", 1), term.getOrder() - 1); + this.term = term; + this.addChild(term); + } + + public SetEvaluatableTerm(EvaluatableTerm term, int order) { + super(new Symbol("", 1), order); + if(term.getOrder() > order + 1) { + var childTerm = new SetEvaluatableTerm(term, order+1); + this.term = childTerm; + this.addChild(childTerm); + } else { + this.term = term; + this.addChild(term); + } + } + + @Override + public EvaluatableTerm linearRightNormalize() { + return (SetEvaluatableTerm) clone(); + } + + @Override + public void selfLinearRightNormalize() { + } + + @Override + public boolean isLinearRightNormal() { + return term.isLinearRightNormal(); + } + + + @Override + public boolean equals(Object another) { + if(! (another instanceof SetEvaluatableTerm)) { + return false; + } + var term = (SetEvaluatableTerm) another; + return term.getTerm().equals(getTerm()); + } + + @Override + public int hashCode() { + return ("SET" + toString()).hashCode(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + sb.append(term.toString()); + sb.append('}'); + return sb.toString(); + } + + @Override + public String toStringWithOrder() { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + sb.append(term.toStringWithOrder()); + sb.append('}'); + return sb.toString() + "(" + order + ")"; + } + + @Override + public Object clone() { + return new SetEvaluatableTerm((EvaluatableTerm) term.clone(), order); + } + +} diff --git a/src/models/terms/meta/MetaDependencyTermVariable.java b/src/models/terms/meta/MetaDependencyTermVariable.java new file mode 100644 index 0000000..80b6902 --- /dev/null +++ b/src/models/terms/meta/MetaDependencyTermVariable.java @@ -0,0 +1,24 @@ +package models.terms.meta; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +@Getter +public class MetaDependencyTermVariable extends MetaVariable { + + public MetaDependencyTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, constraint, order); + } + + public MetaDependencyTermVariable(Variable variableName) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaDependencyTermVariable(Variable variableName, Expression order) { + super(new Symbol(":", 3), MetaRDLTerm.TermType.META_DEPENDENCY_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/models/terms/meta/MetaDependencyVariable.java b/src/models/terms/meta/MetaDependencyVariable.java new file mode 100644 index 0000000..477e338 --- /dev/null +++ b/src/models/terms/meta/MetaDependencyVariable.java @@ -0,0 +1,24 @@ +package models.terms.meta; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +@Getter +public class MetaDependencyVariable extends MetaVariable { + + public MetaDependencyVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, constraint, order); + } + + public MetaDependencyVariable(Variable variableName) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaDependencyVariable(Variable variableName, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_DEPENDENCY_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/models/terms/meta/MetaEvaluatableTermVariable.java b/src/models/terms/meta/MetaEvaluatableTermVariable.java new file mode 100644 index 0000000..b99aa8c --- /dev/null +++ b/src/models/terms/meta/MetaEvaluatableTermVariable.java @@ -0,0 +1,22 @@ +package models.terms.meta; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +public class MetaEvaluatableTermVariable extends MetaVariable { + + public MetaEvaluatableTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, constraint, order); + } + + public MetaEvaluatableTermVariable(Variable variableName) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaEvaluatableTermVariable(Variable variableName, Expression order) { + super(new Symbol(":", 2), MetaRDLTerm.TermType.META_EVALUATABLE_TERM_VARIABLE, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/models/terms/meta/MetaRDLTerm.java b/src/models/terms/meta/MetaRDLTerm.java new file mode 100644 index 0000000..136d7a1 --- /dev/null +++ b/src/models/terms/meta/MetaRDLTerm.java @@ -0,0 +1,238 @@ +package models.terms.meta; + +import java.util.HashMap; +import java.util.Map; + +import exceptions.IllegalTypeException; +import lombok.Getter; +import models.algebra.Symbol; +import models.algebra.Variable; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.EvaluatableTerm; +import models.terms.RDLTerm; +import models.terms.ResourceVariable; + +@Getter +public class MetaRDLTerm extends RDLTerm { + + protected static enum TermType { + META_RDL_TERM(RDLTerm.class), + META_DEPENDENCY(Dependency.class), + META_DEPENDENCY_LIST(Dependency.class), + META_DEPENDENCY_VARIABLE(Dependency.class), + META_DEPENDENCY_TERM(DependencyTerm.class), + META_DEPENDENCY_TERM_VARIABLE(DependencyTerm.class), + META_EVALUATABLE_TERM_VARIABLE(EvaluatableTerm.class), + META_RESOURCE_VARIABLE(ResourceVariable.class); + + @Getter + private Class baseTermClass; + + private TermType(Class clazz) { + this.baseTermClass = clazz; + } + + } + + protected TermType termType; + + protected MetaRDLTerm(Symbol symbol, TermType termType) { + super(symbol, -1); + this.termType = termType; + } + + //dependency + public MetaRDLTerm(RDLTerm dependingTerm, MetaResourceVariable dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResourceVariable dependedVariable) { + super(new Symbol(":", 2), dependedVariable.getOrder()); + addChild(dependingTerm); + addChild(dependedVariable); + this.termType = TermType.META_DEPENDENCY; + } + + //list type dependency + public MetaRDLTerm(MetaRDLTerm dependency) { + super(new Symbol(":", 1), dependency.getOrder() - 1); + addChild(dependency); + this.termType = TermType.META_DEPENDENCY_LIST; + } + + //dependency term + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaRDLTerm dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if (! EvaluatableTerm.class.isAssignableFrom(dependingTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, MetaResourceVariable dependedVariable, EvaluatableTerm argumentTerm) { + super(new Symbol(":", 3), -1); + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + public MetaRDLTerm(EvaluatableTerm dependingTerm, ResourceVariable dependedVariable, MetaRDLTerm argumentTerm) { + super(new Symbol(":", 3), -1); + if(! EvaluatableTerm.class.isAssignableFrom(argumentTerm.getTermType().getBaseTermClass())) { + throw new IllegalTypeException(); + } + addChild(dependingTerm); + addChild(dependedVariable); + addChild(argumentTerm); + this.termType = TermType.META_DEPENDENCY_TERM; + } + + + public boolean isVariable() { + return false; + } + + public boolean isMatchedBy(RDLTerm another) { + return isMatchedBy(another, new HashMap<>(), new HashMap<>()); + } + + public boolean isMatchedBy(RDLTerm another, Map binding, Map orderConstraint) { + if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { + return false; + } + if (this.getChildren().size() != another.getChildren().size()) { + return false; + } + for (int i = 0; i < this.getChildren().size(); i++) { + RDLTerm child = (RDLTerm) this.getChild(i); + RDLTerm anotherChild = (RDLTerm) another.getChild(i); + if (child instanceof MetaRDLTerm) { + MetaRDLTerm metaChild = (MetaRDLTerm) child; + if (! metaChild.isMatchedBy(anotherChild, binding, orderConstraint)) { + return false; + } + } else { + if (!(child.equals(anotherChild))) { + return false; + } + } + } + return true; + } + + + @Override + public String toString() { + switch(termType) { + case META_DEPENDENCY: + return "[" + getChild(0).toString() + " : " + getChild(1).toString() + "]"; + case META_DEPENDENCY_LIST: + return "[" + getChild(0).toString() + "]"; + case META_DEPENDENCY_TERM: + return "[" + getChild(0).toString() + " : " + getChild(1).toString() + " -> " + getChild(2).toString() + "]"; + default: + return ""; + } + } + + @Override + public String toStringWithOrder() { + switch(termType) { + case META_DEPENDENCY: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + ((RDLTerm) getChild(1)).toStringWithOrder() + "]"; + case META_DEPENDENCY_LIST: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + "]"; + case META_DEPENDENCY_TERM: + return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + + ((RDLTerm) getChild(1)).toStringWithOrder() + " -> " + ((RDLTerm) getChild(2)).toStringWithOrder() + "]"; + default: + return ""; + } + } + + @Override + public boolean equals(Object another) { + if(! (another instanceof MetaRDLTerm)) { + return false; + } + MetaRDLTerm anotherTerm = (MetaRDLTerm) another; + return super.equals(another) && termType == anotherTerm.getTermType(); + } + + @Override + public int hashCode() { + return (termType.toString() + toStringWithOrder()).hashCode(); + } + + @Override + public Object clone() { + + return null; + } + +} diff --git a/src/models/terms/meta/MetaRDLTermVariable.java b/src/models/terms/meta/MetaRDLTermVariable.java new file mode 100644 index 0000000..1205c21 --- /dev/null +++ b/src/models/terms/meta/MetaRDLTermVariable.java @@ -0,0 +1,22 @@ +package models.terms.meta; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +public class MetaRDLTermVariable extends MetaVariable { + + public MetaRDLTermVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, constraint, order); + } + + public MetaRDLTermVariable(Variable variableName) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaRDLTermVariable(Variable variableName, Expression order) { + super(new Symbol("", -1), MetaRDLTerm.TermType.META_RDL_TERM, variableName, OrderConstraint.EQ, order); + } + +} diff --git a/src/models/terms/meta/MetaResourceVariable.java b/src/models/terms/meta/MetaResourceVariable.java new file mode 100644 index 0000000..ad665dd --- /dev/null +++ b/src/models/terms/meta/MetaResourceVariable.java @@ -0,0 +1,23 @@ +package models.terms.meta; + +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Variable; + +@Getter +public class MetaResourceVariable extends MetaVariable { + + public MetaResourceVariable(Variable variableName, OrderConstraint constraint, Expression order) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, constraint, order); + } + + public MetaResourceVariable(Variable variableName) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.ANY, new Constant("0")); + } + + public MetaResourceVariable(Variable variableName, Expression order) { + super(new Symbol("", 0), MetaRDLTerm.TermType.META_RESOURCE_VARIABLE, variableName, OrderConstraint.EQ, order); + } +} diff --git a/src/models/terms/meta/MetaVariable.java b/src/models/terms/meta/MetaVariable.java new file mode 100644 index 0000000..3d44a2b --- /dev/null +++ b/src/models/terms/meta/MetaVariable.java @@ -0,0 +1,208 @@ +package models.terms.meta; + +import java.util.HashMap; +import java.util.Map; + +import exceptions.CoefficientNotOneException; +import exceptions.NonLinearExpressionException; +import exceptions.TooManyVariablesException; +import lombok.Getter; +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Symbol; +import models.algebra.Term; +import models.algebra.Variable; +import models.dataConstraintModel.DataConstraintModel; +import models.terms.RDLTerm; + +@Getter +public abstract class MetaVariable extends MetaRDLTerm { + + protected Variable variableName; + protected OrderConstraint constraint; + protected Variable orderVariable; + protected int orderConstant; + protected Expression orderExpression; + + protected MetaVariable(Symbol symbol, TermType termType, Variable name, OrderConstraint constraint, Expression order) { + super(symbol, termType); + this.variableName = name; + this.constraint = constraint; + this.orderExpression = order; + Map coefficients = new HashMap<>(); + int constant = getCoefficientAndConstantsFromExpression(order, coefficients, 1); + if (coefficients.size() > 1) { + // todo: create exception + throw new TooManyVariablesException("Too many variables"); + } + if (coefficients.size() == 1) { + orderVariable = coefficients.keySet().iterator().next(); + if (coefficients.get(orderVariable) != 1) { + throw new CoefficientNotOneException(); + } + } else { + orderVariable = null; + } + orderConstant = constant; + } + + @Override + public boolean isVariable() { + return true; + } + + @Override + public boolean isMatchedBy(RDLTerm another, Map binding, + Map orderConstraint) { + if (! this.termType.getBaseTermClass().isAssignableFrom(another.getClass())) { + return false; + } + + if (! orderConstraintCheck(another, orderConstraint)) { + return false; + } + + if (! binding.containsKey(this.variableName)) { + binding.put(this.variableName, another); + return true; + } + return binding.get(this.variableName).equals(another); + } + + private boolean orderConstraintCheck(RDLTerm another, Map orderConstraints) { + if (orderVariable == null) { + switch (constraint) { + case ANY: + return true; + case EQ: + return another.getOrder() == orderConstant; + case GE: + return another.getOrder() >= orderConstant; + case GT: + return another.getOrder() > orderConstant; + case LE: + return another.getOrder() <= orderConstant; + case LT: + return another.getOrder() < orderConstant; + } + } else { + if (! orderConstraints.containsKey(orderVariable)) { + orderConstraints.put(orderVariable, new OrderVariableConstraint()); + } + var orderVarConst = orderConstraints.get(orderVariable); + return orderVarConst.setConstraint(another.getOrder() - orderConstant, constraint); + } + return false; + } + + private int getCoefficientAndConstantsFromExpression(Expression expression, Map coefficients, int curWeight) { + int res = 0; + if(expression instanceof Constant) { + return getConstantValue((Constant) expression) * curWeight; + } else if(expression instanceof Variable) { + coefficients.put((Variable) expression, coefficients.getOrDefault((Variable) expression, 0) + curWeight); + return 0; + } + Term term = (Term) expression; + Symbol symbol = term.getSymbol(); + if(symbol.equals(DataConstraintModel.add)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); + res += getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); + } else if(symbol.equals(DataConstraintModel.sub)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight); + res += getCoefficientAndConstantsFromExpression(c2, coefficients, -curWeight); + } else if(symbol.equals(DataConstraintModel.mul)) { + Expression c1 = term.getChild(0); + Expression c2 = term.getChild(1); + if(c1.getVariables().size() == 0 && c2.getVariables().size() == 0) { + res += getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) * + getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight); + } else if(c1.getVariables().size() == 0) { + res += getCoefficientAndConstantsFromExpression( + c2, + coefficients, + getCoefficientAndConstantsFromExpression(c1, coefficients, curWeight) + ); + } else if(c2.getVariables().size() == 0){ + res += getCoefficientAndConstantsFromExpression( + c1, + coefficients, + getCoefficientAndConstantsFromExpression(c2, coefficients, curWeight) + ); + } else { + throw new NonLinearExpressionException("Order expression must be linear expression."); + } + } else if(symbol.equals(DataConstraintModel.minus)) { + Expression c1 = term.getChild(0); + res += getCoefficientAndConstantsFromExpression(c1, coefficients, -curWeight); + } else { + throw new NonLinearExpressionException("Order expression must be linear expression."); + } + return res; + + } + + private int getConstantValue(Constant constant) { + return Integer.parseInt((String) constant.getValue()); + } + + + @Override + public String toString() { + return variableName.toString(); + } + + @Override + public String toStringWithOrder() { + return toString() +getOrderString(); + } + + protected String getOrderString() { + switch(constraint) { + case ANY: + return "(*)"; + case EQ: + return "(= " + orderExpression.toString() + ")"; + case GE: + return "(>= " + orderExpression.toString() + ")"; + case GT: + return "(> " + orderExpression.toString() + ")"; + case LE: + return "(<= " + orderExpression.toString() + ")"; + case LT: + return "(< " + orderExpression.toString() + ")"; + } + return ""; + } + + @Override + public boolean equals(Object another) { + if (another instanceof MetaVariable) { + return false; + } + MetaVariable anotherVar = (MetaVariable) another; + return super.equals(another) + && variableName.equals(another) + && constraint == anotherVar.getConstraint() + && orderVariable.equals(anotherVar.getOrderVariable()) + && orderConstant == anotherVar.getOrderConstant(); + } + + @Override + public int hashCode() { + return (termType.name() + toString()).hashCode(); + } + + @Override + public Object clone() { + // TODO 自動生成されたメソッド・スタブ + return super.clone(); + } + + + +} diff --git a/src/models/terms/meta/OrderConstraint.java b/src/models/terms/meta/OrderConstraint.java new file mode 100644 index 0000000..74824a7 --- /dev/null +++ b/src/models/terms/meta/OrderConstraint.java @@ -0,0 +1,12 @@ +package models.terms.meta; + +public enum OrderConstraint { + + EQ, + LT, + LE, + GT, + GE, + ANY; + +} diff --git a/src/models/terms/meta/OrderVariableConstraint.java b/src/models/terms/meta/OrderVariableConstraint.java new file mode 100644 index 0000000..41c7bd3 --- /dev/null +++ b/src/models/terms/meta/OrderVariableConstraint.java @@ -0,0 +1,58 @@ +package models.terms.meta; + +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class OrderVariableConstraint { + + // lower <= x <= upper + private int upper = 100000000; + private int lower = -1; + private boolean isOk = true; + + public boolean setConstraint(int value, OrderConstraint constraint) { + switch (constraint) { + case ANY: + return true; + case EQ: + return setEq(value); + case GE: + return setUpper(value); + case GT: + return setUpper(value - 1); + case LE: + return setLower(value); + case LT: + return setLower(value + 1); + } + return false; + } + + public boolean isOk() { + return isOk; + } + + + private boolean setEq(int eq) { + return setUpper(eq) && setLower(eq); + } + + private boolean setUpper(int upper) { + if (isOk && this.lower <= upper && upper <= this.upper) { + this.upper = upper; + return true; + } + isOk = false; + return false; + } + + private boolean setLower(int lower) { + if (isOk && this.lower <= lower && lower <= this.upper) { + this.lower = lower; + return true; + } + isOk = false; + return false; + } + +} diff --git a/src/tests/LinearRightNormalTest.java b/src/tests/LinearRightNormalTest.java index 498fa3a..e9291ce 100644 --- a/src/tests/LinearRightNormalTest.java +++ b/src/tests/LinearRightNormalTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.Test; -import models.EvaluatableTerm; -import models.ResourceVariable; import models.algebra.Type; import models.dataConstraintModel.DataConstraintModel; +import models.terms.EvaluatableTerm; +import models.terms.ResourceVariable; public class LinearRightNormalTest { diff --git a/src/tests/meta/MetaResourceVariableTest.java b/src/tests/meta/MetaResourceVariableTest.java index 2afdb18..2e258e0 100644 --- a/src/tests/meta/MetaResourceVariableTest.java +++ b/src/tests/meta/MetaResourceVariableTest.java @@ -5,16 +5,16 @@ import org.junit.jupiter.api.Test; -import models.Dependency; -import models.DependencyTerm; -import models.ResourceVariable; import models.algebra.Variable; -import models.meta.MetaDependencyTermVariable; -import models.meta.MetaDependencyVariable; -import models.meta.MetaEvaluatableTermVariable; -import models.meta.MetaRDLTermVariable; -import models.meta.MetaResourceVariable; -import models.meta.OrderConstraint; +import models.terms.Dependency; +import models.terms.DependencyTerm; +import models.terms.ResourceVariable; +import models.terms.meta.MetaDependencyTermVariable; +import models.terms.meta.MetaDependencyVariable; +import models.terms.meta.MetaEvaluatableTermVariable; +import models.terms.meta.MetaRDLTermVariable; +import models.terms.meta.MetaResourceVariable; +import models.terms.meta.OrderConstraint; public class MetaResourceVariableTest {