def rmpyl_icaps14(): """ Example from (Santana & Williams, ICAPS14). """ prog = RMPyL() prog *= prog.decide( {'name':'transport-choice','domain':['Bike','Car','Stay'], 'utility':[100,70,0]}, prog.observe( {'name':'slip','domain':[True,False], 'ctype':'probabilistic','probability':[0.051,1.0-0.051]}, prog.sequence(Episode(action='(ride-bike)', duration={'ctype':'controllable','lb':15,'ub':25}), Episode(action='(change)', duration={'ctype':'controllable','lb':20,'ub':30})), Episode(action='(ride-bike)',duration={'ctype':'controllable','lb':15,'ub':25})), prog.observe( {'name':'accident','domain':[True,False], 'ctype':'probabilistic','probability':[0.013,1.0-0.013]}, prog.sequence(Episode(action='(tow-vehicle)', duration={'ctype':'controllable','lb':30,'ub':90}), Episode(action='(cab-ride)', duration={'ctype':'controllable','lb':10,'ub':20})), Episode(action='(drive)',duration={'ctype':'controllable','lb':10,'ub':20})), Episode(action='(stay)')) prog.add_overall_temporal_constraint(ctype='controllable',lb=0.0,ub=30.0) return prog
def rmpyl_nested_uav(): hello = UAV('hello') uav = UAV('uav') prog = RMPyL() prog.plan = prog.sequence( hello.scan(), uav.scan(), prog.decide( { 'name': 'UAV-choice', 'domain': ['Hello', 'UAV'], 'utility': [7, 5] }, prog.sequence( hello.fly(), prog.observe( { 'name': 'hello-success', 'domain': ['Success', 'Failure'], 'ctype': 'probabilistic', 'probability': [0.8, 0.2] }, prog.decide( { 'name': 'hello-assert-success', 'domain': ['Success'], 'utility': [10] }, hello.stop()), prog.decide( { 'name': 'hello-assert-failure', 'domain': ['Failure'], 'utility': [0] }, hello.stop()))), prog.sequence( uav.fly(), prog.observe( { 'name': 'uav-success', 'domain': ['Success', 'Failure'], 'ctype': 'probabilistic', 'probability': [0.95, 0.05] }, prog.decide( { 'name': 'uav-assert-success', 'domain': ['Success'], 'utility': [10] }, uav.stop()), prog.decide( { 'name': 'uav-assert-failure', 'domain': ['Failure'], 'utility': [0] }, uav.stop()))))) return prog
def rmpyl_parallel_choices(hello,uav): """Simple RMPyL example with parallel execution of choices.""" uav2 = UAV(name='uav2') prog = RMPyL() prog *= prog.parallel( prog.observe({'name':'HELLO-OBS','domain':['FLY','SCAN','CRASH'], 'ctype':'probabilistic','probability':[0.50,0.49,0.01]}, hello.fly(),hello.scan(),hello.crash()), prog.observe({'name':'UAV-OBS','domain':['FLY','SCAN','CRASH'], 'ctype':'probabilistic','probability':[0.50,0.49,0.01]}, uav.fly(),uav.scan(),uav.crash()))*uav2.fly() return prog
def nominal_case(blocks, time_window=-1, dur_dict=None): """ Nominal case, where the robot observes what the human has already completed, and acts accordingly """ agent = 'Baxter' manip = 'BaxterRight' prog = RMPyL(name='run()') prog *= prog.sequence( say('Should I start?'), prog.observe( { 'name': 'ask-human', 'ctype': 'probabilistic', 'domain': ['YES', 'NO'], 'probability': [0.9, 0.1] }, observe_decide_act(prog, blocks, manip, agent, dur_dict), say('All done!'))) if time_window > 0.0: prog.add_overall_temporal_constraint(ctype='controllable', lb=0.0, ub=time_window) return prog
def rmpyl_observation_risk(): prog = RMPyL() prog *= prog.observe( { 'name': 'travel', 'ctype': 'probabilistic', 'domain': ['Short', 'Long'], 'probability': [0.7, 0.3] }, Episode(action='(cab-ride-long)', duration={ 'ctype': 'uncontrollable_probabilistic', 'distribution': { 'type': 'uniform', 'lb': 5.0, 'ub': 11.0 } }), Episode(action='(cab-ride-short)', duration={ 'ctype': 'uncontrollable_probabilistic', 'distribution': { 'type': 'uniform', 'lb': 5.0, 'ub': 10.0 } })) prog.add_overall_temporal_constraint(ctype='controllable', lb=0.0, ub=10.0) return prog
def rmpyl_simple_observe(hello,uav): """Simple RMPyL example using an uncontrollable choice.""" prog = RMPyL() prog *= prog.observe({'name':'UAV-crash','ctype':'probabilistic', 'domain':['OK','FAULT'],'probability':[0.99,0.01]}, uav.scan(), uav.crash()) return prog
def rmpyl_nested_uav(): hello = UAV('hello') uav = UAV('uav') prog = RMPyL() prog.plan = prog.sequence( hello.scan(), uav.scan(), prog.decide( {'name':'UAV-choice','domain':['Hello','UAV'], 'utility':[7,5]}, prog.sequence( hello.fly(), prog.observe( {'name':'hello-success','domain':['Success','Failure'], 'ctype':'probabilistic','probability':[0.8,0.2]}, prog.decide( {'name':'hello-assert-success', 'domain':['Success'], 'utility':[10]}, hello.stop()), prog.decide( {'name':'hello-assert-failure', 'domain':['Failure'], 'utility':[0]}, hello.stop()))), prog.sequence( uav.fly(), prog.observe( {'name':'uav-success','domain':['Success','Failure'], 'ctype':'probabilistic','probability':[0.95,0.05]}, prog.decide( {'name':'uav-assert-success', 'domain':['Success'], 'utility':[10]}, uav.stop()), prog.decide( {'name':'uav-assert-failure', 'domain':['Failure'], 'utility':[0]}, uav.stop()))))) return prog
def rmpyl_observation_risk(): prog = RMPyL() prog *= prog.observe( {'name':'travel','ctype':'probabilistic', 'domain':['Short','Long'],'probability':[0.7,0.3]}, Episode(action='(cab-ride-long)',duration={'ctype':'uncontrollable_probabilistic', 'distribution':{'type':'uniform', 'lb':5.0,'ub':11.0}}), Episode(action='(cab-ride-short)',duration={'ctype':'uncontrollable_probabilistic', 'distribution':{'type':'uniform', 'lb':5.0,'ub':10.0}})) prog.add_overall_temporal_constraint(ctype='controllable',lb=0.0,ub=10.0) return prog
def nominal_case(blocks): """ Nominal case, where the robot observes what the human has already completed, and acts accordingly """ agent='Baxter' manip='BaxterRight' prog = RMPyL(name='run()') prog *= prog.sequence(say('Should I start?'), prog.observe({'name':'observe-human-%d'%(len(blocks)), 'ctype':'uncontrollable', 'domain':['YES','NO']}, observe_and_act(prog,blocks,manip,agent), say('All done!'))) return prog
def rmpyl_choice_risk(): prog = RMPyL() prog *= prog.decide( { 'name': 'transport-choice', 'domain': ['Bike', 'Car', 'Stay'], 'utility': [100, 70, 0] }, prog.observe( { 'name': 'travel', 'ctype': 'probabilistic', 'domain': ['Short', 'Long'], 'probability': [0.7, 0.3] }, Episode(action='(cab-ride-long)', duration={ 'ctype': 'uncontrollable_probabilistic', 'distribution': { 'type': 'uniform', 'lb': 5.0, 'ub': 11.0 } }), Episode(action='(cab-ride-short)', duration={ 'ctype': 'uncontrollable_probabilistic', 'distribution': { 'type': 'uniform', 'lb': 5.0, 'ub': 10.0 } })), Episode(action='(drive-car)', duration={ 'ctype': 'controllable', 'lb': 6.0, 'ub': 8.0 }), Episode(action='(stay)')) prog.add_overall_temporal_constraint(ctype='controllable', lb=0.0, ub=10.0) return prog
def rmpyl_choice_risk(): prog = RMPyL() prog *= prog.decide( {'name':'transport-choice','domain':['Bike','Car','Stay'], 'utility':[100,70,0]}, prog.observe( {'name':'travel','ctype':'probabilistic', 'domain':['Short','Long'],'probability':[0.7,0.3]}, Episode(action='(cab-ride-long)',duration={'ctype':'uncontrollable_probabilistic', 'distribution':{'type':'uniform', 'lb':5.0,'ub':11.0}}), Episode(action='(cab-ride-short)',duration={'ctype':'uncontrollable_probabilistic', 'distribution':{'type':'uniform', 'lb':5.0,'ub':10.0}})), Episode(action='(drive-car)', duration={'ctype':'controllable','lb':6.0,'ub':8.0}), Episode(action='(stay)')) prog.add_overall_temporal_constraint(ctype='controllable',lb=0.0,ub=10.0) return prog
def nominal_case(blocks,time_window=-1,dur_dict=None): """ Nominal case, where the robot observes what the human has already completed, and acts accordingly """ agent='Baxter' manip='BaxterRight' prog = RMPyL(name='run()') prog *= prog.sequence(say('Should I start?'), prog.observe({'name':'ask-human', 'ctype':'probabilistic', 'domain':['YES','NO'], 'probability':[0.9,0.1]}, observe_decide_act(prog,blocks,manip,agent,dur_dict), say('All done!'))) if time_window>0.0: prog.add_overall_temporal_constraint(ctype='controllable',lb=0.0,ub=time_window) return prog
def rmpyl_breakfast(): """ Example from (Levine & Williams, ICAPS14). """ #Actions that Alice performs get_mug_ep = Episode(action='(get alice mug)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_glass_ep = Episode(action='(get alice glass)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) make_cofee_ep = Episode(action='(make-coffee alice)', duration={ 'ctype': 'controllable', 'lb': 3.0, 'ub': 5.0 }) pour_cofee_ep = Episode(action='(pour-coffee alice mug)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) pour_juice_glass = Episode(action='(pour-juice alice glass)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_bagel_ep = Episode(action='(get alice bagel)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_cereal_ep = Episode(action='(get alice cereal)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) toast_bagel_ep = Episode(action='(toast alice bagel)', duration={ 'ctype': 'controllable', 'lb': 3.0, 'ub': 5.0 }) add_cheese_bagel_ep = Episode(action='(add-cheese alice bagel)', duration={ 'ctype': 'controllable', 'lb': 1.0, 'ub': 2.0 }) mix_cereal_ep = Episode(action='(mix-cereal alice milk)', duration={ 'ctype': 'controllable', 'lb': 1.0, 'ub': 2.0 }) #Actions that the robot performs get_grounds_ep = Episode(action='(get grounds robot)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_juice_ep = Episode(action='(get juice robot)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_milk_ep = Episode(action='(get milk robot)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) get_cheese_ep = Episode(action='(get cheese robot)', duration={ 'ctype': 'controllable', 'lb': 0.5, 'ub': 1.0 }) prog = RMPyL() prog *= prog.sequence( prog.parallel( prog.observe( { 'name': 'observe-utensil', 'domain': ['Mug', 'Glass'], 'ctype': 'uncontrollable' }, get_mug_ep, get_glass_ep, id='observe-utensil-ep'), prog.decide( { 'name': 'choose-beverage-ingredient', 'domain': ['Grounds', 'Juice'], 'utility': [0, 0] }, get_grounds_ep, get_juice_ep, id='choose-beverage-ingredient-ep')), prog.observe( { 'name': 'observe-alice-drink', 'domain': ['Coffee', 'Juice'], 'ctype': 'uncontrollable' }, prog.sequence(make_cofee_ep, pour_cofee_ep), pour_juice_glass, id='observe-alice-drink-ep'), prog.parallel(prog.observe( { 'name': 'observe-food', 'domain': ['Bagel', 'Cereal'], 'ctype': 'uncontrollable' }, get_bagel_ep, get_cereal_ep, id='observe-food-ep'), prog.decide( { 'name': 'choose-food-ingredient', 'domain': ['Milk', 'Cheese'], 'utility': [0, 0] }, get_milk_ep, get_cheese_ep, id='choose-food-ingredient-ep'), id='parallel-food-ep'), prog.observe( { 'name': 'observe-alice-food', 'domain': ['Bagel', 'Cereal'], 'ctype': 'uncontrollable' }, prog.sequence(toast_bagel_ep, add_cheese_bagel_ep), mix_cereal_ep), id='breakfast-sequence') extra_tcs = [ TemporalConstraint( start=prog.episode_by_id('breakfast-sequence').start, end=prog.episode_by_id('observe-utensil-ep').start, ctype='controllable', lb=0.0, ub=0.0), TemporalConstraint( start=prog.episode_by_id('breakfast-sequence').start, end=prog.episode_by_id('choose-beverage-ingredient-ep').start, ctype='controllable', lb=0.2, ub=0.3), TemporalConstraint(start=prog.episode_by_id('parallel-food-ep').start, end=prog.episode_by_id('observe-food-ep').start, ctype='controllable', lb=0.0, ub=0.0), TemporalConstraint( start=prog.episode_by_id('parallel-food-ep').start, end=prog.episode_by_id('choose-food-ingredient-ep').start, ctype='controllable', lb=0.2, ub=0.3) ] for tc in extra_tcs: prog.add_temporal_constraint(tc) prog.add_overall_temporal_constraint(ctype='controllable', lb=0.0, ub=7.0) prog.simplify_temporal_constraints() return prog
def rmpyl_breakfast(): """ Example from (Levine & Williams, ICAPS14). """ #Actions that Alice performs get_mug_ep = Episode(action='(get alice mug)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_glass_ep = Episode(action='(get alice glass)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) make_cofee_ep = Episode(action='(make-coffee alice)',duration={'ctype':'controllable','lb':3.0,'ub':5.0}) pour_cofee_ep = Episode(action='(pour-coffee alice mug)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) pour_juice_glass = Episode(action='(pour-juice alice glass)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_bagel_ep = Episode(action='(get alice bagel)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_cereal_ep = Episode(action='(get alice cereal)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) toast_bagel_ep = Episode(action='(toast alice bagel)',duration={'ctype':'controllable','lb':3.0,'ub':5.0}) add_cheese_bagel_ep = Episode(action='(add-cheese alice bagel)',duration={'ctype':'controllable','lb':1.0,'ub':2.0}) mix_cereal_ep = Episode(action='(mix-cereal alice milk)',duration={'ctype':'controllable','lb':1.0,'ub':2.0}) #Actions that the robot performs get_grounds_ep = Episode(action='(get grounds robot)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_juice_ep = Episode(action='(get juice robot)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_milk_ep = Episode(action='(get milk robot)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) get_cheese_ep = Episode(action='(get cheese robot)',duration={'ctype':'controllable','lb':0.5,'ub':1.0}) prog = RMPyL() prog *= prog.sequence( prog.parallel( prog.observe( {'name':'observe-utensil','domain':['Mug','Glass'],'ctype':'uncontrollable'}, get_mug_ep, get_glass_ep, id='observe-utensil-ep'), prog.decide( {'name':'choose-beverage-ingredient','domain':['Grounds','Juice'],'utility':[0,0]}, get_grounds_ep, get_juice_ep, id='choose-beverage-ingredient-ep')), prog.observe( {'name':'observe-alice-drink','domain':['Coffee','Juice'],'ctype':'uncontrollable'}, prog.sequence(make_cofee_ep,pour_cofee_ep), pour_juice_glass, id='observe-alice-drink-ep'), prog.parallel( prog.observe( {'name':'observe-food','domain':['Bagel','Cereal'],'ctype':'uncontrollable'}, get_bagel_ep, get_cereal_ep, id='observe-food-ep'), prog.decide( {'name':'choose-food-ingredient','domain':['Milk','Cheese'],'utility':[0,0]}, get_milk_ep, get_cheese_ep, id='choose-food-ingredient-ep'), id='parallel-food-ep'), prog.observe( {'name':'observe-alice-food','domain':['Bagel','Cereal'],'ctype':'uncontrollable'}, prog.sequence(toast_bagel_ep,add_cheese_bagel_ep), mix_cereal_ep), id='breakfast-sequence') extra_tcs = [TemporalConstraint(start=prog.episode_by_id('breakfast-sequence').start, end=prog.episode_by_id('observe-utensil-ep').start, ctype='controllable',lb=0.0,ub=0.0), TemporalConstraint(start=prog.episode_by_id('breakfast-sequence').start, end=prog.episode_by_id('choose-beverage-ingredient-ep').start, ctype='controllable',lb=0.2,ub=0.3), TemporalConstraint(start=prog.episode_by_id('parallel-food-ep').start, end=prog.episode_by_id('observe-food-ep').start, ctype='controllable',lb=0.0,ub=0.0), TemporalConstraint(start=prog.episode_by_id('parallel-food-ep').start, end=prog.episode_by_id('choose-food-ingredient-ep').start, ctype='controllable',lb=0.2,ub=0.3)] for tc in extra_tcs: prog.add_temporal_constraint(tc) prog.add_overall_temporal_constraint(ctype='controllable',lb=0.0,ub=7.0) prog.simplify_temporal_constraints() return prog
def rmpyl_icaps14(): """ Example from (Santana & Williams, ICAPS14). """ prog = RMPyL() prog *= prog.decide( { 'name': 'transport-choice', 'domain': ['Bike', 'Car', 'Stay'], 'utility': [100, 70, 0] }, prog.observe( { 'name': 'slip', 'domain': [True, False], 'ctype': 'probabilistic', 'probability': [0.051, 1.0 - 0.051] }, prog.sequence( Episode(action='(ride-bike)', duration={ 'ctype': 'controllable', 'lb': 15, 'ub': 25 }), Episode(action='(change)', duration={ 'ctype': 'controllable', 'lb': 20, 'ub': 30 })), Episode(action='(ride-bike)', duration={ 'ctype': 'controllable', 'lb': 15, 'ub': 25 })), prog.observe( { 'name': 'accident', 'domain': [True, False], 'ctype': 'probabilistic', 'probability': [0.013, 1.0 - 0.013] }, prog.sequence( Episode(action='(tow-vehicle)', duration={ 'ctype': 'controllable', 'lb': 30, 'ub': 90 }), Episode(action='(cab-ride)', duration={ 'ctype': 'controllable', 'lb': 10, 'ub': 20 })), Episode(action='(drive)', duration={ 'ctype': 'controllable', 'lb': 10, 'ub': 20 })), Episode(action='(stay)')) prog.add_overall_temporal_constraint(ctype='controllable', lb=0.0, ub=30.0) return prog