/*
* Created on Feb 19, 2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.mindswap.swoop.automation;
import java.util.Hashtable;
/**
* @author Dave Wang
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class ExpressivityRanker
{
private static ExpressivityRanker myInstance;
public Hashtable myComplexityRankTable;
public Hashtable myRoughRankTable;
public static ExpressivityRanker getInstance()
{
if ( myInstance == null )
myInstance = new ExpressivityRanker();
return myInstance;
}
private ExpressivityRanker()
{
myComplexityRankTable = new Hashtable();
buildComplexityTable();
buildRoughRankTable();
}
/* 1 - Polynomial
* 2 - PSpace-Complete
* 3 - ExpTime-Complete
* 4 - NExpTime-Complete
*/
private void buildComplexityTable()
{
myComplexityRankTable.put( "EL", "1");
myComplexityRankTable.put( "ELI", "2");
myComplexityRankTable.put( "ELIH", "2");
myComplexityRankTable.put( "ELIHF", "2"); // PSpace-hard
myComplexityRankTable.put( "ELIF", "3"); // ExpTime-C
myComplexityRankTable.put( "ELU", "3");
myComplexityRankTable.put( "ELUI", "3");
myComplexityRankTable.put( "ELUIF", "3");
myComplexityRankTable.put( "ELUIH", "3");
myComplexityRankTable.put( "AL", "3");
myComplexityRankTable.put( "ALC", "3");
myComplexityRankTable.put( "ALCF", "3");
myComplexityRankTable.put( "ALCI", "3");
myComplexityRankTable.put( "ALCH", "3");
myComplexityRankTable.put( "ALCN", "3");
myComplexityRankTable.put( "ALCHON", "3");
myComplexityRankTable.put( "ALCHOF", "3");
myComplexityRankTable.put( "ALCIF", "3");
myComplexityRankTable.put( "ALCOF", "3");
myComplexityRankTable.put( "ALCIN", "3");
myComplexityRankTable.put( "ALCHI", "3");
myComplexityRankTable.put( "ALCON", "3");
myComplexityRankTable.put( "ALCHO", "3");
myComplexityRankTable.put( "ALCO", "3");
myComplexityRankTable.put( "ALCHF", "3");
myComplexityRankTable.put( "ALCHON", "3");
myComplexityRankTable.put( "SHO", "3");
myComplexityRankTable.put( "SHON", "3");
myComplexityRankTable.put( "ALCHIF", "3");
myComplexityRankTable.put( "ALCHIN", "3");
myComplexityRankTable.put( "ALF", "3"); // bounded by ALCF
myComplexityRankTable.put( "ALI", "3"); // bounded by ALCI
myComplexityRankTable.put( "ALHI", "3"); // bounded by ALCHI
myComplexityRankTable.put( "ALOF", "3"); // bounded by ALCOF
myComplexityRankTable.put( "ALIF", "3"); // bounded by ALCIF
myComplexityRankTable.put( "ALHF", "3"); // bounded by ALCHF
myComplexityRankTable.put( "ALH", "3"); // bounded by ALCH
myComplexityRankTable.put( "ALO", "3"); // bounded by ALCO
myComplexityRankTable.put( "ALIN", "3"); // bounded by ALCIN
myComplexityRankTable.put( "ALOIF", "4"); // bounded by ALCOIF
myComplexityRankTable.put( "ALOIN", "4"); // bounded by ALCOIN
myComplexityRankTable.put( "ALHON", "3"); // bounded by ALCHON
myComplexityRankTable.put( "ALR+IF", "3"); // bounded by SIF
myComplexityRankTable.put( "ALR+", "3"); // bounded by S
myComplexityRankTable.put( "ALR+H", "3"); // bounded by SH
myComplexityRankTable.put( "ALR+HI", "3"); // bounded by SHI
myComplexityRankTable.put( "ALR+HIF", "3"); // bounded by SHIF
myComplexityRankTable.put( "ALR+HN", "3"); // bounded by SHN
myComplexityRankTable.put( "S", "3");
myComplexityRankTable.put( "SIF", "3");
myComplexityRankTable.put( "SH", "3");
myComplexityRankTable.put( "SHI", "3");
myComplexityRankTable.put( "SHIF", "3");
myComplexityRankTable.put( "SHIN", "3");
myComplexityRankTable.put( "SHF", "3");
myComplexityRankTable.put( "SF", "3");
myComplexityRankTable.put( "SI", "3");
myComplexityRankTable.put( "ALCOIF", "4");
myComplexityRankTable.put( "ALCOIN", "4");
myComplexityRankTable.put( "ALCHOIF", "4");
myComplexityRankTable.put( "ALCHOIN", "4");
myComplexityRankTable.put( "ALCOIF", "4");
myComplexityRankTable.put( "ALCOIN", "4");
myComplexityRankTable.put( "SHOIF", "4");
myComplexityRankTable.put( "SHOIN", "4");
myComplexityRankTable.put( "SOIF", "4");
myComplexityRankTable.put( "SOIN", "4");
myComplexityRankTable.put( "DL-Lite", "1");
myComplexityRankTable.put( "RDFS(DL)", "1"); // polynomial by Bernardo
}
/* Roughly group
* 1. sub-boolean without union
* 2. sub-boolean with union to ACL
* 3.
*/
private void buildRoughRankTable()
{
/*
myRoughRankTable.put( "DL-Lite", "1");
myRoughRankTable.put( "RDFS(DL)", "1");
myRoughRankTable.put( "EL", "1");
myRoughRankTable.put( "ELI", "1");
myRoughRankTable.put( "ELIH", "1");
myRoughRankTable.put( "ELIHF", "1");
myRoughRankTable.put( "ELIF", "2");
myRoughRankTable.put( "ELU", "2");
myRoughRankTable.put( "ELUI", "2");
myRoughRankTable.put( "ELUIF", "2");
myRoughRankTable.put( "ELUIH", "2");
myRoughRankTable.put( "ALF", "2"); // bounded by ALCF
myRoughRankTable.put( "ALI", "2"); // bounded by ALCI
myRoughRankTable.put( "ALHI", "2"); // bounded by ALCHI
myRoughRankTable.put( "ALIF", "2"); // bounded by ALCIF
myRoughRankTable.put( "ALHF", "2"); // bounded by ALCHF
myRoughRankTable.put( "ALH", "2"); // bounded by ALCH
myRoughRankTable.put( "ALIN", "2"); // bounded by ALCIN
myRoughRankTable.put( "ALOF", "2"); // bounded by ALCOF
myRoughRankTable.put( "ALO", "2"); // bounded by ALCO
myRoughRankTable.put( "ALR+IF", "2"); // bounded by SIF
myRoughRankTable.put( "ALR+", "2"); // bounded by S
myRoughRankTable.put( "ALR+H", "2"); // bounded by SH
myRoughRankTable.put( "ALR+HI", "2"); // bounded by SHI
myRoughRankTable.put( "ALR+HIF","2"); // bounded by SHIF
myRoughRankTable.put( "ALR+HN", "2"); // bounded by SHN
myRoughRankTable.put( "AL", "2");
myRoughRankTable.put( "ALC", "2");
myRoughRankTable.put( "ALCF", "3");
myRoughRankTable.put( "ALCI", "3");
myRoughRankTable.put( "ALCH", "3");
myRoughRankTable.put( "ALCN", "3");
myRoughRankTable.put( "ALCIF", "3");
myRoughRankTable.put( "ALCIN", "3");
myRoughRankTable.put( "ALCHI", "3");
myRoughRankTable.put( "ALCHF", "3");
myRoughRankTable.put( "ALCHIF", "3");
myRoughRankTable.put( "ALCHIN", "3");
myRoughRankTable.put( "ALCHON", "3");
myRoughRankTable.put( "ALCHOF", "3");
myRoughRankTable.put( "ALCOF", "3");
myRoughRankTable.put( "ALCO", "3");
myRoughRankTable.put( "ALCON", "3");
myRoughRankTable.put( "ALCHO", "3");
myRoughRankTable.put( "ALCHON", "3");
myRoughRankTable.put( "S", "4");
myRoughRankTable.put( "SH", "4");
myRoughRankTable.put( "SF", "4");
myRoughRankTable.put( "SHF", "4");
myRoughRankTable.put( "SI", "5");
myRoughRankTable.put( "SHIF", "5");
myRoughRankTable.put( "SHI", "5");
myRoughRankTable.put( "SIF", "5");
myRoughRankTable.put( "SHIN", "5");
myRoughRankTable.put( "SHOIF", "6");
myRoughRankTable.put( "SHOIN", "6");
myRoughRankTable.put( "SOIF", "6");
myRoughRankTable.put( "SOIN", "6");
myRoughRankTable.put( "SHO", "6");
myRoughRankTable.put( "SHON", "6");
myRoughRankTable.put( "ALOIF", "4"); // bounded by ALCOIF
myRoughRankTable.put( "ALOIN", "4"); // bounded by ALCOIN
myRoughRankTable.put( "ALHON", "3"); // bounded by ALCHON
myRoughRankTable.put( "ALCOIF", "4");
myRoughRankTable.put( "ALCOIN", "4");
myRoughRankTable.put( "ALCHOIF", "4");
myRoughRankTable.put( "ALCHOIN", "4");
myRoughRankTable.put( "ALCOIF", "4");
myRoughRankTable.put( "ALCOIN", "4");
*/
}
public String rankByRoughBin( String cExp )
{
// SHOIN
if ( ( cExp.indexOf( "N" ) != -1 ) || ( cExp.indexOf( "O" ) != -1 ) )
return "4";
// SHIF
else if ( ( cExp.indexOf( "I" ) != -1 ) || ( cExp.indexOf( "C" ) != -1 || (cExp.indexOf( "S" ) != -1) ))
return "3";
// ALHF
else if ( ( cExp.indexOf( "H" ) != -1 ) || ( cExp.indexOf( "F" ) != -1 ) )
return "2";
// AL
return "1";
}
public String rankByComplexity( String cExp )
{
return (String)myComplexityRankTable.get( cExp );
}
}