Unit test requirements (was Re: [Coin-discuss] OsiCbc)
Ted Ralphs
tkralphs at lehigh.edu
Wed Apr 6 14:04:04 EDT 2005
Alan King wrote:
>
> Few comments below
> >
> > Also, the OsiSymSolverInterface unit test should work properly now.
> > There was a bug in the copy constructor that is now fixed. Also, I had
> > to comment out a few tests. SYMPHONY will not pass the common unit tests
> > for two reasons:
> >
> > 1. We do not allow an infeasible solution to be loaded into the
> > interface. I think this is a reasonable policy, since it is natural to
> > assume that the currently loaded solution is feasible to the currently
> > loaded problem. SYMPHONY has no mechanism for storing an infeasible
> > solution. This unit test requires this. I'm not sure this is reasonable,
> > but I'd be curious to hear other opinions.
>
> If the user can modify the loaded solution, then it is reasonable to assume
> that it could be infeasible.
But the question is: should a solver be forced to store an infeasible
solution if it does not make sense for it to do so? I understand that
some solvers may be able to make use of infeasible solutions in some way
and that it may be reasonable to allow a user to load an infeasible
solution. However, SYMPHONY can only make use of feasible solutions and
trying to load an infeasible solution results in an error. This seems to
be a reasonable behavior. And yet, the unit test will fail in many
places if the solver does not allow an infeasible solution to be loaded.
This does not strike me as a behavior that should be required of every
interface.
> > 2. Pointers to rim vectors returned by methods such as getColLower()
> > become invalid if the problem is modified. This is because SYMPHONY
> > itself returns a copy of requested rim vectors to the interface (not a
> > pointer to the internally stored data). The pointer to this copy is then
> > cached locally in the interface. It is the pointer to this locally
> > cached copy that is returned to the user. The locally cached arrays are
> > deleted when certain problem data are modified and only recreated when a
> > new pointer is requested. In particular, when any column bound is
> > changed, the locally cached copies of both the upper and lower bound
> > arrays are deleted. The common unit test requests a pointer to the
> > bounds arrays, then modifies the problem and expects that pointer to
> > remain valid. I'm not sure this is reasonable either. Pointers should
> > probably only be required to remain valid while the problem data remains
> > unchanged. I'd be curious to hear other opinions on this as well.
>
> It is reasonable to require the user to suppose that a pointer to an
> internal array could be modified by its owning program during a subsequent
> call. For the unit test, the bounds arrays returned in the subsequent
> call should be identical to the ones obtained previously.
I'm not sure whether you're agreeing with me or not. Are you saying the
pointer returned should remain valid after a subsequent call or that the
user should assume that such a pointer does not remain valid? To make it
more concrete, here are some lines from the common unit test. First,
pointers to arrays are requested:
const double * cl = si2->getColLower();
const double * cu = si2->getColUpper();
Later, these pointers are used as follows:
assert( !eq(cl[3],1.2345) );
symSi.setColLower( 3, 1.2345 );
assert( eq(symSi.getColLower()[3],1.2345) );
assert( !eq(cu[4],10.2345) );
symSi.setColUpper( 4, 10.2345 );
assert( eq(symSi.getColUpper()[4],10.2345) );
Note that the line
assert( !eq(cl[3],1.2345) )
implicitly assumes that cl is still a valid pointer, even though there
has been a subsequent modification to the problem data. I would say that
this is not a valid assumption and that this should be replaced by
assert( !eq(symSi.getColUpper()[4],10.2345) );
What do you think?
Ted
--
Dr. Ted Ralphs
Assistant Professor
Industrial and Systems Engineering
Lehigh University
(610)758-4784
tkralphs at lehigh.edu
www.lehigh.edu/~tkr2
More information about the Coin-discuss
mailing list