From 4d3e5be4fb59c4c28701b414c3a4ae237d51c669 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Thu, 17 Jul 2014 11:21:15 +0200 Subject: [PATCH] added meaningful ClassCastException to core.algorithm.state.StateManager modified clean from new arr ini to arr value ini --- .../core/algorithm/state/StateManager.java | 82 +++++++++++++---- .../BuildCVRPAlgoFromScratch_IT.java | 11 ++- .../BuildPDVRPAlgoFromScratch_IT.java | 7 +- ...alculatesServiceInsertionOnRouteLevel.java | 87 +++++-------------- .../algorithm/state/StateManagerTest.java | 87 ++++++++++++++++++- 5 files changed, 175 insertions(+), 99 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java index 08e5d61e..f0c98ae8 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java @@ -23,7 +23,6 @@ import jsprit.core.algorithm.ruin.listener.RuinListeners; import jsprit.core.problem.Capacity; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; -import jsprit.core.problem.driver.Driver; import jsprit.core.problem.job.Job; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.route.ReverseRouteActivityVisitor; @@ -244,21 +243,43 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart * */ public void clear(){ - activity_states = new Object[nuActivities][stateIndexCounter]; - route_states = new Object[nuActivities][stateIndexCounter]; - vehicle_dependent_activity_states = new Object[nuActivities][nuVehicleTypeKeys][initialNuStates]; - vehicle_dependent_route_states = new Object[nuActivities][nuVehicleTypeKeys][initialNuStates]; + fill(activity_states, null); + fill(route_states, null); + fill_(vehicle_dependent_activity_states, null); + fill_(vehicle_dependent_route_states,null); +// vehicle_dependent_activity_states = new Object[nuActivities][nuVehicleTypeKeys][initialNuStates]; +// vehicle_dependent_route_states = new Object[nuActivities][nuVehicleTypeKeys][initialNuStates]; problemStates_.clear(); } - /** + private void fill_(Object[][][] states, Object o) { + for(Object[][] twoDimArr : states){ + for(Object[] oneDimArr : twoDimArr){ + Arrays.fill(oneDimArr,o); + } + } + } + + private void fill(Object[][] states, Object o) { + for(Object[] rows : states){ + Arrays.fill(rows,o); + } + } + + /** * Returns activity state of type 'type'. * */ @Override public T getActivityState(TourActivity act, StateId stateId, Class type) { if(act.getIndex()<0) return getDefaultTypedActivityState(act, stateId, type); - T state = type.cast(activity_states[act.getIndex()][stateId.getIndex()]); + T state; + try{ + state = type.cast(activity_states[act.getIndex()][stateId.getIndex()]); + } + catch (ClassCastException e){ + throw getClassCastException(e,stateId,type.toString(),activity_states[act.getIndex()][stateId.getIndex()].getClass().toString()); + } if(state == null) return getDefaultTypedActivityState(act, stateId, type); return state; } @@ -267,13 +288,24 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart * Returns activity state of type 'type'. * */ - public T getActivityState(TourActivity act, Vehicle vehicle, Driver driver, StateId stateId, Class type) { + public T getActivityState(TourActivity act, Vehicle vehicle, StateId stateId, Class type) { if(act.getIndex()<0) return getDefaultTypedActivityState(act, stateId, type); - T state = type.cast(vehicle_dependent_activity_states[act.getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]); + T state; + try { + state = type.cast(vehicle_dependent_activity_states[act.getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]); + } + catch(ClassCastException e){ + Object state_class = vehicle_dependent_activity_states[act.getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]; + throw getClassCastException(e,stateId,type.toString(),state_class.getClass().toString()); + } if(state == null) return getDefaultTypedActivityState(act, stateId, type); return state; } + private ClassCastException getClassCastException(ClassCastException e, StateId stateId, String requestedTypeClass, String memorizedTypeClass){ + return new ClassCastException(e + "\n" + "state with stateId '" + stateId.toString() + "' is of " + memorizedTypeClass + ". cannot cast it to " + requestedTypeClass + "."); + } + /** * * @param act activity for which the state is requested @@ -281,7 +313,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart * @param type class of state value * @return state value */ - private T getDefaultTypedActivityState(TourActivity act, StateId stateId,Class type) { + private T getDefaultTypedActivityState(TourActivity act, StateId stateId, Class type) { if(defaultActivityStates_.containsKey(stateId)){ return type.cast(defaultActivityStates_.get(stateId)); } @@ -303,14 +335,26 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart @Override public T getRouteState(VehicleRoute route, StateId stateId, Class type) { if(route.isEmpty()) return getDefaultTypedRouteState(stateId,type); - T state = type.cast(route_states[route.getActivities().get(0).getIndex()][stateId.getIndex()]); + T state; + try{ + state = type.cast(route_states[route.getActivities().get(0).getIndex()][stateId.getIndex()]); + } + catch (ClassCastException e){ + throw getClassCastException(e,stateId,type.toString(),route_states[route.getActivities().get(0).getIndex()][stateId.getIndex()].getClass().toString()); + } if(state==null) return getDefaultTypedRouteState(stateId,type); return state; } - public T getRouteState(VehicleRoute route, Vehicle vehicle, Driver driver, StateId stateId, Class type) { + public T getRouteState(VehicleRoute route, Vehicle vehicle, StateId stateId, Class type) { if(route.isEmpty()) return getDefaultTypedRouteState(stateId,type); - T state = type.cast(vehicle_dependent_route_states[route.getActivities().get(0).getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]); + T state; + try{ + state = type.cast(vehicle_dependent_route_states[route.getActivities().get(0).getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]); + } + catch( ClassCastException e){ + throw getClassCastException(e, stateId, type.toString(), vehicle_dependent_route_states[route.getActivities().get(0).getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()].getClass().toString()); + } if(state==null) return getDefaultTypedRouteState(stateId,type); return state; } @@ -381,13 +425,13 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart putInternalTypedActivityState(act, stateId, state); } - public void putActivityState(TourActivity act, Vehicle vehicle, Driver driver, StateId stateId, T state){ + public void putActivityState(TourActivity act, Vehicle vehicle, StateId stateId, T state){ if(stateId.getIndex()<10) throw new IllegalStateException("either you use a reserved stateId that is applied\n" + "internally or your stateId has been created without index, e.g. StateFactory.createId(stateName)\n" + " does not assign indeces thus do not use it anymore, but use\n " + "stateManager.createStateId(name)\n" + " instead.\n"); - putInternalTypedActivityState(act, vehicle, driver, stateId, state); + putInternalTypedActivityState(act, vehicle, stateId, state); } private Object[][] resizeArr(Object[][] states, int newLength) { @@ -401,7 +445,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart activity_states[act.getIndex()][stateId.getIndex()]=state; } - void putInternalTypedActivityState(TourActivity act, Vehicle vehicle, Driver driver, StateId stateId, T state){ + void putInternalTypedActivityState(TourActivity act, Vehicle vehicle, StateId stateId, T state){ vehicle_dependent_activity_states[act.getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()]=state; } @@ -443,9 +487,9 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart putTypedInternalRouteState(route, stateId, state); } - public void putRouteState(VehicleRoute route, Vehicle vehicle, Driver driver, StateId stateId, T state){ + public void putRouteState(VehicleRoute route, Vehicle vehicle, StateId stateId, T state){ if(stateId.getIndex()<10) StateFactory.throwReservedIdException(stateId.toString()); - putTypedInternalRouteState(route, vehicle, driver, stateId, state); + putTypedInternalRouteState(route, vehicle, stateId, state); } void putTypedInternalRouteState(VehicleRoute route, StateId stateId, T state){ @@ -453,7 +497,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart route_states[route.getActivities().get(0).getIndex()][stateId.getIndex()] = state; } - void putTypedInternalRouteState(VehicleRoute route, Vehicle vehicle, Driver driver, StateId stateId, T state){ + void putTypedInternalRouteState(VehicleRoute route, Vehicle vehicle, StateId stateId, T state){ if(route.isEmpty()) return; vehicle_dependent_route_states[route.getActivities().get(0).getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()] = state; } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java index dfcbc6e4..a843339f 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildCVRPAlgoFromScratch_IT.java @@ -16,10 +16,6 @@ ******************************************************************************/ package jsprit.core.algorithm; -import static org.junit.Assert.assertEquals; - -import java.util.Collection; - import jsprit.core.algorithm.acceptor.GreedyAcceptance; import jsprit.core.algorithm.module.RuinAndRecreateModule; import jsprit.core.algorithm.recreate.BestInsertionBuilder; @@ -41,10 +37,13 @@ import jsprit.core.problem.solution.route.state.StateFactory; import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; import jsprit.core.problem.vehicle.VehicleFleetManager; import jsprit.core.util.Solutions; - import org.junit.Before; import org.junit.Test; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + public class BuildCVRPAlgoFromScratch_IT { @@ -58,7 +57,7 @@ public class BuildCVRPAlgoFromScratch_IT { new VrpXMLReader(builder).read("src/test/resources/vrpnc1-jsprit.xml"); vrp = builder.build(); - final StateManager stateManager = new StateManager(vrp.getTransportCosts()); + final StateManager stateManager = new StateManager(vrp); stateManager.updateLoadStates(); stateManager.updateTimeWindowStates(); stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java index 6ea47155..b1cccc7a 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPAlgoFromScratch_IT.java @@ -16,8 +16,6 @@ ******************************************************************************/ package jsprit.core.algorithm; -import java.util.Collection; - import jsprit.core.algorithm.acceptor.GreedyAcceptance; import jsprit.core.algorithm.module.RuinAndRecreateModule; import jsprit.core.algorithm.recreate.BestInsertionBuilder; @@ -39,11 +37,12 @@ import jsprit.core.problem.solution.route.state.StateFactory; import jsprit.core.problem.vehicle.InfiniteFleetManagerFactory; import jsprit.core.problem.vehicle.VehicleFleetManager; import jsprit.core.util.Solutions; - import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; +import java.util.Collection; + public class BuildPDVRPAlgoFromScratch_IT { @@ -60,7 +59,7 @@ public class BuildPDVRPAlgoFromScratch_IT { new VrpXMLReader(builder).read("src/test/resources/pd_solomon_r101.xml"); vrp = builder.build(); - final StateManager stateManager = new StateManager(vrp.getTransportCosts()); + final StateManager stateManager = new StateManager(vrp); ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addTimeWindowConstraint(); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java index 3bc815c3..b2ec0fc6 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java @@ -23,6 +23,7 @@ import jsprit.core.problem.AbstractVehicle; import jsprit.core.problem.Capacity; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.cost.AbstractForwardVehicleRoutingTransportCosts; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; import jsprit.core.problem.driver.Driver; import jsprit.core.problem.driver.DriverImpl; @@ -33,11 +34,10 @@ import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.activity.ServiceActivity; import jsprit.core.problem.solution.route.activity.TimeWindow; import jsprit.core.problem.solution.route.activity.TourActivities; -import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; import jsprit.core.problem.vehicle.VehicleType; -import jsprit.core.util.Coordinate; -import jsprit.core.util.ManhattanDistanceCalculator; +import jsprit.core.util.CostFactory; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Before; @@ -83,69 +83,29 @@ public class TestCalculatesServiceInsertionOnRouteLevel { VehicleType type = mock(VehicleType.class); when(type.getCapacityDimensions()).thenReturn(Capacity.Builder.newInstance().addDimension(0, 1000).build()); - - when(vehicle.getType()).thenReturn(type); - when(vehicle.getStartLocationId()).thenReturn("0,0"); - when(vehicle.getEndLocationId()).thenReturn("0,0"); - when(vehicle.getEarliestDeparture()).thenReturn(0.0); - when(vehicle.getLatestArrival()).thenReturn(100.0); - when(vehicle.isReturnToDepot()).thenReturn(true); - - newVehicle = mock(AbstractVehicle.class); - when(newVehicle.getType()).thenReturn(type); - when(newVehicle.getStartLocationId()).thenReturn("0,0"); - when(newVehicle.getEndLocationId()).thenReturn("0,0"); - when(newVehicle.getEarliestDeparture()).thenReturn(0.0); - when(newVehicle.getLatestArrival()).thenReturn(100.0); - when(newVehicle.isReturnToDepot()).thenReturn(true); - + + vehicle = VehicleImpl.Builder.newInstance("v1").setType(type).setStartLocationId("0,0").setLatestArrival(100.).build(); + newVehicle = VehicleImpl.Builder.newInstance("v2").setType(type).setStartLocationId("0,0").setLatestArrival(100.).build(); driver = DriverImpl.noDriver(); - costs = new VehicleRoutingTransportCosts() { + costs = new AbstractForwardVehicleRoutingTransportCosts() { - @Override - public double getBackwardTransportTime(String fromId, String toId, - double arrivalTime, Driver driver, Vehicle vehicle) { - // TODO Auto-generated method stub - return 0; - } + VehicleRoutingTransportCosts routingCosts = CostFactory.createManhattanCosts(); - @Override - public double getBackwardTransportCost(String fromId, String toId, - double arrivalTime, Driver driver, Vehicle vehicle) { - // TODO Auto-generated method stub - return 0; - } + @Override + public double getTransportTime(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { + return 0; + } - @Override - public double getTransportCost(String fromId, String toId, double departureTime, Driver driver, Vehicle veh) { - String[] fromTokens = fromId.split(","); - String[] toTokens = toId.split(","); - double fromX = Double.parseDouble(fromTokens[0]); - double fromY = Double.parseDouble(fromTokens[1]); + @Override + public double getTransportCost(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) { + double tpCosts = routingCosts.getTransportCost(fromId,toId,departureTime,driver,vehicle); + if(vehicle.getId().equals("v1")) return tpCosts; + return 2. * tpCosts; + } - double toX = Double.parseDouble(toTokens[0]); - double toY = Double.parseDouble(toTokens[1]); + }; - double dist = ManhattanDistanceCalculator.calculateDistance(new Coordinate(fromX, fromY), new Coordinate(toX, toY)); - if(veh == vehicle){ - return dist; - } - else if(veh == newVehicle){ - return 2*dist; - } - throw new IllegalStateException(); - } - - @Override - public double getTransportTime(String fromId, String toId, - double departureTime, Driver driver, Vehicle vehicle) { - // TODO Auto-generated method stub - return 0; - } - }; - - first = Service.Builder.newInstance("1").setLocationId("0,10").setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build(); second = Service.Builder.newInstance("3").setLocationId("10,0").setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build(); third = Service.Builder.newInstance("2").setLocationId("10,10").setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build(); @@ -156,7 +116,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).addVehicle(newVehicle).setRoutingCost(costs).build(); - states = new StateManager(vrp.getTransportCosts()); + states = new StateManager(vrp); states.updateLoadStates(); states.updateTimeWindowStates(); states.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), states)); @@ -174,12 +134,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { } - - public TourActivity getActivityMock(String id, double earliestOperationStart, double currCost){ - TourActivity act = mock(TourActivity.class); - when(act.getLocationId()).thenReturn(id); - return act; - } + @Test public void whenInsertingTheFirstJobInAnEmptyTourWithVehicle_itCalculatesMarginalCostChanges(){ diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/StateManagerTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/StateManagerTest.java index c9d5f18b..3ae760e4 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/StateManagerTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/StateManagerTest.java @@ -28,6 +28,8 @@ import jsprit.core.problem.solution.route.state.StateFactory.State; import jsprit.core.problem.solution.route.state.StateFactory.StateId; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; import org.junit.Test; import static org.junit.Assert.*; @@ -186,8 +188,8 @@ public class StateManagerTest { StateManager stateManager = new StateManager(mock(VehicleRoutingProblem.class)); StateId id = stateManager.createStateId("myState"); Capacity capacity = Capacity.Builder.newInstance().addDimension(0, 500).build(); - stateManager.putRouteState(route, vehicle, null, id, capacity); - Capacity getCap = stateManager.getRouteState(route, vehicle, null, id, Capacity.class); + stateManager.putRouteState(route, vehicle, id, capacity); + Capacity getCap = stateManager.getRouteState(route, vehicle, id, Capacity.class); assertEquals(500, getCap.get(0)); } @@ -198,8 +200,85 @@ public class StateManagerTest { StateId id = stateManager.createStateId("myState"); Capacity capacity = Capacity.Builder.newInstance().addDimension(0, 500).build(); TourActivity act = mock(TourActivity.class); - stateManager.putActivityState(act, vehicle, null, id, capacity); - Capacity getCap = stateManager.getActivityState(act, vehicle, null, id, Capacity.class); + stateManager.putActivityState(act, vehicle, id, capacity); + Capacity getCap = stateManager.getActivityState(act, vehicle, id, Capacity.class); assertEquals(500, getCap.get(0)); } + + @Test + public void whenMemorizingVehicleInfo_itShouldBeMemorized(){ + Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").build(); + VehicleRoute route = getRoute(vehicle); + StateManager stateManager = new StateManager(mock(VehicleRoutingProblem.class)); + StateId id = stateManager.createStateId("vehicleParam"); + double distanceParam = vehicle.getType().getVehicleCostParams().perDistanceUnit; + stateManager.putRouteState(route,vehicle, id,distanceParam); + assertEquals(1.,stateManager.getRouteState(route,vehicle,id, Double.class),0.01); + } + + @Test + public void whenMemorizingTwoVehicleInfoForRoute_itShouldBeMemorized(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build(); + VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").build(); + VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").setType(type).build(); + VehicleRoute route = getRoute(vehicle); + + //getting the indices created in vrpBuilder + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + VehicleRoutingProblem vrp = vrpBuilder.addVehicle(vehicle).addVehicle(vehicle2).build(); + + StateManager stateManager = new StateManager(vrp); + StateId id = stateManager.createStateId("vehicleParam"); + double distanceParam = vehicle.getType().getVehicleCostParams().perDistanceUnit; + stateManager.putRouteState(route,vehicle, id,distanceParam); + stateManager.putRouteState(route,vehicle2,id,vehicle2.getType().getVehicleCostParams().perDistanceUnit); + assertEquals(1., stateManager.getRouteState(route, vehicle, id, Double.class), 0.01); + assertEquals(4.,stateManager.getRouteState(route,vehicle2,id, Double.class),0.01); + } + + @Test + public void whenMemorizingTwoVehicleInfoForAct_itShouldBeMemorized(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build(); + VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").build(); + VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").setType(type).build(); + + //getting the indices created in vrpBuilder + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + VehicleRoutingProblem vrp = vrpBuilder.addVehicle(vehicle).addVehicle(vehicle2).build(); + + TourActivity act = mock(TourActivity.class); + + StateManager stateManager = new StateManager(vrp); + StateId id = stateManager.createStateId("vehicleParam"); + double distanceParam = vehicle.getType().getVehicleCostParams().perDistanceUnit; + stateManager.putActivityState(act, vehicle, id, distanceParam); + stateManager.putActivityState(act, vehicle2, id, vehicle2.getType().getVehicleCostParams().perDistanceUnit); + + assertEquals(1., stateManager.getActivityState(act, vehicle, id, Double.class), 0.01); + assertEquals(4.,stateManager.getActivityState(act,vehicle2, id, Double.class),0.01); + } + + @Test + public void whenClearing_arrElementsShouldBeNull(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build(); + VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").build(); + VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("loc").setType(type).build(); + + //getting the indices created in vrpBuilder + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + VehicleRoutingProblem vrp = vrpBuilder.addVehicle(vehicle).addVehicle(vehicle2).build(); + + TourActivity act = mock(TourActivity.class); + + StateManager stateManager = new StateManager(vrp); + StateId id = stateManager.createStateId("vehicleParam"); + double distanceParam = vehicle.getType().getVehicleCostParams().perDistanceUnit; + stateManager.putActivityState(act, vehicle, id, distanceParam); + stateManager.putActivityState(act, vehicle2, id, vehicle2.getType().getVehicleCostParams().perDistanceUnit); + + stateManager.clear(); + + assertNull(stateManager.getActivityState(act, vehicle, id, Double.class)); + assertNull(stateManager.getActivityState(act,vehicle2, id, Double.class)); + } }