frederick99

task_mcmas.py

Apr 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.19 KB | None | 0 0
  1. import itertools as it
  2.  
  3.  
  4.  
  5. ### Template for Environment
  6.  
  7. ENV_CODE = '''
  8. ---Environment agent
  9. Agent Environment
  10.     Obsvars:
  11.         reached: boolean;
  12.    k: 2..{N};
  13.     end Obsvars
  14.     Vars:
  15.         state: {{idle, detected, initiated, completed}};
  16.     end Vars
  17.     Actions = {{none, task_detected_, task_initiated_, task_completed_}};
  18.     Protocol:
  19.         state = idle: {{task_detected_}};
  20.         state = detected: {{task_initiated_}};
  21.         state = completed: {{task_completed_}};
  22.     end Protocol
  23.     Evolution:
  24.         reached=true if {reached_code};
  25.         state = detected if ((state = idle) and {detected_code}) and (Action=task_detected_);
  26.         state = initiated if (state = detected) and (reached=true) and (Action=task_initiated_);
  27.         state = completed if (Action=task_completed_) and
  28.      {completed_code};
  29.     end Evolution  
  30. end Agent'''
  31.  
  32.  
  33. ### Template for Agent
  34.  
  35. AGENT_CODE = '''
  36. ---Robot{i}
  37. Agent Robot{i}
  38.    Vars:
  39.         state: {{idle, busy, ready, promised}};
  40.    end Vars
  41.    Actions = {{task_detected, send_confirm, send_request, send_willing, received_request, received_willing, received_engaged, received_confirm, received_not_required, task_completed}};
  42.    Protocol:
  43.         state = idle: {{task_detected, received_request}};
  44.         state = ready: {{send_request, send_confirm, received_willing, received_engaged}};
  45.         state = busy: {{task_completed}};
  46.         state = promised: {{received_confirm, received_not_required, send_willing}};
  47.    end Protocol
  48.    Evolution:
  49.         state = idle if ((state = idle) and (Action = task_detected) and ({detected_code})) or
  50.                 ((state = busy) and (Action = task_completed) and (
  51.            {completed_code})) or
  52.                 ((state= promised) and (Action=received_not_required));
  53.        
  54.         state = ready if ((state = idle) and (Action = task_detected) and (
  55.            {request_code})) or
  56.                 ((state=ready) and ((Action = received_willing) or (Action = received_engaged)));
  57.          
  58.         state = busy if ((state = ready) and (Action = send_confirm)) or
  59.                 ((state = promised) and (Action=received_confirm));
  60.        
  61.         state = promised if {promised_code};                 
  62.   end Evolution
  63. end Agent'''
  64.  
  65.  
  66. ### Template for Evaluation. InitStates, Fairness, Formulae
  67.  
  68. EVAL_CODE = '''
  69. Evaluation
  70.       ready_var if ( {ready_code} );
  71.  
  72.       bad_condition if {bad_cond_code};
  73. end Evaluation
  74.  
  75.  
  76. InitStates
  77.     {init_code} and
  78.     (Environment.reached=false) and (Environment.state=idle){init_team_size};
  79. end InitStates
  80.  
  81.  
  82. Fairness
  83.  ready_var;
  84. end Fairness
  85.  
  86.  
  87. Formulae
  88.     AG(!bad_condition);
  89. end Formulae'''
  90.  
  91.  
  92.  
  93. #################################
  94. # generate code for Environment #
  95. #################################
  96.  
  97. def gen_env_code(N):
  98.     return ENV_CODE.format(**{
  99.         'N': N,
  100.         'reached_code': gen_env_reached(N),
  101.         'detected_code': gen_env_detected(N),
  102.         'completed_code': gen_env_completed(N)
  103.     })
  104.  
  105.  
  106. def gen_env_reached(N):
  107.     seq = range(1, N+1)
  108.     s = []
  109.     for k in range(2, N+1):
  110.         c = it.combinations(seq, k-1)
  111.         l = ' or '.join('(%s)'%' and '.join(f'(Robot{_i}.Action=received_confirm)' for _i in i) for i in c)
  112.         s.append('((k = %d) and (%s))' % (k, l))
  113.     return '(%s)'%' or '.join(s)
  114.  
  115.  
  116. def gen_env_detected(N):
  117.     return '(%s)'%' or '.join('(Robot%d.Action = task_detected)' % i for i in range(1, N+1))
  118.  
  119.  
  120. def gen_env_completed(N):
  121.     seq = range(1, N+1)
  122.     s = []
  123.     for k in range(2, N+1):
  124.         c = it.combinations(seq, k)
  125.         l = ' or '.join('(%s)'%' and '.join(f'(Robot{_i}.Action=task_completed)' for _i in i) for i in c)
  126.         s.append('((k = %d) and (%s))' % (k, l))
  127.     return '(%s)'%' or '.join(s)
  128.  
  129.  
  130. ################################
  131. # generate code for i-th Agent #
  132. ################################
  133.  
  134. def gen_agent_code(N, i):
  135.     return AGENT_CODE.format(**{
  136.         'N': N, 'i': i,
  137.         'detected_code': gen_agent_detected(N, i),
  138.         'completed_code': gen_agent_completed(N, i),
  139.         'request_code': gen_agent_request(N, i),
  140.         'promised_code': gen_agent_promised(N, i),
  141.     })
  142.  
  143.  
  144. def gen_agent_detected(N, i):
  145.     return ' or '.join(f'(Robot{_i}.Action = task_detected)' for _i in range(1, N+1) if _i != i)
  146.  
  147.  
  148. def gen_agent_completed(N, i):
  149.     return ' or '.join('((Environment.k = %d) and (%s))'%(k,
  150.         ' or '.join('(%s)'%' and '.join(f'(Robot{_i}.Action = task_completed)' for _i in y) for y in it.combinations(filter(lambda x:x!=i, range(1,N+1)), k-1))
  151.     ) for k in range(2, N+1))
  152.  
  153.  
  154. def gen_agent_request(N, i):
  155.     return ' or '.join('((Environment.k = %d) and (%s))'%(k,
  156.         ' or '.join('(%s)'%' and '.join(f'(Robot{_i}.Action = received_request)' for _i in y) for y in it.combinations(filter(lambda x:x!=i, range(1,N+1)), k-1))
  157.     ) for k in range(2, N+1))
  158.  
  159.  
  160. def gen_agent_promised(N, i):
  161.     return ' or '.join(
  162.         f'((state = idle) and (Action=received_request) and (Robot{_i}.Action=send_request)) or '
  163.         f'((state = promised) and (Action=send_willing) and (Robot{_i}.Action=received_willing))'
  164.     for _i in range(1,N+1) if _i != i)
  165.  
  166.  
  167.  
  168. #############################################################
  169. # generate Evaluation, InitStates, Fairness, Formulae, etc. #
  170. #############################################################
  171.  
  172. def gen_eval_code(N, k):
  173.     return EVAL_CODE.format(**{
  174.         'N': N,
  175.         'ready_code': gen_eval_ready(N),
  176.         'bad_cond_code': gen_eval_bad_condition(N),
  177.         'init_code': gen_eval_init_states(N),
  178.         'init_team_size': gen_eval_init_team_size(N, k)
  179.     })
  180.  
  181.  
  182. def gen_eval_ready(N):
  183.     return ' or '.join(f'(Robot{i}.state=ready)' for i in range(1, N+1))
  184.  
  185.  
  186. def gen_eval_bad_condition(N):
  187.     return ' or '.join('(%s)'%' and '.join(f'(Robot{_i}.state={"promised" if _i == i else "idle"})' for _i in range(1,N+1)) for i in range(1,N+1))
  188.  
  189.  
  190. def gen_eval_init_states(N):
  191.     return ' and '.join(f'(Robot{i}.state = idle)' for i in range(1, N+1))
  192.  
  193.  
  194. def gen_eval_init_team_size(N, k):
  195.     return f' and (Environment.k = {k})' if k else ''
  196.  
  197.  
  198.  
  199. # main driver
  200.  
  201. if __name__ == '__main__':
  202.     N = int(input('Enter the number of agents: '))
  203.     k = input('Enter the team size (leave empty for a random number every time): ')
  204.     filename = input('Enter output file name (leave empty for `stdout`):')
  205.    
  206.     import sys
  207.  
  208.     with open(filename, 'w') if filename else sys.stdout as file:
  209.  
  210.         print(gen_env_code(N), file=file)
  211.         print()
  212.  
  213.         for i in range(1,N+1):
  214.             print(gen_agent_code(N, i), file=file)
  215.             print()
  216.  
  217.         print(gen_eval_code(N, k), file=file)
Add Comment
Please, Sign In to add comment