package org.simantics.scl.compiler.elaboration.query.compilation; import java.util.ArrayList; import java.util.Collections; import gnu.trove.map.hash.TLongObjectHashMap; import gnu.trove.procedure.TLongObjectProcedure; public class DynamicProgrammingOrdering { final ConstraintCollectionContext collectionContext; int variableCount; final QueryConstraint[] constraints; TLongObjectHashMap entries = new TLongObjectHashMap(); private static class Path { public final QueryConstraint constraint; public final Path prev; public Path(QueryConstraint constraint, Path prev) { this.constraint = constraint; this.prev = prev; } public void updateOrder(QueryConstraint[] constraints) { Path path = this; for(int i=constraints.length-1;i>=0;--i,path=path.prev) constraints[i] = path.constraint; } } private static class Entry { double branching; double cost; Path path; long variables; public Entry(double branching, double cost, Path path, long variables) { this.branching = branching; this.cost = cost; this.path = path; this.variables = variables; } } private DynamicProgrammingOrdering(ConstraintCollectionContext collectionContext, QueryConstraint[] constraints) { this.collectionContext = collectionContext; this.constraints = constraints; //for(QueryConstraint constraint : constraints) // System.out.println(constraint); int maxVariable = -1; for(QueryConstraint constraint : constraints) for(int v : constraint.variables) maxVariable = Math.max(maxVariable, v); this.variableCount = maxVariable + 1; } private void run(long initialVariableBindings) throws UnsolvableQueryException { entries.put(0L, new Entry(1.0, 0.0, null, initialVariableBindings)); for(int i=0;i 0) b.append(", "); b.append(variableNames.get(i)); } /*b.append("\nUnsolved constraints:"); for(QueryConstraint constraint : constraints) if(!constraint.canBeSolvedFrom(entry.variables)) b.append("\n ").append(constraint); */ throw new UnsolvableQueryException(b.toString()); } } public static void order(ConstraintCollectionContext collectionContext, QueryConstraint[] constraints, long initialVariableBindings) throws UnsolvableQueryException { DynamicProgrammingOrdering algorithm = new DynamicProgrammingOrdering(collectionContext, constraints); algorithm.run(initialVariableBindings); } }