001package org.clafer.compiler; 002 003import java.util.ArrayList; 004import java.util.List; 005import org.clafer.common.Check; 006import org.clafer.instance.InstanceModel; 007import solver.Solver; 008 009/** 010 * 011 * @author jimmy 012 */ 013public class ClaferSolver implements ClaferSearch<InstanceModel> { 014 015 private final Solver solver; 016 private final ClaferSolutionMap solutionMap; 017 private boolean first = true; 018 private boolean more = true; 019 020 ClaferSolver(Solver solver, ClaferSolutionMap solutionMap) { 021 this.solver = Check.notNull(solver); 022 this.solutionMap = Check.notNull(solutionMap); 023 } 024 025 public ClaferSolutionMap getSolutionMap() { 026 return solutionMap; 027 } 028 029 @Override 030 public boolean find() { 031 if (!more) { 032 return false; 033 } 034 if (first) { 035 first = false; 036 more &= solver.findSolution(); 037 return more; 038 } 039 more &= solver.nextSolution(); 040 return more; 041 } 042 043 @Override 044 public InstanceModel instance() { 045 return solutionMap.getInstance(); 046 } 047 048 @Override 049 public InstanceModel[] allInstances() { 050 List<InstanceModel> instances = new ArrayList<>(); 051 while (find()) { 052 instances.add(instance()); 053 } 054 return instances.toArray(new InstanceModel[instances.size()]); 055 } 056 057 @Override 058 public Solver getInternalSolver() { 059 return solver; 060 } 061 062 @Override 063 public String toString() { 064 return solver.toString(); 065 } 066}