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}