Package teamwork :: Package test :: Package multiagent :: Module testPsychAgents
[hide private]
[frames] | no frames]

Source Code for Module teamwork.test.multiagent.testPsychAgents

  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   
10 -class TestPsychAgents(unittest.TestCase):
11 debug = None 12
13 - def setUp(self):
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 # Set up the spec of the desired test action 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 # No inspection act found! 38 self.fail() 39 self.actions = {entity.name:act} 40 # Set up the spec of the desired test message 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
50 - def testConstructor(self):
51 """Tests that the instantiated scenario is what it should be""" 52 53 # First test the structure of the recursive beliefs 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 # No more beliefs down here 68 self.assertEqual(len(last.getEntities()),0)
69 70
71 - def testStateVector(self):
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
90 - def testHypotheticalAct(self):
91 # First test a low-level application of dynamics 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 # Then test built-in method 113 delta = self.entities.hypotheticalAct(self.actions)
114 ## self.verifyActDelta(delta,[]) 115
116 - def verifyActDelta(self,delta,path):
117 """Tests the diff returned by our hypothetical action""" 118 # Make sure recursive changes are all present 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 # Make sure the contents are correct 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 # Everyone should observe this action 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 # Check actual turn delta 144 self.assertEqual(len(value),2) 145 for turnKey,turnValue in value.items(): 146 if turnKey == 'reset': 147 # The turn should not be reset yet 148 self.assertEqual(turnValue,0) 149 elif turnKey == 'FirstResponder': 150 # Flag marking that the FirstResponder acted 151 self.assert_(turnValue) 152 ## elif turnKey == 'turn': 153 ## # The turn should be changed from 0 to 1 154 ## self.assertEqual(len(turnValue),2) 155 ## self.assertEqual(turnValue['new'],1) 156 ## self.assertEqual(turnValue['old'],0) 157 else: 158 # Unexpected key 159 self.fail() 160 elif key == 'state': 161 pass 162 ## key == 'waitTime': 163 ## self.assertEqual(path[-1],'FirstResponder') 164 ## self.assertAlmostEqual(float(value.mean),-.05,5) 165 ## elif key == 'reputation': 166 ## self.assertEqual(path[-1],'FirstResponder') 167 ## self.assertAlmostEqual(float(value.mean),-.01,5) 168 ## elif key == 'containerDanger': 169 ## self.assertEqual(path[-1],'Shipper') 170 ## entity = self.entities.getMember(path) 171 ## self.assertEqual(entity.getState(key),-value) 172 else: 173 self.fail() 174 if len(path) > 0: 175 # Make sure that this entity did observe action 176 self.assert_(delta.has_key('observations')) 177 # Make sure state change occurs in appropriate spots 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 # Make sure that this entity did not observe action 184 self.assert_(not delta.has_key('observations'))
185
186 - def DONTtestRealAct(self):
187 """Tests the effect of a real action""" 188 # We don't bother checking the return value from the following, 189 # because it's the exact same value as for the hypothetical action 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
195 - def verifyActEffect(self,entities):
196 """Verifies the required changes by descending the recursive beliefs""" 197 # Test turn effects 198 next = entities.next() 199 self.assertEqual(len(next),1) 200 self.assertEqual(next[0],'FederalAuthority') 201 # Test effect on entities 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 # Check liking changes 211 if entity.parent.name == 'FederalAuthority': 212 # What should this be? 213 pass 214 elif entity.parent.name == 'Shipper': 215 # This should change, but doesn't yet 216 pass 217 else: 218 # Don't have liking 219 pass 220 elif entity.name == 'Shipper': 221 self.assertAlmostEqual(float(entity.getState('containerDanger')), 222 0.,5) 223 # Descend recursive belief structure to continue testing 224 beliefs = entity.entities 225 if len(beliefs) > 0: 226 self.verifyActEffect(beliefs)
227
228 - def DONTtestMicrostep(self):
229 # Configure beliefs, so that the preferred action is also our test one 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 # Do the step 236 result = self.entities.microstep([{'name':entity.name}]) 237 # Check the results 238 self.assertEqual(step+1,self.entities.time['micro']) 239 self.assertEqual(result['decision'],self.actions) 240 ## self.verifyActDelta(result['delta'],[]) 241 self.verifyActEffect(self.entities) 242 for actor,exp in result.items(): 243 if actor == 'decision' or actor == 'delta': 244 # Already covered 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 ## self.verifyActDelta(value,[actor]) 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 ## def testHypotheticalMsg(self): 274 ## sender = 'FederalAuthority' 275 ## receiver = 'FirstResponder' 276 ## delta = self.entities.hypotheticalMsg(self.msg,sender,[receiver]) 277 ## self.assertEqual(delta.keys(),[receiver]) 278 ## self.verifyMsgDelta(delta[receiver],[receiver]) 279
280 - def verifyMsgDelta(self,delta,path):
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
308 - def DONTtestRealMsg(self):
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 # Do the step 316 result = self.entities.microstep([{'name':entity.name}]) 317 # Check the results 318 self.assertEqual(result['decision'],self.actions)
319 320 if __name__ == '__main__': 321 unittest.main() 322