1 | from decimal import Decimal
|
---|
2 | import unittest
|
---|
3 | from unittest.mock import Mock
|
---|
4 |
|
---|
5 | from geniusweb.bidspace.pareto.ParetoPoint import ParetoPoint
|
---|
6 | from geniusweb.issuevalue.Bid import Bid
|
---|
7 | from geniusweb.issuevalue.Value import Value
|
---|
8 | from geniusweb.profile.utilityspace.LinearAdditive import LinearAdditive
|
---|
9 |
|
---|
10 |
|
---|
11 | class ParetoPointTest(unittest.TestCase):
|
---|
12 | D0_2 = Decimal("0.2")
|
---|
13 | D0_1 = Decimal("0.1")
|
---|
14 | D0_3 = Decimal("0.3")
|
---|
15 | D0_4 = Decimal("0.4")
|
---|
16 | D0_5 = Decimal("0.5")
|
---|
17 | space1 = Mock(LinearAdditive)
|
---|
18 | space2 = Mock(LinearAdditive)
|
---|
19 | bid11 = Mock(Bid)
|
---|
20 | bid12 = Mock(Bid)
|
---|
21 | bid21 = Mock(Bid)
|
---|
22 | bid22 = Mock(Bid)
|
---|
23 |
|
---|
24 | def setUp(self):
|
---|
25 | self.space1.getUtility = Mock(side_effect=lambda b: \
|
---|
26 | {self.bid11:self.D0_1, self.bid12:self.D0_1, \
|
---|
27 | self.bid21:self.D0_2, self.bid22:self.D0_2 }[b])
|
---|
28 | self.space2.getUtility = Mock(side_effect=lambda b: \
|
---|
29 | {self.bid11:self.D0_1, self.bid12:self.D0_2, \
|
---|
30 | self.bid21:self.D0_1, self.bid22:self.D0_2 }[b])
|
---|
31 |
|
---|
32 | self.point11 = ParetoPoint.create(self.bid11, [self.space1, self.space2])
|
---|
33 | self.point12 = ParetoPoint.create(self.bid12, [self.space1, self.space2])
|
---|
34 | self.point21 = ParetoPoint.create(self.bid21, [self.space1, self.space2])
|
---|
35 | self.point22 = ParetoPoint.create(self.bid22, [self.space1, self.space2])
|
---|
36 |
|
---|
37 | def testconstructorTest(self):
|
---|
38 | self.assertEqual(self.bid11, self.point11.getBid())
|
---|
39 | self.assertEqual(self.bid21, self.point21.getBid())
|
---|
40 |
|
---|
41 | self.assertEqual([self.D0_1, self.D0_1], self.point11.getUtilities())
|
---|
42 | self.assertEqual([self.D0_2, self.D0_1], self.point21.getUtilities())
|
---|
43 |
|
---|
44 | def testdominationTest(self):
|
---|
45 | self.assertTrue(self.point11.isDominatedBy(self.point11))
|
---|
46 | self.assertTrue(self.point11.isDominatedBy(self.point12))
|
---|
47 | self.assertTrue(self.point11.isDominatedBy(self.point21))
|
---|
48 | self.assertTrue(self.point11.isDominatedBy(self.point22))
|
---|
49 |
|
---|
50 | self.assertFalse(self.point12.isDominatedBy(self.point11))
|
---|
51 | self.assertFalse(self.point12.isDominatedBy(self.point21))
|
---|
52 | self.assertTrue(self.point12.isDominatedBy(self.point12))
|
---|
53 | self.assertTrue(self.point12.isDominatedBy(self.point22))
|
---|
54 |
|
---|
55 | self.assertFalse(self.point21.isDominatedBy(self.point11))
|
---|
56 | self.assertFalse(self.point21.isDominatedBy(self.point12))
|
---|
57 | self.assertTrue(self.point21.isDominatedBy(self.point21))
|
---|
58 | self.assertTrue(self.point21.isDominatedBy(self.point22))
|
---|
59 |
|
---|
60 | self.assertFalse(self.point22.isDominatedBy(self.point11))
|
---|
61 | self.assertFalse(self.point22.isDominatedBy(self.point12))
|
---|
62 | self.assertFalse(self.point22.isDominatedBy(self.point21))
|
---|
63 | self.assertTrue(self.point22.isDominatedBy(self.point22))
|
---|
64 |
|
---|
65 | def testmergeTest(self):
|
---|
66 | # partial bid 020_010 has value 0.2 for issue 2 in space1 and 0.1 for
|
---|
67 | # issue 2 in space2.
|
---|
68 | value1 = Mock(Value)
|
---|
69 | value2 = Mock(Value)
|
---|
70 | value3 = Mock(Value)
|
---|
71 |
|
---|
72 | partialbid020_010 = Bid({"issue2": value2})
|
---|
73 | partialbid102_301 = Bid({"issue1": value1, "issue3":value3})
|
---|
74 | # merged this should be a bid 122_311 so it has utilities
|
---|
75 | # 1+2+2=0.5 in space1 and 3+1+1=0.5 in space2
|
---|
76 |
|
---|
77 | self.space1.getUtility = Mock(side_effect=lambda bid:\
|
---|
78 | {partialbid020_010:self.D0_2, partialbid102_301:self.D0_3}[bid])
|
---|
79 | self.space2.getUtility = Mock(side_effect=lambda bid:
|
---|
80 | {partialbid020_010:self.D0_1, partialbid102_301:self.D0_4 }[bid])
|
---|
81 |
|
---|
82 | p1 = ParetoPoint.create(partialbid020_010, [self.space1, self.space2])
|
---|
83 | p2 = ParetoPoint.create(partialbid102_301, [self.space1, self.space2])
|
---|
84 |
|
---|
85 | p = p1.merge(p2)
|
---|
86 | bid = p.getBid()
|
---|
87 | self.assertEqual(self.D0_5, p.getUtilities()[0])
|
---|
88 | self.assertEqual(self.D0_5, p.getUtilities()[1])
|
---|