Skip to content

Commit 40ae8b8

Browse files
committed
Merge branch 'dev'
2 parents 1ed533b + 1a114c5 commit 40ae8b8

File tree

15 files changed

+644
-270
lines changed

15 files changed

+644
-270
lines changed

improveai-android/src/androidTest/java/ai/improve/android/AppGivensProviderTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@ public void testAddReward_decisionModel() {
9292
", new reward: " + newTotalRewardsOfModel);
9393
}
9494

95+
@Test
96+
public void testAddRewardForDecision() {
97+
String modelName = "hello";
98+
DecisionModel decisionModel = new DecisionModel(modelName);
99+
double oldTotalRewards = AppGivensProviderUtils.rewardOfModel(modelName);
100+
decisionModel.addReward(0.1, "decision_id");
101+
double newTotalRewards = AppGivensProviderUtils.rewardOfModel(modelName);
102+
assertEquals(oldTotalRewards+0.1, newTotalRewards, 0.000000000001);
103+
IMPLog.d(Tag, "old reward: " + oldTotalRewards +
104+
", new reward: " + newTotalRewards);
105+
}
106+
95107
@Test
96108
public void testVersion_string_length() throws JSONException {
97109
double v = AppGivensProviderUtils.versionToNumber("7.1.2");

improveai/src/main/java/ai/improve/Decision.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,6 @@ public void addReward(double reward) {
8484
throw new IllegalStateException("id can't be null. Make sure that addReward() is " +
8585
"called after get(); and the trackURL is set in the DecisionModel.");
8686
}
87-
model.addRewardForDecision(id, reward);
87+
model.addReward(reward, id);
8888
}
8989
}

