001package org.cpsolver.ifs.assignment;
002
003import java.util.ArrayList;
004import java.util.Arrays;
005import java.util.Collection;
006import java.util.List;
007
008import org.cpsolver.ifs.assignment.context.AssignmentContextHolder;
009import org.cpsolver.ifs.model.Value;
010import org.cpsolver.ifs.model.Variable;
011
012
013/**
014 * An assignment using array to store values of all the variables of the model.
015 * {@link Variable#getIndex()} is used to index the array.
016 * 
017 * @see Assignment
018 * 
019 * @version IFS 1.3 (Iterative Forward Search)<br>
020 *          Copyright (C) 2014 Tomáš Müller<br>
021 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
022 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
023 * <br>
024 *          This library is free software; you can redistribute it and/or modify
025 *          it under the terms of the GNU Lesser General Public License as
026 *          published by the Free Software Foundation; either version 3 of the
027 *          License, or (at your option) any later version. <br>
028 * <br>
029 *          This library is distributed in the hope that it will be useful, but
030 *          WITHOUT ANY WARRANTY; without even the implied warranty of
031 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
032 *          Lesser General Public License for more details. <br>
033 * <br>
034 *          You should have received a copy of the GNU Lesser General Public
035 *          License along with this library; if not see <a href='http://www.gnu.org/licenses'>http://www.gnu.org/licenses</a>.
036 * @param <V> Variable
037 * @param <T> Value
038 **/
039public class AssignmentArray<V extends Variable<V, T>, T extends Value<V, T>> extends AssignmentAbstract<V, T> {
040    protected Object[] iAssignments = new Object[1000];
041    protected Long[] iIteration = new Long[1000];
042    
043    /** Creates an empty assignment 
044     * @param contexts assignment context holder
045     **/
046    public AssignmentArray(AssignmentContextHolder<V, T> contexts) {
047        super(contexts);
048    }
049    
050    @Override
051    public long getIteration(V variable) {
052        try {
053            Long it = iIteration[variable.getIndex()];
054            return (it == null ? 0 : it);
055        } catch (ArrayIndexOutOfBoundsException e) {
056            return 0;
057        }
058    }
059    
060    @Override
061    @SuppressWarnings("unchecked")
062    protected T getValueInternal(V variable) {
063        try {
064            return (T) iAssignments[variable.getIndex()];
065        } catch (ArrayIndexOutOfBoundsException e) {
066            return null;
067        }
068    }
069
070    @Override
071    protected void setValueInternal(long iteration, V variable, T value) {
072        if (iAssignments.length <= variable.getIndex()) {
073            iAssignments = Arrays.copyOf(iAssignments, variable.getIndex() + 1000);
074            iIteration = Arrays.copyOf(iIteration, variable.getIndex() + 1000);
075        }
076        if (value == null) {
077            iAssignments[variable.getIndex()] = null;
078            iIteration[variable.getIndex()] = null;
079        } else {
080            iAssignments[variable.getIndex()] = value;
081            if (iteration > 0)
082                iIteration[variable.getIndex()] = iteration;
083        }
084    }
085    
086    @Override
087    @SuppressWarnings("unchecked")
088    public Collection<V> assignedVariables() {
089        List<V> variables = new ArrayList<V>(iAssignments.length);
090        for (Object value: iAssignments)
091            if (value != null) variables.add(((T)value).variable());
092        return variables;
093    }
094    
095    @Override
096    @SuppressWarnings("unchecked")
097    public Collection<T> assignedValues() {
098        List<T> values = new ArrayList<T>(iAssignments.length);
099        for (Object value: iAssignments)
100            if (value != null) values.add((T)value);
101        return values;
102    }
103
104    @Override
105    public int nrAssignedVariables() {
106        int ret = 0;
107        for (Object value: iAssignments)
108            if (value != null) ret ++;
109        return ret;
110    }
111}