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

org.chocosolver.solver.constraints.nary.geost.PropGeost Maven / Gradle / Ivy

/**
 * This file is part of choco-geost, https://github.com/chocoteam/choco-geost
 *
 * Copyright (c) 2017-10-06T08:40:34Z, 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.constraints.nary.geost;

import org.chocosolver.memory.IStateInt;
import org.chocosolver.solver.Solution;
import org.chocosolver.solver.Solver;
import org.chocosolver.solver.constraints.Propagator;
import org.chocosolver.solver.constraints.PropagatorPriority;
import org.chocosolver.solver.constraints.nary.geost.externalConstraints.ExternalConstraint;
import org.chocosolver.solver.constraints.nary.geost.geometricPrim.GeostObject;
import org.chocosolver.solver.constraints.nary.geost.geometricPrim.ShiftedBox;
import org.chocosolver.solver.constraints.nary.geost.internalConstraints.InternalConstraint;
import org.chocosolver.solver.constraints.nary.geost.layers.ExternalLayer;
import org.chocosolver.solver.constraints.nary.geost.layers.GeometricKernel;
import org.chocosolver.solver.constraints.nary.geost.layers.IntermediateLayer;
import org.chocosolver.solver.constraints.nary.geost.util.Pair;
import org.chocosolver.solver.exception.ContradictionException;
import org.chocosolver.solver.propagation.IPropagationEngine;
import org.chocosolver.solver.propagation.NoPropagationEngine;
import org.chocosolver.solver.variables.IntVar;
import org.chocosolver.solver.variables.events.IntEventType;
import org.chocosolver.util.ESat;

import java.util.HashMap;
import java.util.List;

/**
 * 
* * @author Charles Prud'homme * @since 17/01/2014 */ public class PropGeost extends Propagator { /** * Array of objects ids. * initial order is not preserved in greedy mode, due to iteration over fixed objects. */ int[] oIDs; /** * Index of the last non fixed object id (used with greedy mode) */ IStateInt lastNonFixedO; Constants cst; Setup stp; ExternalLayer externalLayer; GeometricKernel geometricKernel; IntermediateLayer intermediateLayer; protected Solver s; private int greedyMode = 0; boolean increment = false; List ctrlVs; /** * Creates a geost constraint with the given parameters. * * @param vars Array of Variables for choco * @param k Dimension of the problem we are working with * @param objects A vector containing the objects (obj) * @param shiftedBoxes A vector containing the shifted boxes * @param ectr A vector containing the External Constraints in our problem * @param ctrlVs A list of controlling vectors used in the greedy mode * @param solver */ public PropGeost(IntVar[] vars, int k, List objects, List shiftedBoxes, List ectr, List ctrlVs, boolean memo_active, HashMap, Boolean> included, boolean increment_, Solver solver) { super(vars, PropagatorPriority.VERY_SLOW, false); cst = new Constants(); stp = new Setup(cst, solver.getEngine(), this); intermediateLayer = new IntermediateLayer(); externalLayer = new ExternalLayer(cst, stp); geometricKernel = new GeometricKernel(cst, stp, externalLayer, intermediateLayer, memo_active, included, solver, this); cst.setDIM(k); this.ctrlVs = ctrlVs; stp.SetupTheProblem(objects, shiftedBoxes, ectr); //this should be changed and be provided globally to the system oIDs = new int[stp.getNbOfObjects()]; for (int i = 0; i < stp.getNbOfObjects(); i++) { oIDs[i] = objects.get(i).getObjectId(); } lastNonFixedO = solver.getEnvironment().makeInt(oIDs.length); this.s = solver; this.greedyMode = 1; this.increment = increment_; // IntVar D = VariableFactory.bounded("D", 0, 100, s); } /** * Creates a geost constraint with the given parameters. * * @param vars Array of Variables for choco * @param k Dimension of the problem we are working with * @param objects A vector containing the objects (obj) * @param shiftedBoxes A vector containing the shifted boxes * @param ectr A vector containing the External Constraints in our problem * @param solver */ public PropGeost(IntVar[] vars, int k, List objects, List shiftedBoxes, List ectr, boolean memo, HashMap, Boolean> included, Solver solver) { super(vars, PropagatorPriority.VERY_SLOW, false); cst = new Constants(); stp = new Setup(cst, solver.getEngine(), this); intermediateLayer = new IntermediateLayer(); externalLayer = new ExternalLayer(cst, stp); geometricKernel = new GeometricKernel(cst, stp, externalLayer, intermediateLayer, memo, included, solver, this); cst.setDIM(k); stp.SetupTheProblem(objects, shiftedBoxes, ectr); //this should be changed and be provided globally to the system oIDs = new int[stp.getNbOfObjects()]; for (int i = 0; i < stp.getNbOfObjects(); i++) { oIDs[i] = objects.get(i).getObjectId(); } lastNonFixedO = solver.getEnvironment().makeInt(oIDs.length); this.s = solver; } @Override public int getPropagationConditions(int vIdx) { return IntEventType.ALL_EVENTS; } @Override public void propagate(int evtmask) throws ContradictionException { // int l=vars.length; // for (int i=0; i getForbiddenRegions(GeostObject o) { //Should be set up only once during a single fixpoint List ectrs = stp.getConstraints(); for (int i = 0; i < ectrs.size(); i++) { ectrs.get(i).setFrame(externalLayer.InitFrameExternalConstraint(ectrs.get(i), oIDs)); } //TODO: Holes should be generated here for (int i = 0; i < o.getRelatedExternalConstraints().size(); i++) { List v = externalLayer.genInternalCtrs(o.getRelatedExternalConstraints().get(i), o); for (int j = 0; j < v.size(); j++) { o.addRelatedInternalConstraint(v.get(j)); } } return o.getRelatedInternalConstraints(); } public void setGreedy(boolean greedy) { this.greedyMode = greedy ? 1 : 0; } public boolean isGreedy() { return greedyMode != 0; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy