// Path: src/main/java/com/googlecode/rockit/app/solver/thread/RestrictionBuilder.java
// public abstract class RestrictionBuilder extends Thread
// {
// 
//     public abstract FormulaHard getFormula();
// 
// 
//     public abstract void generateRestrictions();
// 
// 
//     public abstract void run();
// 
// 
//     public abstract void addConstraints(ILPConnector con) throws ILPException, SolveException;
// 
// 
//     public abstract boolean isFoundOneRestriction();
// 
// 
//     public abstract void foundNoRestriction();
// 
// 
//     public abstract void setTrackLiterals(boolean trackLiterals);
// 
// 
//     public abstract HashMap<Literal, Literal> getLiterals();
// 
// 
//     public abstract void setEvidenceAxioms(HashMap<Literal, Literal> evidence);
// 
// 
//     public abstract void setSql(MySQLConnector sql);
// 
// 
//     public abstract AggregationManager getAggregationManager();
// 
// 
//     public abstract ArrayList<Clause> getClauses();
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/exception/ParseException.java
// public class ParseException extends Exception
// {
// 
//     /**
//      * Exceptions which can occur in the Parse Phase of the application.
//      */
//     private static final long serialVersionUID = -4390051337485101364L;
// 
// 
//     public ParseException()
//     {
//     }
// 
// 
//     public ParseException(String msg)
//     {
//         super(Messages.printParseExceptionError(msg));
//     }
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/javaAPI/formulas/variables/impl/VariableAbstract.java
// public abstract class VariableAbstract implements Comparable<VariableAbstract>
// {
//     private String  name;
//     private boolean addToWhere = true;
// 
// 
//     public VariableAbstract()
//     {
//     }
// 
// 
//     public VariableAbstract(String name)
//     {
//         this.name = name;
//     }
// 
// 
//     public void setName(String name)
//     {
//         this.name = name;
//     }
// 
// 
//     public String getName()
//     {
//         return name;
//     }
// 
// 
//     @Override
//     public int hashCode()
//     {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((name == null) ? 0 : name.hashCode());
//         return result;
//     }
// 
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         if(this == obj)
//             return true;
//         if(obj == null)
//             return false;
//         if(getClass() != obj.getClass())
//             return false;
//         VariableAbstract other = (VariableAbstract) obj;
//         if(name == null) {
//             if(other.name != null)
//                 return false;
//         } else if(!name.equals(other.name))
//             return false;
//         return true;
//     }
// 
// 
//     public boolean equals(VariableAbstract var)
//     {
//         if(this == var)
//             return true;
//         if(var == null)
//             return false;
//         if(name == null) {
//             if(var.name != null)
//                 return false;
//         } else if(!name.equals(var.name))
//             return false;
//         return true;
//     }
// 
// 
//     public String toString()
//     {
//         return name;
//     }
// 
// 
//     @Override
//     public int compareTo(VariableAbstract arg0)
//     {
//         return this.name.compareTo(arg0.getName());
//     }
// 
// 
//     public boolean addToWhere()
//     {
//         return addToWhere;
//     }
// 
// 
//     public void setAddToWhere(boolean addToWhere)
//     {
//         this.addToWhere = addToWhere;
//     }
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/javaAPI/formulas/variables/impl/VariableType.java
// public class VariableType extends VariableAbstract
// {
//     private Type type;
// 
// 
//     public VariableType()
//     {
//     }
// 
// 
//     public VariableType(String name, Type type)
//     {
//         this.setName(name);
//         this.type = type;
//     }
// 
// 
//     public VariableType(String name)
//     {
//         this.setName(name);
//     }
// 
// 
//     public void setType(Type type)
//     {
//         this.type = type;
// 
//     }
// 
// 
//     public Type getType()
//     {
//         return type;
//     }
// 
// 
//     public String toString()
//     {
//         return getName();
//     }
// 
// }


import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;
import com.googlecode.rockit.app.solver.thread.RestrictionBuilder;
import com.googlecode.rockit.exception.ParseException;
import com.googlecode.rockit.javaAPI.formulas.expressions.IfExpression;
import com.googlecode.rockit.javaAPI.formulas.expressions.impl.PredicateExpression;
import com.googlecode.rockit.javaAPI.formulas.variables.impl.VariableAbstract;
import com.googlecode.rockit.javaAPI.formulas.variables.impl.VariableType;
import com.googlecode.rockit.javaAPI.predicates.PredicateAbstract;
package com.googlecode.rockit.javaAPI.formulas;




public class FormulaHard extends FormulaAbstract
{

    private ArrayList<PredicateExpression> restrictions       = new ArrayList<PredicateExpression>();
    private boolean                        conjunction        = false;
    private RestrictionBuilder             restrictionBuilder = null;


