private boolean manageGoal ( int agentIndex , Agent agent , Stack255 agentExecutionStack , Goal node ) { // Get the goal type for this goal GoalType gtype = ( GoalType ) GlobalState . goalTypes . find ( node . getClass ( ) . getName ( ) ) ; byte [ ] ptypes = gtype . getChildren ( ) ; assert ( ptypes != null ) ; // Clear any previous plan bindings before adding any new ones bindings . clear ( ) ; for ( int p = 0 ; p < ptypes . length ; p ++ ) { PlanType ptype = ( PlanType ) GlobalState . planTypes . get ( ptypes [ p ] ) ; try { // Create an object of this Plan type, so we can // access its context condition Plan planInstance = ( Plan ) ( ptype . getPlanClass ( ) . getConstructor ( Agent . class , Goal . class , String . class ) . newInstance ( GlobalState . agents . get ( agentIndex ) , node , "p" ) ) ; // Clear previously buffered context results if any agent . clearLastResults ( ) ; // Evaluate the context condition if ( planInstance . context ( ) ) { // Get the results of context query just performed Set < Belief > results = agent . getLastResults ( ) ; // Add the results to the bindings bindings . add ( planInstance , ( results == null ) ? null : new LinkedHashSet < Belief > ( results ) ) ; } } catch ( NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e ) { logger . error ( "Could not create plan object of type " + ptype . getClass ( ) . getName ( ) , e ) ; } } int numBindings = bindings . size ( ) ; if ( numBindings == 0 ) { // No plan options for this goal at this point in time, so move to the next agent logger . debug ( Log . logPrefix ( agent . getId ( ) ) + " has no applicable plans for goal " + gtype + " and will continue to wait indefinitely" ) ; return false ; } // Call the meta-level planning prior to plan selection agent . notifyAgentPrePlanSelection ( bindings ) ; // Pick a plan option using specified policy Plan planInstance = bindings . selectPlan ( GlobalConstant . PLAN_SELECTION_POLICY ) ; // Now push the plan on to the intention stack synchronized ( agentExecutionStack ) { logger . debug ( Log . logPrefix ( agent . getId ( ) ) + " choose an instance of plan " + planInstance . getClass ( ) . getSimpleName ( ) + " to handle goal " + node . getClass ( ) . getSimpleName ( ) ) ; agentExecutionStack . push ( planInstance ) ; } return true ; }
Manages the goal at the top of the execution stack of an agent . All relevant plans are evaluated to see if their context conditions hold . Plans deemed applicable are then added to the list of bindings from which a plan instane will be eventually selected .