All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.chocosolver.parser.flatzinc.layout.ASolutionPrinter Maven / Gradle / Ivy

/*
 * Copyright (c) 1999-2015, Ecole des Mines de Nantes
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Ecole des Mines de Nantes nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.chocosolver.parser.flatzinc.layout;

import org.chocosolver.parser.Exit;
import org.chocosolver.parser.flatzinc.ast.declaration.DArray;
import org.chocosolver.parser.flatzinc.ast.declaration.Declaration;
import org.chocosolver.parser.flatzinc.ast.expression.EArray;
import org.chocosolver.parser.flatzinc.ast.expression.ESetBounds;
import org.chocosolver.parser.flatzinc.ast.expression.ESetList;
import org.chocosolver.parser.flatzinc.ast.expression.Expression;
import org.chocosolver.solver.Solver;
import org.chocosolver.solver.search.loop.monitors.IMonitorSolution;
import org.chocosolver.solver.search.solution.Solution;
import org.chocosolver.solver.variables.BoolVar;
import org.chocosolver.solver.variables.IntVar;
import org.chocosolver.solver.variables.SetVar;
import org.chocosolver.solver.variables.Variable;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by cprudhom on 18/06/15.
 * Project: choco-parsers.
 */
public abstract class ASolutionPrinter implements IMonitorSolution {

    boolean printAll;
    boolean printStat;
    boolean wrongSolution;
    int nbSolution;
    boolean userinterruption = true;
    public boolean immutable = false;

    final public Solution bestSolution = new Solution();


    List output_names;
    List output_types;
    List output_vars;

    List output_arrays_names;
    List output_arrays_types;
    List output_arrays_vars;

    StringBuilder stringBuilder = new StringBuilder();

    final Thread statOnKill;


    public ASolutionPrinter(boolean printAll, boolean printStat) {
        this.printAll = printAll;
        this.printStat = printStat;
        output_vars = new ArrayList<>();
        output_names = new ArrayList<>();
        output_types = new ArrayList<>();
        output_arrays_names = new ArrayList<>();
        output_arrays_vars = new ArrayList<>();
        output_arrays_types = new ArrayList<>();
        statOnKill = new Thread() {
            public void run() {
                if (userinterruption) {
                    doFinalOutPut();
                    System.out.printf("%% Unexpected resolution interruption!");
                }
            }
        };
        Runtime.getRuntime().addShutdownHook(statOnKill);
    }

    public void addOutputVar(String name, Variable variable, Declaration type) {
        if (!immutable) {
            output_names.add(name);
            output_vars.add(variable);
            output_types.add(type.typeOf);
        }
    }

    public void addOutputArrays(String name, Variable[] variables, List indices, Declaration type) {
        if (!immutable) {
            EArray array = (EArray) indices.get(0);
            // print the size of the type of array
            stringBuilder.append(name).append(" = array").append(array.what.size()).append("d(");

            // print the size
            build(stringBuilder, array.getWhat_i(0));
            for (int i = 1; i < array.what.size(); i++) {
                stringBuilder.append(',');
                build(stringBuilder, array.getWhat_i(i));
            }
            // prepare to print the values
            if (variables.length > 0) {
                stringBuilder.append(",[%s]);");
            } else {
                stringBuilder.append(",[]);");
            }
            stringBuilder.append("\n");

            output_arrays_names.add(stringBuilder.toString());
            output_arrays_vars.add(variables.clone());
            output_arrays_types.add(((DArray) type).getWhat().typeOf);
            stringBuilder.setLength(0);
        }
    }

    private int[] build(StringBuilder st, Expression exp) {
        switch (exp.getTypeOf()) {
            case INT:
                int idx = exp.intValue();
                st.append(idx);
                return new int[]{idx};
            case SET_B:
                ESetBounds esb = (ESetBounds) exp;
                st.append(esb.toString());
                return esb.enumVal();
            case SET_L:
                ESetList esl = (ESetList) exp;
                st.append(esl.toString());
                return esl.enumVal();
            default:
                return new int[0];
        }
    }

    public void printSolution(Solution solution) {
        for (int i = 0; i < output_names.size(); i++) {
            System.out.printf("%s = %s;\n", output_names.get(i), value(solution, output_vars.get(i), output_types.get(i)));

        }
        for (int i = 0; i < output_arrays_names.size(); i++) {
            String name = output_arrays_names.get(i);
            Variable[] ivars = output_arrays_vars.get(i);
            if (ivars.length > 0) {
                Declaration.DType type = output_arrays_types.get(i);
                stringBuilder.append(value(solution, ivars[0], type));
                for (int j = 1; j < ivars.length; j++) {
                    stringBuilder.append(", ").append(value(solution, ivars[j], type));
                }
                System.out.printf(name, stringBuilder.toString());
                stringBuilder.setLength(0);
            } else {
                System.out.printf(name);
            }
        }
        System.out.printf("----------\n");
    }

    protected String value(Solution solution, Variable var, Declaration.DType type) {
        switch (type) {
            case BOOL:
                return solution.getIntVal((BoolVar) var) == 1 ? "true" : "false";
            case INT:
            case INT2:
            case INTN:
                return Integer.toString(solution.getIntVal(((IntVar) var)));
            case SET:
                StringBuilder st = new StringBuilder();
                st.append('{');
                for (int i : solution.getSetVal((SetVar) var)) {
                    st.append(i).append(',');
                }
                if (st.length() > 1) st.deleteCharAt(st.length() - 1);
                st.append('}');
                return st.toString();
            default:
                Exit.log();
        }
        return "";
    }

    @Override
    public void onSolution() {
        wrongSolution = false;
        nbSolution++;
        if (printAll) {
            printSolution(bestSolution);
        }
    }

    public final void finalOutPut() {
        userinterruption = false;
        Runtime.getRuntime().removeShutdownHook(statOnKill);
        doFinalOutPut();
    }

    public abstract void doFinalOutPut();

    public void immutable() {
        this.immutable = true;
    }

    public void imdone(Solver solver){
        // nothing to be done
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy