Package teamwork :: Package examples :: Package Thespian :: Module RedRidingHoodClasses
[hide private]
[frames] | no frames]

Source Code for Module teamwork.examples.Thespian.RedRidingHoodClasses

  1  ##bad story:
 
  2  ##    story that ends too soon
 
  3  ##    story that characters keep on repeating their actions
 
  4  
 
  5  ## working configuration
 
  6  ## red, 2, 2
 
  7  ## wolf depth 2, 1
 
  8  
 
  9  from teamwork.agent.AgentClasses import * 
 10  from teamwork.dynamics.pwlDynamics import * 
 11  
 
 12  from RedRidingHoodDynamics import * 
 13  
 
 14  classHierarchy['character'] = {
 
 15      'parent': [],
 
 16      'horizon':1,
 
 17      'depth':2,
 
 18      'dynamics':[DynFun['basicDyn'],DynFun['RedDyn']],
 
 19      'state':{\
 
 20              'type':0.0,
 
 21              'being-greeted':0.0,
 
 22              'being-byed':0.0,
 
 23              'being-enquired':0.0,
 
 24  
 
 25              'greeted':0.0,
 
 26              'byed':0.0,
 
 27  
 
 28              'conversation':0.0,
 
 29              
 
 30              'init-norm':0.0,
 
 31              'resp-norm':0.0,
 
 32              'makeResp-norm':0.0,
 
 33              'conversation-flow-norm':0.0,
 
 34              'noRepeat-norm':0.0,
 
 35              
 
 36              'alive':1.0,
 
 37              'sameLocation':1.0,
 
 38              'actAlive':1.0,
 
 39              'noRepeat':1.0,
 
 40  ##            'preferWait':1,
 
 41  
 
 42              'likeMove':-1,
 
 43              'likeTalk':-1,
 
 44              'specialRule':1.0,
 
 45               },
 
 46       'models': {
 
 47          'simple': {'goals':[\
 
 48                              {'entity':['self'],'direction':'max','type':'state',
 
 49                                'key':'init-norm','weight':1.},
 
 50                              {'entity':['self'],'direction':'max','type':'state',
 
 51                                'key':'resp-norm','weight':1000.},
 
 52                              {'entity':['self'],'direction':'max','type':'state',
 
 53                                'key':'makeResp-norm','weight':1.},
 
 54                              {'entity':['self'],'direction':'max','type':'state',
 
 55                                'key':'conversation-flow-norm','weight':1.},
 
 56                              {'entity':['self'],'direction':'max','type':'state',
 
 57                                'key':'noRepeat-norm','weight':1.},
 
 58                              
 
 59                               {'entity':['self'],'direction':'max','type':'state',
 
 60                                'key':'alive','weight':1000},
 
 61                               {'entity':['self'],'direction':'max','type':'state',
 
 62                                'key':'actAlive','weight':1000.},
 
 63                               {'entity':['self'],'direction':'max','type':'state',
 
 64                                'key':'sameLocation','weight':1000.},
 
 65                              {'entity':['self'],'direction':'max','type':'state',
 
 66                                'key':'specialRule','weight':1000.},
 
 67  ##                             {'entity':['self'],'direction':'min','type':'state',
 
 68  ##                              'key':'preferWait','weight':.1},
 
 69                              ],
 
 70                  'policy': [],
 
 71                       },
 
 72          'evil': {'goals':[\
 
 73                              {'entity':['self'],'direction':'max','type':'state',
 
 74                                'key':'init-norm','weight':1.},
 
 75                              {'entity':['self'],'direction':'max','type':'state',
 
 76                                'key':'resp-norm','weight':1000.},
 
 77                              {'entity':['self'],'direction':'max','type':'state',
 
 78                                'key':'makeResp-norm','weight':1.},
 
 79                              {'entity':['self'],'direction':'max','type':'state',
 
 80                                'key':'conversation-flow-norm','weight':1.},
 
 81                              {'entity':['self'],'direction':'max','type':'state',
 
 82                                'key':'noRepeat-norm','weight':1.},
 
 83                              
 
 84                               {'entity':['self'],'direction':'max','type':'state',
 
 85                                'key':'alive','weight':1000.},
 
 86                               {'entity':['self'],'direction':'max','type':'state',
 
 87                                'key':'actAlive','weight':1000.},
 
 88                               {'entity':['self'],'direction':'max','type':'state',
 
 89                                'key':'sameLocation','weight':1000.},
 
 90                              {'entity':['self'],'direction':'max','type':'state',
 
 91                                'key':'specialRule','weight':1000.},
 
 92  ##                             {'entity':['self'],'direction':'min','type':'state',
 
 93  ##                              'key':'preferWait','weight':.1},
 
 94                              {'entity':['self'],'direction':'max','type':'state',
 
 95                                'key':'full','weight':5.},
 
 96                              ],
 
 97                  'policy': [],
 
 98                       },
 
 99  
 
100       'good': {'goals':[\
 
101                              {'entity':['self'],'direction':'max','type':'state',
 
102                                'key':'init-norm','weight':1.},
 
103                              {'entity':['self'],'direction':'max','type':'state',
 
104                                'key':'resp-norm','weight':1000.},
 
105                              {'entity':['self'],'direction':'max','type':'state',
 
106                                'key':'makeResp-norm','weight':1.},
 
107                              {'entity':['self'],'direction':'max','type':'state',
 
108                                'key':'conversation-flow-norm','weight':1.},
 
109                              {'entity':['self'],'direction':'max','type':'state',
 
110                                'key':'noRepeat-norm','weight':1.},
 
111                              
 
112                               {'entity':['self'],'direction':'max','type':'state',
 
113                                'key':'alive','weight':1000.},
 
114                               {'entity':['self'],'direction':'max','type':'state',
 
115                                'key':'actAlive','weight':1000.},
 
116                               {'entity':['self'],'direction':'max','type':'state',
 
117                                'key':'sameLocation','weight':1000.},
 
118                              {'entity':['self'],'direction':'max','type':'state',
 
119                                'key':'specialRule','weight':1000.},
 
120  ##                             {'entity':['self'],'direction':'min','type':'state',
 
121  ##                              'key':'preferWait','weight':.1},
 
122                              {'entity':['self'],'direction':'min','type':'state',
 
123                                'key':'full','weight':.1},
 
124                              ],
 
125                  'policy': [],
 
126                       },
 
127  
 
128                  
 
129      'shy': {'goals':[\
 
130                              {'entity':['self'],'direction':'max','type':'state',
 
131                                'key':'init-norm','weight':1.},
 
132                              {'entity':['self'],'direction':'max','type':'state',
 
133                                'key':'resp-norm','weight':1000.},
 
134                              {'entity':['self'],'direction':'max','type':'state',
 
135                                'key':'makeResp-norm','weight':1.},
 
136                              {'entity':['self'],'direction':'max','type':'state',
 
137                                'key':'specialRule','weight':1000.},
 
138                              {'entity':['self'],'direction':'max','type':'state',
 
139                                'key':'conversation-flow-norm','weight':1.},
 
140                              {'entity':['self'],'direction':'max','type':'state',
 
141                                'key':'noRepeat-norm','weight':1.},
 
142                              
 
143                               {'entity':['self'],'direction':'max','type':'state',
 
144                                'key':'alive','weight':1000.},
 
145                               {'entity':['self'],'direction':'max','type':'state',
 
146                                'key':'actAlive','weight':1000.},
 
147                               {'entity':['self'],'direction':'max','type':'state',
 
148                                'key':'sameLocation','weight':1000.},
 
149                              {'entity':['self'],'direction':'max','type':'state',
 
150                                'key':'specialRule','weight':1000.},
 
151  ##                             {'entity':['self'],'direction':'min','type':'state',
 
152  ##                              'key':'preferWait','weight':.1},
 
153                              {'entity':['self'],'direction':'min','type':'state',
 
154                                'key':'likeTalk','weight':1},
 
155  
 
156                              ],
 
157                  'policy': [],
 
158                       },
 
159          'talktive': {'goals':[\
 
160                              {'entity':['self'],'direction':'max','type':'state',
 
161                                'key':'init-norm','weight':1.},
 
162                              {'entity':['self'],'direction':'max','type':'state',
 
163                                'key':'resp-norm','weight':1000.},
 
164                              {'entity':['self'],'direction':'max','type':'state',
 
165                                'key':'makeResp-norm','weight':1.},
 
166                              {'entity':['self'],'direction':'max','type':'state',
 
167                                'key':'conversation-flow-norm','weight':1.},
 
168                              {'entity':['self'],'direction':'max','type':'state',
 
169                                'key':'noRepeat-norm','weight':1.},
 
170                              
 
171                               {'entity':['self'],'direction':'max','type':'state',
 
172                                'key':'alive','weight':1000.},
 
173                               {'entity':['self'],'direction':'max','type':'state',
 
174                                'key':'actAlive','weight':1000.},
 
175                               {'entity':['self'],'direction':'max','type':'state',
 
176                                'key':'sameLocation','weight':1000.},
 
177                              {'entity':['self'],'direction':'max','type':'state',
 
178                                'key':'specialRule','weight':1000.},
 
179  ##                             {'entity':['self'],'direction':'min','type':'state',
 
180  ##                              'key':'preferWait','weight':.1},
 
181                              {'entity':['self'],'direction':'max','type':'state',
 
182                                'key':'likeTalk','weight':1},
 
183  
 
184                              ],
 
185                  'policy': [],
 
186                       },
 
187                  },
 
188      } 
189  classHierarchy['red'] = {
 
190      'parent': ['character'],
 
191      'horizon':2,
 
192      'depth':2,
 
193      'state':{\
 
194              'has-cake':1.0,
 
195              
 
196              'location':0,
 
197  
 
198              'told-about-granny':0.0,
 
199              'given-cake':0.0,
 
200  
 
201              'SDwithWolf':-.19,
 
202              'being-enquired-about-granny':0,
 
203  
 
204               },
 
205  ##    'beliefs':{'hunter':{'model':'simple'},
 
206  ##               'granny':{'model':'simple'},
 
207  ##               'wolf':{'model':'simple'},
 
208  ##               },
 
209      'goals':[\
 
210              {'entity':['self'],'direction':'max','type':'state',
 
211                  'key':'init-norm','weight':1.},
 
212              {'entity':['self'],'direction':'max','type':'state',
 
213                'key':'resp-norm','weight':1000.},
 
214              {'entity':['self'],'direction':'max','type':'state',
 
215                  'key':'makeResp-norm','weight':1.},
 
216              {'entity':['self'],'direction':'max','type':'state',
 
217                'key':'conversation-flow-norm','weight':1.},
 
218              {'entity':['self'],'direction':'max','type':'state',
 
219                'key':'noRepeat-norm','weight':1.},
 
220  
 
221               {'entity':['self'],'direction':'max','type':'state',
 
222                'key':'alive','weight':5.},
 
223  ##            {'entity':['wolf'],'direction':'min','type':'state',
 
224  ##              'key':'alive','weight':1.},
 
225  ##             {'entity':['granny'],'direction':'max','type':'state',
 
226  ##              'key':'alive','weight':1.},
 
227               {'entity':['granny'],'direction':'max','type':'state',
 
228                'key':'has-cake','weight':1.},
 
229               {'entity':['self'],'direction':'max','type':'state',
 
230                'key':'actAlive','weight':1000.},
 
231               {'entity':['self'],'direction':'max','type':'state',
 
232                'key':'sameLocation','weight':1000.},
 
233              {'entity':['self'],'direction':'max','type':'state',
 
234                'key':'specialRule','weight':1000.},
 
235              
 
236  ##             {'entity':['self'],'direction':'max','type':'state',
 
237  ##              'key':'preferWait','weight':.1},
 
238              {'entity':['self'],'direction':'max','type':'state',
 
239                'key':'likeMove','weight':.5},
 
240              {'entity':['self'],'direction':'max','type':'state',
 
241                'key':'likeTalk','weight':.5},
 
242               ],
 
243       'actions': {'type':'OR',
 
244                  'values':[{'type':'decision',
 
245                             'value':{'type':'XOR',
 
246                                      'key':'object',
 
247                                      'values':[{'type':'generic','value':'wolf'}],
 
248                                      'base': {'type':'XOR',
 
249                                               'key':'type',
 
250                                               'values':[\
 
251                                                         {'type':'literal','value':'tell-about-granny'},
 
252                                                         {'type':'literal','value':'inform-about-granny'},
 
253                                                         {'type':'literal','value':'escape'},
 
254                                                         {'type':'literal','value':'greet-init'},
 
255                                                         {'type':'literal','value':'greet-resp'},
 
256                                                         {'type':'literal','value':'bye-init'},
 
257                                                         {'type':'literal','value':'bye-resp'},
 
258                                                         {'type':'literal','value':'enquiry'},
 
259                                                         {'type':'literal','value':'inform'},
 
260                                                         {'type':'literal','value':'give-cake'},
 
261  ##                                                       {'type':'literal','value':'kill'},
 
262  ##                                                       {'type':'literal','value':'follow'},
 
263                                                         ],
 
264                                               },
 
265                                      },
 
266                             },
 
267                            {'type':'decision',
 
268                             'value':{'type':'XOR',
 
269                                      'key':'object',
 
270                                      'values':[{'type':'generic','value':'granny'}],
 
271                                      'base': {'type':'XOR',
 
272                                               'key':'type',
 
273                                               'values':[{'type':'literal','value':'give-cake'},
 
274                                                         ],
 
275                                               },
 
276                                      },
 
277                             },
 
278                            {'type':'decision',
 
279                             'value':{'type':'XOR',
 
280                                               'key':'type',
 
281                                               'values':[{'type':'literal','value':'move2'},
 
282                                                         {'type':'literal','value':'wait'},
 
283                                                         ],
 
284                                      },
 
285                             },
 
286                            {'type':'decision',
 
287                             'value':{'type':'XOR',
 
288                                      'key':'object',
 
289                                      'values':[{'type':'generic','value':'hunter'}],
 
290                                      'base': {'type':'XOR',
 
291                                               'key':'type',
 
292                                               'values':[{'type':'literal','value':'enquiry'},
 
293                                                         ],
 
294                                               },
 
295                                      },
 
296                             },
 
297                            ],
 
298                  },
 
299  
 
300      } 
301  
 
