List of usage examples for com.google.common.collect Ordering greatestOf
public <E extends T> List<E> greatestOf(Iterator<E> iterator, int k)
From source file:com.twitter.common.collections.Multimaps.java
/** * Returns the set of keys associated with the largest values in the multimap. * * @param map The multimap to search./*w w w . j a v a2 s . c o m*/ * @param topValues Number of groupings to find the keys for. * @return The keys associated with the largest groups, of maximum size {@code topValues}. */ public static <K> Set<K> getLargestGroups(Multimap<K, ?> map, int topValues) { Ordering<Multiset.Entry<K>> groupOrdering = new Ordering<Multiset.Entry<K>>() { @Override public int compare(Multiset.Entry<K> entry1, Multiset.Entry<K> entry2) { return entry1.getCount() - entry2.getCount(); // overflow-safe, since sizes are nonnegative } }; Set<K> topKeys = Sets.newHashSetWithExpectedSize(topValues); for (Multiset.Entry<K> entry : groupOrdering.greatestOf(map.keys().entrySet(), topValues)) { topKeys.add(entry.getElement()); } return topKeys; }
From source file:com.xiaomi.linden.cluster.ResultMerger.java
private static LindenResult mergeGroupSearch(LindenSearchRequest lindenRequest, List<LindenResult> resultList) { LindenResult mergedResult = resultList.get(0); if (!mergedResult.isSetHits()) { mergedResult.setHits(new ArrayList<LindenHit>()); }//from ww w . j a v a 2 s . c o m String groupField = lindenRequest.getGroupParam().getGroupField(); int innerLimit = lindenRequest.getGroupParam().getGroupInnerLimit(); //traverse LindenResults from shards for (int i = 1; i < resultList.size(); ++i) { LindenResult subResult = resultList.get(i); if (!subResult.isSetHits()) { continue; } mergedResult.totalHits += subResult.totalHits; mergedResult.totalGroups = Math.max(mergedResult.totalGroups, subResult.totalGroups); mergedResult.totalGroupHits += subResult.totalGroupHits; //traverse groups in waiting LindenResult for (LindenHit subGroup : subResult.getHits()) { String groupName = subGroup.getFields().get(groupField); boolean isFound = false; //find the group in the merged groupList for (int j = 0; j < mergedResult.getHitsSize(); ++j) { LindenHit mergedHit = mergedResult.getHits().get(j); if (mergedHit.getFields().get(groupField).equals(groupName)) { Iterable<LindenHit> groupIterable = Iterables.mergeSorted( ImmutableList.of(subGroup.getGroupHits(), mergedHit.getGroupHits()), new LindenHitCmp(null)); List<LindenHit> hits = Lists.newArrayList(Iterables.limit(groupIterable, innerLimit)); if (mergedHit.getScore() < subGroup.getScore()) { mergedHit = subGroup; } mergedHit.setGroupHits(hits); mergedResult.getHits().set(j, mergedHit); isFound = true; break; } } if (!isFound) { mergedResult.getHits().add(subGroup); } } } //sort the group by score Ordering<LindenHit> ordering = new Ordering<LindenHit>() { @Override public int compare(@Nullable LindenHit left, @Nullable LindenHit right) { return Double.compare(left.getScore(), right.getScore()); } }; List<LindenHit> orderedHits = ordering.greatestOf(mergedResult.getHits(), mergedResult.getHitsSize()); //offset -> offset+size groups int from = lindenRequest.getOffset(); int size = lindenRequest.getLength(); if (from < orderedHits.size()) { List<LindenHit> subHits = orderedHits.subList(from, Math.min(from + size, orderedHits.size())); mergedResult.setHits(subHits); } else { mergedResult.setHits(new ArrayList<LindenHit>()); } return mergedResult; }
From source file:org.glowroot.local.ui.TransactionJsonService.java
private static List<String> getTopTimerNames(List<StackedPoint> stackedPoints, int topX) { MutableLongMap<String> timerTotals = new MutableLongMap<String>(); for (StackedPoint stackedPoint : stackedPoints) { for (Entry<String, MutableLong> entry : stackedPoint.getStackedTimers().entrySet()) { timerTotals.add(entry.getKey(), entry.getValue().longValue()); }/*from w ww . jav a 2 s . c o m*/ } Ordering<Entry<String, MutableLong>> valueOrdering = Ordering.natural() .onResultOf(new Function<Entry<String, MutableLong>, Long>() { @Override public Long apply(@Nullable Entry<String, MutableLong> entry) { checkNotNull(entry); return entry.getValue().longValue(); } }); List<String> timerNames = Lists.newArrayList(); @SuppressWarnings("assignment.type.incompatible") List<Entry<String, MutableLong>> topTimerTotals = valueOrdering.greatestOf(timerTotals.entrySet(), topX); for (Entry<String, MutableLong> entry : topTimerTotals) { timerNames.add(entry.getKey()); } return timerNames; }
From source file:org.grouplens.samantha.modeler.ranking.NDCGLoss.java
public double getMetric(int maxN, List<StochasticOracle> topN, double[] scores, double[] relevance) { double dcg = 0.0; for (int i = 0; i < maxN; i++) { StochasticOracle oracle = topN.get(i); relevance[i] = oracle.getLabel(); dcg += (Math.pow(2.0, relevance[i]) - 1.0) / Math.log(2 + i); }//from w w w. java2 s . com Ordering<StochasticOracle> ordering = RankingUtilities.stochasticOracleLabelOrdering(); List<StochasticOracle> bestTop = ordering.greatestOf(topN, topN.size()); double maxDcg = 0.0; for (int i = 0; i < maxN; i++) { StochasticOracle oracle = bestTop.get(i); maxDcg += (Math.pow(2.0, oracle.getLabel()) - 1.0) / Math.log(2 + i); } scores[maxN] = maxDcg; return dcg / maxDcg; }
From source file:com.anhth12.lambda.app.serving.als.Because.java
@GET @Path("{userID}/{itemID}") @Produces({ MediaType.TEXT_PLAIN, CSVMessageBodyWriter.TEXT_CSV, MediaType.APPLICATION_JSON }) public List<IDValue> get(@PathParam("userID") String userID, @PathParam("itemID") String itemID, @DefaultValue("10") @QueryParam("howMany") int howMany, @DefaultValue("0") @QueryParam("offset") int offset) throws LambdaServingException { check(howMany > 0, "howMany must be positive"); check(offset >= 0, "offset must be non-negative"); ALSServingModel model = getALSServingModel(); float[] itemVector = model.getItemVector(itemID); checkExists(itemVector != null, itemID); List<Pair<String, float[]>> knownItemVectors = model.getKnowItemVectorsForUser(userID); checkExists(knownItemVectors != null, itemID); Iterable<Pair<String, Double>> idSimilarities = Iterables.transform(knownItemVectors, new CosineSimilarityFunction(itemVector)); Ordering<Pair<?, Double>> ordering = Ordering.from(PairComparators.<Double>bySecond()); return toIDValueResponse(ordering.greatestOf(idSimilarities, howMany + offset), howMany, offset); }
From source file:org.grouplens.samantha.server.ranker.PredictorBasedRanker.java
public RankedResult rank(RetrievedResult retrievedResult, RequestContext requestContext) { List<ObjectNode> entityList = retrievedResult.getEntityList(); List<Prediction> predictions = predictor.predict(entityList, requestContext); int curLimit = limit; if (pageSize == 0 || limit > predictions.size()) { curLimit = predictions.size();/*from w ww . j av a 2 s . c o m*/ } Ordering<Prediction> ordering = RankerUtilities.scoredResultScoreOrdering(); List<Prediction> candidates = ordering.greatestOf(predictions, offset + curLimit); List<Prediction> recs; if (candidates.size() < offset) { recs = new ArrayList<>(); } else { recs = candidates.subList(offset, candidates.size()); } List<ObjectNode> recEntities = new ArrayList<>(recs.size()); for (Prediction pred : recs) { recEntities.add(pred.getEntity()); } for (EntityExpander expander : entityExpanders) { expander.expand(recEntities, requestContext); } return new RankedResult(recs, offset, curLimit, predictions.size()); }
From source file:com.cloudera.oryx.app.serving.als.Because.java
@GET @Path("{userID}/{itemID}") @Produces({ MediaType.TEXT_PLAIN, CSVMessageBodyWriter.TEXT_CSV, MediaType.APPLICATION_JSON }) public List<IDValue> get(@PathParam("userID") String userID, @PathParam("itemID") String itemID, @DefaultValue("10") @QueryParam("howMany") int howMany, @DefaultValue("0") @QueryParam("offset") int offset) throws OryxServingException { check(howMany > 0, "howMany must be positive"); check(offset >= 0, "offset must be non-negative"); ALSServingModel model = getALSServingModel(); float[] itemVector = model.getItemVector(itemID); checkExists(itemVector != null, itemID); List<Pair<String, float[]>> knownItemVectors = model.getKnownItemVectorsForUser(userID); checkExists(knownItemVectors != null, userID); Iterable<Pair<String, Double>> idSimilarities = Iterables.transform(knownItemVectors, new CosineSimilarityFunction(itemVector)); Ordering<Pair<?, Double>> ordering = Ordering.from(PairComparators.<Double>bySecond()); return toIDValueResponse(ordering.greatestOf(idSimilarities, howMany + offset), howMany, offset); }
From source file:com.cloudera.oryx.ml.serving.als.Because.java
@GET @Path("{userID}/{itemID}") @Produces({ CSVMessageBodyWriter.TEXT_CSV, MediaType.APPLICATION_JSON }) public List<IDValue> get(@PathParam("userID") String userID, @PathParam("itemID") String itemID, @DefaultValue("10") @QueryParam("howMany") int howMany, @DefaultValue("0") @QueryParam("offset") int offset) throws OryxServingException { check(howMany > 0, "howMany must be positive"); check(offset >= 0, "offset must be non-negative"); ALSServingModel model = getALSServingModel(); float[] itemVector = model.getItemVector(itemID); checkExists(itemVector != null, itemID); List<Pair<String, float[]>> knownItemVectors = model.getKnownItemVectorsForUser(userID); checkExists(knownItemVectors != null, userID); Iterable<Pair<String, Double>> idSimilarities = Iterables.transform(knownItemVectors, new CosineSimilarityFunction(itemVector)); Ordering<Pair<?, Double>> ordering = Ordering.from(PairComparators.<Double>bySecond()); return toIDValueResponse(ordering.greatestOf(idSimilarities, howMany + offset), howMany, offset); }
From source file:org.grouplens.samantha.server.ranker.PercentileBlendingRanker.java
public RankedResult rank(RetrievedResult retrievedResult, RequestContext requestContext) { List<ObjectNode> entityList = retrievedResult.getEntityList(); for (EntityExpander expander : entityExpanders) { entityList = expander.expand(entityList, requestContext); }/* w ww . jav a 2s . c o m*/ int listSize = entityList.size(); if (listSize > 0) { for (Object2DoubleMap.Entry<String> entry : defaults.object2DoubleEntrySet()) { String key = entry.getKey(); entityList.sort(SortingUtilities.jsonFieldComparator(key)); for (int i = 0; i < entityList.size(); i++) { entityList.get(i).put(key + "Percentile", (double) i / listSize); } } } int curLimit = limit; if (pageSize == 0 || limit > listSize) { curLimit = entityList.size(); } List<Prediction> scoredList = new ArrayList<>(entityList.size()); for (ObjectNode entity : entityList) { double score = 0.0; for (Object2DoubleMap.Entry<String> entry : defaults.object2DoubleEntrySet()) { String key = entry.getKey(); score += (entry.getDoubleValue() * entity.get(key + "Percentile").asDouble()); } scoredList.add(new Prediction(entity, null, score)); } Ordering<Prediction> ordering = RankerUtilities.scoredResultScoreOrdering(); List<Prediction> candidates = ordering.greatestOf(scoredList, offset + curLimit); List<Prediction> recs; if (candidates.size() < offset) { recs = new ArrayList<>(); } else { recs = candidates.subList(offset, candidates.size()); } return new RankedResult(recs, offset, curLimit, scoredList.size()); }
From source file:org.grouplens.samantha.modeler.ranking.AbstractLambdaLoss.java
public List<StochasticOracle> wrapOracle(List<StochasticOracle> oracles) { if (oracles.size() <= 1) { return new ArrayList<>(); }/*from w w w . j a v a 2 s.co m*/ int maxN = N; if (maxN == 0 || maxN > oracles.size()) { maxN = oracles.size(); } List<StochasticOracle> newOracles = new ArrayList<>(maxN); Ordering<StochasticOracle> ordering = RankingUtilities.stochasticOracleOrdering(); List<StochasticOracle> topN = ordering.greatestOf(oracles, maxN); double[] scores = new double[maxN + 1]; double[] relevance = new double[maxN]; double metric = getMetric(maxN, topN, scores, relevance); double[] lambdas = new double[maxN]; for (int i = 0; i < maxN; i++) { for (int j = i + 1; j < maxN; j++) { if (relevance[i] != relevance[j]) { StochasticOracle highOracle = topN.get(i); StochasticOracle lowOracle = topN.get(j); double diff = (highOracle.getModelOutput() - lowOracle.getModelOutput()); double ijCoef = -sigma / (1.0 + Math.exp(sigma * diff)); double jiCoef = -sigma / (1.0 + Math.exp(-sigma * diff)); double delta = Math.abs(getDelta(i, j, scores, relevance)); if (relevance[i] > relevance[j]) { lambdas[i] += ijCoef * delta; lambdas[j] -= jiCoef * delta; } else { lambdas[i] -= ijCoef * delta; lambdas[j] += jiCoef * delta; } } } } double objVal = -metric / maxN; for (int i = 0; i < maxN; i++) { StochasticOracle oracle = topN.get(i); double weight = oracle.getWeight(); oracle.setObjVal(objVal * weight); oracle.setGradient(lambdas[i] * weight); newOracles.add(oracle); } return newOracles; }