List of usage examples for java.util.concurrent.locks Lock lock
lock
From source file:net.myrrix.online.ServerRecommender.java
@Override public List<RecommendedItem> recommendToAnonymous(long[] itemIDs, float[] values, int howMany, IDRescorer rescorer) throws NotReadyException, NoSuchItemException { Preconditions.checkArgument(howMany > 0, "howMany must be positive"); float[] anonymousUserFeatures = buildAnonymousUserFeatures(itemIDs, values); FastIDSet userKnownItemIDs = new FastIDSet(itemIDs.length); for (long itemID : itemIDs) { userKnownItemIDs.add(itemID);//from www . ja v a2s. c o m } float[][] anonymousFeaturesAsArray = { anonymousUserFeatures }; Generation generation = getCurrentGeneration(); Lock yLock = generation.getYLock().readLock(); yLock.lock(); try { return multithreadedTopN(anonymousFeaturesAsArray, userKnownItemIDs, generation.getUserTagIDs(), rescorer, howMany, generation.getCandidateFilter()); } finally { yLock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
@Override public int getNumUserClusters() throws NotReadyException { Generation generation = getCurrentGeneration(); Collection<IDCluster> clusters = generation.getUserClusters(); if (clusters == null || clusters.isEmpty()) { throw new UnsupportedOperationException(); }/*w ww .ja v a 2s . co m*/ Lock lock = generation.getUserClustersLock().readLock(); lock.lock(); try { return clusters.size(); } finally { lock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
@Override public int getNumItemClusters() throws NotReadyException { Generation generation = getCurrentGeneration(); Collection<IDCluster> clusters = generation.getItemClusters(); if (clusters == null || clusters.isEmpty()) { throw new UnsupportedOperationException(); }/*w w w. j a va 2 s . c o m*/ Lock lock = generation.getItemClustersLock().readLock(); lock.lock(); try { return clusters.size(); } finally { lock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
/** * One-argument version of {@link #mostSimilarItems(long[], int, Rescorer)}. *///from w ww . j a v a2 s. c o m @Override public List<RecommendedItem> mostSimilarItems(long itemID, int howMany, Rescorer<LongPair> rescorer) throws NoSuchItemException, NotReadyException { Preconditions.checkArgument(howMany > 0, "howMany must be positive"); Generation generation = getCurrentGeneration(); FastByIDMap<float[]> Y = generation.getY(); Lock yLock = generation.getYLock().readLock(); yLock.lock(); try { float[] itemFeatures = Y.get(itemID); if (itemFeatures == null) { throw new NoSuchItemException(itemID); } return TopN.selectTopN(new MostSimilarItemIterator(Y.entrySet().iterator(), generation.getUserTagIDs(), new long[] { itemID }, new float[][] { itemFeatures }, rescorer), howMany); } finally { yLock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
/** * Computes items most similar to an item or items. The returned items have the highest average similarity * to the given items.// ww w .ja va2 s. com * * @param itemIDs items for which most similar items are required * @param howMany maximum number of similar items to return; fewer may be returned * @param rescorer rescoring function used to modify item-item similarities before ranking results * @return {@link RecommendedItem}s representing the top recommendations for the user, ordered by quality, * descending. The score associated to it is an opaque value. Larger means more similar, but no further * interpretation may necessarily be applied. * @throws NoSuchItemException if any of the items is not known in the model * @throws NotReadyException if the recommender has no model available yet */ @Override public List<RecommendedItem> mostSimilarItems(long[] itemIDs, int howMany, Rescorer<LongPair> rescorer) throws NoSuchItemException, NotReadyException { Preconditions.checkArgument(howMany > 0, "howMany must be positive"); Generation generation = getCurrentGeneration(); FastByIDMap<float[]> Y = generation.getY(); Lock yLock = generation.getYLock().readLock(); yLock.lock(); try { List<float[]> itemFeatures = Lists.newArrayListWithCapacity(itemIDs.length); for (long itemID : itemIDs) { float[] features = Y.get(itemID); if (features != null) { itemFeatures.add(features); } } if (itemFeatures.isEmpty()) { throw new NoSuchItemException(Arrays.toString(itemIDs)); } float[][] itemFeaturesArray = itemFeatures.toArray(new float[itemFeatures.size()][]); return TopN.selectTopN(new MostSimilarItemIterator(Y.entrySet().iterator(), generation.getUserTagIDs(), itemIDs, itemFeaturesArray, rescorer), howMany); } finally { yLock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
@Override public float[] estimatePreferences(long userID, long... itemIDs) throws NotReadyException { Generation generation = getCurrentGeneration(); FastByIDMap<float[]> X = generation.getX(); float[] userFeatures; Lock xLock = generation.getXLock().readLock(); xLock.lock(); try {//from w w w. j a v a 2 s .c om userFeatures = X.get(userID); } finally { xLock.unlock(); } if (userFeatures == null) { return new float[itemIDs.length]; // All 0.0f } FastByIDMap<float[]> Y = generation.getY(); Lock yLock = generation.getYLock().readLock(); yLock.lock(); try { float[] result = new float[itemIDs.length]; for (int i = 0; i < itemIDs.length; i++) { long itemID = itemIDs[i]; float[] itemFeatures = Y.get(itemID); if (itemFeatures != null) { float value = (float) SimpleVectorMath.dot(itemFeatures, userFeatures); Preconditions.checkState(LangUtils.isFinite(value), "Bad estimate"); result[i] = value; } // else leave value at 0.0f } return result; } finally { yLock.unlock(); } }
From source file:net.myrrix.online.ServerRecommender.java
@Override public float[] similarityToItem(long toItemID, long... itemIDs) throws TasteException { Generation generation = getCurrentGeneration(); FastByIDMap<float[]> Y = generation.getY(); float[] similarities = new float[itemIDs.length]; Lock yLock = generation.getYLock().readLock(); yLock.lock(); try {/*from w w w .java 2 s. co m*/ float[] toFeatures = Y.get(toItemID); if (toFeatures == null) { throw new NoSuchItemException(toItemID); } double toFeaturesNorm = SimpleVectorMath.norm(toFeatures); boolean anyFound = false; for (int i = 0; i < similarities.length; i++) { float[] features = Y.get(itemIDs[i]); if (features == null) { similarities[i] = Float.NaN; } else { anyFound = true; double featuresNorm = SimpleVectorMath.norm(features); similarities[i] = (float) (SimpleVectorMath.dot(features, toFeatures) / (featuresNorm * toFeaturesNorm)); } } if (!anyFound) { throw new NoSuchItemException(Arrays.toString(itemIDs)); } } finally { yLock.unlock(); } return similarities; }
From source file:net.myrrix.online.ServerRecommender.java
public void setUserTag(long userID, String tag, float value, boolean bulk) { Preconditions.checkNotNull(tag);//from www . ja va 2s .co m Preconditions.checkArgument(!tag.isEmpty()); // Record datum try { generationManager.appendUserTag(userID, tag, value, bulk); } catch (IOException ioe) { log.warn("Could not append datum; continuing", ioe); } Generation generation; try { generation = getCurrentGeneration(); } catch (NotReadyException nre) { // Corner case -- no model ready so all we can do is record (above). Don't fail the request. return; } long tagID = tagHasher.toLongID(tag); FastIDSet userTagIDs = generation.getUserTagIDs(); Lock userTagWriteLock = generation.getYLock().writeLock(); userTagWriteLock.lock(); try { userTagIDs.add(tagID); } finally { userTagWriteLock.unlock(); } float[] userFeatures = getFeatures(userID, generation.getX(), generation.getXLock()); float[] tagFeatures = getFeatures(tagID, generation.getY(), generation.getYLock()); updateFeatures(userFeatures, tagFeatures, value, generation); updateClusters(userID, userFeatures, generation.getUserClusters(), generation.getUserClustersLock().readLock()); }
From source file:net.myrrix.online.ServerRecommender.java
public void setItemTag(String tag, long itemID, float value, boolean bulk) { Preconditions.checkNotNull(tag);//from www .j a v a 2 s .c o m Preconditions.checkArgument(!tag.isEmpty()); // Record datum try { generationManager.appendItemTag(tag, itemID, value, bulk); } catch (IOException ioe) { log.warn("Could not append datum; continuing", ioe); } Generation generation; try { generation = getCurrentGeneration(); } catch (NotReadyException nre) { // Corner case -- no model ready so all we can do is record (above). Don't fail the request. return; } long tagID = tagHasher.toLongID(tag); FastIDSet itemTagIDs = generation.getItemTagIDs(); Lock itemTagWriteLock = generation.getXLock().writeLock(); itemTagWriteLock.lock(); try { itemTagIDs.add(tagID); } finally { itemTagWriteLock.unlock(); } float[] tagFeatures = getFeatures(tagID, generation.getX(), generation.getXLock()); float[] itemFeatures = getFeatures(itemID, generation.getY(), generation.getYLock()); updateFeatures(tagFeatures, itemFeatures, value, generation); updateClusters(itemID, itemFeatures, generation.getItemClusters(), generation.getItemClustersLock().readLock()); }
From source file:net.myrrix.online.ServerRecommender.java
@Override public float estimateForAnonymous(long toItemID, long[] itemIDs, float[] values) throws NotReadyException, NoSuchItemException { Generation generation = getCurrentGeneration(); FastByIDMap<float[]> Y = generation.getY(); Lock yLock = generation.getYLock().readLock(); float[] toItemFeatures; yLock.lock(); try {/*www. ja v a 2s .com*/ toItemFeatures = Y.get(toItemID); } finally { yLock.unlock(); } if (toItemFeatures == null) { throw new NoSuchItemException(toItemID); } float[] anonymousUserFeatures = buildAnonymousUserFeatures(itemIDs, values); return (float) SimpleVectorMath.dot(anonymousUserFeatures, toItemFeatures); }