1 from teamwork.agent.Entities import *
2 from teamwork.multiagent.sequential import *
3 from teamwork.multiagent.GenericSociety import *
4 from teamwork.agent.DefaultBased import createEntity
5 from teamwork.messages.PsychMessage import *
6 from teamwork.examples.InfoShare.PortClasses import *
7 from teamwork.math.probability import *
8 import unittest
9
11 debug = None
12
14 """Creates the instantiated scenario used for testing"""
15 self.society = GenericSociety()
16 self.society.importDict(classHierarchy)
17 entities = []
18 self.instances = {'World':1,'FederalAuthority':1,
19 'FirstResponder':1,'Shipper':1}
20 for cls,num in self.instances.items():
21 for index in range(num):
22 if num > 1:
23 name = '%s%d' % (cls,index)
24 else:
25 name = cls
26 entity = createEntity(cls,name,self.society,PsychEntity)
27 entities.append(entity)
28 self.entities = SequentialAgents(entities)
29 self.entities.applyDefaults()
30
31 entity = self.entities['FirstResponder']
32 options = entity.actions.getOptions()
33 for act in options:
34 if act[0]['type'] == 'inspect':
35 break
36 else:
37
38 self.fail()
39 self.actions = {entity.name:act}
40
41 dangerLevel = .8
42 self.danger = Distribution({0.0: dangerLevel,
43 0.3: 1.-dangerLevel})
44 msg = {'factors': [{'topic':'state',
45 'relation':'=','value':self.danger,
46 'lhs':['entities','Shipper','state',
47 'containerDanger']}]}
48 self.msg = Message(msg)
49
51 """Tests that the instantiated scenario is what it should be"""
52
53
54 numEntities = sum(self.instances.values())
55 self.assertEqual(len(self.entities),numEntities)
56 for entity in self.entities.members():
57 if entity.name == 'World':
58 self.assertEqual(len(entity.getEntities()),0)
59 else:
60 self.assertEqual(len(entity.getEntities()),numEntities)
61 for other in entity.getEntityBeliefs():
62 if other.name == 'World':
63 self.assertEqual(len(other.getEntities()),0)
64 else:
65 self.assertEqual(len(other.getEntities()),numEntities)
66 for last in other.getEntityBeliefs():
67
68 self.assertEqual(len(last.getEntities()),0)
69
70
72 distribution = self.entities.getState()
73 self.assertEqual(len(distribution),1)
74 row = distribution.keys()[0]
75 self.assertEqual(len(row),5)
76 self.assertAlmostEqual(row[StateKey({'entity':'World',
77 'feature':'socialWelfare'})],
78 0.2,5)
79 self.assertAlmostEqual(row[StateKey({'entity':'FirstResponder',
80 'feature':'waitTime'})],
81 0.8,5)
82 self.assertAlmostEqual(row[StateKey({'entity':'FirstResponder',
83 'feature':'reputation'})],
84 0.5,5)
85 self.assertAlmostEqual(row[StateKey({'entity':'Shipper',
86 'feature':'containerDanger'})],
87 0.7,5)
88 self.assertAlmostEqual(row[keyConstant],1.,5)
89
91
92 entity = self.entities['FirstResponder']
93 state = self.entities.getState()
94 tree = self.entities.getDynamics(self.actions)['state']
95 new = tree.apply(state)*state
96 self.assertEqual(len(new),1)
97 row = new.keys()[0]
98 self.assertEqual(len(row),5)
99 self.assertAlmostEqual(row[StateKey({'entity':'World',
100 'feature':'socialWelfare'})],
101 0.2,5)
102 self.assertAlmostEqual(row[StateKey({'entity':'FirstResponder',
103 'feature':'waitTime'})],
104 0.9,5)
105 self.assertAlmostEqual(row[StateKey({'entity':'FirstResponder',
106 'feature':'reputation'})],
107 0.51,5)
108 self.assertAlmostEqual(row[StateKey({'entity':'Shipper',
109 'feature':'containerDanger'})],
110 0.0,5)
111 self.assertAlmostEqual(row[keyConstant],1.,5)
112
113 delta = self.entities.hypotheticalAct(self.actions)
114
115
117 """Tests the diff returned by our hypothetical action"""
118
119 if len(path) < 3:
120 for entity in self.entities.members():
121 self.assert_(delta.has_key(entity.name))
122 else:
123 for entity in self.entities.members():
124 self.assert_(not delta.has_key(entity.name))
125
126 for key,value in delta.items():
127 if key in self.entities.members():
128 newPath = path+[key]
129 entity = self.entities.getMember(newPath)
130 self.verifyActDelta(value,newPath)
131 elif key == 'observations':
132
133 entity = self.entities.getMember(path)
134 self.assertEqual(value,self.actions)
135 elif key == 'turn':
136 if len(path) > 0:
137 entity = self.entities.getMember(path)
138 if len(value) == 0:
139 self.assertEqual(len(entity.getEntities()),0)
140 else:
141 self.assertEqual(len(entity.getEntities()),
142 len(self.entities))
143
144 self.assertEqual(len(value),2)
145 for turnKey,turnValue in value.items():
146 if turnKey == 'reset':
147
148 self.assertEqual(turnValue,0)
149 elif turnKey == 'FirstResponder':
150
151 self.assert_(turnValue)
152
153
154
155
156
157 else:
158
159 self.fail()
160 elif key == 'state':
161 pass
162
163
164
165
166
167
168
169
170
171
172 else:
173 self.fail()
174 if len(path) > 0:
175
176 self.assert_(delta.has_key('observations'))
177
178 if path[-1] == 'FirstResponder':
179 self.assert_(delta.has_key('waitTime'))
180 else:
181 self.assert_(not delta.has_key('waitTime'))
182 else:
183
184 self.assert_(not delta.has_key('observations'))
185
187 """Tests the effect of a real action"""
188
189
190 step = self.entities.time['micro']
191 self.entities.performAct(self.actions)
192 self.assertEqual(step+1,self.entities.time['micro'])
193 self.verifyActEffect(self.entities)
194
196 """Verifies the required changes by descending the recursive beliefs"""
197
198 next = entities.next()
199 self.assertEqual(len(next),1)
200 self.assertEqual(next[0],'FederalAuthority')
201
202 for entity in entities.members():
203 if entity.name == 'FirstResponder':
204 state = entity.getState('waitTime')
205 if entity.parent and entity.parent.name == 'FederalAuthority':
206 self.assertAlmostEqual(float(state),.5*.95,3)
207 else:
208 self.assertAlmostEqual(float(state),.1*.9,3)
209 if entity.parent:
210
211 if entity.parent.name == 'FederalAuthority':
212
213 pass
214 elif entity.parent.name == 'Shipper':
215
216 pass
217 else:
218
219 pass
220 elif entity.name == 'Shipper':
221 self.assertAlmostEqual(float(entity.getState('containerDanger')),
222 0.,5)
223
224 beliefs = entity.entities
225 if len(beliefs) > 0:
226 self.verifyActEffect(beliefs)
227
229
230 entity = self.entities['FirstResponder']
231 entity.setBelief('Shipper','containerDanger',self.danger)
232 self.assertEqual(entity.getBelief('Shipper','containerDanger'),
233 self.danger)
234 step = self.entities.time['micro']
235
236 result = self.entities.microstep([{'name':entity.name}])
237
238 self.assertEqual(step+1,self.entities.time['micro'])
239 self.assertEqual(result['decision'],self.actions)
240
241 self.verifyActEffect(self.entities)
242 for actor,exp in result.items():
243 if actor == 'decision' or actor == 'delta':
244
245 continue
246 for key,value in exp.items():
247 if key == 'decision':
248 self.assertEqual(value,self.actions[actor])
249 elif key == 'actor':
250 self.assertEqual(value,actor)
251 elif key == 'effect':
252 pass
253
254 elif key == 'options':
255 entity = self.entities[actor]
256 actStrings = map(str,entity.actions.getOptions())
257 self.assertEqual(len(value.keys()),len(actStrings))
258 for option in value.keys():
259 self.assert_(option in actStrings)
260 for option,breakdown in value.items():
261 for subKey,subValue in breakdown.items():
262 if subKey == 'actor':
263 self.assertEqual(subValue,actor)
264 elif subKey == 'decision':
265 self.assert_(str(subValue) in actStrings)
266 else:
267 if self.debug:
268 print '\t%s' % (subKey)
269 else:
270 if self.debug:
271 print key
272
273
274
275
276
277
278
279
281 for key,value in delta.items():
282 if key == 'turn':
283 self.assertEqual(len(value),2)
284 self.assertEqual(value['reset'],0)
285 self.assert_(value['FederalAuthority'])
286 elif key == 'observations':
287 self.assertEqual(path[-1],'FirstResponder')
288 self.assertEqual(value,{'FederalAuthority':[self.msg]})
289 elif key == str(self.msg):
290 for subKey,subValue in value.items():
291 if subKey == 'decision':
292 self.assert_(subValue)
293 else:
294 if self.debug:
295 print '\t%s' % (subKey)
296 elif key == 'FirstResponder':
297 if self.debug:
298 print key,value.keys()
299 elif key == 'FederalAuthority':
300 if self.debug:
301 print key,value.keys()
302 elif key == 'Shipper':
303 if self.debug:
304 print key,value.keys()
305 else:
306 self.fail()
307
309 sender = 'FederalAuthority'
310 receiver = 'FirstResponder'
311 self.entities.performMsg(self.msg,sender,[receiver])
312 entity = self.entities[receiver]
313 self.assertEqual(entity.getBelief('Shipper','containerDanger'),
314 self.danger)
315
316 result = self.entities.microstep([{'name':entity.name}])
317
318 self.assertEqual(result['decision'],self.actions)
319
320 if __name__ == '__main__':
321 unittest.main()
322