package yacs.solver;

import yacs.exceptions.*;
import yacs.net.*;

import org.apache.log4j.*;

/**
 * <p>Abstrakte Klasse für Constraint-Solver mit Verfahren zur Herstellung eines
 * speziellen Konsistenzgrades.</p>
 *
 * <p>Copyright (C) 2005  Wolfgang Runte
 * <br><br>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <br><br>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <br><br>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 * USA</p>
 *
 * @author Wolfgang Runte (woru@tzi.org)
 * @version YACS 0.1.1
 */
public abstract class ConsistencySolver implements Solver {

// ********** private attributs **********

  /** Logger aktivieren: */
  private static Logger logger = Logger.getLogger("yacs.solver.ConsistencySolver");

// ********** public attributs **********

// ********** private methods **********

// ********** public methods **********

  /**
   * Benötigt als Eingabe ein Constraint-Netz. Liefert <code>true</code>, wenn
   * Wertebereichseinschränkungen vorgenommen wurden, <code>false</code> wenn
   * nicht.
   * @param constraintNet ConstraintNet
   * @return boolean
   * @throws InconsistencyException
   */
  public abstract boolean propagate(ConstraintNet constraintNet) throws InconsistencyException;

  /**
   * Methode zur Initiierung des Lösungsprozesses des jeweiligen
   * Constraint-Solvers. Liefert <code>true</code>, wenn
   * Wertebereichseinschränkungen vorgenommen wurden, <code>false</code> wenn
   * nicht.
   * @param constraintNet ConstraintNet
   * @return boolean
   * @throws InconsistencyException
   */
  public boolean evaluate(ConstraintNet constraintNet) throws InconsistencyException {
    this.logger.info("evaluate() in " + this.getClass());
    return this.propagate(constraintNet);
/*
    // Nur wenn primitive Constraints existieren:
    if (constraintNet.getSubproblem() != null) {
      // Solver starten und Rückgabe merken:
      this.logger.info("this.propagate() in " + this.getClass() + ".evaluate().");
      boolean domainModification = this.propagate(constraintNet);
      // Wenn Wertebereichseinschränkungen vorgenommen wurden ...
      if (domainModification) {
        // ... so lange Propagieren, bis keine Änderungen mehr auftreten:
        while (domainModification) {
          this.logger.info("Iteration in " + this.getClass() + ".evaluate().");
          domainModification = this.propagate(constraintNet);
        }
        // Trotzdem 'true' für Änderungen zurückgeben:
        return true;
      }
    }
    return false;
*/
  }

}
