Skip to content

Commit

Permalink
Fix logic error in EmptyEvaluateStateChangeRec.
Browse files Browse the repository at this point in the history
  • Loading branch information
homothetyhk committed Jan 9, 2023
1 parent 5ec67ff commit 914f212
Showing 1 changed file with 18 additions and 16 deletions.
34 changes: 18 additions & 16 deletions RandomizerCore/Logic/DNFLogicDef.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ internal class Clause
public readonly int[] stateLogic;
public readonly int stateProvider;
private DNFLogicDef? parent;
private LogicManager lm => parent.lm;

public Clause(int[] logic, int[] stateLogic, int stateProvider)
{
Expand Down Expand Up @@ -89,7 +90,7 @@ public bool EvaluateStateChange(ProgressionManager pm, List<State> result)

private int EvaluateVariable(int id, ProgressionManager pm)
{
return pm.lm.GetVariable(id) switch
return lm.GetVariable(id) switch
{
LogicInt li => li.GetValue(parent, pm),
_ => 0,
Expand Down Expand Up @@ -124,7 +125,7 @@ private bool EvaluateStateDiscardRec(int i, ProgressionManager pm, LazyStateBuil
int id = stateLogic[i];
if (id < -99)
{
foreach (LazyStateBuilder lsb2 in ((StateModifier)pm.lm.GetVariable(id)).ModifyState(parent, pm, lsb))
foreach (LazyStateBuilder lsb2 in ((StateModifier)lm.GetVariable(id)).ModifyState(parent, pm, lsb))
{
if (EvaluateStateDiscardRec(i + 1, pm, lsb2)) return true;
}
Expand Down Expand Up @@ -157,7 +158,7 @@ private bool EmptyEvaluateStateDiscardRec(int i, ProgressionManager pm)
}

int id = stateLogic[i];
if (id < -99 && ((StateModifier)pm.lm.GetVariable(id)).ProvideState(parent, pm) is IEnumerable<LazyStateBuilder> lsbs)
if (id < -99 && ((StateModifier)lm.GetVariable(id)).ProvideState(parent, pm) is IEnumerable<LazyStateBuilder> lsbs)
{
foreach (LazyStateBuilder lsb2 in lsbs)
{
Expand All @@ -180,7 +181,7 @@ private void EvaluateStateChangeRec(int i, ProgressionManager pm, List<State> st
int id = stateLogic[i];
if (id < -99)
{
foreach (LazyStateBuilder lsb2 in ((StateModifier)pm.lm.GetVariable(id)).ModifyState(parent, pm, lsb))
foreach (LazyStateBuilder lsb2 in ((StateModifier)lm.GetVariable(id)).ModifyState(parent, pm, lsb))
{
EvaluateStateChangeRec(i + 1, pm, states, lsb2);
}
Expand Down Expand Up @@ -211,21 +212,22 @@ private bool EmptyEvaluateStateChangeRec(int i, ProgressionManager pm, List<Stat
}

int id = stateLogic[i];
if (((StateModifier)pm.lm.GetVariable(id)).ProvideState(null, pm) is IEnumerable<LazyStateBuilder> lsbs)
if (((StateModifier)lm.GetVariable(id)).ProvideState(null, pm) is IEnumerable<LazyStateBuilder> lsbs)
{
foreach (LazyStateBuilder lsb2 in lsbs)
{
EvaluateStateChangeRec(i, pm, states, lsb2);
}
return EmptyEvaluateStateChangeRec(i + 1, pm, states);
}
return EmptyEvaluateStateChangeRec(i + 1, pm, states);
return false;
}

private int EvaluateStateVariable(int id, ProgressionManager pm, LazyStateBuilder state)
{
if (id >= 0) return pm.Get(id);

return pm.lm.GetVariable(id) switch
return lm.GetVariable(id) switch
{
LogicInt li => li.GetValue(parent, pm),
StateAccessVariable sav => sav.GetValue(parent, pm, state),
Expand All @@ -240,15 +242,15 @@ private int EvaluateStateVariable(int id, ProgressionManager pm, LazyStateBuilde
case >= 0:
return pm.GetState(stateProvider);
case <= LogicManager.intVariableOffset:
if (pm.lm.GetVariable(stateProvider) is StateProvider spv) return spv.GetInputState(parent, pm);
if (lm.GetVariable(stateProvider) is StateProvider spv) return spv.GetInputState(parent, pm);
break;
}
return null;
}

public bool EvaluateClause(ProgressionManager pm) => EvaluateLogic(pm) && EvaluateStateDiscard(pm);

public IEnumerable<Term> GetTerms(LogicManager lm)
public IEnumerable<Term> GetTerms()
{
for (int i = 0; i < logic.Length; i++)
{
Expand Down Expand Up @@ -336,7 +338,7 @@ private static TermToken ConvertToken(LogicManager lm, int[] arr, ref int i)
}
}

public IEnumerable<TermToken> ToTermTokenSequence(LogicManager lm)
public IEnumerable<TermToken> ToTermTokenSequence()
{
for (int i = 0; i < logic.Length; i++)
{
Expand All @@ -348,7 +350,7 @@ public IEnumerable<TermToken> ToTermTokenSequence(LogicManager lm)
}
}

public IEnumerable<LogicToken> ToTokenSequence(LogicManager lm) => RPN.OperateOver(ToTermTokenSequence(lm), OperatorToken.AND);
public IEnumerable<LogicToken> ToTokenSequence() => RPN.OperateOver(ToTermTokenSequence(), OperatorToken.AND);
}

internal DNFLogicDef(Clause[] clauses, LogicManager lm, string name, string infixSource) : base(name, infixSource)
Expand Down Expand Up @@ -390,7 +392,7 @@ private void CreateTermClauseLookup()
termClauseLookup = new();
foreach (Clause c in clauses)
{
foreach (Term t in c.GetTerms(lm))
foreach (Term t in c.GetTerms())
{
if (!termClauseLookup.TryGetValue(t, out List<Clause> cs))
{
Expand Down Expand Up @@ -435,7 +437,7 @@ public override bool CheckForUpdatedState(ProgressionManager pm, StateUnion curr
{
for (int j = 0; j < clauses.Length; j++)
{
if (clauses[j].EvaluateClause(pm)) return clauses[j].ToTermTokenSequence(lm);
if (clauses[j].EvaluateClause(pm)) return clauses[j].ToTermTokenSequence();
}
return null;
}
Expand All @@ -444,18 +446,18 @@ public IEnumerable<IEnumerable<TermToken>> GetAllSuccessfulConjunctions(Progress
{
for (int j = 0; j < clauses.Length; j++)
{
if (clauses[j].EvaluateClause(pm)) yield return clauses[j].ToTermTokenSequence(lm);
if (clauses[j].EvaluateClause(pm)) yield return clauses[j].ToTermTokenSequence();
}
}

public override IEnumerable<LogicToken> ToTokenSequence()
{
return RPN.OperateOver(Enumerable.Range(0, clauses.Length).Select(j => clauses[j].ToTokenSequence(lm)), OperatorToken.OR);
return RPN.OperateOver(Enumerable.Range(0, clauses.Length).Select(j => clauses[j].ToTokenSequence()), OperatorToken.OR);
}

public override IEnumerable<Term> GetTerms()
{
return clauses.SelectMany(c => c.GetTerms(lm));
return clauses.SelectMany(c => c.GetTerms());
}

// cursed hacks for deserialization into ILogicDef property type, where the converter doesn't trigger.
Expand Down

0 comments on commit 914f212

Please sign in to comment.