/******************************************************************************* * Copyright 2014 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ package com.analog.lyric.dimple.solvers.lp; import java.util.Iterator; import java.util.List; import net.jcip.annotations.NotThreadSafe; import com.analog.lyric.dimple.solvers.lp.IntegerEquation.TermIterator; import com.analog.lyric.util.misc.Matlab; import org.eclipse.jdt.annotation.Nullable; @Matlab @NotThreadSafe public class MatlabConstraintTermIterator implements TermIterator { /*------- * State */ private final LPVariableConstraint.TermIterator _varIterator; private final LPFactorMarginalConstraint.TermIterator _factorIterator; private final @Nullable Iterator<IntegerEquation> _constraintIterator; private final int _size; private @Nullable IntegerEquation.TermIterator _curIterator; private int _row; /*-------------- * Construction */ MatlabConstraintTermIterator(@Nullable List<IntegerEquation> constraints, int nTerms) { _varIterator = new LPVariableConstraint.TermIterator(null); _factorIterator = new LPFactorMarginalConstraint.TermIterator(null); _constraintIterator = constraints != null ? constraints.iterator() : null; _size = nTerms; _curIterator = null; _row = 0; } /*---------------------- * TermIterator methods */ @Override public boolean advance() { IntegerEquation.TermIterator curIterator = _curIterator; if (curIterator == null || !curIterator.advance()) { final Iterator<IntegerEquation> constraintIterator = _constraintIterator; if (constraintIterator != null && constraintIterator.hasNext()) { IntegerEquation constraint = constraintIterator.next(); LPVariableConstraint varConstraint = constraint.asVariableConstraint(); if (varConstraint != null) { curIterator = _curIterator = _varIterator.reset(varConstraint); } else { curIterator = _curIterator = _factorIterator.reset(constraint.asFactorConstraint()); } curIterator.advance(); // assume this will return true ++_row; } else { _curIterator = null; _row = -1; } } return _curIterator != null; } @Override public int getVariable() { final IntegerEquation.TermIterator curIterator = _curIterator; return curIterator != null ? curIterator.getVariable() + 1 : -1; } @Override public int getCoefficient() { final IntegerEquation.TermIterator curIterator = _curIterator; return curIterator != null ? curIterator.getCoefficient() : 0; } /* * MatlabConstraintTermIterator methods */ /** * Get row number of current constraint term, where rows are numbered starting from 1. */ public int getRow() { return _row; } /** * @return the number of terms that should be returned by this iterator for use in allocating * the sparse matrix in MATLAB. */ public int size() { return _size; } }