improveai/src/main/java/ai/improve/DecisionContext.java

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ public <T> Decision<T> chooseFrom(List<T> variants) {
2929

3030
Map allGivens = decisionModel.combinedGivens(givens);
3131
List scores = decisionModel.scoreInternal(variants, allGivens);
32-
Object best = ModelUtils.topScoringVariant(variants, scores);
32+
T best = (T) ModelUtils.topScoringVariant(variants, scores);
3333

34-
Decision decision = new Decision(decisionModel);
34+
Decision<T> decision = new Decision(decisionModel);
3535
decision.variants = variants;
3636
decision.best = best;
3737
decision.givens = allGivens;
@@ -74,24 +74,14 @@ public <T> Decision<T> chooseFirst(List<T> variants) {
7474
return chooseFrom(variants, ModelUtils.generateDescendingGaussians(variants.size()));
7575
}
7676

77+
public <T> T first(List<T> variants) {
78+
return chooseFirst(variants).get();
79+
}
80+
7781
/**
7882
* @see ai.improve.DecisionModel#first(Object...)
7983
*/
80-
public Object first(Object... variants) {
81-
if(variants == null) {
82-
throw new IllegalArgumentException("variants can't be null");
83-
}
84-
if(variants.length <= 0) {
85-
throw new IllegalArgumentException("first() expects at least one variant");
86-
}
87-
88-
if(variants.length == 1) {
89-
if(!(variants[0] instanceof List) || ((List)variants[0]).size() <= 0) {
90-
throw new IllegalArgumentException("If only one argument, it must be a non-empty list.");
91-
}
92-
return chooseFirst((List)variants[0]).get();
93-
}
94-
84+
public <T> T first(T... variants) {
9585
return chooseFirst(Arrays.asList(variants)).get();
9686
}
9787

@@ -108,49 +98,47 @@ public <T> Decision<T> chooseRandom(List<T> variants) {
10898
/**
10999
* @see ai.improve.DecisionModel#random(Object...)
110100
*/
111-
public Object random(Object... variants) {
112-
if(variants == null) {
113-
throw new IllegalArgumentException("variants can't be null");
114-
}
115-
if(variants.length <= 0) {
116-
throw new IllegalArgumentException("random() expects at least one variant");
117-
}
118-
if(variants.length == 1) {
119-
if(!(variants[0] instanceof List) || ((List)variants[0]).size() <= 0) {
120-
throw new IllegalArgumentException("If only one argument, it must be a non-empty list.");
121-
}
122-
return chooseRandom((List)variants[0]).get();
123-
}
101+
public <T> T random(T... variants) {
124102
return chooseRandom(Arrays.asList(variants)).get();
125103
}
126104

105+
public <T> T random(List<T> variants) {
106+
return chooseRandom(variants).get();
107+
}
108+
127109
/**
128-
* @see ai.improve.DecisionModel#chooseMultiVariate(Map)
110+
* @see ai.improve.DecisionModel#chooseMultivariate(Map)
129111
*/
130-
public Decision chooseMultiVariate(Map<String, ?> variants) {
112+
public Decision<Map<String, ?>> chooseMultivariate(Map<String, ?> variants) {
131113
if(variants == null || variants.size() <= 0) {
132114
return chooseFrom(null);
133115
}
134116

135-
List allKeys = new ArrayList();
117+
List<String> allKeys = new ArrayList();
136118

137119
List<List> categories = new ArrayList();
138120
for(Map.Entry<String, ?> entry : variants.entrySet()) {
139121
if(entry.getValue() instanceof List) {
140-
categories.add((List)entry.getValue());
122+
if(((List)entry.getValue()).size() > 0) {
123+
categories.add((List) entry.getValue());
124+
allKeys.add(entry.getKey());
125+
}
141126
} else {
142127
categories.add(Arrays.asList(entry.getValue()));
128+
allKeys.add(entry.getKey());
143129
}
144-
allKeys.add(entry.getKey());
130+
}
131+
if(categories.size() <= 0) {
132+
throw new IllegalArgumentException("valueMap values are all empty list!");
145133
}
146134

147-
List<Map> combinations = new ArrayList();
135+
List<Map<String, ?>> combinations = new ArrayList();
148136
for(int i = 0; i < categories.size(); ++i) {
149137
List category = categories.get(i);
150-
List<Map> newCombinations = new ArrayList();
138+
List<Map<String, ?>> newCombinations = new ArrayList();
151139
for(int m = 0; m < category.size(); ++m) {
152140
if(combinations.size() == 0) {
153-
Map newVariant = new HashMap();
141+
Map<String, Object> newVariant = new HashMap();
154142
newVariant.put(allKeys.get(i), category.get(m));
155143
newCombinations.add(newVariant);
156144
} else {
@@ -167,6 +155,10 @@ public Decision chooseMultiVariate(Map<String, ?> variants) {
167155
return chooseFrom(combinations);
168156
}
169157

158+
public Map<String, ?> optimize(Map<String, ?> variants) {
159+
return chooseMultivariate(variants).get();
160+
}
161+
170162
/**
171163
* @see ai.improve.DecisionModel#score(List)
172164
*/
@@ -178,20 +170,14 @@ public <T> List<Double> score(List<T> variants) {
178170
/**
179171
* @see ai.improve.DecisionModel#which(Object...)
180172
*/
181-
public Object which(Object... variants) {
173+
public <T> T which(T... variants) {
182174
if(variants == null || variants.length <= 0) {
183175
throw new IllegalArgumentException("should at least provide one variant.");
184176
}
185-
186-
if(variants.length == 1) {
187-
if(variants[0] instanceof List) {
188-
return chooseFrom((List)variants[0]).get();
189-
} else if(variants[0] instanceof Map) {
190-
return chooseMultiVariate((Map)variants[0]).get();
191-
}
192-
throw new IllegalArgumentException("If only one argument, it must be a List or Map");
193-
}
194-
195177
return chooseFrom(Arrays.asList(variants)).get();
196178
}
179+
180+
public <T> T which(List<T> variants) {
181+
return chooseFrom(variants).get();
182+
}
197183
}

0 commit comments

Comments
 (0)