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

rinde.sim.pdptw.central.arrays.ArraysSolverDebugger Maven / Gradle / Ivy

The newest version!
/**
 * 
 */
package rinde.sim.pdptw.central.arrays;

import static com.google.common.collect.Lists.newArrayList;
import static java.lang.System.out;
import static java.util.Arrays.copyOf;
import static java.util.Arrays.deepToString;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.annotation.Nullable;

import rinde.sim.pdptw.central.arrays.ArraysSolvers.ArraysObject;
import rinde.sim.pdptw.central.arrays.ArraysSolvers.MVArraysObject;

/**
 * A {@link SingleVehicleArraysSolver} wrapper that adds debugging facilities. A
 * history is kept of all inputs and outputs and all inputs can optionally be
 * printed to sys.out.
 * @author Rinde van Lon 
 */
public final class ArraysSolverDebugger {

  private ArraysSolverDebugger() {}

  /**
   * Wraps the specified {@link SingleVehicleArraysSolver} to allow easy
   * debugging. Every invocation of
   * {@link SingleVehicleArraysSolver#solve(int[][], int[], int[], int[][], int[], SolutionObject)}
   * all inputs and outputs are printed to System.out, also all
   * inputs and outputs are stored (accessible via
   * {@link SVASDebugger#getInputs()} and
   * {@link SVASDebugger#getOutputs()}.
   * @param s The {@link SingleVehicleArraysSolver} to wrap.
   * @return The wrapped solver.
   */
  public static SVASDebugger wrap(SingleVehicleArraysSolver s) {
    return new SVASDebugger(s, true);
  }

  /**
   * Wraps the specified {@link SingleVehicleArraysSolver} to allow easy
   * debugging. Stores all invocation arguments and outputs and optionally
   * prints them to System.out.
   * @param s The {@link SingleVehicleArraysSolver} to wrap.
   * @param print If true all information will be printed as well.
   * @return The wrapped solver.
   */
  public static SVASDebugger wrap(SingleVehicleArraysSolver s, boolean print) {
    return new SVASDebugger(s, print);
  }

  /**
   * Wraps the specified {@link MultiVehicleArraysSolver} to allow easy
   * debugging. Stores all invocation arguments and outputs and optionally
   * prints them to System.out.
   * @param s The {@link MultiVehicleArraysSolver} to wrap.
   * @param print If true all information will be printed as well.
   * @return The wrapped solver.
   */
  public static MVASDebugger wrap(MultiVehicleArraysSolver s, boolean print) {
    return new MVASDebugger(s, print);
  }

  static String fix(String s) {
    return s.replace('[', '{').replace(']', '}') + ";";
  }

  private static class Debugger {
    protected final List inputMemory;
    protected final List outputMemory;
    protected final boolean print;

    Debugger(boolean print) {
      this.print = print;
      inputMemory = newArrayList();
      outputMemory = newArrayList();
    }

    /**
     * Clears the memory.
     */
    public void flush() {
      inputMemory.clear();
      outputMemory.clear();
    }

    /**
     * @return An unmodifiable list with an {@link ArraysObject} in invocation
     *         order for every invocation of solve(..).
     */
    public List getInputs() {
      return Collections.unmodifiableList(inputMemory);
    }

    /**
     * @return An unmodifiable list with an {@link SolutionObject} in invocation
     *         order for every invocation of solve(..).
     */
    public List getOutputs() {
      return Collections.unmodifiableList(outputMemory);
    }
  }

  /**
   * Debugger for {@link SingleVehicleArraysSolver}s.
   * @author Rinde van Lon 
   */
  public static final class SVASDebugger extends
      Debugger implements
      SingleVehicleArraysSolver {
    private final SingleVehicleArraysSolver solver;

    SVASDebugger(SingleVehicleArraysSolver solver, boolean print) {
      super(print);
      this.solver = solver;
    }

    @Override
    public SolutionObject solve(int[][] travelTime, int[] releaseDates,
        int[] dueDates, int[][] servicePairs, int[] serviceTimes,
        @Nullable SolutionObject currentSolution) {

      inputMemory.add(new ArraysObject(travelTime, releaseDates, dueDates,
          servicePairs, serviceTimes, currentSolution == null ? null
              : new SolutionObject[] { currentSolution }));
      if (print) {
        out.println("int[][] travelTime = " + fix(deepToString(travelTime)));
        out.println("int[] releaseDates = "
            + fix(Arrays.toString(releaseDates)));
        out.println("int[] dueDates = " + fix(Arrays.toString(dueDates)));
        out.println("int[][] servicePairs = " + fix(deepToString(servicePairs)));
        out.println("int[] serviceTime = " + fix(Arrays.toString(serviceTimes)));
      }

      final long start = System.currentTimeMillis();
      final SolutionObject sol = solver.solve(travelTime, releaseDates,
          dueDates, servicePairs, serviceTimes, currentSolution);
      if (print) {
        out.println(System.currentTimeMillis() - start + "ms");
        out.println("route: " + Arrays.toString(sol.route));
        out.println("arrivalTimes: " + Arrays.toString(sol.arrivalTimes));
        out.println("objectiveValue: " + sol.objectiveValue);
      }

      outputMemory
          .add(new SolutionObject(copyOf(sol.route, sol.route.length), copyOf(
              sol.arrivalTimes, sol.arrivalTimes.length), sol.objectiveValue));

      int totalTravelTime = 0;
      for (int i = 1; i < travelTime.length; i++) {
        totalTravelTime += travelTime[sol.route[i - 1]][sol.route[i]];
      }
      if (print) {
        out.println("travel time :  " + totalTravelTime);
      }
      return sol;
    }
  }

  /**
   * Debugger for {@link MultiVehicleArraysSolver}s.
   * @author Rinde van Lon 
   */
  public static final class MVASDebugger extends
      Debugger implements
      MultiVehicleArraysSolver {

    private final MultiVehicleArraysSolver solver;

    MVASDebugger(MultiVehicleArraysSolver solver, boolean print) {
      super(print);
      this.solver = solver;
    }

    @Override
    public SolutionObject[] solve(int[][] travelTime, int[] releaseDates,
        int[] dueDates, int[][] servicePairs, int[] serviceTimes,
        int[][] vehicleTravelTimes, int[][] inventories,
        int[] remainingServiceTimes, int[] currentDestinations,
        @Nullable SolutionObject[] currentSolutions) {

      inputMemory.add(new MVArraysObject(travelTime, releaseDates, dueDates,
          servicePairs, serviceTimes, vehicleTravelTimes, inventories,
          remainingServiceTimes, currentDestinations, currentSolutions));

      final SolutionObject[] output = solver.solve(travelTime, releaseDates,
          dueDates, servicePairs, serviceTimes, vehicleTravelTimes,
          inventories, remainingServiceTimes, currentDestinations,
          currentSolutions);
      outputMemory.add(output);
      return output;
    }
  }
}