Add method to get sub-functions from patterns
This commit is contained in:
parent
591813402d
commit
ba468d199a
|
@ -2,9 +2,11 @@ package it.cavallium.warppi.math.rules.dsl;
|
|||
|
||||
import it.cavallium.warppi.math.Function;
|
||||
import it.cavallium.warppi.math.MathContext;
|
||||
import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Recognizes and generates functions of some specific shape.
|
||||
|
@ -27,4 +29,10 @@ public interface Pattern {
|
|||
* @return The resulting function.
|
||||
*/
|
||||
Function replace(MathContext mathContext, Map<String, Function> subFunctions);
|
||||
|
||||
/**
|
||||
* @return The (possibly empty) <code>Set</code> of all sub-function patterns
|
||||
* found within this pattern and its children.
|
||||
*/
|
||||
Set<SubFunctionPattern> getSubFunctions();
|
||||
}
|
||||
|
|
|
@ -3,10 +3,10 @@ package it.cavallium.warppi.math.rules.dsl;
|
|||
import it.cavallium.warppi.math.Function;
|
||||
import it.cavallium.warppi.math.FunctionOperator;
|
||||
import it.cavallium.warppi.math.functions.Subtraction;
|
||||
import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Contains helper methods which are useful for writing patterns.
|
||||
|
@ -71,4 +71,17 @@ public class PatternUtils {
|
|||
.flatMap(match2 -> mergeMatches(match1, match2))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gathers all sub-function patterns from multiple patterns.
|
||||
*
|
||||
* @param patterns The patterns from which sub-functions are gathered.
|
||||
* @return The union of the return values of {@link Pattern#getSubFunctions()} for each pattern.
|
||||
*/
|
||||
public static Set<SubFunctionPattern> getSubFunctionsFrom(final Pattern... patterns) {
|
||||
return Arrays.stream(patterns)
|
||||
.map(Pattern::getSubFunctions)
|
||||
.flatMap(Set::stream)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the arccosine of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class ArcCosinePattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof ArcCosinePattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the arcsine of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class ArcSinePattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof ArcSinePattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the arctangent of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class ArcTangentPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof ArcTangentPattern)) {
|
||||
|
|
|
@ -5,10 +5,7 @@ import it.cavallium.warppi.math.MathContext;
|
|||
import it.cavallium.warppi.math.functions.Variable;
|
||||
import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Matches and generates a specific symbolic constant.
|
||||
|
@ -35,6 +32,11 @@ public class ConstantPattern extends VisitorPattern {
|
|||
return new Variable(mathContext, symbol, Variable.V_TYPE.CONSTANT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof ConstantPattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the cosine of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class CosinePattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof CosinePattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a division of two other patterns.
|
||||
|
@ -37,6 +38,11 @@ public class DivisionPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(dividend, divisor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof DivisionPattern)) {
|
||||
|
|
|
@ -11,6 +11,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates an equation of two other patterns.
|
||||
|
@ -38,6 +39,11 @@ public class EquationPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(left, right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof EquationPattern)) {
|
||||
|
|
|
@ -7,10 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern;
|
|||
import it.cavallium.warppi.math.rules.dsl.PatternUtils;
|
||||
import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Matches and generates a system of equations of multiple other patterns.
|
||||
|
@ -48,6 +45,11 @@ public class EquationsSystemPattern extends VisitorPattern {
|
|||
return new EquationsSystem(mathContext, functions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(patterns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof EquationsSystemPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a logarithm of base and argument patterns.
|
||||
|
@ -37,6 +38,11 @@ public class LogarithmPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(base, argument);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof LogarithmPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a multiplication of two other patterns.
|
||||
|
@ -37,6 +38,11 @@ public class MultiplicationPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(left, right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof MultiplicationPattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the negative of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class NegativePattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return inner.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof NegativePattern)) {
|
||||
|
|
|
@ -6,10 +6,7 @@ import it.cavallium.warppi.math.functions.Number;
|
|||
import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Matches and generates a specific number.
|
||||
|
@ -35,6 +32,11 @@ public class NumberPattern extends VisitorPattern {
|
|||
return new Number(mathContext, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof NumberPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a power (exponentiation) of base and exponent patterns.
|
||||
|
@ -37,6 +38,11 @@ public class PowerPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(base, exponent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof PowerPattern)) {
|
||||
|
|
|
@ -13,6 +13,7 @@ import java.math.BigDecimal;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a root of degree and radicand patterns.
|
||||
|
@ -51,6 +52,11 @@ public class RootPattern extends VisitorPattern {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(degree, radicand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof RootPattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the sine of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class SinePattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof SinePattern)) {
|
||||
|
|
|
@ -4,10 +4,7 @@ import it.cavallium.warppi.math.Function;
|
|||
import it.cavallium.warppi.math.MathContext;
|
||||
import it.cavallium.warppi.math.rules.dsl.Pattern;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Matches and generates any function as a named sub-function.
|
||||
|
@ -31,6 +28,11 @@ public class SubFunctionPattern implements Pattern {
|
|||
return subFunctions.get(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return Collections.singleton(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof SubFunctionPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a subtraction of two other patterns.
|
||||
|
@ -37,6 +38,11 @@ public class SubtractionPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(left, right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof SubtractionPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a sum of two other patterns.
|
||||
|
@ -37,6 +38,11 @@ public class SumPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(left, right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof SumPattern)) {
|
||||
|
|
|
@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates a sum/subtraction (±) of two other patterns.
|
||||
|
@ -37,6 +38,11 @@ public class SumSubtractionPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return PatternUtils.getSubFunctionsFrom(left, right);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof SumSubtractionPattern)) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Matches and generates the tangent of another pattern.
|
||||
|
@ -33,6 +34,11 @@ public class TangentPattern extends VisitorPattern {
|
|||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return argument.getSubFunctions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (!(o instanceof TangentPattern)) {
|
||||
|
|
|
@ -5,9 +5,7 @@ import it.cavallium.warppi.math.MathContext;
|
|||
import it.cavallium.warppi.math.functions.Undefined;
|
||||
import it.cavallium.warppi.math.rules.dsl.VisitorPattern;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Matches and generates <code>Undefined</code>.
|
||||
|
@ -23,6 +21,11 @@ public class UndefinedPattern extends VisitorPattern {
|
|||
return new Undefined(mathContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<SubFunctionPattern> getSubFunctions() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
return o instanceof UndefinedPattern;
|
||||
|
|
Loading…
Reference in New Issue
Block a user