/* * Seldon -- open source prediction engine * ======================================= * Copyright 2011-2015 Seldon Technologies Ltd and Rummble Ltd (http://www.seldon.io/) * ********************************************************************************************** * * 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 io.seldon.client.algorithm; import java.util.LinkedList; import java.util.List; /** * Created by: marc on 25/11/2011 at 10:43 */ public class AlgorithmOptions { private List<CFAlgorithm.CF_SORTER> sorters = new LinkedList<CFAlgorithm.CF_SORTER>(); private List<CFAlgorithm.CF_PREDICTOR> predictors = new LinkedList<CFAlgorithm.CF_PREDICTOR>(); private List<CFAlgorithm.CF_RECOMMENDER> recommenders = new LinkedList<CFAlgorithm.CF_RECOMMENDER>(); private List<CFAlgorithm.CF_ITEM_COMPARATOR> itemComparators = new LinkedList<CFAlgorithm.CF_ITEM_COMPARATOR>(); private CFAlgorithm.CF_STRATEGY sorterStrategy; private CFAlgorithm.CF_STRATEGY predictorStrategy; private CFAlgorithm.CF_STRATEGY recommenderStrategy; private CFAlgorithm.CF_STRATEGY itemComparatorStrategy; private CFAlgorithm.CF_POSTPROCESSING postprocessingType; private Double longTermClusterWeight = null; private Double shortTermClusterWeight = null; private final String optionSeparator = ","; private final String parameterSeparator = ":"; private final String valueSeparator = "|"; public List<CFAlgorithm.CF_SORTER> getSorters() { return sorters; } public List<CFAlgorithm.CF_PREDICTOR> getPredictors() { return predictors; } public List<CFAlgorithm.CF_RECOMMENDER> getRecommenders() { return recommenders; } public List<CFAlgorithm.CF_ITEM_COMPARATOR> getItemComparators() { return itemComparators; } public CFAlgorithm.CF_STRATEGY getSorterStrategy() { return sorterStrategy; } public CFAlgorithm.CF_STRATEGY getPredictorStrategy() { return predictorStrategy; } public CFAlgorithm.CF_STRATEGY getRecommenderStrategy() { return recommenderStrategy; } public CFAlgorithm.CF_STRATEGY getItemComparatorStrategy() { return itemComparatorStrategy; } public CFAlgorithm.CF_POSTPROCESSING getPostprocessingType() { return postprocessingType; } public Double getLongTermClusterWeight() { return longTermClusterWeight; } public Double getShortTermClusterWeight() { return shortTermClusterWeight; } public AlgorithmOptions withLongTermClusterWeight(double weight) { this.longTermClusterWeight = weight; return this; } public AlgorithmOptions withShortTermClusterWeight(double weight) { this.shortTermClusterWeight = weight; return this; } public AlgorithmOptions withSorter(CFAlgorithm.CF_SORTER sorter) { sorters.add(sorter); return this; } public AlgorithmOptions withSorterStrategy(CFAlgorithm.CF_STRATEGY strategy) { sorterStrategy = strategy; return this; } public AlgorithmOptions withPredictor(CFAlgorithm.CF_PREDICTOR predictor) { predictors.add(predictor); return this; } public AlgorithmOptions withPredictorStrategy(CFAlgorithm.CF_STRATEGY strategy) { predictorStrategy = strategy; return this; } public AlgorithmOptions withRecommender(CFAlgorithm.CF_RECOMMENDER recommender) { recommenders.add(recommender); return this; } public AlgorithmOptions withRecommenderStrategy(CFAlgorithm.CF_STRATEGY strategy) { recommenderStrategy = strategy; return this; } public AlgorithmOptions withItemComparator(CFAlgorithm.CF_ITEM_COMPARATOR comparator) { itemComparators.add(comparator); return this; } public AlgorithmOptions withItemComparatorStrategy(CFAlgorithm.CF_STRATEGY strategy) { itemComparatorStrategy = strategy; return this; } public AlgorithmOptions withPostprocessingType(CFAlgorithm.CF_POSTPROCESSING postprocessing) { postprocessingType = postprocessing; return this; } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(serialiseOptionList("sorters", sorters)); stringBuilder.append(serialiseOptionList("item_comparators", itemComparators)); stringBuilder.append(serialiseOptionList("recommenders", recommenders)); stringBuilder.append(serialiseOptionList("predictors", predictors)); stringBuilder.append(serialiseStrategy("sorter_strategy", sorterStrategy)); stringBuilder.append(serialiseStrategy("recommender_strategy", recommenderStrategy)); stringBuilder.append(serialiseStrategy("predictor_strategy", predictorStrategy)); stringBuilder.append(serialiseStrategy("item_comparator_strategy", itemComparatorStrategy)); stringBuilder.append(serialisePostprocessingType("postprocessing", postprocessingType)); stringBuilder.append(serialiseNumericParameter("long_term_cluster_weight", this.longTermClusterWeight)); stringBuilder.append(serialiseNumericParameter("short_term_cluster_weight", this.shortTermClusterWeight)); if (stringBuilder.length() > 0) { // knock out the initial separator return stringBuilder.substring(1); } else { return ""; } } private String serialiseStrategy(String strategyName, CFAlgorithm.CF_STRATEGY strategy) { return serialiseStrategyName(strategyName, (strategy == null) ? null : strategy.toString()); } private String serialisePostprocessingType(String strategyName, CFAlgorithm.CF_POSTPROCESSING postprocessing) { return serialiseStrategyName(strategyName, (postprocessing == null) ? null : postprocessing.toString()); } private String serialiseStrategyName(String strategyName, String strategy) { if (strategy != null) { return optionSeparator + strategyName + this.parameterSeparator + strategy; } else { return ""; } } private String serialiseNumericParameter(String name,Double val) { if (val != null) return optionSeparator + name + this.parameterSeparator + val; else return ""; } private <T> String serialiseOptionList(String optionName, List<T> options) { StringBuilder stringBuilder = new StringBuilder(); if (options.size() > 0) { stringBuilder.append(optionSeparator); stringBuilder.append(optionName).append(this.parameterSeparator); for (T entry : options) { stringBuilder.append(entry); stringBuilder.append(this.valueSeparator); } stringBuilder.deleteCharAt(stringBuilder.length() - 1); } return stringBuilder.toString(); } }