private MacroTransition GetMacro() { if (Tape.IsMisaligned) { return(null); } var read = Tape.ReadPacked(); var mt = ML.GetMacro(Q, read, Tape.FacingRight); if (mt == null) { mt = MacroTransition.CreateSingleMacroTransition(Definition, Q, read, Tape.FacingRight, Tape.Macro); if (mt != null) { ML.LearnMacro(mt); } } return(mt); }
private bool MacroTransitionStep(MacroTransition t) { if (t == null) { throw new ArgumentNullException(); } if (t.Next == null) { Result.SetNonhalting("Single cell runs indefinitely: " + t.ToString(Definition)); return(false); } if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All) { Log.ForegroundColor = ConsoleColor.Yellow; Log.Write(t.ToString(Definition)); } try { if (t.EndFacingRight == null) { // transition to halting state Tape.WriteSingleInCell(t.Write, t.Direction, t.Shifts); } else { bool dir; bool whole; if (true && Options.UseMacroForwarding && t.Source == t.Next && t.StartFacingRight == t.EndFacingRight ) { if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All) { var reps = Tape.GetEqualSymbolRepetitionCount(); Log.Write("x" + reps.ToString()); } dir = t.StartFacingRight; whole = true; } else { dir = t.Direction > 0; whole = false; } if (!Tape.WritePacked(t.Write, dir, t.Shifts, whole)) { Result.SetRefusedCandidate("A cell with a virtual exponent without direct value was accessed. This operation is invalid, as it may depend on the virtual's value. (LONELY_EXPONENT_EXCEPTION)"); return(false); } } } finally { if (TmPrintOptions.PrintTransitionLevel >= PrintTransitionLevel.All) { Log.WriteLine(); Log.ResetColor(); } } Q = t.Next; return(true); }