302  classHierarchy['hunter'] = {
 
303      'parent': ['character'],
 
304  ##    'horizon':1,
 
305      'depth':1,
 
306      'state':{\
 
307              'location':-.6,
 
308              'likeMove':-1,
 
309               },
 
310      'beliefs':{'red':{'model':'simple'},
 
311                 'granny':{'model':'simple'},
 
312                 'wolf':{'model':'simple'},
 
313                 },
 
314      'goals':[\
 
315          {'entity':['self'],'direction':'max','type':'state',
 
316                                'key':'init-norm','weight':1.},
 
317                              {'entity':['self'],'direction':'max','type':'state',
 
318                                'key':'resp-norm','weight':1000.},
 
319                          {'entity':['self'],'direction':'max','type':'state',
 
320                                  'key':'makeResp-norm','weight':1.},
 
321                              {'entity':['self'],'direction':'max','type':'state',
 
322                                'key':'conversation-flow-norm','weight':1.},
 
323                              {'entity':['self'],'direction':'max','type':'state',
 
324                                'key':'noRepeat-norm','weight':1.},
 
325          
 
326               {'entity':['wolf'],'direction':'min','type':'state',
 
327                'key':'alive','weight':1.},
 
328  
 
329               {'entity':['self'],'direction':'max','type':'state',
 
330                'key':'actAlive','weight':1000.},
 
331               {'entity':['self'],'direction':'max','type':'state',
 
332                'key':'sameLocation','weight':1000.},
 
333  ##             {'entity':['self'],'direction':'max','type':'state',
 
334  ##              'key':'preferWait','weight':1},
 
335  
 
336              {'entity':['self'],'direction':'max','type':'state',
 
337                'key':'likeMove','weight':.5},
 
338                       {'entity':['self'],'direction':'max','type':'state',
 
339                'key':'likeTalk','weight':.5},
 
340               ],
 
341       'actions': {'type':'OR',
 
342                  'values':[{'type':'decision',
 
343                             'value':{'type':'XOR',
 
344                                      'key':'object',
 
345                                      'values':[{'type':'generic','value':'wolf'}],
 
346                                      'base': {'type':'XOR',
 
347                                               'key':'type',
 
348                                               'values':[{'type':'literal','value':'kill'},
 
349                                                         ],
 
350                                               },
 
351                                      },
 
352                             },
 
353                            {'type':'decision',
 
354                             'value':{'type':'XOR',
 
355                                      'key':'object',
 
356                                      'values':[{'type':'generic','value':'red'}],
 
357                                      'base': {'type':'XOR',
 
358                                               'key':'type',
 
359                                               'values':[{'type':'literal','value':'inform'},
 
360                                                         ],
 
361                                               },
 
362                                      },
 
363                             },
 
364                            {'type':'decision',
 
365                             'value':{'type':'XOR',
 
366                                               'key':'type',
 
367                                               'values':[{'type':'literal','value':'move2'},
 
368                                                         {'type':'literal','value':'wait'},
 
369                                                         ],
 
370                                      },
 
371                             },
 
372                            
 
373                            ],
 
374                  },
 
375  
 
376      } 
377  
 
