source: java2python/geniuswebtranslator/geniuswebsrc/geniusweb/bidspace/PartialSpaceFromUtility.java@ 805

Last change on this file since 805 was 582, checked in by wouter, 18 months ago

#169 geniusweb translator now works for 3 big modules: bidspace, profile, issuevalue!

File size: 3.1 KB
RevLine 
[519]1package geniusweb.bidspace;
2
3import java.math.BigInteger;
4import java.security.SecureRandom;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.Map;
8import java.util.Set;
9
10import geniusweb.issuevalue.Bid;
11import geniusweb.profile.DefaultPartialOrdering;
12import geniusweb.profile.PartialOrdering;
13import geniusweb.profile.utilityspace.UtilitySpace;
14import tudelft.utilities.immutablelist.ListWithRemove;
15import tudelft.utilities.immutablelist.Tuple;
16import tudelft.utilities.immutablelist.Tuples;
17
18/**
19 * Simple demo converting a {@link UtilitySpace} into a {@link PartialOrdering}.
20 * Notice, a UtilitySpace IS a PartialOrdering, but a special one that is in
21 * fact a full ordering. This converter makes it a space that really has all
22 * info removed except for a few basic "isBetter" informations.
23 */
24public class PartialSpaceFromUtility extends DefaultPartialOrdering {
25 public PartialSpaceFromUtility(UtilitySpace space, int nRankings) {
[582]26 super(space.getName() + "_" + nRankings, space.getDomain(),
27 space.getReservationBid(), pickBetter(space, nRankings));
[519]28 }
29
30 /**
[582]31 * Pick subset of static isbetter rankings. Notice, ShuffledList currently
32 * can't handle really large lists which also limits this. This has to be
33 * fixed.
[519]34 *
35 * @param space the space to sample from
[582]36 * @param nRankings the number of rankings to be placed in the
37 * PartialOrdering.
[519]38 * @return a subset creating a partial profile of the geiven UtilitySpace
39 */
[582]40 private static Map<Bid, Set<Bid>> pickBetter(UtilitySpace space,
41 int nRankings) {
[519]42 Map<Bid, Set<Bid>> eqOrBetter = new HashMap<>();
43
44 AllBidsList allbids = new AllBidsList(space.getDomain());
[582]45 ListWithRemove<Tuple<Bid, Bid>> available = new ListWithRemove<>(
46 new Tuples<Bid, Bid>(allbids, allbids));
47 for (int n = 0; n < nRankings; n = n + 1) {
[519]48 BigInteger sel = rnd(available.size());
49 Tuple<Bid, Bid> tuple = available.get(sel);
50 Bid bid1 = tuple.get1();
51 Bid bid2 = tuple.get2();
52 switch (space.getUtility(bid1).compareTo(space.getUtility(bid2))) {
53 case -1: // bid1 is worse
54 add(eqOrBetter, bid2, bid1);
55 break;
56 case 0:
57 add(eqOrBetter, bid2, bid1);
58 add(eqOrBetter, bid1, bid2);
59 break;
60 case 1:// bid1 is better
61 add(eqOrBetter, bid1, bid2);
62 break;
63 }
64 available = available.remove(sel);
65 }
[582]66
[519]67 return eqOrBetter;
68 }
69
70 /**
71 *
72 * @param eqOrBetter map to be extended with (key=bid1, value=bid2)
73 * @param bid1 the key to add a value to
74 * @param bid2 the value to be added
75 */
76 private static void add(Map<Bid, Set<Bid>> eqOrBetter, Bid bid1, Bid bid2) {
77 Set<Bid> set = eqOrBetter.get(bid1);
78 if (set == null) {
79 set = new HashSet<Bid>();
80 }
81 set.add(bid2);
82 eqOrBetter.put(bid1, set);
83 }
84
85 /**
[582]86 * Bit simplistic way to generate random in [0,n>. Simplistic because the
87 * mod() operator that we use causes bias in the random numbers.
[519]88 *
89 * @param n the maximum value for the random number
90 * @return random in [0,n>
91 *
92 */
93 private static final BigInteger rnd(BigInteger n) {
94 return new BigInteger(n.bitLength(), new SecureRandom()).mod(n);
95 }
96}
Note: See TracBrowser for help on using the repository browser.