/* * 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.distribution.fuzzy.linguistic; import org.drools.chance.degree.ChanceDegreeTypeRegistry; import org.drools.chance.degree.DegreeType; import org.drools.chance.degree.Degree; import org.drools.chance.degree.simple.SimpleDegree; import org.drools.chance.distribution.DiscretePossibilityDistribution; import org.drools.chance.distribution.Distribution; import org.drools.chance.distribution.DistributionStrategies; import org.drools.core.util.StringUtils; import java.lang.reflect.Constructor; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; public class ShapedFuzzyPartitionStrategy<T extends Linguistic> implements DistributionStrategies<Linguistic> { private DegreeType degreeType; private Class<T> domainType; private Constructor degreeStringConstr = null; ShapedFuzzyPartitionStrategy( DegreeType degreeType, Class<T> domainType ){ this.degreeType = degreeType; this.domainType = domainType; } private Constructor getDegreeStringConstructor() { if ( degreeStringConstr == null ) { degreeStringConstr = ChanceDegreeTypeRegistry.getSingleInstance().getConstructorByString( degreeType ); } return degreeStringConstr; } public Distribution<Linguistic> toDistribution(Linguistic value) { Distribution<Linguistic> dist = createEmptyPartition(); if ( value != null ) { ((DiscretePossibilityDistribution<Linguistic>) dist).getDistribution().put(value,SimpleDegree.TRUE); } return dist; } public Distribution<Linguistic> toDistribution(Linguistic value, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> toDistribution(Linguistic value, Object... params) { ShapedFuzzyPartition part = (ShapedFuzzyPartition) createEmptyPartition(); part.reshape( value, (Degree) params[0] ); return part; } public Distribution<Linguistic> parse(String distrAsString) { ShapedFuzzyPartition part = (ShapedFuzzyPartition) createEmptyPartition(); if ( StringUtils.isEmpty( distrAsString ) ) { return part; } StringTokenizer tok = new StringTokenizer(distrAsString,","); while (tok.hasMoreElements()) { String pair = tok.nextToken().trim(); StringTokenizer sub = new StringTokenizer(pair,"/"); try { String label = sub.nextToken().trim(); Degree deg = (Degree) getDegreeStringConstructor().newInstance(sub.nextToken().trim() ); part.reshape(label, deg); } catch (Exception e) { e.printStackTrace(); } } return part; } protected Distribution<Linguistic> createEmptyPartition() { try { Linguistic[] values = (Linguistic[]) domainType.getMethod("values").invoke(null); ShapedFuzzyPartition ans = new ShapedFuzzyPartition(values); return ans; } catch (Exception e) { e.printStackTrace(); } return null; } public Distribution<Linguistic> newDistribution() { return createEmptyPartition(); } public Distribution<Linguistic> newDistribution(Set<Linguistic> focalElements) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> newDistribution(Map<? extends Linguistic, ? extends Degree> elements) { return new ShapedFuzzyPartition(elements); } public Linguistic toCrispValue(Distribution<Linguistic> dist) { DiscretePossibilityDistribution<Linguistic> ldist = (DiscretePossibilityDistribution<Linguistic>) dist; if ( ldist.size() == 0 ) { return null; } return ldist.iterator().next(); } public Linguistic toCrispValue(Distribution<Linguistic> dist, String strategy) { return toCrispValue(dist); } public Linguistic toCrispValue(Distribution<Linguistic> dist, Object... params) { return toCrispValue(dist); } public Linguistic sample(Distribution<Linguistic> dist) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Linguistic sample(Distribution<Linguistic> dist, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Linguistic sample(Distribution<Linguistic> dist, Object... params) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> merge(Distribution<Linguistic> current, Distribution<Linguistic> newBit) { ShapedFuzzyPartition part1 = (ShapedFuzzyPartition) current; ShapedFuzzyPartition part2 = (ShapedFuzzyPartition) newBit; Iterator<Linguistic<Number>> iter = part2.iterator(); while ( iter.hasNext() ) { Linguistic<Number> ling = iter.next(); Degree deg = part2.getDegree( ling ); part1.reshape( ling, part1.getDegree( ling ).max( deg ) ); } return part1; } public Distribution<Linguistic> merge(Distribution<Linguistic> current, Distribution<Linguistic> newBit, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> merge(Distribution<Linguistic> current, Distribution<Linguistic> newBit, Object... params) { ShapedFuzzyPartition part1 = (ShapedFuzzyPartition) current; ShapedFuzzyPartition part2 = (ShapedFuzzyPartition) newBit; Iterator<Linguistic<Number>> iter = part2.iterator(); while ( iter.hasNext() ) { Linguistic<Number> ling = iter.next(); Degree deg1 = part1.getDegree( ling ); Degree deg2 = part2.getDegree( ling ); part1.reshape( ling, deg1.max( deg2 ) ); } return part1; } public Distribution<Linguistic> mergeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit) { ShapedFuzzyPartition part1 = (ShapedFuzzyPartition) current; ShapedFuzzyPartition part2 = (ShapedFuzzyPartition) newBit; ShapedFuzzyPartition ansPt = (ShapedFuzzyPartition) createEmptyPartition(); Iterator<Linguistic<Number>> iter = ansPt.iterator(); while ( iter.hasNext() ) { Linguistic<Number> ling = iter.next(); Degree deg1 = part1.getDegree( ling ); Degree deg2 = part2.getDegree( ling ); part1.reshape( ling, deg1.max( deg2 ) ); } return ansPt; } public Distribution<Linguistic> mergeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> mergeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit, Object... params) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> remove(Distribution<Linguistic> current, Distribution<Linguistic> newBit) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> remove(Distribution<Linguistic> current, Distribution<Linguistic> newBit, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> remove(Distribution<Linguistic> current, Distribution<Linguistic> newBit, Object... params) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> removeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> removeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit, String strategy) { return null; //To change body of implemented methods use File | Settings | File Templates. } public Distribution<Linguistic> removeAsNew(Distribution<Linguistic> current, Distribution<Linguistic> newBit, Object... params) { return null; //To change body of implemented methods use File | Settings | File Templates. } public void normalize(Distribution<Linguistic> distr) { //To change body of implemented methods use File | Settings | File Templates. } }