org.cpsolver.ifs.assignment.context

## Class ConstraintWithContext<V extends Variable<V,T>,T extends Value<V,T>,C extends AssignmentConstraintContext<V,T>>

- java.lang.Object
- - org.cpsolver.ifs.model.Constraint<V,T>
  - - org.cpsolver.ifs.assignment.context.ConstraintWithContext<V,T,C>

- Type Parameters:
    `V` - Variable
    `T` - Value
    `C` - Assignment Context
  All Implemented Interfaces:
    Comparable<Constraint<V,T>>, CanHoldContext, HasAssignmentContext<V,T,C>
  Direct Known Subclasses:
    ExamDistributionConstraint, ExamRoom, FlexibleConstraint, GroupConstraint, InstructorConstraint, MinimizeNumberOfUsedGroupsOfTime, MinimizeNumberOfUsedRoomsConstraint, Resource, ResourceConstraint, RoomConstraint, SameInstructorConstraint, SameLinkConstraint, SpreadConstraint

      public abstract class ConstraintWithContext<V extends Variable<V,T>,T extends Value<V,T>,C extends AssignmentConstraintContext<V,T>>
      extends Constraint<V,T>
      implements HasAssignmentContext<V,T,C>, CanHoldContext

  A constraint with an assignment context. In order to be able to hold multiple assignments in memory it is desired for all the assignment dependent data a constraint may need (to effectively enumerate conflicting values), to store these data in a separate class (implementing the `AssignmentConstraintContext` interface). This context is created by calling `HasAssignmentContext.createAssignmentContext(Assignment)` and accessed by `getContext(Assignment)`.
  Version:
    IFS 1.3 (Iterative Forward Search)
    Copyright (C) 2014 Tomáš Müller
    muller@unitime.org
    http://muller.unitime.org
    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 3 of the License, or (at your option) any later version.
    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.
    You should have received a copy of the GNU Lesser General Public License along with this library; if not see http://www.gnu.org/licenses.
  See Also:
    `AssignmentContext`

- - ### Field Summary

    - ### Fields inherited from class org.cpsolver.ifs.model.Constraint

      `iConstraintListeners, iId`

    - ### Fields inherited from interface org.cpsolver.ifs.assignment.context.CanHoldContext

      `sMaxSize`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ConstraintWithContext()`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `assigned(Assignment<V,T> assignment, long iteration, T value)` Given value is to be assigned to its variable.
    `AssignmentContextReference<V,T,C>` | `getAssignmentContextReference()` Returns an assignment context reference
    `AssignmentContext[]` | `getContext()` An array of `CanHoldContext.sMaxSize` assignment contexts
    `C` | `getContext(Assignment<V,T> assignment)` Returns an assignment context associated with this constraint.
    `void` | `setAssignmentContextReference(AssignmentContextReference<V,T,C> reference)` Store an assignment context reference that was given for the class by the `Model.createReference(HasAssignmentContext)`.
    `void` | `setModel(Model<V,T> model)` Sets the model which the constraint belongs to
    `void` | `unassigned(Assignment<V,T> assignment, long iteration, T value)` Given value is unassigned from its variable.

    - ### Methods inherited from class org.cpsolver.ifs.model.Constraint

      `addConstraintListener, addVariable, assignedVariables, compareTo, computeConflicts, computeConflictsNoForwardCheck, constraintListeners, countAssignedVariables, countVariables, equals, getDescription, getId, getModel, getName, hashCode, inConflict, isConsistent, isHard, removeConstraintListener, removeVariable, variables`

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface org.cpsolver.ifs.assignment.context.HasAssignmentContext

      `createAssignmentContext`

- - ### Constructor Detail

    - #### ConstraintWithContext

          public ConstraintWithContext()

  - ### Method Detail

    - #### setModel

          public void setModel(Model<V,T> model)

      Description copied from class: `Constraint`
      Sets the model which the constraint belongs to
      Overrides:
        `setModel` in class `Constraint<V extends Variable<V,T>,T extends Value<V,T>>`
      Parameters:
        `model` - problem model

    - #### getContext

          public C getContext(Assignment<V,T> assignment)

      Returns an assignment context associated with this constraint. If there is no assignment context associated with this constraint yet, one is created using the `HasAssignmentContext.createAssignmentContext(Assignment)` method. From that time on, this context is kept with the assignment and automatically updated by calling the `AssignmentConstraintContext.assigned(Assignment, Value)` and `AssignmentConstraintContext.unassigned(Assignment, Value)` whenever a variable of this constraint is changed.
      Specified by:
        `getContext` in interface `HasAssignmentContext<V extends Variable<V,T>,T extends Value<V,T>,C extends AssignmentConstraintContext<V,T>>`
      Parameters:
        `assignment` - given assignment
      Returns:
        assignment context associated with this constraint and the given assignment

    - #### getAssignmentContextReference

          public AssignmentContextReference<V,T,C> getAssignmentContextReference()

      Description copied from interface: `HasAssignmentContext`
      Returns an assignment context reference
      Specified by:
        `getAssignmentContextReference` in interface `HasAssignmentContext<V extends Variable<V,T>,T extends Value<V,T>,C extends AssignmentConstraintContext<V,T>>`
      Returns:
        reference provided by the model by calling `Model.createReference(HasAssignmentContext)` during initialization

    - #### setAssignmentContextReference

          public void setAssignmentContextReference(AssignmentContextReference<V,T,C> reference)

      Description copied from interface: `HasAssignmentContext`
      Store an assignment context reference that was given for the class by the `Model.createReference(HasAssignmentContext)`.
      Specified by:
        `setAssignmentContextReference` in interface `HasAssignmentContext<V extends Variable<V,T>,T extends Value<V,T>,C extends AssignmentConstraintContext<V,T>>`
      Parameters:
        `reference` - reference provided by the model by calling `Model.createReference(HasAssignmentContext)` during initialization

    - #### getContext

          public AssignmentContext[] getContext()

      Description copied from interface: `CanHoldContext`
      An array of `CanHoldContext.sMaxSize` assignment contexts
      Specified by:
        `getContext` in interface `CanHoldContext`
      Returns:
        assignment contexts

    - #### assigned

          public void assigned(Assignment<V,T> assignment,
                               long iteration,
                               T value)

      Description copied from class: `Constraint`
      Given value is to be assigned to its variable. In this method, the constraint should unassigns all variables which are in conflict with the given assignment because of this constraint.
      Overrides:
        `assigned` in class `Constraint<V extends Variable<V,T>,T extends Value<V,T>>`
      Parameters:
        `assignment` - current assignment
        `iteration` - current iteration
        `value` - assigned value

    - #### unassigned

          public void unassigned(Assignment<V,T> assignment,
                                 long iteration,
                                 T value)

      Description copied from class: `Constraint`
      Given value is unassigned from its variable.
      Overrides:
        `unassigned` in class `Constraint<V extends Variable<V,T>,T extends Value<V,T>>`
      Parameters:
        `assignment` - current assignment
        `iteration` - current iteration
        `value` - unassigned value