package com.spbsu.exp.modelexp.users; import com.spbsu.commons.random.FastRandom; import com.spbsu.exp.modelexp.Query; import com.spbsu.exp.modelexp.User; import java.util.Arrays; /** * User: solar * Date: 07.04.15 * Time: 14:43 */ public class UniformUser implements User { protected final FastRandom rng; private final double lambda; private final short[] intents; private final static int[][] stats = new int[Query.INTENTS_LEN][65536]; // private static Vec intentWeights; // // static { // intentWeights = new ArrayVec(INTENTS_LEN); // for (int i = 0; i < intentWeights.length(); i++) { // intentWeights.set(i, Math.pow(1, i)); // } // } public UniformUser(FastRandom rng, double lambda) { this.rng = rng; this.lambda = lambda; this.intents = new short[Query.INTENTS_LEN]; for(int i = 0; i < Query.INTENTS_LEN; i++) { final int scale = 1 + 2 * i; final double gamma = rng.nextGamma(1, scale); final double v = 1 + gamma; if (v > 32768) throw new RuntimeException(); final short next = (short) v; intents[i] = next; stats[i][next]++; } } public short[] properties() { return intents; } @Override public Query next(int day, int hour) { final short[] qIntents = new short[Query.INTENTS_LEN]; int intents = rng.nextPoisson(2) + 1; for (int i = 0; i < intents; i++) { final int intent = (int) (rng.nextDouble() * Query.INTENTS_LEN); qIntents[intent] = this.intents[intent]; } final IntentBasedQuery query = new IntentBasedQuery(qIntents); // freqs.adjustOrPutValue(query, 1, 1); // boolean val = freqs.size() == 1000000; // if (val) { // final Object[] keys = freqs.keys(); // Arrays.sort(keys, new Comparator<Object>() { // @Override // public int compare(Object o1, Object o2) { // return Integer.compare(freqs.get(o2), freqs.get(o1)); // } // }); // for(int i = 0; i < keys.length && i < 100; i++) { // System.out.println(freqs.get(keys[i]) + " -> " + keys[i]); // } // System.out.println(); // } return query; } @Override public void feedback(double score) { } @Override public double activity() { return lambda; } private class IntentBasedQuery implements Query { private final short[] qIntents; public IntentBasedQuery(short[] qIntents) { this.qIntents = qIntents; } @Override public short[] properties() { return qIntents; } @Override public int hashCode() { return Arrays.hashCode(qIntents); } @Override public String toString() { return Arrays.toString(qIntents); } @Override public boolean equals(Object obj) { return obj instanceof IntentBasedQuery && Arrays.equals(qIntents, ((IntentBasedQuery) obj).qIntents); } } }