Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java Fri May 9 14:35:12 2008 @@ -0,0 +1,123 @@ +/** + * 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.recommender; + +import org.apache.mahout.cf.taste.correlation.UserCorrelation; +import org.apache.mahout.cf.taste.impl.correlation.PearsonCorrelation; +import org.apache.mahout.cf.taste.impl.model.GenericDataModel; +import org.apache.mahout.cf.taste.impl.model.GenericItem; +import org.apache.mahout.cf.taste.impl.TasteTestCase; +import org.apache.mahout.cf.taste.model.DataModel; +import org.apache.mahout.cf.taste.model.Item; +import org.apache.mahout.cf.taste.model.User; +import org.apache.mahout.cf.taste.recommender.RecommendedItem; +import org.apache.mahout.cf.taste.recommender.Recommender; + +import java.util.ArrayList; +import java.util.List; + +/** + * <p>Tests [EMAIL PROTECTED] TreeClusteringRecommender}.</p> + */ +public final class TreeClusteringRecommenderTest extends TasteTestCase { + + public void testNoRecommendations() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1)); + users.add(getUser("test2", 0.2, 0.6)); + users.add(getUser("test3", 0.4, 0.9)); + DataModel dataModel = new GenericDataModel(users); + UserCorrelation correlation = new PearsonCorrelation(dataModel); + ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); + Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); + List<RecommendedItem> recommended = recommender.recommend("test1", 1); + assertNotNull(recommended); + assertEquals(0, recommended.size()); + } + + public void testHowMany() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1, 0.2)); + users.add(getUser("test2", 0.2, 0.3, 0.3, 0.6)); + users.add(getUser("test3", 0.4, 0.4, 0.5, 0.9)); + users.add(getUser("test4", 0.1, 0.4, 0.5, 0.8, 0.9, 1.0)); + users.add(getUser("test5", 0.2, 0.3, 0.6, 0.7, 0.1, 0.2)); + DataModel dataModel = new GenericDataModel(users); + UserCorrelation correlation = new PearsonCorrelation(dataModel); + ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); + Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); + List<RecommendedItem> fewRecommended = recommender.recommend("test1", 2); + List<RecommendedItem> moreRecommended = recommender.recommend("test1", 4); + for (int i = 0; i < fewRecommended.size(); i++) { + assertEquals(fewRecommended.get(i).getItem(), moreRecommended.get(i).getItem()); + } + } + + public void testRescorer() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1, 0.2)); + users.add(getUser("test2", 0.2, 0.3, 0.3, 0.6)); + users.add(getUser("test3", 0.4, 0.4, 0.5, 0.9)); + DataModel dataModel = new GenericDataModel(users); + UserCorrelation correlation = new PearsonCorrelation(dataModel); + ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); + Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); + List<RecommendedItem> originalRecommended = recommender.recommend("test1", 2); + List<RecommendedItem> rescoredRecommended = + recommender.recommend("test1", 2, new ReversingRescorer<Item>()); + assertNotNull(originalRecommended); + assertNotNull(rescoredRecommended); + assertEquals(2, originalRecommended.size()); + assertEquals(2, rescoredRecommended.size()); + assertEquals(originalRecommended.get(0).getItem(), rescoredRecommended.get(1).getItem()); + assertEquals(originalRecommended.get(1).getItem(), rescoredRecommended.get(0).getItem()); + } + + public void testEstimatePref() throws Exception { + List<User> users = new ArrayList<User>(4); + users.add(getUser("test1", 0.1, 0.3)); + users.add(getUser("test2", 0.2, 0.3, 0.3)); + users.add(getUser("test3", 0.4, 0.3, 0.5)); + users.add(getUser("test4", 0.7, 0.3, 0.8, 0.9)); + DataModel dataModel = new GenericDataModel(users); + UserCorrelation correlation = new PearsonCorrelation(dataModel); + ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); + Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); + assertEquals(0.9, recommender.estimatePreference("test3", "3")); + } + + public void testBestRating() throws Exception { + List<User> users = new ArrayList<User>(4); + users.add(getUser("test1", 0.1, 0.3)); + users.add(getUser("test2", 0.2, 0.3, 0.3)); + users.add(getUser("test3", 0.4, 0.3, 0.5)); + users.add(getUser("test4", 0.7, 0.3, 0.8)); + DataModel dataModel = new GenericDataModel(users); + UserCorrelation correlation = new PearsonCorrelation(dataModel); + ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); + Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); + List<RecommendedItem> recommended = recommender.recommend("test1", 1); + assertNotNull(recommended); + assertEquals(1, recommended.size()); + RecommendedItem firstRecommended = recommended.get(0); + // item one should be recommended because it has a greater rating/score + assertEquals(new GenericItem<String>("2"), firstRecommended.getItem()); + assertEquals(0.3, firstRecommended.getValue(), EPSILON); + } + +}
Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java Fri May 9 14:35:12 2008 @@ -0,0 +1,118 @@ +/** + * 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.recommender.slopeone; + +import org.apache.mahout.cf.taste.common.TasteException; +import org.apache.mahout.cf.taste.impl.model.GenericDataModel; +import org.apache.mahout.cf.taste.impl.model.GenericItem; +import org.apache.mahout.cf.taste.impl.recommender.ReversingRescorer; +import org.apache.mahout.cf.taste.impl.TasteTestCase; +import org.apache.mahout.cf.taste.model.DataModel; +import org.apache.mahout.cf.taste.model.Item; +import org.apache.mahout.cf.taste.model.User; +import org.apache.mahout.cf.taste.recommender.RecommendedItem; +import org.apache.mahout.cf.taste.recommender.Recommender; + +import java.util.ArrayList; +import java.util.List; + +/** + * <p>Tests [EMAIL PROTECTED] SlopeOneRecommender}.</p> + */ +public final class SlopeOneRecommenderTest extends TasteTestCase { + + public void testRecommender() throws Exception { + Recommender recommender = buildRecommender(); + List<RecommendedItem> recommended = recommender.recommend("test1", 1); + assertNotNull(recommended); + assertEquals(1, recommended.size()); + RecommendedItem firstRecommended = recommended.get(0); + assertEquals(new GenericItem<String>("2"), firstRecommended.getItem()); + assertEquals(0.34803885284992736, firstRecommended.getValue(), EPSILON); + } + + public void testHowMany() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1, 0.2)); + users.add(getUser("test2", 0.2, 0.3, 0.3, 0.6)); + users.add(getUser("test3", 0.4, 0.4, 0.5, 0.9)); + users.add(getUser("test4", 0.1, 0.4, 0.5, 0.8, 0.9, 1.0)); + users.add(getUser("test5", 0.2, 0.3, 0.6, 0.7, 0.1, 0.2)); + DataModel dataModel = new GenericDataModel(users); + Recommender recommender = new SlopeOneRecommender(dataModel); + List<RecommendedItem> fewRecommended = recommender.recommend("test1", 2); + List<RecommendedItem> moreRecommended = recommender.recommend("test1", 4); + for (int i = 0; i < fewRecommended.size(); i++) { + assertEquals(fewRecommended.get(i).getItem(), moreRecommended.get(i).getItem()); + } + } + + public void testRescorer() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1, 0.2)); + users.add(getUser("test2", 0.2, 0.3, 0.3, 0.6)); + users.add(getUser("test3", 0.4, 0.4, 0.5, 0.9)); + DataModel dataModel = new GenericDataModel(users); + Recommender recommender = new SlopeOneRecommender(dataModel); + List<RecommendedItem> originalRecommended = recommender.recommend("test1", 2); + List<RecommendedItem> rescoredRecommended = + recommender.recommend("test1", 2, new ReversingRescorer<Item>()); + assertNotNull(originalRecommended); + assertNotNull(rescoredRecommended); + assertEquals(2, originalRecommended.size()); + assertEquals(2, rescoredRecommended.size()); + assertEquals(originalRecommended.get(0).getItem(), rescoredRecommended.get(1).getItem()); + assertEquals(originalRecommended.get(1).getItem(), rescoredRecommended.get(0).getItem()); + } + + public void testEstimatePref() throws Exception { + Recommender recommender = buildRecommender(); + assertEquals(0.34803885284992736, recommender.estimatePreference("test1", "2"), EPSILON); + } + + public void testBestRating() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.0, 0.3)); + users.add(getUser("test2", 0.2, 0.3, 0.3)); + users.add(getUser("test3", 0.4, 0.3, 0.5)); + DataModel dataModel = new GenericDataModel(users); + Recommender recommender = new SlopeOneRecommender(dataModel); + List<RecommendedItem> recommended = recommender.recommend("test1", 1); + assertNotNull(recommended); + assertEquals(1, recommended.size()); + RecommendedItem firstRecommended = recommended.get(0); + // item one should be recommended because it has a greater rating/score + assertEquals(new GenericItem<String>("2"), firstRecommended.getItem()); + assertEquals(0.2400938676203033, firstRecommended.getValue(), EPSILON); + } + + public void testDiffStdevBehavior() throws Exception { + List<User> users = new ArrayList<User>(3); + users.add(getUser("test1", 0.1, 0.2)); + users.add(getUser("test2", 0.2, 0.3, 0.6)); + DataModel dataModel = new GenericDataModel(users); + Recommender recommender = new SlopeOneRecommender(dataModel); + assertEquals(0.5, recommender.estimatePreference("test1", "2"), EPSILON); + } + + private static Recommender buildRecommender() throws TasteException { + DataModel dataModel = new GenericDataModel(getMockUsers()); + return new SlopeOneRecommender(dataModel); + } + +} Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplificationTest.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplificationTest.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplificationTest.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplificationTest.java Fri May 9 14:35:12 2008 @@ -0,0 +1,35 @@ +/** + * 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.transforms; + +/** + * <p>Tests [EMAIL PROTECTED] CaseAmplification}.</p> + */ +public final class CaseAmplificationTest extends TransformTestCase { + + public void testOneValue() { + assertEquals(2.0, new CaseAmplification(0.5).transformCorrelation(null, null, 4.0), EPSILON); + assertEquals(-2.0, new CaseAmplification(0.5).transformCorrelation(null, null, -4.0), EPSILON); + } + + public void testRefresh() { + // Make sure this doesn't throw an exception + new CaseAmplification(1.0).refresh(); + } + +} Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequencyTest.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequencyTest.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequencyTest.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequencyTest.java Fri May 9 14:35:12 2008 @@ -0,0 +1,55 @@ +/** + * 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.transforms; + +import org.apache.mahout.cf.taste.impl.model.GenericDataModel; +import org.apache.mahout.cf.taste.model.Preference; +import org.apache.mahout.cf.taste.model.User; + +import java.util.ArrayList; +import java.util.List; + +/** + * <p>Tests [EMAIL PROTECTED] InverseUserFrequency}.</p> + */ +public final class InverseUserFrequencyTest extends TransformTestCase { + + public void testIUF() { + List<User> users = new ArrayList<User>(5); + users.add(getUser("test1", 0.1)); + users.add(getUser("test2", 0.2, 0.3)); + users.add(getUser("test3", 0.4, 0.5, 0.6)); + users.add(getUser("test4", 0.7, 0.8, 0.9, 1.0)); + users.add(getUser("test5", 1.0, 1.0, 1.0, 1.0, 1.0)); + GenericDataModel dummy = new GenericDataModel(users); + InverseUserFrequency iuf = new InverseUserFrequency(dummy, 10.0); + + User user = dummy.getUser("test5"); + for (int i = 0; i < 5; i++) { + Preference pref = user.getPreferenceFor(String.valueOf(i)); + assertNotNull(pref); + assertEquals(Math.log(5.0 / (double) (5 - i)) / Math.log(iuf.getLogBase()), + iuf.getTransformedValue(pref), + EPSILON); + } + + // Make sure this doesn't throw an exception + iuf.refresh(); + } + +} Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/TransformTestCase.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/TransformTestCase.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/TransformTestCase.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/TransformTestCase.java Fri May 9 14:35:12 2008 @@ -0,0 +1,34 @@ +/** + * 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.transforms; + +import org.apache.mahout.cf.taste.impl.TasteTestCase; +import org.apache.mahout.cf.taste.model.Preference; +import org.apache.mahout.cf.taste.model.User; + +abstract class TransformTestCase extends TasteTestCase { + + static void assertPrefsEquals(User user, double... expected) { + int i = 0; + for (Preference pref : user.getPreferences()) { + assertEquals(expected[i], pref.getValue()); + i++; + } + assertEquals(expected.length, i); + } +} Added: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/ZScoreTest.java URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/ZScoreTest.java?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/ZScoreTest.java (added) +++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/transforms/ZScoreTest.java Fri May 9 14:35:12 2008 @@ -0,0 +1,62 @@ +/** + * 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.transforms; + +import org.apache.mahout.cf.taste.model.User; +import org.apache.mahout.cf.taste.transforms.PreferenceTransform2; + +/** + * <p>Tests [EMAIL PROTECTED] ZScore}.</p> + */ +public final class ZScoreTest extends TransformTestCase { + + public void testOnePref() throws Exception { + User user = getUser("test", 1.0); + PreferenceTransform2 zScore = new ZScore(); + assertEquals(0.0, zScore.getTransformedValue(user.getPreferenceFor("0")), EPSILON); + } + + public void testAllSame() throws Exception { + User user = getUser("test", 1.0, 1.0, 1.0); + PreferenceTransform2 zScore = new ZScore(); + assertEquals(0.0, zScore.getTransformedValue(user.getPreferenceFor("0")), EPSILON); + assertEquals(0.0, zScore.getTransformedValue(user.getPreferenceFor("1")), EPSILON); + assertEquals(0.0, zScore.getTransformedValue(user.getPreferenceFor("2")), EPSILON); + } + + public void testStdev() throws Exception { + User user = getUser("test", -1.0, -2.0); + PreferenceTransform2 zScore = new ZScore(); + assertEquals(0.707107, zScore.getTransformedValue(user.getPreferenceFor("0")), EPSILON); + assertEquals(-0.707107, zScore.getTransformedValue(user.getPreferenceFor("1")), EPSILON); + } + + public void testExample() throws Exception { + User user = getUser("test", 5.0, 7.0, 9.0); + PreferenceTransform2 zScore = new ZScore(); + assertEquals(-1.0, zScore.getTransformedValue(user.getPreferenceFor("0")), EPSILON); + assertEquals(0.0, zScore.getTransformedValue(user.getPreferenceFor("1")), EPSILON); + assertEquals(1.0, zScore.getTransformedValue(user.getPreferenceFor("2")), EPSILON); + } + + public void testRefresh() { + // Make sure this doesn't throw an exception + new ZScore().refresh(); + } + +} Added: lucene/mahout/trunk/core/taste-build.properties URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/taste-build.properties?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/taste-build.properties (added) +++ lucene/mahout/trunk/core/taste-build.properties Fri May 9 14:35:12 2008 @@ -0,0 +1,23 @@ +# Temporarily, this ex-Taste build file is separate. Next step is to integrate it. + +version=2.0 + +junit.jar=lib/junit-3.8.2.jar +ejb.jar=lib/ejb-2_1-api.jar +servlet.jar=lib/servlet-api.jar +dbcp.jar=lib/commons-dbcp-1.2.2.jar +pool.jar=lib/commons-pool-1.4.jar + +# These .jars aren't included with the distribution and must be +# manually added +mysql.jar=lib/mysql-connector-java-5.1.6-bin.jar +proguard.jar=lib/proguard.jar +# Should contains Axis2 1.3 or later .jars +axis.jars=lib/axis/ + +# Uncomment this line to disable JDBC tests. +# Alternatively, add "-Dnotestjdbc=true" to your ant command +#notestjdbc=true +# Uncomment this line to disable load tests. +# Alternatively, add "-Dnotestload=true" to your ant command +#notestload=true Added: lucene/mahout/trunk/core/taste-build.xml URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/taste-build.xml?rev=654943&view=auto ============================================================================== --- lucene/mahout/trunk/core/taste-build.xml (added) +++ lucene/mahout/trunk/core/taste-build.xml Fri May 9 14:35:12 2008 @@ -0,0 +1,347 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + 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. +--> + +<!-- Temporarily, this ex-Taste build file is separate. + Next step is to integrate it. --> + +<project basedir="." default="build" name="mahout-taste"> + + <property file="taste-build.properties"/> + <property environment="env"/> + <property name="name" value="${ant.project.name}"/> + <property name="release-jar" value="${name}.jar"/> + <property name="release-ejb-jar" value="${name}-ejb.jar"/> + <property name="release-war" value="${name}.war"/> + <property name="release-zip" value="${name}-${version}.zip"/> + + <target name="init"> + <tstamp/> + <available file="${proguard.jar}" property="proguard.jar.present"/> + <available file="${mysql.jar}" property="mysql.jar.present"/> + <available type="dir" file="${axis.jars}" property="axis.jars.present"/> + </target> + + <target depends="init" name="build-except-jdbc" description="Compiles all but JDBC-related code"> + <mkdir dir="build"/> + <javac source="1.5" + target="1.5" + deprecation="true" + destdir="build" + debug="true" + optimize="true" + srcdir="src/main/java"> + <compilerarg value="-Xlint:all,-serial,-unchecked"/> + <classpath> + <pathelement location="${ejb.jar}"/> + <pathelement location="${servlet.jar}"/> + </classpath> + <include name="org/apache/mahout/cf/taste/**"/> + <exclude name="org/apache/mahout/cf/taste/impl/model/jdbc/**"/> + <exclude name="org/apache/mahout/cf/taste/impl/recommender/slopeone/jdbc/**"/> + </javac> + </target> + + <target depends="init,build-except-jdbc" name="build-jdbc" description="Compiles JDBC-related code" if="mysql.jar.present"> + <javac source="1.5" + target="1.5" + deprecation="true" + destdir="build" + debug="true" + optimize="true" + srcdir="src/main/java"> + <compilerarg value="-Xlint:all,-serial,-unchecked"/> + <classpath> + <pathelement location="${dbcp.jar}"/> + <pathelement location="${pool.jar}"/> + <pathelement location="${mysql.jar}"/> + <pathelement location="build"/> + </classpath> + <include name="org/apache/mahout/cf/taste/impl/model/jdbc/**"/> + <include name="org/apache/mahout/cf/taste/impl/recommender/slopeone/jdbc/**"/> + </javac> + </target> + + <target depends="init,build-except-jdbc,build-jdbc" name="build" description="Compiles all code"> + <jar jarfile="${release-jar}"> + <fileset dir="build"> + <include name="org/apache/mahout/cf/taste/**"/> + <exclude name="org/apache/mahout/cf/taste/web/**"/> + <exclude name="org/apache/mahout/cf/taste/ejb/**"/> + <exclude name="org/apache/mahout/cf/taste/example/**"/> + </fileset> + </jar> + </target> + + <target depends="build" name="optimize" description="Optimizes code" if="proguard.jar.present"> + <property name="rt.jar" value="${env.JDK_HOME}/jre/lib/rt.jar"/> + <fail message="Can't find JDK classes at ${rt.jar}; is JDK_HOME set?"> + <condition> + <not> + <available type="file" file="${rt.jar}"/> + </not> + </condition> + </fail> + <move file="${release-jar}" tofile="temp.jar"/> + <java jar="${proguard.jar}" fork="true" failonerror="true"> + <arg value="-injars temp.jar"/> + <arg value="-outjars ${release-jar}"/> + <arg value="-libraryjars ${env.JDK_HOME}/jre/lib/rt.jar"/> + <arg value="-libraryjars ${pool.jar}"/> + <arg value="-ignorewarnings"/> + <arg value="-dontshrink"/> + <arg value="-dontobfuscate"/> + <arg value="-optimizationpasses 6"/> + <arg value="-keep public class * { public protected *; }"/> + <arg value="-target 5"/> + <arg value="-verbose"/> + </java> + <delete file="temp.jar"/> + </target> + + <target depends="build,optimize" name="build-ejb" description="Builds deployable EJB component"> + <fail unless="my-recommender.jar" message="Please set -Dmy-recommender.jar=XXX"/> + <fail unless="my-recommender-class" message="Please set -Dmy-recommender-class=XXX"/> + <property name="my-ejb-jar.xml" value="${java.io.tmpdir}/ejb-jar.xml"/> + <copy file="src/main/java/org/apache/mahout/cf/taste/ejb/ejb-jar.xml" tofile="${my-ejb-jar.xml}"> + <filterset> + <filter token="RECOMMENDER_CLASS" value="${my-recommender-class}"/> + </filterset> + </copy> + <jar jarfile="${release-ejb-jar}"> + <fileset dir="build"> + <include name="org/apache/mahout/cf/taste/ejb/**"/> + </fileset> + <zipfileset src="${release-jar}"/> + <metainf file="${my-ejb-jar.xml}"/> + </jar> + <delete file="${my-ejb-jar.xml}"/> + </target> + + <target depends="build" name="build-test" description="Builds test classes"> + <mkdir dir="build-test"/> + <javac source="1.5" + target="1.5" + debug="true" + debuglevel="lines,vars,source" + deprecation="true" + destdir="build-test" + srcdir="src/test/java"> + <compilerarg value="-Xlint:all,-serial"/> + <classpath> + <pathelement location="${junit.jar}"/> + <pathelement location="${mysql.jar}"/> + <pathelement location="${release-jar}"/> + </classpath> + <include name="org/apache/mahout/cf/taste/**"/> + </javac> + </target> + + <target depends="build,optimize" name="build-server" description="Builds deployable web-based Taste server"> + <fail unless="my-recommender.jar" message="Please set -Dmy-recommender.jar=XXX"/> + <fail unless="my-recommender-class" message="Please set -Dmy-recommender-class=XXX"/> + <fail unless="axis.jars.present" message="Please copy all Axis Java 1.4 .jar files from its lib directory into ${axis.jars}"/> + <tempfile property="my-web.xml"/> + <copy file="src/main/java/org/apache/mahout/cf/taste/web/web.xml" tofile="${my-web.xml}"> + <filterset> + <filter token="RECOMMENDER_CLASS" value="${my-recommender-class}"/> + </filterset> + </copy> + <war destfile="${release-war}" webxml="${my-web.xml}"> + <lib dir="."> + <include name="${release-jar}"/> + <include name="${my-recommender.jar}"/> + </lib> + <lib dir="${axis.jars}"/> + <classes dir="build"> + <include name="org/apache/mahout/cf/taste/web/**"/> + </classes> + <fileset dir="src/main/java/org/apache/mahout/cf/taste/web"> + <include name="RecommenderService.jws"/> + </fileset> + </war> + <delete file="${my-web.xml}"/> + </target> + + <target depends="init,build" name="build-grouplens-example" description="Builds deployable GroupLens example"> + <property name="grouplens-location" value="src/main/examples/org/apache/mahout/cf/taste/example/grouplens"/> + <fail message="Please download and install the GroupLens .dat files to ${grouplens-location}"> + <condition> + <not> + <and> + <available type="file" file="${grouplens-location}/ratings.dat"/> + <available type="file" file="${grouplens-location}/movies.dat"/> + </and> + </not> + </condition> + </fail> + <javac source="1.5" + target="1.5" + deprecation="true" + debug="true" + optimize="true" + destdir="build" + srcdir="src/main/examples"> + <compilerarg value="-Xlint:all,-serial"/> + <classpath> + <pathelement location="${release-jar}"/> + </classpath> + </javac> + <jar jarfile="grouplens.jar"> + <include name="${grouplens-location}/ratings.dat"/> + <include name="${grouplens-location}/movies.dat"/> + <fileset dir="build"> + <include name="org/apache/mahout/cf/taste/example/grouplens/**"/> + </fileset> + </jar> + <property name="my-recommender.jar" value="grouplens.jar"/> + <property name="my-recommender-class" value="org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommender"/> + <antcall target="build-server"/> + </target> + + <target depends="build-grouplens-example" name="eval-grouplens-example" + description="Evaluates current GroupLens example Recommender"> + <java classname="org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommenderEvaluatorRunner" fork="true"> + <assertions> + <disable/> + </assertions> + <jvmarg line="-server"/> + <jvmarg line="-Xmx1024m"/> + <classpath> + <pathelement location="${release-jar}"/> + <pathelement location="grouplens.jar"/> + </classpath> + </java> + </target> + + <target depends="build,optimize,build-test" name="test-quick" description="Runs quick unit tests"> + <junit printsummary="on" haltonfailure="on" haltonerror="on" fork="on"> + <formatter type="plain" usefile="false"/> + <classpath> + <pathelement location="${junit.jar}"/> + <pathelement location="${release-jar}"/> + <pathelement location="build-test"/> + </classpath> + <assertions> + <enable/> + </assertions> + <batchtest> + <fileset dir="src/test/java"> + <include name="org/apache/mahout/cf/taste/**/*Test.java"/> + <exclude name="org/apache/mahout/cf/taste/impl/model/jdbc/*.java"/> + <exclude name="org/apache/mahout/cf/taste/impl/LoadTest.java"/> + </fileset> + </batchtest> + </junit> + </target> + + <target depends="test-quick,test-jdbc,test-load" name="test" description="Runs all unit tests"/> + + <target depends="build,optimize,build-test" name="test-jdbc" unless="notestjdbc" description="Runs JDBC unit tests"> + <junit printsummary="on" haltonfailure="on" haltonerror="on" fork="on"> + <formatter type="plain" usefile="false"/> + <classpath> + <pathelement location="${junit.jar}"/> + <pathelement location="${mysql.jar}"/> + <pathelement location="${release-jar}"/> + <pathelement location="build-test"/> + </classpath> + <assertions> + <enable/> + </assertions> + <batchtest> + <fileset dir="src/test/java"> + <include name="org/apache/mahout/cf/taste/impl/model/jdbc/*Test.java"/> + </fileset> + </batchtest> + </junit> + </target> + + <target depends="build,optimize,build-test" name="test-load" unless="notestload" description="Runs load tests"> + <junit printsummary="on" haltonfailure="on" haltonerror="on" fork="on"> + <formatter type="plain" usefile="false"/> + <classpath> + <pathelement location="${junit.jar}"/> + <pathelement location="${release-jar}"/> + <pathelement location="build-test"/> + </classpath> + <assertions> + <disable/> + </assertions> + <jvmarg value="-server"/> + <jvmarg value="-Xmx512m"/> + <batchtest> + <fileset dir="src/test/java"> + <include name="org/apache/mahout/cf/taste/impl/LoadTest.java"/> + </fileset> + </batchtest> + </junit> + </target> + + <target depends="init" name="javadoc" description="Builds javadoc documentation"> + <mkdir dir="docs/javadoc"/> + <javadoc destdir="docs/javadoc"> + <fileset dir="src/main/java"> + <include name="**/*.java"/> + </fileset> + <classpath> + <pathelement location="${ejb.jar}"/> + <pathelement location="${servlet.jar}"/> + <pathelement location="${dbcp.jar}"/> + <pathelement location="${pool.jar}"/> + <pathelement location="${mysql.jar}"/> + </classpath> + </javadoc> + </target> + + <target depends="clean,test,build-grouplens-example,javadoc" name="release" + description="Builds a release package"> + <zip destfile="${release-zip}" basedir="."> + <include name="${release-jar}"/> + <include name="src/main/java/org/apache/mahout/cf/taste/**"/> + <include name="src/main/examples/org/apache/mahout/cf/taste/**"/> + <include name="src/test/java/org/apache/mahout/cf/taste/**"/> + <!-- Make sure GroupLens data is not redistributed --> + <exclude name="src/**/*.dat"/> + <include name="docs/**"/> + <include name="lib/**"/> + <exclude name="lib/mysql*"/> + <exclude name="lib/proguard*"/> + <include name="build.xml"/> + <include name="build.properties"/> + <include name="CHANGES"/> + <include name="LICENSE"/> + </zip> + </target> + + <target depends="init" name="clean" description="Deletes build products"> + <delete dir="build"/> + <delete dir="build-test"/> + <delete dir="docs/javadoc"/> + <delete dir="target"/> + <delete file="${release-jar}"/> + <delete file="${release-zip}"/> + <delete file="${release-war}"/> + <delete> + <fileset dir="."> + <include name="mahout*.jar"/> + </fileset> + </delete> + </target> + +</project>
