Files
timmy-config/allegro/goap/__pycache__/planner.cpython-312.pyc

154 lines
21 KiB
Plaintext
Raw Normal View History

2026-03-31 20:02:01 +00:00
<EFBFBD>
<00>N<EFBFBD>i<EFBFBD>H<00><00><00>dZddlZddlZddlZddlmZmZmZmZm Z m
Z
m Z ddl m Z mZddlmZddlmZmZddlmZmZmZddlmZmZmZGd <09>d
e<12>Ze d <0B> <0C>Gd <0A>d<0E><00>Ze Gd<0F>d<10><00>ZGd<11>d<12>ZGd<13>d<14>Z Gd<15>d<16>Z!Gd<17>d<18>Z"e <20>Z#e$dk(<00>r^e%d<1A>ddlm&Z&ddlm'Z'm(Z(e&<26>Z)dddd d!d"d#d$<24>iZ*e%d%e)jV<00><00><02>e%d&e)jYe*<2A>d'<27><04><02>e%d(e)j[<00><00><00><02>e%d)<29>ej<00>Z.e#j_e)e*<2A>Z/ej<00>e.z
Z0e/rse%d*e0d+<2B>d,<2C><03>e%d-e1e/j(<00><00><00><02>e%d.e/jd<00><00><02>e3e/j(<00>D] \Z4Z5e%d/e4d0z<00>d1e5jV<00><00><04><00>"ne%d2<64>e%d3<64>e%ejle#jo<00>d"<22>4<EFBFBD><00>yy)5z|
GOAP Planner Module - Allegro-Primus Child Autonomy System
A* search-based planning for action sequences to achieve goals.
<EFBFBD>N)<07>Dict<63>List<73>Optional<61>Set<65>Tuple<6C>Any<6E>Callable)<02> dataclass<73>field)<01>deepcopy)<02>Enum<75>auto)<03>Action<6F> ActionLibrary<72>action_library)<03>Goal<61> GoalManager<65> goal_managerc<00>V<00>eZdZdZe<04>Ze<04>Ze<04>Ze<04>Ze<04>Z y)<03>
PlanStatuszStatus of a planN)
<EFBFBD>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r<00>PENDING<4E> IN_PROGRESS<53> COMPLETED<45>FAILED<45> CANCELLED<45><00><00>/root/allegro/goap/planner.pyrrs(<00><00><1A><12>f<EFBFBD>G<EFBFBD><16>&<26>K<EFBFBD><14><06>I<EFBFBD> <11>V<EFBFBD>F<EFBFBD><14><06>Ir!rT)<01>orderc<00><><00>eZdZUdZeed<ed<03><04>Zeed<ed<03><04>Zeed<ed<03><04>Z e
ed<edd<08> <09>Z e e ed
<edd<08> <09>Ze ded <edd <0C> <09>Zeed <d<0E>Zd<0F>Zy)<10>PlanNodezNode in the planning graph<70>f_scoreF)<01>compare<72>g_score<72>h_score<72> world_stateN)r'<00>default<6C>action<6F>parentr<00>depthc<00>`<00>ttj|jdt<00><02><00>S)NT<4E><02> sort_keysr+)<05>hash<73>json<6F>dumpsr*<00>str<74><01>selfs r"<00>__hash__zPlanNode.__hash__'s <00><00><13>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>/<2F>/<2F>4<EFBFBD><13>M<>N<>Nr!c<00><><00>t|t<00>rMtj|jdt
<00><02>tj|jdt
<00><02>k(Sy)NTr0F)<06>
isinstancer%r3r4r*r5)r7<00>others r"<00>__eq__zPlanNode.__eq__+sG<00><00> <15>e<EFBFBD>X<EFBFBD> &<26><17>:<3A>:<3A>d<EFBFBD>.<2E>.<2E>$<24><03>L<><17>:<3A>:<3A>e<EFBFBD>/<2F>/<2F>4<EFBFBD><13>M<>N<01> N<01>r!)rrrr<00>float<61>__annotations__r r(r)r*rr,rrr-r.<00>intr8r<r r!r"r%r%s<00><00>$<24> <12>N<EFBFBD><1A>5<EFBFBD>)<29>G<EFBFBD>U<EFBFBD>)<29><1A>5<EFBFBD>)<29>G<EFBFBD>U<EFBFBD>)<29><1D>e<EFBFBD>,<2C>K<EFBFBD><14>,<2C>$<24>U<EFBFBD>D<EFBFBD>A<>F<EFBFBD>H<EFBFBD>V<EFBFBD> <1C>A<>#(<28><15><04>#E<>F<EFBFBD>H<EFBFBD>Z<EFBFBD> <20>E<><16>u<EFBFBD>a<EFBFBD>0<>E<EFBFBD>3<EFBFBD>0<>O<01>r!r%c<00><00>eZdZUdZeed<eeed<eed<eed<e jZ e ed<e e j<00><07>Zeed<d Zeeed
<d Zeeed <e e<12><07>Zeeed <d <0A>Zedefd<0F><04>Zdefd<10>Zy )<11>PlanzAn action plan<61>goal<61>actions<6E>estimated_cost<73>estimated_duration<6F>status)<01>default_factory<72>
created_atN<EFBFBD>
started_at<EFBFBD> completed_at<61>execution_tracec<00>,<00>t|j<00>S<00>N)<02>lenrCr6s r"<00>__len__z Plan.__len__?s<00><00><12>4<EFBFBD><<3C><<3C> <20> r!<00>returnc<00>f<00>|jr%|jr|j|jz
Sy)z Get plan duration (if completed)<29>)rJrIr6s r"<00>durationz Plan.durationBs+<00><00> <10> <1C> <1C><14><1F><1F><17>$<24>$<24>t<EFBFBD><EFBFBD><EFBFBD>6<> 6<>r!c <00>X<00>|jjt|j<00>|jD<00>cgc]}|j<00><02>c}|j|j
|j j|j|j|j|jd<01>
Scc}w)N)
rB<00> action_countrCrDrErFrHrIrJrS) rB<00>namerNrCrDrErFrHrIrJrS)r7<00>as r"<00>to_dictz Plan.to_dictIs{<00><00><18>I<EFBFBD>I<EFBFBD>N<EFBFBD>N<EFBFBD><1F><04> <0C> <0C>-<2D>(,<2C> <0C> <0C>5<>1<EFBFBD><01><06><06>5<>"<22>1<>1<>"&<26>"9<>"9<><1A>k<EFBFBD>k<EFBFBD>&<26>&<26><1E>/<2F>/<2F><1E>/<2F>/<2F> <20>-<2D>-<2D><1C> <0A> <0A> 
<EFBFBD>
<EFBFBD><EFBFBD>6s<00>B')rrrrrr>rrr=rrrFr <00>timerHrIrrJ<00>listrKrrO<00>propertyrSrXr r!r"rArA2s<><00><00><18>
<0E>J<EFBFBD> <11>&<26>\<5C><19><19><19><1D><1D>#<23>+<2B>+<2B>F<EFBFBD>J<EFBFBD>+<2B><1D>d<EFBFBD>i<EFBFBD>i<EFBFBD>8<>J<EFBFBD><05>8<>"&<26>J<EFBFBD><08><15><0F>&<26>$(<28>L<EFBFBD>(<28>5<EFBFBD>/<2F>(<28>"'<27><04>"=<3D>O<EFBFBD>T<EFBFBD>$<24>Z<EFBFBD>=<3D>!<21><0E><13>%<25><13><0E><13> 
<EFBFBD><14> 
r!rAc<00>V<00>eZdZdZedeeefdede fd<05><04>Z
edededefd<08><04>Z y )
<EFBFBD>HeuristicCalculatorz+Calculates heuristic estimates for planningr*rBrPc<00><00>|j<00>}|syd}d}|j<00>D]<5D>\}}tj||<05>}|<07>|dz }n<>t |t
t f<02>rRt |t
t f<02>r<|dk7r*t||z
<00>t|<06>z }|td|<08>z }nR||dk(rdndz }nEt |t<00>r |||k(rdndz }n(t |ttf<02>r |||k(rdndz }n|dz }|dz }<04><>|td|<04>z S)zx
Calculate estimated distance to goal.
Returns value between 0 (at goal) and 1 (far from goal).
rRrg<00>?g<00>?<3F>) <0A>get_desired_state<74>itemsr]<00>_get_nested_valuer:r?r=<00>abs<62>min<69>boolrZr5<00>max) r*rB<00>desired<65>total_distance<63>count<6E>key<65> target_value<75> actual_value<75>diffs r"<00>distance_to_goalz$HeuristicCalculator.distance_to_goal[s$<00><00> <17>(<28>(<28>*<2A><07><16><16><1C><0E><11><05>!(<28><1D><1D><1F> <17> <1D>C<EFBFBD><1C>.<2E>@<40>@<40><1B>c<EFBFBD>R<>L<EFBFBD><1B>#<23><1E>#<23>%<25><0E><1B>L<EFBFBD>3<EFBFBD><05>,<2C>7<>J<EFBFBD>|<7C>VY<56>[`<60>Ua<55><b<><1F>1<EFBFBD>$<24><1E>|<7C>l<EFBFBD>:<3A>;<3B>c<EFBFBD>,<2C>>O<>O<>D<EFBFBD>"<22>c<EFBFBD>#<23>t<EFBFBD>n<EFBFBD>4<>N<EFBFBD>"<22>\<5C>Q<EFBFBD>-><3E>c<EFBFBD>C<EFBFBD>G<>N<EFBFBD><1B>L<EFBFBD>$<24>/<2F><1E><1C><1C>)E<>#<23>3<EFBFBD>N<><0E><1B>L<EFBFBD>4<EFBFBD><13>+<2B>6<><1E><1C><1C>)E<>#<23>3<EFBFBD>N<><0E><1E>#<23>%<25><0E> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD>+ <17>.<1E><03>A<EFBFBD>u<EFBFBD> <0A>-<2D>-r!<00>drjc<00><><00>|jd<01>}|}|D]%}t|t<00>r|j|<04>}<03>%y|S)z-Get value from nested dict using dot notation<6F>.N)<04>splitr:<00>dict<63>get)rorj<00>keys<79>value<75>ks r"rbz%HeuristicCalculator._get_nested_value<75>sF<00><00><13>y<EFBFBD>y<EFBFBD><13>~<7E><04><11><05><15> <1C>A<EFBFBD><19>%<25><14>&<26><1D> <09> <09>!<21> <0C><05><1B>  <1C>
<15> r!N) rrrr<00> staticmethodrr5rrr=rnrbr r!r"r]r]Xs^<00><00>5<><11>#.<2E>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>#.<2E>D<EFBFBD>#.<2E>U<EFBFBD>#.<2E><12>#.<2E>J<12> <15>T<EFBFBD> <15><03> <15><03> <15><12> r!r]c
<00><00>eZdZdZ ddedededefd<07>Z dded e e
e fd
e e e
d e efd <0C>Zded ede eeeeffded ef
d<10>Zdedefd<13>Z ddeed e e
e fde
d eefd<16>Zded e e
e fded e efd<19>Zd e fd<1A>Zy)<1E> GOAPPlannerzl
Goal-Oriented Action Planner using A* search.
Finds optimal action sequences to achieve goals.
Nr<00> max_depth<74> max_nodes<65>timeout_secondsc<00><><00>|xs
t<00>|_||_||_||_t <00>|_d|_d|_d|_ d|_
y)NrrR) rrr{r|r}r]<00> heuristic<69> plans_created<65>plans_succeeded<65>average_planning_time<6D>total_planning_time)r7rr{r|r}s r"<00>__init__zGOAPPlanner.__init__<5F>sU<00><00>-<2D>?<3F> <0A><0F><04><1B>"<22><04><0E>"<22><04><0E>.<2E><04><1C>,<2C>.<2E><04><0E><1F><04><1A> <20><04><1C>%(<28><04>"<22>#&<26><04> r!rBr*<00>forbidden_actionsrPc <00>Z<00>tj<00>}|xs
t<00>}|j|<02>dk\rt|gddtj
<00><03>St |jj||<01>d|jj||<01>t|<02>d<04><05>}d}|j||fg}t|<06>di} i}
d} |<08>r<>| |jk<00>r<>tj<00>|z
|jkDr<02>n<>tj|<08>\} } } | dz } |j| j <00>}|dk\r(|j#|| |
|<06>}|j%|d<07>|S| j&|j(k\r<01><>|j*j-<00>D]<5D>}|j.|vr<01>|j1| j <00>s<01>.|j3| j <00>}| j4|j6z}|jj||<01>}||z}t |||||| | j&dz<00><08>}t|<15>}|| vr | ||kr<01><>|| |<t| <0A>|f|
|<|dz }tj8||||f<03><00><>|r| |jkr<02><01><>|j%|d <09>y
) z<>
Create a plan to achieve the goal from the current world state.
Uses A* search to find optimal action sequence.
gffffff<66>?rR)rBrCrDrErFr)r&r(r)r*r.r_T)r&r(r)r*r,r-r.FN)rY<00>set<65>evaluaterArrr%rrnr r&r2r|r}<00>heapq<70>heappopr*<00>_reconstruct_plan<61> _update_statsr.r{r<00>get_allrV<00>check_preconditions<6E> apply_effectsr(<00>cost<73>heappush)r7rBr*r<><00>
start_time<EFBFBD> forbidden<65> initial_node<64>counter<65>open_set<65>visited<65> came_from<6F>nodes_expanded<65>_<>current<6E>goal_satisfaction<6F>planr,<00> new_stater(r)r&<00>new_node<64> node_hashs r"r<>zGOAPPlanner.plan<61>s<><00><00><1A>Y<EFBFBD>Y<EFBFBD>[<5B>
<EFBFBD>%<25>.<2E><13><15> <09> <10>=<3D>=<3D><1B> %<25><14> -<2D><17><19><1A>"<22>#&<26>!<21>+<2B>+<2B> <0E> <0E> <20><18>N<EFBFBD>N<EFBFBD>3<>3<>K<EFBFBD><14>F<><17><18>N<EFBFBD>N<EFBFBD>3<>3<>K<EFBFBD><14>F<> <20><1B>-<2D><13> 
<EFBFBD> <0C><14><07>!<21>)<29>)<29>7<EFBFBD>L<EFBFBD>A<>B<><08>&*<2A>,<2C>%7<><13>$=<3D><07>46<34> <09><1A><0E><16>><3E>D<EFBFBD>N<EFBFBD>N<EFBFBD>:<3A><13>y<EFBFBD>y<EFBFBD>{<7B>Z<EFBFBD>'<27>$<24>*><3E>*><3E>><3E><15>"<22>M<EFBFBD>M<EFBFBD>(<28>3<>M<EFBFBD>A<EFBFBD>q<EFBFBD>'<27> <1A>a<EFBFBD> <1F>N<EFBFBD>!%<25> <0A> <0A>g<EFBFBD>.A<>.A<> B<> <1D> <20>D<EFBFBD>(<28><1B>-<2D>-<2D><18>'<27>9<EFBFBD>l<EFBFBD><12><04><15>"<22>"<22>:<3A>t<EFBFBD>4<><1B> <0B><17>}<7D>}<7D><04><0E><0E>.<2E><18><1F>-<2D>-<2D>5<>5<>7<>% G<01><06><19>;<3B>;<3B>)<29>+<2B><1C><1E>1<>1<>'<27>2E<32>2E<32>F<><1C>#<23>0<>0<><17>1D<31>1D<31>E<> <09>"<22>/<2F>/<2F>F<EFBFBD>K<EFBFBD>K<EFBFBD>7<><07><1E>.<2E>.<2E>9<>9<>)<29>T<EFBFBD>J<><07>!<21>G<EFBFBD>+<2B><07>#<23>#<23>#<23>#<23> )<29>!<21>"<22>!<21>-<2D>-<2D>!<21>+<2B><12><08>!<21><18>N<EFBFBD> <09><1D><07>'<27>G<EFBFBD>I<EFBFBD>,><3E>'<27>,I<><1C>%,<2C><07> <09>"<22>(,<2C>W<EFBFBD> <0A>v<EFBFBD>'><3E> <09>)<29>$<24><17>1<EFBFBD> <0C><07><15><0E><0E>x<EFBFBD>'<27>7<EFBFBD>H<EFBFBD>)E<>F<>K% G<01>1<17>><3E>D<EFBFBD>N<EFBFBD>N<EFBFBD>:<3A>@ <0A><1A><1A>:<3A>u<EFBFBD>-<2D>r!<00>end_noder<65><00>
start_nodec<00><><00>g}t|<02>}t|<04>}d}d} ||k7r:||vrn5||\}
} |j| <0B>|| jz }| dz } |
}||k7r<01>:|j<00>t |||| <09><03>S)z.Reconstruct action sequence from came_from maprR<00>>@<40>rBrCrDrE)r2<00>appendr<64><00>reverserA) r7rBr<>r<>r<>rC<00> current_hash<73>
start_hash<EFBFBD>
total_costrE<00> prev_hashr,s r"r<>zGOAPPlanner._reconstruct_plans<><00><00><15><07><1B>H<EFBFBD>~<7E> <0C><19>*<2A>%<25>
<EFBFBD><18>
<EFBFBD> <20><1A><1A>j<EFBFBD>(<28><1B>9<EFBFBD>,<2C><15> )<29>,<2C> 7<> <1D>I<EFBFBD>v<EFBFBD> <13>N<EFBFBD>N<EFBFBD>6<EFBFBD> "<22> <16>&<26>+<2B>+<2B> %<25>J<EFBFBD> <1E>$<24> &<26> <1E>$<24>L<EFBFBD><1B>j<EFBFBD>(<28> <10><0F><0F><19><13><15><1B>%<25>1<> 
<EFBFBD>
r!r<><00> succeededc<00><><00>tj<00>|z
}|xjdz c_|xj|z c_|j|jz |_|r|xjdz c_yy)zUpdate planning statisticsr_N)rYr<>r<>r<>r<>)r7r<>r<><00>elapseds r"r<>zGOAPPlanner._update_stats9sf<00><00><16>)<29>)<29>+<2B>
<EFBFBD>*<2A><07> <0C><1A><1A>a<EFBFBD><1F><1A> <0C> <20> <20>G<EFBFBD>+<2B> <20>%)<29>%=<3D>%=<3D><04>@R<>@R<>%R<><04>"<22> <14> <10> <20> <20>A<EFBFBD> %<25> <20> r!<00>goals<6C>strategyc<00>Z<00>g}t|<02>}|dk(r^t|d<02>d<03><04>D]J}|j||<05>}|s<01>|j|<07>|jD]}|j |<05>}<05><00>L|S|dk(r5|r3t |d<06><00><07>} |j| |<05>}|r|j|<07>|S)zi
Plan for multiple goals.
Strategies: 'sequential', 'interleaved', 'prioritized'
<20>
sequentialc<00>.<00>|jjSrM<00><02>state<74>effective_priority<74><01>gs r"<00><lambda>z-GOAPPlanner.plan_multi_goal.<locals>.<lambda>Q<00><00><00>A<EFBFBD>G<EFBFBD>G<EFBFBD>4N<34>4N<34>r!T)rjr<><00> prioritizedc<00>.<00>|jjSrMr<>r<>s r"r<>z-GOAPPlanner.plan_multi_goal.<locals>.<lambda>\r<>r!)rj)r <00>sortedr<64>r<>rCr<>rf)
r7r<>r*r<><00>plans<6E> current_staterBr<>r,<00>top_goals
r"<00>plan_multi_goalzGOAPPlanner.plan_multi_goalBs<><00><00><13><05> <20><1B>-<2D> <0A> <13>|<7C> #<23><1E>u<EFBFBD>*N<>X\<5C>]<5D> L<01><04><1B>y<EFBFBD>y<EFBFBD><14>}<7D>5<><04><17><19>L<EFBFBD>L<EFBFBD><14>&<26>"&<26>,<2C>,<2C>L<01><06>(.<2E>(<<3C>(<<3C>]<5D>(K<> <0A>L<01>  L<01> <15> <0C><16><1D> &<26><14><1E>u<EFBFBD>*N<>O<><08><1B>y<EFBFBD>y<EFBFBD><18>=<3D>9<><04><17><19>L<EFBFBD>L<EFBFBD><14>&<26><14> r!<00> current_plan<61>failed_action_indexc<00>h<00>|j|dzd}|j|j|<02>}|r|Sy)zD
Replan from current state after an action failure.
r_N)rCr<>rB)r7r<>r*r<><00>remaining_actions<6E>new_plans r"<00>replanzGOAPPlanner.replancsC<00><00>)<29>0<>0<>1D<31>q<EFBFBD>1H<31>1I<31>J<><19><18>9<EFBFBD>9<EFBFBD>\<5C>.<2E>.<2E> <0B><<3C><08> <13><1B>O<EFBFBD>r!c <00><><00>|j|j|jtd|j<00>z |j|j|j
|j |jd<02>S)zGet planner statisticsr_)r<>r<><00> success_rater<65>r<>r{r|r})r<>r<>rfr<>r<>r{r|r}r6s r"<00> get_statszGOAPPlanner.get_statsysd<00><00>"<22>/<2F>/<2F>#<23>3<>3<> <20>0<>0<>3<EFBFBD>q<EFBFBD>$<24>:L<>:L<>3M<33>M<>%)<29>%?<3F>%?<3F>#'<27>#;<3B>#;<3B><1D><1E><1E><1D><1E><1E>#<23>3<>3<> 
<EFBFBD>
r!)N<>
i<>g@rM)r<>)rrrrrr?r=r<>rrr5rrrrAr<>r%rrr<>rer<>rr<>r<>r<>r r!r"rzrz<00>sk<00><00><08>)-<2D><1B><1D>!$<24> '<27>%<25>'<27><17>'<27><17> '<27>
<1F> '<27>.15<31> m<14><12>m<14><1A>#<23>s<EFBFBD>(<28>^<5E>m<14>$<24>C<EFBFBD><03>H<EFBFBD>-<2D> m<14>
<12>$<24><1E> m<14>^!
<EFBFBD><12>!
<EFBFBD><1B>!
<EFBFBD><18><03>U<EFBFBD>3<EFBFBD><06>;<3B>/<2F>/<2F>0<> !
<EFBFBD>
<1D> !
<EFBFBD>
<0E> !
<EFBFBD>F&<26><05>&<26>$<24>&<26>%<25> <15><13>D<EFBFBD>z<EFBFBD><15><1A>#<23>s<EFBFBD>(<28>^<5E><15><16> <15>
<0E>d<EFBFBD><1A> <15>B<14><1A><14><1A>#<23>s<EFBFBD>(<28>^<5E><14>!<21> <14>
<12>$<24><1E> <14>, 
<EFBFBD>4<EFBFBD> 
r!rzc<00>P<00>eZdZdZededefd<04><04>Zededeeefd<05><04>Z y)<07> PlanOptimizerz&Optimizes plans for better performancer<65>rPc<00><><00>|js|Sg}i}|jD]m}d}|jj<00>D]\}}|j|<05>|k7s<01>d}n|r<01>B|j |<03>|j |j<00><00>ot |j|td<03>|D<00><00>t|<01>dz<00><05>S)z"Remove redundant actions from planTFc3<00>4K<00>|]}|j<00><01><00>y<00>wrM)r<>)<02>.0rWs r"<00> <genexpr>z4PlanOptimizer.remove_redundancies.<locals>.<genexpr><3E>s<00><00><><00>9<>!<21>q<EFBFBD>v<EFBFBD>v<EFBFBD>9<>s<00>r<>r<>)
rC<00>effectsrartr<><00>updaterArB<00>sumrN)r<><00> optimized<65> last_effectsr,<00> redundantrjrvs r"<00>remove_redundanciesz!PlanOptimizer.remove_redundancies<65>s<><00><00><14>|<7C>|<7C><17>K<EFBFBD><16> <09><19> <0C><1A>l<EFBFBD>l<EFBFBD>
4<>F<EFBFBD><1C>I<EFBFBD>$<24>n<EFBFBD>n<EFBFBD>2<>2<>4<> <1A>
<EFBFBD><03>U<EFBFBD><1F>#<23>#<23>C<EFBFBD>(<28>E<EFBFBD>1<> %<25>I<EFBFBD><19> <1A>
<1D><19> <20> <20><16>(<28><1C>#<23>#<23>F<EFBFBD>N<EFBFBD>N<EFBFBD>3<>
4<><14><15><19><19><1D><1E>9<>y<EFBFBD>9<>9<>"<22>9<EFBFBD>~<7E><04>4<> 
<EFBFBD>
r!c<00><><00>|jsgSg}g}|jD]<5D>}|s|j|<03><00>d}|D]M}t|jj <00><00>t|j
j <00><00>zs<01>Kd}n|r|j|<03><00>|j|<02>|g}<02><>|r|j|<02>|S)zk
Identify actions that can be executed in parallel.
Returns list of action groups.
TF)rCr<>r<><00> preconditionsrur<>)r<><00>parallel_groups<70> current_groupr,<00> independent<6E>grouped_actions r"<00>parallelize_actionsz!PlanOptimizer.parallelize_actions<6E>s<><00><00> <14>|<7C>|<7C><15>I<EFBFBD><1C><0F><1A> <0A><1A>l<EFBFBD>l<EFBFBD> -<2D>F<EFBFBD> <20><1D>$<24>$<24>V<EFBFBD>,<2C>#<23> <0B>&3<><1E>N<EFBFBD><1A>6<EFBFBD>/<2F>/<2F>4<>4<>6<>7<>#<23>n<EFBFBD>>T<>>T<>>Y<>>Y<>>[<5B>:\<5C>\<5C>&+<2B> <0B><1D> <1E> <1F>!<21>(<28>(<28><16>0<>#<23>*<2A>*<2A>=<3D>9<>%+<2B>H<EFBFBD>M<EFBFBD>! -<2D>$ <19> <1B> "<22> "<22>=<3D> 1<><1E>r!N)
rrrrrxrAr<>rrr<>r r!r"r<>r<><00>sP<00><00>0<><11>
<EFBFBD>$<24>
<EFBFBD>4<EFBFBD>
<EFBFBD><12>
<EFBFBD>6<12> <1F>$<24> <1F>4<EFBFBD><04>V<EFBFBD> <0C>+=<3D> <1F><12> r!r<>c<00>`<00>eZdZdZd deefd<04>Zd<05>Zd<06>Zde fd<08>Z
d e d
e ee fd ee fd <0C>Zy)<0E> PlanLibraryz%Library of successful plans for reuseN<65> storage_pathc<00>H<00>|xsd|_i|_|j<00>y)Nz$/root/allegro/goap/plan_library.json)r<>r<><00>_load)r7r<>s r"r<>zPlanLibrary.__init__<5F>s <00><00>(<28>R<>,R<><04><19>,.<2E><04>
<EFBFBD> <0C>
<EFBFBD>
<EFBFBD> r!c<00><00>ddl}|jj|j<00>r= t |jd<03>5}t j |<02>}i|_ddd<02>yy#1swYyxYw#i|_YyxYw)zLoad plan library from diskrN<>r)<08>os<6F>path<74>existsr<73><00>openr3<00>loadr<64>)r7r<><00>f<>datas r"r<>zPlanLibrary._load<61>sr<00><00><11> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24>+<2B>+<2B> ,<2C> <20><19>$<24>+<2B>+<2B>S<EFBFBD>1<>$<24>Q<EFBFBD><1F>9<EFBFBD>9<EFBFBD>Q<EFBFBD><<3C>D<EFBFBD>!#<23>D<EFBFBD>J<EFBFBD>$<24>$<24> -<2D>$<24>$<24><> <20><1F><04>
<EFBFBD>s)<00>A4<00>A(<03>A4<00>(A1<07>-A4<00>1A4<00>4 A?c<00>6<00>t|jd<01>5}tj|jj <00>D<00><02><03>cic]$\}}||D<00>cgc]}|j <00><00><02>c}<04><02>&c}}}|d<02><03>ddd<04>ycc}wcc}}}w#1swYyxYw)zSave plan library to disk<73>w<><00><01>indentN)r<>r<>r3<00>dumpr<70>rarX)r7r<>rBr<><00>ps r"<00>savezPlanLibrary.save<76>s<><00><00> <11>$<24>#<23>#<23>S<EFBFBD> )<29> <1C>Q<EFBFBD> <10>I<EFBFBD>I<EFBFBD>#'<27>:<3A>:<3A>#3<>#3<>#5<><0E><0E><1F>D<EFBFBD>%<25><15>E<EFBFBD>2<>q<EFBFBD>q<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>2<>2<><0E><11><11> <1C> <1C> <1C><>2<><32><0E> <1C> <1C>s/<00>.B<03> B<0E>B<16>)B<0E>. B<03>B<0E>B<03>Br<>c<00><><00>|jj}||jvrg|j|<|j|j|<01>|j <00>y)z$Add a successful plan to the libraryN)rBrVr<>r<>r<>)r7r<><00> goal_names r"<00>add_planzPlanLibrary.add_plan<61>sI<00><00><18>I<EFBFBD>I<EFBFBD>N<EFBFBD>N<EFBFBD> <09> <14>D<EFBFBD>J<EFBFBD>J<EFBFBD> &<26>$&<26>D<EFBFBD>J<EFBFBD>J<EFBFBD>y<EFBFBD> !<21> <0C>
<EFBFBD>
<EFBFBD>9<EFBFBD><1D>$<24>$<24>T<EFBFBD>*<2A> <0C> <09> <09> r!rBr*rPc<00><><00>|j|jvryd}d}|j|jD]#}|jtjk(s<01>!|cSy)zFind a similar successful planNrR)rVr<>rFrr)r7rBr*<00>
best_match<EFBFBD>best_similarityr<79>s r"<00>find_similar_planzPlanLibrary.find_similar_plan<61>s[<00><00> <10>9<EFBFBD>9<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD> &<26><17><1A>
<EFBFBD><1D><0F><18>J<EFBFBD>J<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>)<29> <1C>D<EFBFBD><13>{<7B>{<7B>j<EFBFBD>2<>2<>2<><1B> <0B> <1C>
r!rM)rrrrrr5r<>r<>r<>rAr<>rrrr<>r r!r"r<>r<><00>sX<00><00>/<2F><15>X<EFBFBD>c<EFBFBD>]<5D><15>
 <20><1C><14>T<EFBFBD><14><14><12><14><1A>#<23>s<EFBFBD>(<28>^<5E><14>
<12>$<24><1E> r!r<><00>__main__z === GOAP Planner Module Test ===)<01>SystemHealthGoal)<02>CheckSystemHealth<74>CleanupResources<65>system<65>-<00><<00>U<00>0r<>F)<06> cpu_percent<6E>memory_percent<6E> disk_percent<6E> uptime_hours<72> recent_errors<72>health_checkedz
Goal: zInitial satisfaction: z.2fzDesired state: z
=== Planning ===zPlan found in z.3f<EFBFBD>sz Actions: zEstimated cost: z r_z. z No plan foundz
=== Planner Stats ===r<>)8rr<>rYr3<00>typingrrrrrrr <00> dataclassesr
r <00>copyr <00>enumr rrCrrrr<>rrrrr%rAr]rzr<>r<><00>plannerr<00>printr<74>r<>rrBr*rVr<>r`<00>startr<74>r<>rNrD<00> enumerate<74>ir,r4r<>r r!r"<00><module>rs.<00><01><04>
 <0A> <0B> <0B>B<>B<>B<>(<28><19><1B>9<>9<>1<>1<><17><14><17> <0B><14><16><15><15><17><15>* <0B>"
<EFBFBD>"
<EFBFBD> <0B>"
<EFBFBD>J3<15>3<15>lv
<EFBFBD>v
<EFBFBD>r@<1F>@<1F>N6<14>6<14>t <16>-<2D><07> <0C>z<EFBFBD><19> <09>
,<2C>-<2D>&<26>;<3B> <1C> <1D>D<EFBFBD><10><1D> <20><1E><1E><1E>#<23> 
<EFBFBD> <06>K<EFBFBD>
<EFBFBD>H<EFBFBD>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>K<EFBFBD>
<20>!<21> <09> "<22>4<EFBFBD>=<3D>=<3D><1B>#=<3D>c<EFBFBD>"B<>
C<EFBFBD>D<> <09>O<EFBFBD>D<EFBFBD>2<>2<>4<>5<>
6<EFBFBD>7<>
<EFBFBD>
<1E><1F> <15>D<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD>E<EFBFBD> <12><<3C><<3C><04>k<EFBFBD> *<2A>D<EFBFBD><17>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>E<EFBFBD>!<21>G<EFBFBD> <0B> <0A><0E>w<EFBFBD>s<EFBFBD>m<EFBFBD>1<EFBFBD>-<2D>.<2E> <0A> <09>#<23>d<EFBFBD>l<EFBFBD>l<EFBFBD>+<2B>,<2C>-<2D>.<2E> <0A> <20><14>!4<>!4<> 5<>6<>7<>"<22>4<EFBFBD><<3C><<3C>0<> -<2D>I<EFBFBD>A<EFBFBD>v<EFBFBD> <11>B<EFBFBD>q<EFBFBD><11>s<EFBFBD>e<EFBFBD>2<EFBFBD>f<EFBFBD>k<EFBFBD>k<EFBFBD>]<5D>+<2B> ,<2C> -<2D> <0E>o<EFBFBD><1E> <09>
#<23>$<24> <09>*<2A>$<24>*<2A>*<2A>W<EFBFBD>&<26>&<26>(<28><11>
3<EFBFBD>4<>Qr!