1 from teamwork.math.Keys import *
2 from teamwork.math.KeyedMatrix import *
3 from testPWL import TestPWL,makeDynamics,makeVector
4 import copy
5 import random
6 import time
7 import unittest
8
10 """
11 @cvar iterations: the number of times to repeat each test
12 @type iterations: int
13 @cvar horizon: the number of steps to consider in a projection
14 @type horizon: int
15 @cvar features: a list of state features to use as test case
16 @type features: C{str}[]
17 @cvar agents: a list of entity names to use as test cases
18 @type agents: C{str}[]
19 @cvar step: the granularity of the iteration through vector space
20 @type step: C{float}
21 """
22 features = [
23 'strength',
24 'dexterity',
25 'constitution',
26 'intelligence',
27 'charisma',
28 'wisdom',
29 ]
30 agents = [
31 'warrior',
32 'wizard',
33 'cleric',
34 'thief',
35 ]
36 step = 0.5
37 iterations = 10
38 horizon = 10
39
45
47 """Generate the first state vector in an exhaustive sequence
48 @rtype: L{KeyedVector} instance"""
49 vec = KeyedVector()
50 vec.setArray()
51 return vec
52
54 """Return the next state vector in sequence following the given one
55 @param vec: the current vector from the sequence
56 @type vec: L{KeyedVector} instance
57 @rtype: L{KeyedVector} instance"""
58 for key in self.keys + [keyConstant]:
59 if vec.has_key(key):
60 vec[key] += self.step
61 if vec[key] > 1.:
62 del vec[key]
63 else:
64 break
65 else:
66 vec[key] = -1.
67 break
68 else:
69 return None
70 vec.setArray()
71 return vec
72
74 """Checks a single addition between two vectors
75 @type row1,row2: L{KeyedVector}"""
76 row3 = row1 + row2
77 self.assertEqual(row1.keys(),row3.keys())
78 self.assertEqual(row2.keys(),row3.keys())
79 for key in row1.keys():
80 self.assert_(key in row3.keys())
81 for key in row2.keys():
82 self.assert_(key in row3.keys())
83 for key in row3.keys():
84 if key in row1.keys():
85 if key in row2.keys():
86 self.assertAlmostEqual(row1[key]+row2[key],row3[key],8)
87 else:
88 self.assertAlmostEqual(row1[key],row3[key],8)
89 elif key in row2.keys():
90 self.assertAlmostEqual(row2[key],row3[key],8)
91 else:
92 self.fail()
93
95 """Checks a single product between vector and float scaling factor
96 @param vec1: the vector to scale
97 @type vec1: L{KeyedVector}
98 @param scale: the factor to scale vector by
99 @type scale: C{float}"""
100 vec2 = vec1 * scale
101 for key in vec2.keys():
102 self.assert_(key in vec1.keys())
103 for key in vec1.keys():
104 self.assertAlmostEqual(vec2[key],vec1[key]*scale,8)
105 self.assertEqual(len(vec2),len(vec1.keys()))
106
108 """Checks a single product between two vectors
109 @type row1,row2: L{KeyedVector}"""
110 total = 0.
111 for key in row1.keys():
112 try:
113 total += row1[key]*row2[key]
114 except KeyError:
115
116 pass
117 keyList = self.keys+[keyConstant]
118 keyList.sort()
119 row1.fill(keyList,0.)
120 row1.freeze()
121 row2.fill(keyList,0.)
122 row2.freeze()
123 result = row1 * row2
124 self.assertAlmostEqual(result,total,8)
125
146
157
159
160 keyList = self.keys+[keyConstant]
161 keyList.sort()
162 size = len(keyList)
163 for index in range(self.iterations):
164 vector = makeVector(self.keys)
165 vector.fill(keyList)
166 self.assertEqual(len(vector),len(keyList))
167 self.assertEqual(vector.keys(),keyList)
168 for index in range(size):
169 key = keyList[index]
170 self.assert_(vector.has_key(key))
171 self.assertEqual(vector._order[key],index)
172 self.assertEqual(vector.keys(),keyList)
173
174 key = random.choice(keyList)
175 vector[key] = random.random()
176 self.assertEqual(len(vector),len(keyList))
177 self.assertEqual(len(vector.keys()),len(keyList))
178 self.assertEqual(len(vector.getArray()),len(keyList))
179
180 del vector[key]
181 self.assertEqual(len(vector),len(keyList)-1)
182 self.assertEqual(len(vector.keys()),len(keyList)-1)
183 self.assertEqual(len(vector.getArray()),len(keyList)-1)
184 self.assert_(not vector.has_key(key))
185
197
209
216
222
231
233 """Checks a single product between 2D and 1D matrices
234 @type mat: L{KeyedMatrix}
235 @type vec: L{KeyedVector}"""
236 vec.fill(self.keys,0.)
237 result = mat*vec
238 for key in self.keys:
239 self.assertAlmostEqual(result[key],mat[key]*vec,8)
240 self.assertAlmostEqual(result[keyConstant],1.,8)
241
249
251 """Checks a single product between 1D and 2D matrices
252 @type vector: L{KeyedVector}
253 @type matrix: L{KeyedMatrix}
254 """
255 vector.fill(self.keys)
256 self.assertEqual(vector.keys(),matrix.rowKeys())
257 self.assertEqual(vector._order,matrix._rowOrder)
258 self.assertEqual(vector.keys(),matrix.colKeys())
259 self.assertEqual(vector._order,matrix.values()[0]._order)
260 result = vector * matrix
261 self.assertEqual(vector.keys(),result.keys())
262 for col in self.keys+[keyConstant]:
263 total = 0.
264 for row in self.keys+[keyConstant]:
265 total += vector[row]*matrix[row][col]
266 self.assertAlmostEqual(result[col],total,8)
267 self.assertEqual(result.getArray().shape,vector.getArray().shape)
268
285
305
329
331 typeList = getDeltaTypes()
332 for cls1 in typeList.values():
333 if cls1.keyClass is StateKey:
334 key = random.choice(self.keys)
335 elif cls1.keyClass is ConstantKey:
336 key = keyConstant
337 else:
338 self.fail()
339 row1 = cls1(sourceKey=StateKey({'entity':'self',
340 'feature':self.features[0]}),
341 deltaKey=key,value=random.uniform(-1.,1.))
342 for cls2 in typeList.values():
343 if cls2.keyClass is StateKey:
344 key = random.choice(self.keys)
345 elif cls2.keyClass is ConstantKey:
346 key = keyConstant
347 else:
348 self.fail()
349 row2 = cls2(sourceKey=StateKey({'entity':'self',
350 'feature':self.features[1]}),
351 deltaKey=key,value=random.uniform(-1.,1.))
352 row3 = row1 + row2
353 if isinstance(row3,row1.__class__):
354 self.assert_(isinstance(row2,row1.__class__))
355 else:
356 self.assert_(not isinstance(row3,DeltaRow))
357
374
382
398
406
423
424
426 from teamwork.agent.Agent import Agent
427 keyList = self.keys+[keyConstant]
428 keyList.sort()
429 for index in range(self.iterations):
430 value = random.random()
431 matrix = SetToConstantMatrix(feature=self.features[0],
432 value=value)
433 table = {'self':Agent(self.agents[0])}
434 matrix.instantiateKeys(table)
435 matrix.fill(keyList)
436 old = makeVector(self.keys)
437 old[keyConstant] = 1.
438 old.fill(self.keys)
439 key = StateKey({'entity':self.agents[0],
440 'feature':self.features[0]})
441 new = matrix*old
442 self.assertAlmostEqual(new[key],value,8)
443 for index in range(self.iterations):
444 value = random.random()
445 deltaKey = StateKey({'entity':self.agents[1],
446 'feature':self.features[1]})
447 matrix = SetToFeatureMatrix(feature=self.features[0],
448 key=deltaKey,
449 value=value)
450 table = {'self':Agent(self.agents[0])}
451 matrix.instantiateKeys(table)
452 matrix.fill(keyList)
453 old = makeVector(self.keys)
454 old[keyConstant] = 1.
455 old[deltaKey] = random.random()
456 old.fill(self.keys)
457 key = StateKey({'entity':self.agents[0],
458 'feature':self.features[0]})
459 new = matrix*old
460 self.assertAlmostEqual(new[key],value*old[deltaKey],8)
461
463 from numpy.linalg.linalg import LinAlgError
464 for index in range(self.iterations):
465 done = False
466 while not done:
467 matrix = makeDynamics(self.keys,1.)
468 try:
469 inverse = matrix.inverse()
470 done = True
471 except LinAlgError:
472 pass
473 result1 = matrix*inverse
474 result2 = inverse*matrix
475 for rowKey in matrix.rowKeys():
476 for colKey in matrix.colKeys():
477 if colKey == rowKey:
478 self.assertAlmostEqual(result1[rowKey][colKey],1.,8)
479 self.assertAlmostEqual(result2[rowKey][colKey],1.,8)
480 else:
481 self.assertAlmostEqual(result1[rowKey][colKey],0.,8)
482 self.assertAlmostEqual(result2[rowKey][colKey],0.,8)
483
484 if __name__ == '__main__':
485 unittest.main()
486