378  classHierarchy['granny'] = {
 
379      'parent': ['character'],
 
380  ##    'horizon':0,
 
381      'depth':1,
 
382      'state':{\
 
383              'has-cake':0.0,
 
384              'location':0.4,
 
385              
 
386               },
 
387      'beliefs':{'red':{'model':'simple'},
 
388                 'hunter':{'model':'simple'},
 
389                 'wolf':{'model':'simple'},
 
390                 },
 
391      'goals':[\
 
392               {'entity':['self'],'direction':'max','type':'state',
 
393                'key':'alive','weight':5.},
 
394               {'entity':['self'],'direction':'max','type':'state',
 
395                'key':'actAlive','weight':1000.},
 
396               {'entity':['self'],'direction':'max','type':'state',
 
397                'key':'sameLocation','weight':1000.},
 
398               
 
399               {'entity':['self'],'direction':'max','type':'state',
 
400                'key':'has-cake','weight':1},
 
401  ##             {'entity':['self'],'direction':'max','type':'state',
 
402  ##              'key':'preferWait','weight':1},
 
403               ],
 
404       'actions': {'type':'OR',
 
405                  'values':[{'type':'decision',
 
406                             'value':{'type':'XOR',
 
407                                      'key':'object',
 
408                                      'values':[{'type':'generic','value':'wolf'}],
 
409                                      'base': {'type':'XOR',
 
410                                               'key':'type',
 
411                                               'values':[{'type':'literal','value':'escape'},
 
412                                                         ],
 
413                                               },
 
414                                      },
 
415                             },
 
416                            {'type':'decision',
 
417                             'value':{'type':'XOR',
 
418                                               'key':'type',
 
419                                               'values':[{'type':'literal','value':'wait'},
 
420                                                         ],
 
421                                      },
 
422                             },
 
423                            ],
 
424                  },
 
425  
 
426      } 
427  
 
