package com.spbsu.exp.modelexp.setup;
import com.spbsu.commons.random.FastRandom;
import com.spbsu.commons.util.MultiMap;
import com.spbsu.exp.modelexp.*;
import java.util.*;
/**
* User: solar
* Date: 02.04.15
* Time: 21:13
*/
public class SimpleExclusive implements Setup {
private double slot = 0.05;
private int expLen = 14;
private double prodShare = 0.5;
private final FastRandom rng;
private Experiment prod = new Experiment() {
@Override
public double work(Query q) {
return 0;
}
@Override
public boolean relevant(Query q) {
return true;
}
@Override
public double realScore() {
return 0;
}
};
private final Set<Experiment> current = new HashSet<>();
private final MultiMap<Integer, Experiment> deadlines = new MultiMap<>();
private final List<Experiment> queue = new ArrayList<>();
private final Map<Experiment, Stat> value = new HashMap<>();
int index;
public SimpleExclusive(FastRandom rng) {
this.rng = rng;
index = 0;
}
@Override
public void add(Experiment exp) {
queue.add(exp);
}
@Override
public void cancel(Experiment exp) {
current.remove(exp);
}
@Override
public void nextDay() {
{ // experimental setup for the next day
current.removeAll(deadlines.get(index));
while (current.size() < (1 - prodShare) / slot && !queue.isEmpty()) {
final Experiment next = queue.remove(0);
current.add(next);
deadlines.put(index + expLen, next);
}
}
index++;
System.out.println("Experiments: " + Arrays.toString(current.toArray(new Experiment[current.size()])));
}
@Override
public Experiment[] assign(User u, Query q) {
final double v = rng.nextDouble();
double sum = prodShare;
final Iterator<Experiment> it = current.iterator();
Experiment result = prod;
while (sum < v && it.hasNext()) {
result = it.next();
sum += slot;
}
return new Experiment[]{result};
}
@Override
public void feedback(User user, Query query, Experiment[] config, double score) {
for (final Experiment exp : config) {
Stat stat = value.get(exp);
if (stat == null)
value.put(exp, stat = new Stat());
stat.update(score);
}
}
@Override
public Stat score(Experiment experiment) {
final Stat stat = value.get(experiment);
return stat != null ? stat : new Stat();
}
}