/** * Copyright 2012 plista GmbH (http://www.plista.com/) * * Licensed 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.plista.kornakapi.core.config; import com.thoughtworks.xstream.XStream; import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity; import org.junit.Test; import java.util.List; import static org.junit.Assert.*; public class ConfigurationTest { @Test public void deserialize() { String xml = "<configuration>\n" + " <modelDirectory>/tmp/models</modelDirectory>\n" + " <numProcessorsForTraining>3</numProcessorsForTraining>\n" + " <storageConfiguration>\n" + " <jdbcDriverClass>com.mysql.jdbc.Driver</jdbcDriverClass>\n" + " <jdbcUrl>jdbc:mysql://localhost/plista</jdbcUrl>\n" + " <username>root</username>\n" + " <password>secret</password>\n" + " </storageConfiguration>\n" + " <itembasedRecommenders>\n" + " <itembasedRecommender>\n" + " <name>itembased</name>\n" + " <similarityClass>org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity</similarityClass>\n" + " <similarItemsPerItem>25</similarItemsPerItem>\n" + " <retrainCronExpression>0 0 1 * * ?</retrainCronExpression>\n" + " </itembasedRecommender>\n" + " </itembasedRecommenders>\n" + " <factorizationbasedRecommenders>\n" + " <factorizationbasedRecommender>\n" + " <name>weighted-mf</name>\n" + " <usesImplicitFeedback>true</usesImplicitFeedback>\n" + " <numberOfFeatures>10</numberOfFeatures>\n" + " <numberOfIterations>10</numberOfIterations>\n" + " <lambda>0.01</lambda>\n" + " <alpha>40.0</alpha>\n" + " <retrainAfterPreferenceChanges>5</retrainAfterPreferenceChanges>\n" + " </factorizationbasedRecommender>\n" + " </factorizationbasedRecommenders>\n" + "</configuration>"; Configuration conf = Configuration.fromXML(xml); assertEquals("/tmp/models", conf.getModelDirectory()); assertEquals(3, conf.getNumProcessorsForTraining()); StorageConfiguration storageConf = conf.getStorageConfiguration(); assertNotNull(storageConf); assertEquals("com.mysql.jdbc.Driver", storageConf.getJdbcDriverClass()); assertEquals("jdbc:mysql://localhost/plista", storageConf.getJdbcUrl()); assertEquals("root", storageConf.getUsername()); assertEquals("secret", storageConf.getPassword()); List<ItembasedRecommenderConfig> itembasedRecommenders = conf.getItembasedRecommenders(); assertNotNull(itembasedRecommenders); assertEquals(1, itembasedRecommenders.size()); ItembasedRecommenderConfig itembasedRecommenderConf = itembasedRecommenders.get(0); assertEquals("itembased", itembasedRecommenderConf.getName()); assertEquals(LogLikelihoodSimilarity.class.getName(), itembasedRecommenderConf.getSimilarityClass()); assertEquals(25, itembasedRecommenderConf.getSimilarItemsPerItem()); assertEquals(RecommenderConfig.DONT_RETRAIN_ON_PREFERENCE_CHANGES, itembasedRecommenderConf.getRetrainAfterPreferenceChanges()); assertEquals("0 0 1 * * ?", itembasedRecommenderConf.getRetrainCronExpression()); List<FactorizationbasedRecommenderConfig> factorizationbasedRecommenders = conf.getFactorizationbasedRecommenders(); assertNotNull(factorizationbasedRecommenders); assertEquals(1, factorizationbasedRecommenders.size()); FactorizationbasedRecommenderConfig factorizationbasedRecommenderConf = factorizationbasedRecommenders.get(0); assertEquals("weighted-mf", factorizationbasedRecommenderConf.getName()); assertTrue(factorizationbasedRecommenderConf.isUsesImplicitFeedback()); assertEquals(10, factorizationbasedRecommenderConf.getNumberOfFeatures()); assertEquals(10, factorizationbasedRecommenderConf.getNumberOfIterations()); assertEquals(0.01, factorizationbasedRecommenderConf.getLambda(), 0); assertEquals(40, factorizationbasedRecommenderConf.getAlpha(), 0); assertEquals(5, factorizationbasedRecommenderConf.getRetrainAfterPreferenceChanges()); assertNull(factorizationbasedRecommenderConf.getRetrainCronExpression()); } @Test public void serialize() { StorageConfiguration storageConf = new StorageConfiguration(); storageConf.setJdbcDriverClass("com.mysql.jdbc.Driver"); storageConf.setJdbcUrl("jdbc:mysql://localhost/plista"); storageConf.setUsername("root"); storageConf.setPassword("secret"); Configuration conf = new Configuration(); conf.setModelDirectory("/tmp/models"); conf.setStorageConfiguration(storageConf); conf.setNumProcessorsForTraining(3); ItembasedRecommenderConfig itembasedRecommenderConf = new ItembasedRecommenderConfig(); itembasedRecommenderConf.setName("itembased"); itembasedRecommenderConf.setRetrainCronExpression("0 0 1 * * ?"); itembasedRecommenderConf.setSimilarityClass(LogLikelihoodSimilarity.class.getName()); itembasedRecommenderConf.setSimilarItemsPerItem(25); conf.addItembasedRecommender(itembasedRecommenderConf); FactorizationbasedRecommenderConfig factorizationbasedRecommenderConf = new FactorizationbasedRecommenderConfig(); factorizationbasedRecommenderConf.setName("weighted-mf"); factorizationbasedRecommenderConf.setNumberOfFeatures(10); factorizationbasedRecommenderConf.setNumberOfIterations(10); factorizationbasedRecommenderConf.setUsesImplicitFeedback(true); factorizationbasedRecommenderConf.setLambda(0.01); factorizationbasedRecommenderConf.setAlpha(40); factorizationbasedRecommenderConf.setRetrainAfterPreferenceChanges(5); conf.addFactorizationbasedRecommender(factorizationbasedRecommenderConf); XStream serializer = new XStream(); serializer.alias("configuration", Configuration.class); serializer.alias("itembasedRecommender", ItembasedRecommenderConfig.class); serializer.alias("factorizationbasedRecommender", FactorizationbasedRecommenderConfig.class); serializer.toXML(conf, System.out); } }