package vroom.optimization.online.jmsa.vrp.vrpsd; import java.util.Arrays; import vroom.common.modeling.dataModel.IVRPRequest; import vroom.common.modeling.dataModel.Node; import vroom.common.modeling.dataModel.attributes.AttributeKey; import vroom.common.modeling.dataModel.attributes.DeterministicDemand; import vroom.common.modeling.dataModel.attributes.IDemand; import vroom.common.modeling.dataModel.attributes.IRequestAttribute; import vroom.common.modeling.dataModel.attributes.RequestAttributeKey; import vroom.common.utilities.IDerefenceable; import vroom.common.utilities.IObservable; import vroom.common.utilities.IObserver; import vroom.common.utilities.Update; import vroom.common.utilities.ValueUpdate; import vroom.common.utilities.Wrapper; /** * Creation date: Apr 19, 2010 - 12:03:54 PM<br/> * <code>SampledRequest</code> is a {@linkplain Wrapper wrapper} for a * {@linkplain IVRPRequest request} of the a VRPSD for which the demands have * been sampled * * @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los * Andes</a>-<a href="http://copa.uniandes.edu.co">Copa</a> <a * href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a * href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a> * @version 1.0 */ public class SampledRequest implements IVRPRequest, Wrapper<IVRPRequest>, IObserver, IDerefenceable { private static final RequestAttributeKey<DeterministicDemand> SAMPLED_DEMAND = new RequestAttributeKey<DeterministicDemand>( "sampled_demand", DeterministicDemand.class); /** The wrapped request */ private final IVRPRequest mRequest; /** An array containing the sampled demands for each product */ private final double[] mSampledDemands; private final DeterministicDemand mSampledDemandAtt; /** * Creates a new <code>SampledRequest</code> * * @param request * the wrapped request * @param sampledDemands * an array containing the sampled demand values */ public SampledRequest(IVRPRequest request, double[] sampledDemands) { mRequest = request; if (mRequest instanceof IObservable) { ((IObservable) mRequest).addObserver(this); } mSampledDemands = sampledDemands; mSampledDemandAtt = new DeterministicDemand(mSampledDemands); } @Override public double getDemand() { return getDemand(0); } @Override public IDemand getDemandAttribute() { return mSampledDemandAtt; } @Override public double getDemand(int product) { return mSampledDemands[product]; } @Override public Node getDestinationNode() { return mRequest.getDestinationNode(); } @Override public Node getNode() { return mRequest.getNode(); } @Override public boolean isOriginDestination() { return mRequest.isOriginDestination(); } @Override public void setDemands(double... demands) { throw new IllegalAccessError( "Demands cannot be set on an instance of SampledRequest"); } @Override public <AE extends IRequestAttribute, KE extends AttributeKey<AE>> AE getAttribute( KE attributeKey) { return mRequest.getAttribute(attributeKey); } @Override public String getAttributesAsString() { return mRequest.getAttributesAsString(); } @Override public IRequestAttribute setAttribute(RequestAttributeKey<?> attributeKey, IRequestAttribute value) { throw new IllegalAccessError( "Cannot set attributes on an instance of SampledRequest"); } @Override public String toString() { if (isOriginDestination()) { return String.format("[%s->%s %s (dem:%s)]", getNode(), getDestinationNode(), getAttributesAsString(), Arrays.toString(mSampledDemands)); } else { return String.format("[%s %s(dem:%s)]", getDestinationNode(), getAttributesAsString(), Arrays.toString(mSampledDemands)); } } @Override public IVRPRequest getWrappedObject() { return mRequest; } @Override public int getID() { return getWrappedObject().getID(); } @Override public void update(IObservable source, Update update) { if (source instanceof VRPSDActualRequest && ((VRPSDActualRequest) source).getWrappedObject() == getWrappedObject() && update instanceof ValueUpdate && VRPSDActualRequest.PROP_ACTUAL_DEMANDS.equals(update .getDescription())) { for (int p = 0; p < mSampledDemands.length; p++) { mSampledDemands[p] = ((double[]) ((ValueUpdate) update) .getNewValue())[p]; } } } @Override public void dereference() { if (mRequest instanceof IObservable) { ((IObservable) mRequest).removeObserver(this); } } }