428  classHierarchy['wolf'] = {
 
429      'parent': ['character'],
 
430      'horizon':2,
 
431      'depth':2,
 
432      'state':{\
 
433              'location':-.2,
 
434              'full':0.0,
 
435              
 
436              'know-granny':0.0,          
 
437  
 
438              'enquired':0.0,
 
439  ##            'noRepeat':1.0,
 
440  
 
441              'SDnorm':0.0,
 
442  
 
443              'preferWait':-1,
 
444               },
 
445  ##    'beliefs':{'hunter':{'model':'simple'},
 
446  ##               'granny':{'model':'simple'},
 
447  ##               'red':{'model':'simple'},
 
448  ##               },
 
449      'goals':[{'entity':['self'],'direction':'max','type':'state',
 
450                                'key':'init-norm','weight':1.},
 
451                              {'entity':['self'],'direction':'max','type':'state',
 
452                                'key':'resp-norm','weight':1000.},
 
453                               {'entity':['self'],'direction':'max','type':'state',
 
454                              'key':'makeResp-norm','weight':1.},
 
455                              {'entity':['self'],'direction':'max','type':'state',
 
456                                'key':'conversation-flow-norm','weight':1.},
 
457                              {'entity':['self'],'direction':'max','type':'state',
 
458                                'key':'noRepeat-norm','weight':1.},
 
459               
 
460               {'entity':['self'],'direction':'max','type':'state',
 
461                'key':'SDnorm','weight':1.},
 
462               {'entity':['self'],'direction':'max','type':'state',
 
463                'key':'full','weight':3.},
 
464               {'entity':['self'],'direction':'max','type':'state',
 
465                'key':'alive','weight':5.},
 
466                {'entity':['self'],'direction':'max','type':'state',
 
467                'key':'know-granny','weight':1.},
 
468               
 
469               {'entity':['self'],'direction':'max','type':'state',
 
470                'key':'actAlive','weight':1000.},
 
471               {'entity':['self'],'direction':'max','type':'state',
 
472                'key':'sameLocation','weight':1000.},
 
473               {'entity':['self'],'direction':'max','type':'state',
 
474                'key':'specialRule','weight':1000.},
 
475               
 
476               {'entity':['self'],'direction':'max','type':'state',
 
477                'key':'preferWait','weight':.1},
 
478  
 
479               {'entity':['self'],'direction':'max','type':'state',
 
480                'key':'likeMove','weight':.5},
 
481                       {'entity':['self'],'direction':'max','type':'state',
 
482                'key':'likeTalk','weight':.5},
 
483  
 
484              
 
485               ],
 
486      
 
487       'actions': {'type':'OR',
 
488                  'values':[{'type':'decision',
 
489                             'value':{'type':'XOR',
 
490                                      'key':'object',
 
491                                      'values':[{'type':'generic','value':'red'},
 
492                                                {'type':'generic','value':'granny'}],
 
493                                      'base': {'type':'XOR',
 
494                                               'key':'type',
 
495                                               'values':[{'type':'literal','value':'eat'},
 
496                                                         ],
 
497                                               },
 
498                                      },
 
499                             },
 
500                            {'type':'decision',
 
501                             'value':{'type':'XOR',
 
502                                      'key':'object',
 
503                                      'values':[{'type':'generic','value':'red'},
 
504                                                ],
 
505                                      'base': {'type':'XOR',
 
506                                               'key':'type',
 
507                                               'values':[\
 
508                                                         {'type':'literal','value':'greet-init'},
 
509                                                         {'type':'literal','value':'greet-resp'},
 
510                                                         {'type':'literal','value':'bye-init'},
 
511                                                         {'type':'literal','value':'bye-resp'},
 
512                                                         {'type':'literal','value':'enquiry'},
 
513                                                         {'type':'literal','value':'enquiry-about-granny'},
 
514                                                         {'type':'literal','value':'inform'},
 
515                                                         ],
 
516                                               },
 
517                                      },
 
518                             },
 
519                         
 
520                            {'type':'decision',
 
521                                     'value':{'type':'XOR',
 
522                                                       'key':'type',
 
523                                                       'values':[{'type':'literal','value':'move2'},
 
524                                                                 {'type':'literal','value':'wait'},
 
525  ##                                                                {'type':'literal','value':'changeIdentity'},
 
526                                                                 ],
 
527                                                      
 
528                                              },
 
529                                     }, 
 
530                            ],
 
531                  },
 
532      } 
533  
 