    public void setAllAsForVariables()
    {
        TreeSet<VariableType> forVar = new TreeSet<VariableType>();
        for(PredicateExpression expr : this.restrictions) {
            for(VariableAbstract var : expr.getVariables()) {
                if(var instanceof VariableType) {
                    forVar.add((VariableType) var);
                }
            }
        }
        for(IfExpression ifexpr : this.getIfExpressions()) {
            for(VariableAbstract var : ifexpr.getAllVariables()) {
                if(var instanceof VariableType) {
                    forVar.add((VariableType) var);
                }
            }
        }
        HashSet<VariableType> setset = new HashSet<VariableType>();
        for(VariableType fv : forVar) {
            setset.add(fv);
        }
        this.setForVariables(setset);
    }


// Path: src/main/java/com/googlecode/rockit/app/solver/thread/RestrictionBuilder.java
// public abstract class RestrictionBuilder extends Thread
// {
// 
//     public abstract FormulaHard getFormula();
// 
// 
//     public abstract void generateRestrictions();
// 
// 
//     public abstract void run();
// 
// 
//     public abstract void addConstraints(ILPConnector con) throws ILPException, SolveException;
// 
// 
//     public abstract boolean isFoundOneRestriction();
// 
// 
//     public abstract void foundNoRestriction();
// 
// 
//     public abstract void setTrackLiterals(boolean trackLiterals);
// 
// 
//     public abstract HashMap<Literal, Literal> getLiterals();
// 
// 
//     public abstract void setEvidenceAxioms(HashMap<Literal, Literal> evidence);
// 
// 
//     public abstract void setSql(MySQLConnector sql);
// 
// 
//     public abstract AggregationManager getAggregationManager();
// 
// 
//     public abstract ArrayList<Clause> getClauses();
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/exception/ParseException.java
// public class ParseException extends Exception
// {
// 
//     /**
//      * Exceptions which can occur in the Parse Phase of the application.
//      */
//     private static final long serialVersionUID = -4390051337485101364L;
// 
// 
//     public ParseException()
//     {
//     }
// 
// 
//     public ParseException(String msg)
//     {
//         super(Messages.printParseExceptionError(msg));
//     }
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/javaAPI/formulas/variables/impl/VariableAbstract.java
// public abstract class VariableAbstract implements Comparable<VariableAbstract>
// {
//     private String  name;
//     private boolean addToWhere = true;
// 
// 
//     public VariableAbstract()
//     {
//     }
// 
// 
//     public VariableAbstract(String name)
//     {
//         this.name = name;
//     }
// 
// 
//     public void setName(String name)
//     {
//         this.name = name;
//     }
// 
// 
//     public String getName()
//     {
//         return name;
//     }
// 
// 
//     @Override
//     public int hashCode()
//     {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((name == null) ? 0 : name.hashCode());
//         return result;
//     }
// 
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         if(this == obj)
//             return true;
//         if(obj == null)
//             return false;
//         if(getClass() != obj.getClass())
//             return false;
//         VariableAbstract other = (VariableAbstract) obj;
//         if(name == null) {
//             if(other.name != null)
//                 return false;
//         } else if(!name.equals(other.name))
//             return false;
//         return true;
//     }
// 
// 
//     public boolean equals(VariableAbstract var)
//     {
//         if(this == var)
//             return true;
//         if(var == null)
//             return false;
//         if(name == null) {
//             if(var.name != null)
//                 return false;
//         } else if(!name.equals(var.name))
//             return false;
//         return true;
//     }
// 
// 
//     public String toString()
//     {
//         return name;
//     }
// 
// 
//     @Override
//     public int compareTo(VariableAbstract arg0)
//     {
//         return this.name.compareTo(arg0.getName());
//     }
// 
// 
//     public boolean addToWhere()
//     {
//         return addToWhere;
//     }
// 
// 
//     public void setAddToWhere(boolean addToWhere)
//     {
//         this.addToWhere = addToWhere;
//     }
// 
// }
// 
// Path: src/main/java/com/googlecode/rockit/javaAPI/formulas/variables/impl/VariableType.java
// public class VariableType extends VariableAbstract
// {
//     private Type type;
// 
// 
//     public VariableType()
//     {
//     }
// 
// 
//     public VariableType(String name, Type type)
//     {
//         this.setName(name);
//         this.type = type;
//     }
// 
// 
//     public VariableType(String name)
//     {
//         this.setName(name);
//     }
// 
// 
//     public void setType(Type type)
//     {
//         this.type = type;
// 
//     }
// 
// 
//     public Type getType()
//     {
//         return type;
//     }
// 
// 
//     public String toString()
//     {
//         return getName();
//     }
// 
// }


// Path: src/main/java/com/googlecode/rockit/javaAPI/formulas/FormulaHard.java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;
import com.googlecode.rockit.app.solver.thread.RestrictionBuilder;
import com.googlecode.rockit.exception.ParseException;
import com.googlecode.rockit.javaAPI.formulas.expressions.IfExpression;
import com.googlecode.rockit.javaAPI.formulas.expressions.impl.PredicateExpression;
import com.googlecode.rockit.javaAPI.formulas.variables.impl.VariableAbstract;
import com.googlecode.rockit.javaAPI.formulas.variables.impl.VariableType;
import com.googlecode.rockit.javaAPI.predicates.PredicateAbstract;

package com.googlecode.rockit.javaAPI.formulas;




public class FormulaHard extends FormulaAbstract
{

    private ArrayList<PredicateExpression> restrictions       = new ArrayList<PredicateExpression>();
    private boolean                        conjunction        = false;
    private RestrictionBuilder             restrictionBuilder = null;


    public void setAllAsForVariables()
    {
        TreeSet<VariableType> forVar = new TreeSet<VariableType>();
        for(PredicateExpression expr : this.restrictions) {
            for(VariableAbstract var : expr.getVariables()) {
                if(var instanceof VariableType) {
                    forVar.add((VariableType) var);
                }
            }
        }
        for(IfExpression ifexpr : this.getIfExpressions()) {
            for(VariableAbstract var : ifexpr.getAllVariables()) {
                if(var instanceof VariableType) {
                    forVar.add((VariableType) var);
                }
            }
        }
        HashSet<VariableType> setset = new HashSet<VariableType>();
        for(VariableType fv : forVar) {
            setset.add(fv);
        }
        this.setForVariables(setset);
    }


    public FormulaHard(String name, HashSet<VariableType> forVariables, ArrayList<IfExpression> ifExpressions, ArrayList<PredicateExpression> restrictions, boolean usesConjunctions) throws ParseException