/* Copyright 2006, Carnegie Mellon, All Rights Reserved */
package edu.cmu.minorthird.classify.relational;
import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import edu.cmu.minorthird.classify.Dataset;
import edu.cmu.minorthird.classify.DatasetLoader;
import edu.cmu.minorthird.classify.Example;
import edu.cmu.minorthird.classify.SGMExample;
import edu.cmu.minorthird.classify.Splitter;
import edu.cmu.minorthird.util.Saveable;
import edu.cmu.minorthird.util.gui.Visible;
/**
* A real set of examples for stacked graphical learning -- coreset + relational
* template. Currently the legalAggregators include EXISTS and COUNT
*
* @author Zhenzhen Kou
*/
public class RealRelationalDataset extends CoreRelationalDataset implements
Visible,Saveable,Dataset,Serializable{
static final long serialVersionUID=20080128L;
protected static Map<String,Set<String>> aggregators=new HashMap<String,Set<String>>();
public static Set<String> legalAggregators=new HashSet<String>();
static{
legalAggregators.add("EXISTS");
legalAggregators.add("COUNT");
}
/**
* Add an aggregator, i.e., save the info. in RelTemp sccript
*
* @param oper
* @param L_type
*/
static public void addAggregator(String oper,String L_type){
if(legalAggregators.contains(oper)){
if(aggregators.containsKey(L_type)){
aggregators.get(L_type).add(oper);
}else{
HashSet<String> set=new HashSet<String>();
set.add(oper);
// why o why clone? - frank
aggregators.put(L_type,(HashSet<String>)set.clone());
}
}else{
System.out.println(oper+" is not a legal aggregator");
}
return;
}
public static Map<String,Set<String>> getAggregators(){
return aggregators;
}
public static void setAggregators(Map<String,Set<String>> aggregators){
RealRelationalDataset.aggregators=aggregators;
}
// public Iterator<Example> iterator(){
// final Iterator<Example> inner=examples.iterator();
// return new Iterator<Example>(){
// public boolean hasNext(){
// return inner.hasNext();
// }
// public Example next(){
// return inner.next();
// }
// public void remove(){
// inner.remove();
// }
// };
// }
@Override
public Split split(final Splitter<Example> splitter){
splitter.split(iterator());
return new Split(){
@Override
public int getNumPartitions(){
return splitter.getNumPartitions();
}
@Override
public Dataset getTrain(int k){
return invertIteration(splitter.getTrain(k));
}
@Override
public Dataset getTest(int k){
return invertIteration(splitter.getTest(k));
}
};
}
private RealRelationalDataset invertIteration(Iterator<Example> i){
RealRelationalDataset copy=new RealRelationalDataset();
while(i.hasNext()){
copy.addSGM((SGMExample)i.next());
}
return copy;
}
// public Split splitSGM(final Splitter<SGMExample> splitter){
// splitter.split(iteratorSGM());
// return new Split(){
//
// public int getNumPartitions(){
// return splitter.getNumPartitions();
// }
//
// public Dataset getTrain(int k){
// return invertIterationSGM(splitter.getTrain(k));
// }
//
// public Dataset getTest(int k){
// return invertIterationSGM(splitter.getTest(k));
// }
// };
// }
//
// private RealRelationalDataset invertIterationSGM(Iterator<SGMExample> i){
// RealRelationalDataset copy=new RealRelationalDataset();
// while(i.hasNext()){
// copy.addSGM(i.next());
// }
// return copy;
// }
// test routine
/** Simple test routine */
static public void main(String[] args){
try{
RealRelationalDataset data=new RealRelationalDataset();
DatasetLoader.loadRelFile(new File("test.osf"),data);
DatasetLoader.loadLinkFile(new File("test.lsf"),data);
DatasetLoader.loadRelTempFile(new File("relTemp.txt"),data);
System.out.println(data.getSchema());
System.out.println("Aggregators: "+RealRelationalDataset.getAggregators());
for(Iterator<Example> i=data.examples.iterator();i.hasNext();){
SGMExample e=(SGMExample)i.next();
System.out.println(e);
}
}catch(Exception e){
e.printStackTrace();
}
}
}