534  classHierarchy['fairy'] = {
 
535      'parent': ['Entity'],
 
536      'horizon':1,
 
537      'depth':0,
 
538      'goals':[{'entity':['self'],'direction':'min','type':'state',
 
539                'key':'preferWait','weight':1},],
 
540      'state':{\
 
541              'alive':1,
 
542               },
 
543      'dynamics':[],
 
544       'actions': {'type':'OR',
 
545                  'values':[{'type':'decision',
 
546                             'value':{'type':'XOR',
 
547                                      'key':'object',
 
548                                      'values':[{'type':'generic','value':'wolf'}],
 
549                                      'base': {'type':'XOR',
 
550                                               'key':'type',
 
551                                               'values':[{'type':'literal','value':'kill'},
 
552                                                         ],
 
553                                               },
 
554                                      },
 
555                             },
 
556                            
 
557                            {'type':'decision',
 
558                             'value':{'type':'XOR',
 
559                                               'key':'type',
 
560                                               'values':[{'type':'literal','value':'wait'},
 
561                                                         ],
 
562                                      },
 
563                             },
 
564                            {'type':'decision',
 
565                             'value':{'type':'XOR',
 
566                                      'key':'object',
 
567                                      'values':[{'type':'generic','value':'red'},
 
568                                                {'type':'generic','value':'granny'},
 
569                                                {'type':'generic','value':'wolf'},],
 
570                                      'base': {'type':'XOR',
 
571                                               'key':'type',
 
572                                               'values':[{'type':'literal','value':'resurrect'},
 
573                                                         ],
 
574                                               },
 
575                                      },
 
576                             },
 
577                            ],
 
578                  },
 
579  
 
580      } 
581