Skip to content

Commit

Permalink
Cleaned up the code
Browse files Browse the repository at this point in the history
  • Loading branch information
jtmaxwell3 committed Feb 17, 2025
1 parent f560297 commit 998bb8a
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 59 deletions.
2 changes: 1 addition & 1 deletion src/SIL.Machine/FiniteState/Fst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ out IEnumerable<FstResult<TData, TOffset>> results
}
else if (_registerCount > 0)
{
traversalMethod = new LazyNondeterministicFsaTraversalMethod<TData, TOffset>(
traversalMethod = new TwoPassNondeterministicFsaTraversalMethod<TData, TOffset>(
this,
data,
varBindings,
Expand Down
41 changes: 25 additions & 16 deletions src/SIL.Machine/FiniteState/TraversalMethodBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,17 @@ internal abstract class TraversalMethodBase<TData, TOffset, TInst> : ITraversalM
private readonly IDictionary<TInst, IList<CommandUpdate>> _commandUpdates;
private readonly IDictionary<TInst, IList<TraverseOutput>> _outputs;
private readonly TInst _finalInst;
private readonly Register<TOffset> _emptyRegister;
private readonly bool _canonicalizeOptionalAnnotations;

protected TraversalMethodBase(
Fst<TData, TOffset> fst,
TData data,
VariableBindings varBindings,
bool startAnchor,
bool endAnchor,
bool useDefaults
bool useDefaults,
bool canonicalizeOptionalAnnotations = false
)
{
_fst = fst;
Expand Down Expand Up @@ -70,6 +73,8 @@ bool useDefaults
_commandUpdates = new Dictionary<TInst, IList<CommandUpdate>>();
_outputs = new Dictionary<TInst, IList<TraverseOutput>>();
_finalInst = CreateInstance();
_emptyRegister = new Register<TOffset>();
_canonicalizeOptionalAnnotations = canonicalizeOptionalAnnotations;
}

private int CompareAnnotations(Annotation<TOffset> x, Annotation<TOffset> y)
Expand Down Expand Up @@ -116,7 +121,8 @@ public CommandUpdate(
Arc<TData, TOffset> arc,
IEnumerable<TagMapCommand> cmds,
Register<TOffset> start,
Register<TOffset> end)
Register<TOffset> end
)
{
Source = source;
Arc = arc;
Expand Down Expand Up @@ -201,7 +207,7 @@ Arc<TData, TOffset> arc
{
if (arc.Target.IsAccepting && (!_endAnchor || inst.AnnotationIndex == _annotations.Count))
{
RecordCommands(inst, arc, arc.Target.Finishers, new Register<TOffset>(), new Register<TOffset>(), _finalInst);
RecordCommands(inst, arc, arc.Target.Finishers, _emptyRegister, _emptyRegister, _finalInst);
}
}

Expand Down Expand Up @@ -247,7 +253,7 @@ IList<int> priorities
Annotation<TOffset> ann =
annIndex < _annotations.Count ? _annotations[annIndex] : _data.Annotations.GetEnd(_fst.Direction);
var matchRegisters = (Register<TOffset>[,])registers.Clone();
ExecuteCommands(matchRegisters, arc.Target.Finishers, new Register<TOffset>(), new Register<TOffset>());
ExecuteCommands(matchRegisters, arc.Target.Finishers, _emptyRegister, _emptyRegister);
if (arc.Target.AcceptInfos.Count > 0)
{
foreach (AcceptInfo<TData, TOffset> acceptInfo in arc.Target.AcceptInfos)
Expand Down Expand Up @@ -468,7 +474,7 @@ protected IEnumerable<TInst> Initialize(
startInst.Registers[i, j] = registers[i, j];
}

ExecuteCommands(registers, cmds, new Register<TOffset>(offset, true), new Register<TOffset>());
ExecuteCommands(registers, cmds, new Register<TOffset>(offset, true), _emptyRegister);

for (
;
Expand All @@ -486,7 +492,7 @@ protected IEnumerable<TInst> Initialize(
inst.VariableBindings = _varBindings != null ? _varBindings.Clone() : new VariableBindings();
insts.Add(inst);
initAnns.Add(annIndex);
RecordCommands(startInst, null, cmds, new Register<TOffset>(offset, true), new Register<TOffset>(), inst);
RecordCommands(startInst, null, cmds, new Register<TOffset>(offset, true), _emptyRegister, inst);
}
}

Expand Down Expand Up @@ -537,19 +543,22 @@ protected IEnumerable<TInst> Advance(
TInst ti = CopyInstance(source);
ti.AnnotationIndex = i;
if (curResults == null)
RecordCommands(source, arc, null, new Register<TOffset>(), new Register<TOffset>(), ti);
RecordCommands(source, arc, null, _emptyRegister, _emptyRegister, ti);
HashSet<FeatureStruct> nextOptionalFeatureStructs = null;
FeatureStruct annFS = null;
nextOptionalFeatureStructs = new HashSet<FeatureStruct>(FreezableEqualityComparer<FeatureStruct>.Default);
if (optionalFeatureStructs != null)
nextOptionalFeatureStructs.AddRange(optionalFeatureStructs);
if (!_frozenAnnotationFS.ContainsKey(i))
if (_canonicalizeOptionalAnnotations)
{
_frozenAnnotationFS[i] = _annotations[i].FeatureStruct.Clone();
_frozenAnnotationFS[i].Freeze();
nextOptionalFeatureStructs = new HashSet<FeatureStruct>(FreezableEqualityComparer<FeatureStruct>.Default);
if (optionalFeatureStructs != null)
nextOptionalFeatureStructs.AddRange(optionalFeatureStructs);
if (!_frozenAnnotationFS.ContainsKey(i))
{
_frozenAnnotationFS[i] = _annotations[i].FeatureStruct.Clone();
_frozenAnnotationFS[i].Freeze();
}
annFS = _frozenAnnotationFS[i];
nextOptionalFeatureStructs.Add(annFS);
}
annFS = _frozenAnnotationFS[i];
nextOptionalFeatureStructs.Add(annFS);
foreach (TInst ni in Advance(ti, varBindings, arc, curResults, true, nextOptionalFeatureStructs))
{
yield return ni;
Expand Down Expand Up @@ -615,7 +624,7 @@ protected IEnumerable<TInst> Advance(
if (varBindings != null)
inst.VariableBindings = cloneOutputs ? varBindings.Clone() : varBindings;
if (curResults == null)
RecordCommands(inst, null, null, new Register<TOffset>(), new Register<TOffset>(), ni);
RecordCommands(inst, null, null, _emptyRegister, _emptyRegister, ni);
yield return ni;
cloneOutputs = true;
first = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@

namespace SIL.Machine.FiniteState
{
internal class LazyNondeterministicFsaTraversalMethod<TData, TOffset>
internal class TwoPassNondeterministicFsaTraversalMethod<TData, TOffset>
: TraversalMethodBase<TData, TOffset, NondeterministicFsaTraversalInstance<TData, TOffset>>
where TData : IAnnotatedData<TOffset>
{
public LazyNondeterministicFsaTraversalMethod(
public TwoPassNondeterministicFsaTraversalMethod(
Fst<TData, TOffset> fst,
TData data,
VariableBindings varBindings,
bool startAnchor,
bool endAnchor,
bool useDefaults
)
: base(fst, data, varBindings, startAnchor, endAnchor, useDefaults) { }
: base(fst, data, varBindings, startAnchor, endAnchor, useDefaults, true) { }

public override IEnumerable<FstResult<TData, TOffset>> Traverse(
ref int annIndex,
Expand All @@ -38,45 +38,29 @@ ISet<int> initAnns
var curResults = new List<FstResult<TData, TOffset>>();
var traversed = new Dictionary<
Tuple<State<TData, TOffset>, int, VariableBindings>,
NondeterministicFsaTraversalInstance<TData, TOffset>>
NondeterministicFsaTraversalInstance<TData, TOffset>
>(
AnonymousEqualityComparer.Create<Tuple<State<TData, TOffset>, int, VariableBindings>>
(
AnonymousEqualityComparer.Create<Tuple<State<TData, TOffset>, int, VariableBindings>>
(
KeyEquals,
KeyGetHashCode
)
);
KeyEquals,
KeyGetHashCode
)
);
while (instStack.Count != 0)
{
NondeterministicFsaTraversalInstance<TData, TOffset> inst = instStack.Pop();

bool releaseInstance = true;
VariableBindings varBindings = null;
int i = 0;
foreach (Arc<TData, TOffset> arc in inst.State.Arcs)
{
bool isInstReusable = true;
if (arc.Input.IsEpsilon)
{
if (!inst.Visited.Contains(arc.Target))
{
NondeterministicFsaTraversalInstance<TData, TOffset> ti;
if (isInstReusable)
{
ti = inst;
}
else
{
ti = CopyInstance(inst);
if (inst.VariableBindings != null && varBindings == null)
varBindings = inst.VariableBindings.Clone();
ti.VariableBindings = varBindings;
RecordCommands(inst, null, null, new Register<TOffset>(), new Register<TOffset>(), ti);
}

ti.Visited.Add(arc.Target);
inst.Visited.Add(arc.Target);
NondeterministicFsaTraversalInstance<TData, TOffset> newInst = EpsilonAdvance(
ti,
inst,
arc,
null
);
Expand All @@ -94,25 +78,18 @@ ISet<int> initAnns
instStack.Push(newInst);
traversed[key] = newInst;
}
if (isInstReusable)
releaseInstance = false;
varBindings = null;
}
}
else
{
if (inst.VariableBindings != null && varBindings == null)
varBindings = isInstReusable ? inst.VariableBindings : inst.VariableBindings.Clone();
varBindings = inst.VariableBindings;
if (CheckInputMatch(arc, inst.AnnotationIndex, varBindings))
{
NondeterministicFsaTraversalInstance<TData, TOffset> ti = isInstReusable
? inst
: CopyInstance(inst);
RecordCommands(inst, null, null, new Register<TOffset>(), new Register<TOffset>(), ti);

foreach (
NondeterministicFsaTraversalInstance<TData, TOffset> newInst in Advance(
ti,
inst,
varBindings,
arc,
null
Expand All @@ -135,16 +112,11 @@ NondeterministicFsaTraversalInstance<TData, TOffset> newInst in Advance(
traversed[key] = newInst;
}
}
if (isInstReusable)
releaseInstance = false;
varBindings = null;
}
}
i++;
}

if (releaseInstance)
ReleaseInstance(inst);
}

GetFstResults(curResults);
Expand Down

0 comments on commit 998bb8a

Please # to comment.