source: src/main/java/genius/core/BidIterator.java

Last change on this file was 1, checked in by Wouter Pasman, 6 years ago

Initial import : Genius 9.0.0

File size: 3.8 KB
Line 
1package genius.core;
2
3import java.util.HashMap;
4import java.util.Iterator;
5import java.util.List;
6
7import genius.core.issue.Issue;
8import genius.core.issue.IssueDiscrete;
9import genius.core.issue.IssueInteger;
10import genius.core.issue.IssueReal;
11import genius.core.issue.Value;
12import genius.core.issue.ValueInteger;
13import genius.core.issue.ValueReal;
14
15/**
16 * Class used to generate all bids in the domain. For issues with a continuous
17 * range discretization is used. If you want to search the set of generated bids
18 * efficiently, consider using SortedOutcomeSpace instead.
19 *
20 * @author Dmytro, Wouter
21 */
22public class BidIterator implements Iterator<Bid> {
23 protected Domain fDomain;
24 protected int fNumberOfIssues;
25 protected int[] fValuesIndexes;
26 protected boolean fInit;
27
28 /**
29 * Creates an iterator for the given outcomespace (domain).
30 *
31 * @param pDomain
32 * of which we want to generate all bids.
33 */
34 public BidIterator(Domain pDomain) {
35 fDomain = pDomain;
36 fInit = true;
37 fNumberOfIssues = fDomain.getIssues().size();
38 fValuesIndexes = new int[fNumberOfIssues];
39 }
40
41 public boolean hasNext() {
42 int[] lNextIndexes = makeNextIndexes();
43 boolean result = false;
44 if (fInit) {
45 return true;
46 } else {
47 for (int i = 0; i < fNumberOfIssues; i++)
48 if (lNextIndexes[i] != 0) {
49 result = true;
50 break;
51 }
52 return result;
53 }
54 // return fHasNext;
55 }
56
57 private int[] makeNextIndexes() {
58 int[] lNewIndexes = new int[fNumberOfIssues];
59 for (int i = 0; i < fNumberOfIssues; i++)
60 lNewIndexes[i] = fValuesIndexes[i];
61 List<Issue> lIssues = fDomain.getIssues();
62 for (int i = 0; i < fNumberOfIssues; i++) {
63 Issue lIssue = lIssues.get(i);
64 // to loop through the Real Issues we use discretization
65 int lNumberOfValues = 0;
66 switch (lIssue.getType()) {
67 case INTEGER:
68 IssueInteger lIssueInteger = (IssueInteger) lIssue;
69 lNumberOfValues = lIssueInteger.getUpperBound()
70 - lIssueInteger.getLowerBound() + 1;
71 break;
72 case REAL:
73 IssueReal lIssueReal = (IssueReal) lIssue;
74 lNumberOfValues = lIssueReal.getNumberOfDiscretizationSteps();
75 break;
76 case DISCRETE:
77 IssueDiscrete lIssueDiscrete = (IssueDiscrete) lIssue;
78 lNumberOfValues = lIssueDiscrete.getNumberOfValues();
79 break;
80 }
81 if (lNewIndexes[i] < lNumberOfValues - 1) {
82 lNewIndexes[i]++;
83 break;
84 } else {
85 lNewIndexes[i] = 0;
86 }
87
88 }// for
89 return lNewIndexes;
90 }
91
92 public Bid next() {
93 Bid lBid = null;
94 int[] lNextIndexes = makeNextIndexes();
95 if (fInit)
96 fInit = false;
97 else
98 fValuesIndexes = lNextIndexes;
99
100 // build Hashmap and createFrom the next bid.
101 try {
102 HashMap<Integer, Value> lValues = new HashMap<Integer, Value>(/*
103 * 16,(float
104 * )0.75
105 */);
106 List<Issue> lIssues = fDomain.getIssues();
107 for (int i = 0; i < fNumberOfIssues; i++) {
108 Issue lIssue = lIssues.get(i);
109 double lOneStep;
110 switch (lIssue.getType()) {
111 // TODO: COMPLETE add cases for all types of issues
112 case INTEGER:
113 IssueInteger lIssueInteger = (IssueInteger) lIssue;
114 lValues.put(lIssue.getNumber(), new ValueInteger(
115 lIssueInteger.getLowerBound() + fValuesIndexes[i]));
116 break;
117 case REAL:
118 IssueReal lIssueReal = (IssueReal) lIssue;
119 lOneStep = (lIssueReal.getUpperBound() - lIssueReal
120 .getLowerBound())
121 / (lIssueReal.getNumberOfDiscretizationSteps() - 1);
122 lValues.put(lIssue.getNumber(),
123 new ValueReal(lIssueReal.getLowerBound() + lOneStep
124 * fValuesIndexes[i]));
125 break;
126 case DISCRETE:
127 IssueDiscrete lIssueDiscrete = (IssueDiscrete) lIssue;
128 lValues.put(lIssue.getNumber(),
129 lIssueDiscrete.getValue(fValuesIndexes[i]));
130 break;
131 }
132 }
133
134 lBid = new Bid(fDomain, lValues);
135 } catch (Exception e) {
136 e.printStackTrace();
137 }
138 return lBid;
139 }
140
141 public void remove() {
142 }
143
144}
Note: See TracBrowser for help on using the repository browser.