source: geniuswebcore/test/geniusweb/opponentmodel/FrequencyOppModelTest.py@ 84

Last change on this file since 84 was 84, checked in by Bart Vastenhouw, 2 years ago

Added time-dependent parties for python and simpleRunner-GUI for java

File size: 7.1 KB
Line 
1from unitpy.GeneralTests import GeneralTests
2from geniusweb.opponentmodel.FrequencyOpponentModel import FrequencyOpponentModel
3from geniusweb.issuevalue.DiscreteValue import DiscreteValue
4from unittest.mock import Mock
5from geniusweb.progress.Progress import Progress
6from geniusweb.actions.PartyId import PartyId
7from geniusweb.actions.Offer import Offer
8from decimal import Decimal
9from typing import Dict, List
10from geniusweb.issuevalue.ValueSet import ValueSet
11from geniusweb.issuevalue.DiscreteValueSet import DiscreteValueSet
12from geniusweb.issuevalue.NumberValueSet import NumberValueSet
13from geniusweb.issuevalue.Domain import Domain
14from geniusweb.issuevalue.Value import Value
15from geniusweb.issuevalue.NumberValue import NumberValue
16from geniusweb.issuevalue.Bid import Bid
17from geniusweb.actions.Offer import Offer
18import unittest
19from tudelft.utilities.immutablelist.Range import Range
20
21class FrequencyOppModelTest (unittest.TestCase, GeneralTests[FrequencyOpponentModel] ):
22 ISS1 = "issue1"
23 ISS2 = "issue2";
24 I1V1 = DiscreteValue("i1v1")
25 I1V2 = DiscreteValue("i1v2");
26 I2V1 = DiscreteValue("i2v1")
27 I2V2 = DiscreteValue("i2v2")
28 I1V2b = DiscreteValue("i1v2b");
29 progress = Mock(Progress);
30 other = PartyId("other")
31 HALF = Decimal("0.5")
32 #list:List[List[Bid]] = []
33
34 def setUp(self):
35 issues:Dict[str, ValueSet] = {}
36 discretevalues1:List[DiscreteValue] = []
37 discretevalues1.append(self.I1V1);
38 discretevalues1.append(self.I1V2);
39 values1 = DiscreteValueSet(discretevalues1)
40 issues[self.ISS1]= values1
41 values2 = NumberValueSet(Range(Decimal(0),Decimal(10), Decimal("0.3")))
42 issues[self.ISS2]=values2
43 self.domain = Domain("test", issues)
44 self.domain2 = Domain("test2", issues)
45
46 # slightly different issue1
47 issues = {}
48 discretevalues1 = []
49 discretevalues1.append(self.I1V1)
50 discretevalues1.append(self.I1V2b)
51 values1 = DiscreteValueSet(discretevalues1)
52 issues[self.ISS1]= values1
53 values2 = NumberValueSet(Range(Decimal(0), Decimal(10),Decimal("0.3")))
54 issues[self.ISS2]= values2
55 self.domain3 = Domain("test", issues)
56
57 # all bids are for domain
58 issuevalues:Dict[str, Value] = {}
59 issuevalues[self.ISS1]= self.I1V1
60 issuevalues[self.ISS2]=NumberValue(Decimal("1.2"))
61 self.bid1 = Bid(issuevalues)
62
63 issuevalues[self.ISS1]= self.I1V1
64 issuevalues[self.ISS2]= NumberValue(Decimal("1.5"))
65 self.bid2 = Bid(issuevalues)
66
67 issuevalues[self.ISS1]= self.I1V2
68 issuevalues[self.ISS2]= NumberValue(Decimal("1.5"))
69 self.bid3 = Bid(issuevalues)
70
71 self.oppModel1 = FrequencyOpponentModel.create().With(self.domain, None)
72 self.oppModel1b = FrequencyOpponentModel.create().With(self.domain, None)
73 self.oppModel2 = FrequencyOpponentModel.create().With(self.domain2, None)
74 self.oppModel3 = FrequencyOpponentModel.create().With(self.domain3, None)
75 self.oppModel4 = self.oppModel3.WithAction(Offer(self.other, self.bid1), self.progress)
76
77 #Override
78 def getGeneralTestData(self) -> List[List[FrequencyOpponentModel]] :
79 return [[self.oppModel1, self.oppModel1b],
80 [self.oppModel2], [self.oppModel3], [self.oppModel4]]
81
82 #Override
83 def getGeneralTestStrings(self)->List[str] :
84 return ["FrequencyOpponentModel\\[0,\\{issue.=\\{\\}, issue.=\\{\\}\\}\\]",
85 "FrequencyOpponentModel\\[0,\\{issue.=\\{\\}, issue.=\\{\\}\\}\\]",
86 "FrequencyOpponentModel\\[0,\\{issue.=\\{\\}, issue.=\\{\\}\\}\\]",
87 "FrequencyOpponentModel\\[1,\\{issue2=\\{1.2=1\\}, issue1=\\{\"i1v1\"=1\\}\\}\\]"]
88
89 def testsmokeTestNull(self) :
90 self.assertRaises(ValueError, lambda:FrequencyOpponentModel.create().With(None,None))
91
92 def testsmokeTest(self):
93 FrequencyOpponentModel.create().With(self.domain, None)
94
95 def testEmptyModel(self):
96 oppModel = FrequencyOpponentModel.create().With(self.domain, None)
97 self.assertEqual(1, oppModel.getUtility(self.bid1))
98 self.assertEqual(1, oppModel.getUtility(self.bid2))
99
100 def testEmptyModelPartialBid(self):
101 oppModel =FrequencyOpponentModel.create().With(self.domain, None)
102 bid = Bid({})
103 self.assertEqual(1, oppModel.getUtility(bid))
104
105 def testPartialUtility(self):
106 freqs:Dict[str, Dict[Value, int]] = {}
107 freqs1:Dict[Value, int] = {}
108 freqs2:Dict[Value, int] = {}
109
110 freqs1[self.I1V1]= 2
111 freqs1[self.I1V2]= 0
112 freqs2[self.I2V1]= 1
113 freqs2[self.I2V2]= 1
114
115 freqs[self.ISS1]= freqs1
116 freqs[self.ISS2]= freqs2
117 total = Decimal(2)
118
119 oppModel = FrequencyOpponentModel(self.domain, freqs, total,None)
120
121 E = 0.0000001
122 self.assertAlmostEqual(0.5, oppModel.getUtility(Bid({self.ISS1: self.I1V1})), None,E)
123 self.assertAlmostEqual(0, oppModel.getUtility(Bid({self.ISS1: self.I1V2})))
124 self.assertAlmostEqual(0.25,
125 oppModel.getUtility(Bid({self.ISS2:self.I2V1})), None,E)
126 self.assertAlmostEqual(0.25, oppModel.getUtility(Bid({self.ISS2: self.I2V2})))
127
128
129 def testUpdate(self):
130 oppModel = self.oppModel1.WithAction(Offer(self.other, self.bid1),
131 self.progress);
132 self.assertEqual(1, oppModel.getUtility(self.bid1) )
133 self.assertEqual(0,oppModel.getUtility(self.bid3) )
134 # bid2 has 1 of 2 issue values same as bid1.
135 self.assertTrue(0.5, oppModel.getUtility(self.bid2))
136
137 def testUpdate2(self):
138 # bid1 and bid2 both want I1V1. They differ on the number value.
139 # bid3 wants I1V2 but does have the number value from bid2
140 oppModel = self.oppModel1\
141 .WithAction(Offer(self.other, self.bid1), self.progress)\
142 .WithAction(Offer(self.other, self.bid2), self.progress)
143 self.assertEqual(0.75, oppModel.getUtility(self.bid1))
144 self.assertEqual(0.75, oppModel.getUtility(self.bid2))
145 self.assertEqual(0.25, oppModel.getUtility(self.bid3))
146
147 def testPartialBidUpdate(self):
148 oppModel = self.oppModel1.WithAction(Offer(self.other, self.bid1),
149 self.progress)
150 partialbid = Bid({self.ISS1: self.I1V1})
151 oppModel.WithAction(Offer(self.other, partialbid), self.progress)
152
153 def testGetCounts(self):
154 self.assertEqual({}, self.oppModel1.getCounts(self.ISS1))
155 self.assertEquals({}, self.oppModel1.getCounts(self.ISS2))
156
157 values1:Dict[str, Value] = {}
158 values1[self.ISS1]= self.I1V1
159 values1[self.ISS2]= self.I2V1
160 offer1 = Offer(self.other, Bid(values1))
161
162 oppmod = self.oppModel1.WithAction(offer1, self.progress)
163
164 self.assertEqual(1, oppmod.getCounts(self.ISS1)[self.I1V1])
165 self.assertFalse(self.I1V2 in oppmod.getCounts(self.ISS1))
166 self.assertEquals(1, oppmod.getCounts(self.ISS2)[self.I2V1])
167 self.assertFalse(self.I2V2 in oppmod.getCounts(self.ISS2))
168
169 # same identical bid. Counts should go to 2
170 oppmod = oppmod.WithAction(offer1, self.progress)
171
172 self.assertEquals(2, oppmod.getCounts(self.ISS1)[self.I1V1])
173 self.assertEquals(2, oppmod.getCounts(self.ISS2)[self.I2V1])
174
175 values2:Dict[str, Value] = {}
176 values2[self.ISS1]=self.I1V2
177 values2[self.ISS2]=self.I2V2
178 offer2 = Offer(self.other, Bid(values2))
179
180 # Other bid. with value2 for both issues
181 oppmod = oppmod.WithAction(offer2, self.progress)
182
183 self.assertEqual(2, oppmod.getCounts(self.ISS1)[self.I1V1])
184 self.assertEqual(2, oppmod.getCounts(self.ISS2)[self.I2V1])
185 self.assertEqual(1, oppmod.getCounts(self.ISS1)[self.I1V2])
186 self.assertEqual(1, oppmod.getCounts(self.ISS2)[self.I2V2])
187
188
189 def testStableName(self):
190 name = self.oppModel1.getName()
191 self.assertNotEqual(None, name)
192 self.assertEqual(name, self.oppModel1.getName())
193
Note: See TracBrowser for help on using the repository browser.