// Path: src/main/java/org/avmframework/TerminationException.java
// public class TerminationException extends Exception {}
// 
// Path: src/main/java/org/avmframework/Vector.java
// public class Vector extends AbstractVector {
// 
//   public void addVariable(Variable variable) {
//     variables.add(variable);
//   }
// 
//   public List<Variable> getVariables() {
//     return new ArrayList<>(variables);
//   }
// 
//   public void setVariablesToInitial() {
//     for (Variable var : variables) {
//       var.setValueToInitial();
//     }
//   }
// 
//   public void setVariablesToRandom(RandomGenerator rg) {
//     for (Variable var : variables) {
//       var.setValueToRandom(rg);
//     }
//   }
// 
//   public Vector deepCopy() {
//     Vector copy = new Vector();
//     deepCopyVariables(copy);
//     return copy;
//   }
// }
// 
// Path: src/main/java/org/avmframework/objective/ObjectiveFunction.java
// public abstract class ObjectiveFunction {
// 
//   public static final boolean USE_CACHE_DEFAULT = true;
// 
//   protected boolean useCache = USE_CACHE_DEFAULT;
//   protected Map<Vector, ObjectiveValue> previousVals = new HashMap<>();
//   protected Monitor monitor;
// 
//   public void setMonitor(Monitor monitor) {
//     this.monitor = monitor;
//   }
// 
//   public ObjectiveValue evaluate(Vector vector) throws TerminationException {
//     monitor.observeVector();
// 
//     if (useCache && previousVals.containsKey(vector)) {
//       return previousVals.get(vector);
//     }
// 
//     ObjectiveValue objVal = computeObjectiveValue(vector);
// 
//     if (useCache) {
//       previousVals.put(vector.deepCopy(), objVal);
//     }
// 
//     if (monitor != null) {
//       monitor.observePreviouslyUnseenVector(vector, objVal);
//     }
// 
//     return objVal;
//   }
// 
//   protected abstract ObjectiveValue computeObjectiveValue(Vector vector);
// }
// 
// Path: src/main/java/org/avmframework/variable/AtomicVariable.java
// public abstract class AtomicVariable implements Variable {
// 
//   protected int min;
//   protected int max;
// 
//   protected int initialValue;
//   protected int value;
// 
//   public AtomicVariable(int initialValue, int min, int max) {
//     this.initialValue = initialValue;
//     this.min = min;
//     this.max = max;
//   }
// 
//   public int getMin() {
//     return min;
//   }
// 
//   public int getMax() {
//     return max;
//   }
// 
//   @Override
//   public void setValueToInitial() {
//     setValue(initialValue);
//   }
// 
//   @Override
//   public void setValueToRandom(RandomGenerator randomGenerator) {
//     int range = max - min + 1;
//     int randomValue = randomGenerator.nextInt(range);
//     setValue(min + randomValue);
//   }
// 
//   public void setValue(int value) {
//     if (value > max) {
//       value = max;
//     }
// 
//     if (value < min) {
//       value = min;
//     }
// 
//     this.value = value;
//   }
// 
//   public int getValue() {
//     return value;
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     }
//     if (obj == null || getClass() != obj.getClass()) {
//       return false;
//     }
// 
//     AtomicVariable that = (AtomicVariable) obj;
// 
//     if (min != that.min) {
//       return false;
//     }
//     if (max != that.max) {
//       return false;
//     }
//     if (initialValue != that.initialValue) {
//       return false;
//     }
//     return value == that.value;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = min;
//     result = 31 * result + max;
//     result = 31 * result + initialValue;
//     result = 31 * result + value;
//     return result;
//   }
// }


import org.avmframework.TerminationException;
import org.avmframework.Vector;
import org.avmframework.objective.ObjectiveFunction;
import org.avmframework.variable.AtomicVariable;
package org.avmframework.localsearch;


public abstract class LocalSearch {

  protected AtomicVariable var;
  protected Vector vector;
  protected ObjectiveFunction objFun;

