public void Run() { try { // add SI again in C.I if (1) it was not removed (2) is is not running (by some other reason) -- but this test does not apply to atomic intentions --, and (3) this wait was not dropped if (c.RemovePendingIntention(sEvt) == si && (si.IsAtomic() || !c.HasRunningIntention(si)) && !dropped) { if (stopByTimeout && (te != null || formula != null) && elapsedTimeTerm == null) { // fail the .wait by timeout if (si.IsSuspended()) { // if the intention was suspended by .suspend IPlanBody body = si.Peek().GetPlan().GetBody(); body.Add(1, new PlanBodyImpl(BodyType.Body_Type.internalAction, new InternalActionLiteral(".fail"))); c.AddPendingIntention(SuspendStdLib.SUSPENDED_INT + si.GetID(), si); } else { rs.GenerateDesireDeletion(si, (List <ITerm>)JasonityException.CreateBasicErrorAnnots("wait_timeout", "timeout in .wait")); } } else if (!si.IsFinished()) { si.Peek().RemoveCurrentStep(); if (elapsedTimeTerm != null) { long elapsedTime = DateTime.Now.Millisecond - startTime; //long elapsedTime = System.currentTimeMillis() - startTime; un.Unifies(elapsedTimeTerm, new NumberTermImpl(elapsedTime)); } if (si.IsSuspended()) { // if the intention was suspended by .suspend c.AddPendingIntention(SuspendStdLib.SUSPENDED_INT + si.GetID(), si); } else { c.ResumeIntention(si); } } } } catch (Exception e) { //rs.getLogger().log(Level.SEVERE, "Error at .wait thread", e); } }
public void FindDesireAndDrop(Reasoner rs, Literal l, Unifier un) { Trigger g = new Trigger(TEOperator.add, TEType.achieve, l); Circumstance C = rs.GetCircumstance(); Unifier bak = un.Clone(); IEnumerator <Intention> itinit = C.GetRunningIntentionsPlusAtomic(); while (itinit.MoveNext()) { Intention i = itinit.Current; if (DropDesire(i, g, rs, un) > 1) { C.DropRunningIntention(i); un = bak.Clone(); } } // dropping the current intention? DropDesire(C.GetSelectedIntention(), g, rs, un); un = bak.Clone(); //dropping G in Events IEnumerator <Event> ie = C.GetEventsPlusAtomic(); while (ie.MoveNext()) { Event e = ie.Current; //Test in the intention Intention i = e.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemoveEvent(e); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } else { //Test in the event Trigger t = e.GetTrigger(); if (i != Intention.emptyInt && !i.IsFinished()) { t = t.Capply(i.Peek().GetUnif()); } if (un.Unifies(g, t)) { DropDesireInEvent(rs, e, i); un = bak.Clone(); } } } //dropping G in Pending Events foreach (string ek in C.GetPendingEvents().Keys) { //Test in the intention Event e = C.GetPendingEvents()[ek]; Intention i = e.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemovePendingEvent(ek); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } else { //test in the event Trigger t = e.GetTrigger(); if (i != Intention.emptyInt && !i.IsFinished()) { t = t.Capply(i.Peek().GetUnif()); } if (un.Unifies(g, t)) { DropDesireInEvent(rs, e, i); un = bak.Clone(); } } } //Dropping from pending Actions foreach (ExecuteAction a in C.GetPendingActions().Values) { Intention i = a.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) //i was changed { C.RemovePendingAction(i.GetID()); // remove i from PA if (r == 1) // i must continue running { C.ResumeIntention(i); // and put the intention back in I } // if r > 1, the event was generated and i will be back soon un = bak.Clone(); } } //Dropping from pending intentions foreach (Intention i in C.GetPendingIntentions().Values) { int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemovePendingIntention(i.GetID()); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } } }