Add method to get sub-functions from patterns

This commit is contained in:
Riccardo Azzolini 2019-01-27 20:32:46 +01:00
parent 591813402d
commit ba468d199a
23 changed files with 150 additions and 22 deletions

View File

@ -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();
}

View File

@ -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());
}
}

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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)) {

View File

@ -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;