  public void search(AtomicVariable var, Vector vector, ObjectiveFunction objFun)
// Path: src/main/java/org/avmframework/TerminationException.java
// public class TerminationException extends Exception {}
// 
// Path: src/main/java/org/avmframework/Vector.java
// public class Vector extends AbstractVector {
// 
//   public void addVariable(Variable variable) {
//     variables.add(variable);
//   }
// 
//   public List<Variable> getVariables() {
//     return new ArrayList<>(variables);
//   }
// 
//   public void setVariablesToInitial() {
//     for (Variable var : variables) {
//       var.setValueToInitial();
//     }
//   }
// 
//   public void setVariablesToRandom(RandomGenerator rg) {
//     for (Variable var : variables) {
//       var.setValueToRandom(rg);
//     }
//   }
// 
//   public Vector deepCopy() {
//     Vector copy = new Vector();
//     deepCopyVariables(copy);
//     return copy;
//   }
// }
// 
// Path: src/main/java/org/avmframework/objective/ObjectiveFunction.java
// public abstract class ObjectiveFunction {
// 
//   public static final boolean USE_CACHE_DEFAULT = true;
// 
//   protected boolean useCache = USE_CACHE_DEFAULT;
//   protected Map<Vector, ObjectiveValue> previousVals = new HashMap<>();
//   protected Monitor monitor;
// 
//   public void setMonitor(Monitor monitor) {
//     this.monitor = monitor;
//   }
// 
//   public ObjectiveValue evaluate(Vector vector) throws TerminationException {
//     monitor.observeVector();
// 
//     if (useCache && previousVals.containsKey(vector)) {
//       return previousVals.get(vector);
//     }
// 
//     ObjectiveValue objVal = computeObjectiveValue(vector);
// 
//     if (useCache) {
//       previousVals.put(vector.deepCopy(), objVal);
//     }
// 
//     if (monitor != null) {
//       monitor.observePreviouslyUnseenVector(vector, objVal);
//     }
// 
//     return objVal;
//   }
// 
//   protected abstract ObjectiveValue computeObjectiveValue(Vector vector);
// }
// 
// Path: src/main/java/org/avmframework/variable/AtomicVariable.java
// public abstract class AtomicVariable implements Variable {
// 
//   protected int min;
//   protected int max;
// 
//   protected int initialValue;
//   protected int value;
// 
//   public AtomicVariable(int initialValue, int min, int max) {
//     this.initialValue = initialValue;
//     this.min = min;
//     this.max = max;
//   }
// 
//   public int getMin() {
//     return min;
//   }
// 
//   public int getMax() {
//     return max;
//   }
// 
//   @Override
//   public void setValueToInitial() {
//     setValue(initialValue);
//   }
// 
//   @Override
//   public void setValueToRandom(RandomGenerator randomGenerator) {
//     int range = max - min + 1;
//     int randomValue = randomGenerator.nextInt(range);
//     setValue(min + randomValue);
//   }
// 
//   public void setValue(int value) {
//     if (value > max) {
//       value = max;
//     }
// 
//     if (value < min) {
//       value = min;
//     }
// 
//     this.value = value;
//   }
// 
//   public int getValue() {
//     return value;
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     }
//     if (obj == null || getClass() != obj.getClass()) {
//       return false;
//     }
// 
//     AtomicVariable that = (AtomicVariable) obj;
// 
//     if (min != that.min) {
//       return false;
//     }
//     if (max != that.max) {
//       return false;
//     }
//     if (initialValue != that.initialValue) {
//       return false;
//     }
//     return value == that.value;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = min;
//     result = 31 * result + max;
//     result = 31 * result + initialValue;
//     result = 31 * result + value;
//     return result;
//   }
// }


// Path: src/main/java/org/avmframework/localsearch/LocalSearch.java
import org.avmframework.TerminationException;
import org.avmframework.Vector;
import org.avmframework.objective.ObjectiveFunction;
import org.avmframework.variable.AtomicVariable;

package org.avmframework.localsearch;


public abstract class LocalSearch {

  protected AtomicVariable var;
  protected Vector vector;
  protected ObjectiveFunction objFun;

  public void search(AtomicVariable var, Vector vector, ObjectiveFunction objFun)
      throws TerminationException {