/* * Copyright 2011 JBoss Inc * * 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.drools.chance.common; import org.drools.chance.distribution.probability.gaussian.GaussianDistributionStrategyFactory; import org.drools.chance.rule.constraint.core.connectives.ConnectiveFactory; import org.drools.chance.rule.constraint.core.connectives.factories.fuzzy.linguistic.FuzzyConnectiveFactory; import org.drools.chance.rule.constraint.core.connectives.factories.fuzzy.mvl.ManyValuedConnectiveFactory; import org.drools.chance.rule.constraint.core.connectives.factories.probability.discrete.DiscreteProbabilityConnectiveFactory; import org.drools.chance.degree.DegreeType; import org.drools.chance.degree.ChanceDegreeTypeRegistry; import org.drools.chance.degree.interval.IntervalDegree; import org.drools.chance.degree.simple.SimpleDegree; import org.drools.chance.distribution.DistributionStrategies; import org.drools.chance.distribution.DistributionStrategyFactory; import org.drools.chance.distribution.ImpKind; import org.drools.chance.distribution.ImpType; import java.util.HashMap; /** * Level I (master) factory. * * Given a KIND of imperfection --> fuzzy, probability, belief, ... * and a TYPE of distribution --> discrete, fuzzyset, Gaussian, Dirichlet, ... * * retrieves the appropriate DistributionStrategyFactory which is capable * of building the appropriate DistributionStrategies object, which in turn * acts a factory class for the IDistributions, in addition to providing * all the necessary methods. * * Any class implementing DistributionStrategyFactory must register itself * TODO Improve? * At the moment, with something like * DistributionStrategyFactory subFactory = * (DistributionStrategyFactory) //load class by name//.newInstance(); * ChanceStrategyFactory.register(subFactory.getImp_Kind(),factory.getImp_Model(),factory); * * * @param <T> */ public class ChanceStrategyFactory<T> { private static HashMap<Pair<ImpKind,ImpType>,ConnectiveFactory> cacheConnective = new HashMap<Pair<ImpKind, ImpType>, ConnectiveFactory>(); private static ConnectiveFactory defaultFactory = new ManyValuedConnectiveFactory(); static { cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.PROBABILITY, ImpType.DISCRETE ), new DiscreteProbabilityConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.PROBABILITY, ImpType.DIRICHLET ), new DiscreteProbabilityConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.FUZZINESS, ImpType.LINGUISTIC ), new FuzzyConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.FUZZINESS, ImpType.MVL ), new ManyValuedConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.FUZZINESS, ImpType.BASIC ), new ManyValuedConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.PROBABILITY, ImpType.BASIC ), new ManyValuedConnectiveFactory() ); cacheConnective.put( new Pair<ImpKind, ImpType>( ImpKind.PROBABILITY, ImpType.GAUSSIAN ), new ManyValuedConnectiveFactory() ); } public static void registerConnectiveFactory( ImpKind kind, ImpType model, ConnectiveFactory connFac ) { cacheConnective.put( new Pair<ImpKind, ImpType>( kind, model ), connFac ); } public static ConnectiveFactory getConnectiveFactory( ImpKind kind, ImpType model ){ if ( kind == null || model == null ) { return defaultFactory; } return cacheConnective.get( new Pair<ImpKind, ImpType>( kind, model ) ); } public static void setDefaultFactory(ConnectiveFactory defaultFactory) { ChanceStrategyFactory.defaultFactory = defaultFactory; } /*********************************************************************************************************************************/ private static HashMap<Pair<ImpKind,ImpType>,DistributionStrategyFactory> cache = new HashMap<Pair<ImpKind, ImpType>, DistributionStrategyFactory>(); public static <T> DistributionStrategies buildStrategies( ImpKind kind, ImpType model, DegreeType degreeType, Class<T> domainType) { DistributionStrategyFactory<T> factory = cache.get( new Pair( kind,model ) ); return factory.<T>buildStrategies( degreeType, domainType ); } public static <T> void register( ImpKind kind, ImpType model, DistributionStrategyFactory<T> factory ) { cache.put( new Pair<ImpKind, ImpType>( kind, model ), factory ); } public static void initDefaults() { try { DistributionStrategyFactory factory = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.probability.discrete.DiscreteDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory.getImp_Kind(), factory.getImp_Model(), factory ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.probability.BasicDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory.getImp_Kind(), factory.getImp_Model(), factory ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory2 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.probability.dirichlet.DirichletDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory2.getImp_Kind(), factory2.getImp_Model(), factory2 ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory3 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.fuzzy.linguistic.ShapedFuzzyPartitionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory3.getImp_Kind(), factory3.getImp_Model(), factory3 ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory4 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.fuzzy.linguistic.LinguisticPossibilityDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register(factory4.getImp_Kind(), factory4.getImp_Model(), factory4); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory5 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.probability.BasicDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory5.getImp_Kind(), factory5.getImp_Model(), factory5 ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory6 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.fuzzy.BasicDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory6.getImp_Kind(), factory6.getImp_Model(), factory6 ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory7 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.belief.discrete.TBMStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory7.getImp_Kind(), factory7.getImp_Model(), factory7 ); } catch ( Exception e ) { e.printStackTrace(); } try { DistributionStrategyFactory factory8 = (DistributionStrategyFactory) Class.forName( "org.drools.chance.distribution.probability.gaussian.GaussianDistributionStrategyFactory" ).newInstance(); ChanceStrategyFactory.register( factory8.getImp_Kind(), factory8.getImp_Model(), factory8 ); } catch ( Exception e ) { e.printStackTrace(); } ChanceDegreeTypeRegistry.getSingleInstance().registerDegreeType( DegreeType.SIMPLE, SimpleDegree.class); ChanceDegreeTypeRegistry.getSingleInstance().registerDegreeType( DegreeType.INTERVAL, IntervalDegree.class); } /*********************************************************************************************************************************/ private static class Pair<X,Y> { private X x; private Y y; Pair( X x, Y y ) { this.x = x; this.y = y; } public X getX() { return x; } public Y getY() { return y; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Pair pair = (Pair) o; if (!x.equals(pair.x)) return false; if (!y.equals(pair.y)) return false; return true; } @Override public int hashCode() { int result = x.hashCode(); result = 31 * result + y.hashCode(); return result; } } }