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

org.sat4j.csp.encodings.BinarySupportEncoding Maven / Gradle / Ivy

/*******************************************************************************
* SAT4J: a SATisfiability library for Java Copyright (C) 2004-2008 Daniel Le Berre
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU Lesser General Public License Version 2.1 or later (the
* "LGPL"), in which case the provisions of the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of the LGPL, and not to allow others to use your version of
* this file under the terms of the EPL, indicate your decision by deleting
* the provisions above and replace them with the notice and other provisions
* required by the LGPL. If you do not delete the provisions above, a recipient
* may use your version of this file under the terms of the EPL or the LGPL.
*******************************************************************************/
package org.sat4j.csp.encodings;

import java.util.HashMap;
import java.util.Map;

import org.sat4j.core.VecInt;
import org.sat4j.csp.Encoding;
import org.sat4j.csp.Evaluable;
import org.sat4j.csp.Var;
import org.sat4j.specs.ContradictionException;
import org.sat4j.specs.ISolver;
import org.sat4j.specs.IVec;
import org.sat4j.specs.IVecInt;
import org.sat4j.specs.IteratorInt;

public class BinarySupportEncoding implements Encoding {

    private final Map supportsa = new HashMap();

    private final Map supportsb = new HashMap();

    private static final Encoding instance = new BinarySupportEncoding();

    private BinarySupportEncoding() {
        // nothing here
    }

    public static Encoding instance() {
        return instance;
    }

    public void onFinish(ISolver solver, IVec scope)
            throws ContradictionException {
        generateClauses(scope.get(0), supportsa, solver);
        generateClauses(scope.get(1), supportsb, solver);

    }

    public void onInit(ISolver solver, IVec scope) {
        supportsa.clear();
        supportsb.clear();
    }

    public void onNogood(ISolver solver, IVec scope,
            Map tuple) throws ContradictionException {
    }

    public void onSupport(ISolver solver, IVec scope,
            Map tuple) throws ContradictionException {
        Var vara = scope.get(0);
        Integer va = tuple.get(vara);
        Var varb = scope.get(1);
        Integer vb = tuple.get(varb);
        addSupport(va, varb, vb, supportsa);
        addSupport(vb, vara, va, supportsb);
    }

    private void addSupport(Integer head, Evaluable v, Integer value,
            Map supports) {
        IVecInt sup = supports.get(head);
        if (sup == null) {
            sup = new VecInt();
            supports.put(head, sup);
        }
        sup.push(v.translate(value.intValue()));
    }

    private void generateClauses(Evaluable v, Map supports,
            ISolver solver) throws ContradictionException {
        IVecInt clause = new VecInt();
        for (IteratorInt  it =  v.domain().iterator() ; it.hasNext();) {
            Integer key = new Integer(it.next());
            clause.clear();
            IVecInt support = supports.get(key);
            clause.push(-v.translate(key.intValue()));
            if (support != null) {
                for (IteratorInt  iterator = support.iterator() ; iterator.hasNext();)
                    clause.push(iterator.next());
            }
            solver.addClause(clause);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy