Skip to content

Commit

Permalink
WIP #1009 prepare some basics in patternmatching package
Browse files Browse the repository at this point in the history
  • Loading branch information
axkr committed Jun 21, 2024
1 parent b96f8dd commit 771e71e
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1625,42 +1625,8 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority,

determinePatternsRecursive(patternIndexMap, (IAST) lhsPatternExpr, priority,
ruleWithoutPattern, 1);
int size = patternIndexMap.size();
switch (size) {
case 1:
PatternMap1 patternMap1 = new PatternMap1();
patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond();
return patternMap1;
case 2:
PatternMap2 patternMap2 = new PatternMap2();
patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond();
patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst();
patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond();
return patternMap2;
case 3:
PatternMap3 patternMap3 = new PatternMap3();
patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond();
patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst();
patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond();
patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst();
patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond();
return patternMap3;
}
PatternMap patternMap = new PatternMap();
patternMap.fRuleWithoutPattern = ruleWithoutPattern[0];
patternMap.fSymbolsOrPattern = new IExpr[size];
patternMap.fSymbolsOrPatternValues = new IExpr[size];
patternMap.fPatternObjects = new IPatternObject[size];
int i = 0;
for (GenericPair<IExpr, IPatternObject> entry : patternIndexMap) {
patternMap.fSymbolsOrPattern[i] = entry.getFirst();
patternMap.fPatternObjects[i] = entry.getSecond();
i++;
}
return patternMap;
boolean isRuleWithoutPattern = ruleWithoutPattern[0];
return createPatternMap(patternIndexMap, isRuleWithoutPattern);
} else if (lhsPatternExpr instanceof PatternNested) {
PatternNested pattern2 = (PatternNested) lhsPatternExpr;
// PatternMap1 patternMap1 = new PatternMap1();
Expand Down Expand Up @@ -1691,6 +1657,87 @@ static IPatternMap determinePatterns(final IExpr lhsPatternExpr, int[] priority,
return new PatternMap0();
}

public static IPatternMap createSymbolValue(
List<GenericPair<IExpr, ISymbol>> patternIndexMap) {
int size = patternIndexMap.size();
switch (size) {
case 1:
PatternMap1 patternMap1 = new PatternMap1();
patternMap1.fValue1 = patternIndexMap.get(0).getFirst();
patternMap1.fSymbol1 = patternIndexMap.get(0).getSecond();
return patternMap1;
case 2:
PatternMap2 patternMap2 = new PatternMap2();
patternMap2.fValue1 = patternIndexMap.get(0).getFirst();
patternMap2.fSymbol1 = patternIndexMap.get(0).getSecond();
patternMap2.fValue2 = patternIndexMap.get(1).getFirst();
patternMap2.fSymbol2 = patternIndexMap.get(1).getSecond();
return patternMap2;
case 3:
PatternMap3 patternMap3 = new PatternMap3();
patternMap3.fValue1 = patternIndexMap.get(0).getFirst();
patternMap3.fSymbol1 = patternIndexMap.get(0).getSecond();
patternMap3.fValue2 = patternIndexMap.get(1).getFirst();
patternMap3.fSymbol2 = patternIndexMap.get(1).getSecond();
patternMap3.fValue3 = patternIndexMap.get(2).getFirst();
patternMap3.fSymbol3 = patternIndexMap.get(2).getSecond();
return patternMap3;
}
PatternMap patternMap = new PatternMap();
patternMap.fRuleWithoutPattern = true;
patternMap.fSymbolsOrPattern = new IExpr[size];
patternMap.fSymbolsOrPatternValues = new IExpr[size];
patternMap.fPatternObjects = new IPatternObject[size];
int i = 0;
for (GenericPair<IExpr, ISymbol> entry : patternIndexMap) {
patternMap.fSymbolsOrPatternValues[i] = entry.getFirst();
patternMap.fSymbolsOrPattern[i] = entry.getSecond();
i++;
}
return patternMap;
}

public static IPatternMap createPatternMap(
List<GenericPair<IExpr, IPatternObject>> patternIndexMap,
boolean isRuleWithoutPattern) {
int size = patternIndexMap.size();
switch (size) {
case 1:
PatternMap1 patternMap1 = new PatternMap1();
patternMap1.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap1.fPatternObject1 = patternIndexMap.get(0).getSecond();
return patternMap1;
case 2:
PatternMap2 patternMap2 = new PatternMap2();
patternMap2.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap2.fPatternObject1 = patternIndexMap.get(0).getSecond();
patternMap2.fSymbol2 = patternIndexMap.get(1).getFirst();
patternMap2.fPatternObject2 = patternIndexMap.get(1).getSecond();
return patternMap2;
case 3:
PatternMap3 patternMap3 = new PatternMap3();
patternMap3.fSymbol1 = patternIndexMap.get(0).getFirst();
patternMap3.fPatternObject1 = patternIndexMap.get(0).getSecond();
patternMap3.fSymbol2 = patternIndexMap.get(1).getFirst();
patternMap3.fPatternObject2 = patternIndexMap.get(1).getSecond();
patternMap3.fSymbol3 = patternIndexMap.get(2).getFirst();
patternMap3.fPatternObject3 = patternIndexMap.get(2).getSecond();
return patternMap3;
}
PatternMap patternMap = new PatternMap();
patternMap.fRuleWithoutPattern = isRuleWithoutPattern;
patternMap.fSymbolsOrPattern = new IExpr[size];
patternMap.fSymbolsOrPatternValues = new IExpr[size];
patternMap.fPatternObjects = new IPatternObject[size];
int i = 0;
for (GenericPair<IExpr, IPatternObject> entry : patternIndexMap) {
patternMap.fSymbolsOrPattern[i] = entry.getFirst();
patternMap.fPatternObjects[i] = entry.getSecond();
i++;
}
return patternMap;
}

/**
* Determine all patterns (i.e. all objects of instance IPattern) in the given expression
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.List;
import org.matheclipse.core.basic.Config;
import org.matheclipse.core.eval.EvalEngine;
import org.matheclipse.core.eval.exception.ConditionException;
import org.matheclipse.core.eval.exception.ReturnException;
import org.matheclipse.core.expression.F;
import org.matheclipse.core.expression.S;
import org.matheclipse.core.generic.GenericPair;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IEvalStepListener;
import org.matheclipse.core.interfaces.IExpr;
Expand Down Expand Up @@ -216,6 +218,16 @@ public IExpr eval(final IExpr leftHandSide, EvalEngine engine) {
return replace(leftHandSide, engine, true);
}

public static IExpr evalInternal(final IExpr leftHandSide, final IExpr rightHandSide,
List<GenericPair<IExpr, ISymbol>> patternIndexMap) {
PatternMatcherAndEvaluator pm = new PatternMatcherAndEvaluator();
IPatternMap patternMap = IPatternMap.createSymbolValue(patternIndexMap);
pm.fPatternMap = patternMap;
pm.fRightHandSide = rightHandSide;
pm.setLHSExprToMatch(leftHandSide);
return pm.replacePatternMatch(leftHandSide, patternMap, EvalEngine.get(), true);
}

public IExpr replace(final IExpr leftHandSide, EvalEngine engine, boolean evaluate) {
IPatternMap patternMap = null;
if (isRuleWithoutPatterns()) {
Expand Down Expand Up @@ -288,7 +300,9 @@ public IExpr replacePatternMatch(final IExpr leftHandSide, IPatternMap patternMa

engine.pushOptionsStack();
try {
engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap);
if (fLhsPatternExpr != null) {
engine.setOptionsPattern(fLhsPatternExpr.topHead(), patternMap);
}
if (fRightHandSide == DUMMY_SUBSET_CASES) {
fSubstitutedMatch = patternMap.substitutePatterns(fLhsPatternExpr, F.CEmptySequence);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ public final IPatternMatcher putDownRule(final IExpr leftHandSide, final IExpr r

public final IPatternMatcher putDownRule(final int setSymbol, final boolean equalRule,
final IExpr leftHandSide, final IExpr rightHandSide) {
return putDownRule(IPatternMatcher.SET_DELAYED, false, leftHandSide, rightHandSide,
return putDownRule(setSymbol, false, leftHandSide, rightHandSide,
IPatternMap.DEFAULT_RULE_PRIORITY);
}

Expand Down

0 comments on commit 771e71e

Please sign in to comment.