package net.varkhan.data.learn.decision;
import net.varkhan.base.functor.Mapper;
import net.varkhan.base.functor.Ordinal;
import net.varkhan.base.functor._;
import net.varkhan.base.functor.curry.Pair;
import net.varkhan.base.functor.mapper.ConstMapper;
import net.varkhan.base.functor.ordinal.ComposedOrdinal;
import net.varkhan.base.functor.ordinal.ConstOrdinal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 12/28/13
* @time 12:47 PM
*/
public class Partition<A,T,C> extends ComposedOrdinal<T,C> {
protected final double conf;
public Partition(Mapper<A,T,C> mapr, Ordinal<A,C> part, double conf) {
super(part, mapr);
this.conf=conf;
}
@SuppressWarnings("unchecked")
public Mapper<A,T,C> attribute() { return (Mapper<A, T, C>) mapr; }
@SuppressWarnings("unchecked")
public Ordinal<A,C> partition() { return (Ordinal<A, C>) ordn; }
public double confidence() { return conf; }
protected static final Partition<Object,Object,Object> NULL=new Partition<Object,Object,Object>(ConstMapper.NULL(), ConstOrdinal.UNITY(), 1);
@Override
public String toString() {
return super.toString()+"@"+conf;
}
@SuppressWarnings("unchecked")
public static <A,T,C> Partition<A,T,C> NULL() { return (Partition<A,T,C>) NULL; }
public static interface Factory<K,A,T,C> extends Mapper<Partition<A,T,C>,Iterable<? extends Pair<T,K>>,C>{
}
@SuppressWarnings("unchecked")
public static <A,T,C> List<List<T>> partition(Partition<A,T,C> part, Collection<? extends T> values, C ctx) {
List<T>[] subs = new List[(int)part.cardinal()];
for(int i=0; i<subs.length; i++) subs[i] = new ArrayList<T>();
for(T v: values) {
long i = part.invoke(v, ctx);
subs[(int)i].add(v);
}
return Arrays.asList(subs);
}
@SuppressWarnings("unchecked")
public static <A,T,C,X extends _<T,?>> List<List<X>> partition_(Partition<A,T,C> part, Collection<? extends X> values, C ctx) {
List<X>[] subs = new List[(int)part.cardinal()];
for(int i=0; i<subs.length; i++) subs[i] = new ArrayList<X>();
for(X v: values) {
long i = part.invoke(v.lvalue(), ctx);
subs[(int)i].add(v);
}
return Arrays.asList(subs);
}
public static <T,C> boolean identical(Partition<?,T,C> part1, Partition<?,T,C> part2, Collection<? extends T> values, C ctx) {
for(T val: values) if(part1.invoke(val, ctx)!=part2.invoke(val, ctx)) return false;
return true;
}
public static <A,T,C,X extends _<T,?>> boolean identical_(Partition<A,T,C> part1, Partition<A,T,C> part2, Collection<? extends X> values, C ctx) {
for(X val: values) if(part1.invoke(val.lvalue(), ctx)!=part2.invoke(val.lvalue(), ctx)) return false;
return true;
}
}