Added: mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCInMemoryItemSimilarityTest.java URL: http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCInMemoryItemSimilarityTest.java?rev=1088059&view=auto ============================================================================== --- mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCInMemoryItemSimilarityTest.java (added) +++ mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCInMemoryItemSimilarityTest.java Sat Apr 2 16:38:38 2011 @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.mahout.cf.taste.impl.similarity.jdbc; + +import org.apache.mahout.cf.taste.impl.TasteTestCase; +import org.apache.mahout.cf.taste.similarity.ItemSimilarity; +import org.easymock.classextension.EasyMock; +import org.junit.Test; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +public class MySQLJDBCInMemoryItemSimilarityTest extends TasteTestCase { + + @Test + public void testMemoryLoad() throws Exception { + + DataSource dataSource = EasyMock.createMock(DataSource.class); + Connection connection = EasyMock.createMock(Connection.class); + PreparedStatement statement = EasyMock.createMock(PreparedStatement.class); + ResultSet resultSet = EasyMock.createMock(ResultSet.class); + + EasyMock.expect(dataSource.getConnection()).andReturn(connection); + EasyMock.expect(connection.prepareStatement(MySQLJDBCInMemoryItemSimilarity.DEFAULT_GET_ALL_ITEMSIMILARITIES_SQL, + ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)).andReturn(statement); + statement.setFetchDirection(ResultSet.FETCH_FORWARD); + statement.setFetchSize(Integer.MIN_VALUE); + EasyMock.expect(statement.executeQuery()).andReturn(resultSet); + + EasyMock.expect(resultSet.next()).andReturn(true); + + EasyMock.expect(resultSet.isAfterLast()).andReturn(false); + EasyMock.expect(resultSet.getLong(1)).andReturn(1L); + EasyMock.expect(resultSet.getLong(2)).andReturn(2L); + EasyMock.expect(resultSet.getDouble(3)).andReturn(0.5d); + EasyMock.expect(resultSet.next()).andReturn(true); + + EasyMock.expect(resultSet.isAfterLast()).andReturn(false); + EasyMock.expect(resultSet.getLong(1)).andReturn(1L); + EasyMock.expect(resultSet.getLong(2)).andReturn(3L); + EasyMock.expect(resultSet.getDouble(3)).andReturn(0.4d); + EasyMock.expect(resultSet.next()).andReturn(true); + + EasyMock.expect(resultSet.isAfterLast()).andReturn(false); + EasyMock.expect(resultSet.getLong(1)).andReturn(3L); + EasyMock.expect(resultSet.getLong(2)).andReturn(4L); + EasyMock.expect(resultSet.getDouble(3)).andReturn(0.1d); + + EasyMock.expect(resultSet.isAfterLast()).andReturn(true); + + resultSet.close(); + statement.close(); + connection.close(); + + EasyMock.expect(resultSet.next()).andReturn(false); + + EasyMock.replay(dataSource, connection, statement, resultSet); + + ItemSimilarity similarity = new MySQLJDBCInMemoryItemSimilarity(dataSource); + + assertEquals(similarity.itemSimilarity(1L, 2L), 0.5d, EPSILON); + assertEquals(similarity.itemSimilarity(1L, 3L), 0.4d, EPSILON); + assertEquals(similarity.itemSimilarity(3L, 4L), 0.1d, EPSILON); + assertTrue(Double.isNaN(similarity.itemSimilarity(1L, 4L))); + + EasyMock.verify(dataSource, connection, statement, resultSet); + } +}
Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/HybridSimilarity.java URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/HybridSimilarity.java?rev=1088059&r1=1088058&r2=1088059&view=diff ============================================================================== --- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/HybridSimilarity.java (original) +++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/HybridSimilarity.java Sat Apr 2 16:38:38 2011 @@ -23,16 +23,18 @@ import java.util.Collection; import org.apache.mahout.cf.taste.common.Refreshable; import org.apache.mahout.cf.taste.common.TasteException; +import org.apache.mahout.cf.taste.impl.similarity.AbstractItemSimilarity; import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.similarity.ItemSimilarity; -final class HybridSimilarity implements ItemSimilarity { +final class HybridSimilarity extends AbstractItemSimilarity { private final ItemSimilarity cfSimilarity; private final ItemSimilarity contentSimilarity; HybridSimilarity(DataModel dataModel, File dataFileDirectory) throws IOException { + super(dataModel); cfSimilarity = new LogLikelihoodSimilarity(dataModel); contentSimilarity = new TrackItemSimilarity(dataFileDirectory); } Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/TrackItemSimilarity.java URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/TrackItemSimilarity.java?rev=1088059&r1=1088058&r2=1088059&view=diff ============================================================================== --- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/TrackItemSimilarity.java (original) +++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/TrackItemSimilarity.java Sat Apr 2 16:38:38 2011 @@ -22,9 +22,11 @@ import java.io.IOException; import java.util.Collection; import org.apache.mahout.cf.taste.common.Refreshable; +import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.example.kddcup.KDDCupDataModel; import org.apache.mahout.cf.taste.impl.common.FastByIDMap; import org.apache.mahout.cf.taste.impl.common.FastIDSet; +import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; import org.apache.mahout.cf.taste.similarity.ItemSimilarity; import org.apache.mahout.common.iterator.FileLineIterable; @@ -85,6 +87,19 @@ final class TrackItemSimilarity implemen } @Override + public long[] allSimilarItemIDs(long itemID) throws TasteException { + FastIDSet allSimilarItemIDs = new FastIDSet(); + LongPrimitiveIterator allItemIDs = trackData.keySetIterator(); + while (allItemIDs.hasNext()) { + long possiblySimilarItemID = allItemIDs.nextLong(); + if (!Double.isNaN(itemSimilarity(itemID, possiblySimilarItemID))) { + allSimilarItemIDs.add(possiblySimilarItemID); + } + } + return allSimilarItemIDs.toArray(); + } + + @Override public void refresh(Collection<Refreshable> alreadyRefreshed) { // do nothing }
