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

org.chocosolver.solver.propagation.PropagationEngineObserver Maven / Gradle / Ivy

There is a newer version: 4.10.17
Show newest version
/*
 * This file is part of choco-solver, http://choco-solver.org/
 *
 * Copyright (c) 2022, IMT Atlantique. All rights reserved.
 *
 * Licensed under the BSD 4-clause license.
 *
 * See LICENSE file in the project root for full license information.
 */
package org.chocosolver.solver.propagation;

import org.chocosolver.solver.ICause;
import org.chocosolver.solver.Model;
import org.chocosolver.solver.constraints.Propagator;
import org.chocosolver.solver.exception.ContradictionException;
import org.chocosolver.solver.variables.Variable;
import org.chocosolver.solver.variables.events.IEventType;
import org.chocosolver.solver.variables.events.PropagatorEventType;

/**
 * This class extends {@link PropagationEngine} in order to collect
 * data relative to propagation.
 * 
* * @author Charles Prud'homme * @since 12/10/2021 */ public class PropagationEngineObserver extends PropagationEngine { /** * The observer to notify */ private final PropagationObserver observer; /** * A propagation engine profiler. * * @param model the declaring model * @param observer the propagation engine observer to notify */ public PropagationEngineObserver(Model model, PropagationObserver observer) { super(model); this.observer = observer; } /** * @apiNote This is the main reason this class exists, to notify a propagation observer */ @Override public void execute(Propagator propagator) throws ContradictionException { if (propagator.isStateLess() || propagator.isActive()) { observer.onCoarseEvent(propagator); } super.execute(propagator); } /** * @apiNote This is the main reason this class exists, to notify a propagation observer */ @Override protected void propagateEvents() throws ContradictionException { try { //lastProp if (lastProp.reactToFineEvent()) { observer.onFineEvent(lastProp); lastProp.doFinePropagation(); // now we can check whether a delayed propagation has been scheduled int dp = getDelayedPropagation(); if (dp > 0) { observer.onCoarseEvent(lastProp); lastProp.propagate(dp); } } else if (lastProp.isActive()) { // need to be checked due to views observer.onCoarseEvent(lastProp); lastProp.propagate(PropagatorEventType.FULL_PROPAGATION.getMask()); } } catch (ContradictionException cex) { observer.onFailure(cex.c, lastProp); throw cex; } } /** * @apiNote This is the main reason this class exists, to notify a propagation observer */ @Override public void onVariableUpdate(Variable variable, IEventType type, ICause cause) { if (cause instanceof Propagator) { observer.onFiltering(cause, lastProp); } observer.onVariableModification(variable, type, cause); super.onVariableUpdate(variable, type, cause); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy