<br><font size=2 face="sans-serif">Hello,</font>
<br>
<br><font size=2 face="sans-serif">I must confess to my eternal shame to
being the original author of this code and hence responsible for its errors.</font>
<br>
<br><font size=2 face="sans-serif">The paper I refer to in my comments
is:</font>
<br>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Presolving
in linear programming</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; erling
D. Andersen, Knud D. Andersen</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Mathematical
Programming 71 (1995) 221-245</font>
<br>
<br><font size=2 face="sans-serif">I have no formal training in optimization.
&nbsp;I learned about optimization mostly by reading the source code for
OSL. &nbsp;When I wrote this code, I had difficulty understanding how the
OSL presolve worked, so John Forrest recommended this paper to me, after
which I was able to understand most, but not all, of the OSL code. &nbsp;The
result is in a sense the OSL algorithms recast in this framework. &nbsp;The
simpler transformations generally follow the paper, but the more complex
ones follow OSL, if for no other reason than the paper didn't treat them.
&nbsp;The code even uses old-style OSL identifiers like mcstrt (lingering
remnants of Fortran). &nbsp;I never developed my own transformations, but
hoped that the framework would allow other people to do so without too
much pain. &nbsp;I didn't adapt my code for COIN; John Forrest did that
because I was too embarrassed about the state of the code to bring myself
to do it.</font>
<br>
<br><font size=2 face="sans-serif">remove_fixed_action concerns the case
where (possibly as the result of prior transformations) a variable's bounds
become equal (or close enough), so one can fix its value. &nbsp;make_fixed_action
concerns the case where a variable is to be forced to one of the bounds;
the presolver only calls this when it determines that this must be the
case, but a programmer could also use this as a heuristic when solving
IPs. &nbsp;Since the concepts seemed so similar, I tried to share code
by using removed_fixed_action to implement make_fixed_action. &nbsp;make_fixed_action
simply saves the old bound and changes it before calling remove_fixed_action::presolve.
&nbsp;I remember being not entirely happy about the way it worked out.</font>
<br>
<br><font size=2 face="sans-serif">The one unusual case is when the presolver
starts. &nbsp;The first transformation is to eliminate trivially fixed
variables (ones whose bounds are already fixed at the start). &nbsp;I initially
had special-purpose code to do this, but after a while thought it would
be clever to use removed_fixed_action to do it instead. &nbsp;That is what
make_fixed is used for; it is called in Osi/OsiPresolve.cpp once before
anything else (it took me a while to find it). &nbsp;I suspect that it
shouldn't be used otherwise.</font>
<br>
<br><font size=2 face="sans-serif">As for remove_fixed, I'm stumped. &nbsp;That
may have been have been an experiment that I failed to remove. &nbsp;I
see that I never call it.</font>
<br>
<br><font size=2 face="sans-serif">I hope this helps. &nbsp;Keep in mind
that it has been about three years since I've dealt with this code. &nbsp;I
was pretty depressed about the whole thing by the end, so comments like
this never got added to the code.</font>
<br>
<br><font size=2 face="sans-serif">As for the difficulties you mention,
I think John Forrest added that code, so I will leave that to him. &nbsp;If
it were my code I would not hesistate to call them bugs, but since it is
his, I would rather not. &nbsp;</font>
<br>
<br><font size=2 face="sans-serif">Vernon Austel</font>
<br>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td width=40%><font size=1 face="sans-serif"><b>Lou Hafer &lt;lou@cs.sfu.ca&gt;</b>
</font>
<br><font size=1 face="sans-serif">Sent by: coin-core-admin@www-124.southbury.usf.ibm.com</font>
<p><font size=1 face="sans-serif">03/11/2004 01:21 PM</font>
<table border>
<tr valign=top>
<td bgcolor=white>
<div align=center><font size=1 face="sans-serif">Please respond to<br>
coin-core</font></div></table>
<br>
<td width=59%>
<table width=100%>
<tr>
<td>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td valign=top><font size=1 face="sans-serif">coin-core@www-124.southbury.usf.ibm.com</font>
<tr>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td valign=top>
<tr>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td valign=top><font size=1 face="sans-serif">[Coin-core] paper/notes for
Coin Presolve?</font></table>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br>
<br>
<br><font size=2><tt>Folks,<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
I've located the bug I was stalking in CoinPresolve, plus what I<br>
think are a few others. I can see a quick patch, but it's not clear to
me<br>
that this is the right solution.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
In the code, there are occasional references to `the paper', and also<br>
numbered references (e.g., `(22)') attached to comments. Can anyone point
me<br>
to this paper, and the source of the numbered references?<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
What I'm having trouble getting my head around is the larger picture<br>
of how make_fixed_action (fix a variable) and remove_fixed_action (substitute<br>
the value &amp; remove the column) fit together. &nbsp;Make_fixed_action
always<br>
invokes remove_fixed_action. It looks like remove_fixed_action is supposed
to<br>
be available as an independent action. &nbsp;(There is at least one example,
in<br>
CoinPresolveForcing.cpp.) But is make_fixed_action ever to be used<br>
independently of remove_fixed_action? There is definite information loss
at<br>
the interface between make_fixed_action and remove_fixed_action in the<br>
present arrangement. There are a number of other questions (free space<br>
management, use of next[Row,Col]ToDo) that I'd like to answer without having<br>
to read the whole piece of code.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For those interested, a quick description of the bugs. For reference,<br>
make_fixed_action::presolve invokes remove_fixed_action::presolve, with
the<br>
residual effect that a make_fixed_action::postsolve object contains<br>
remove_fixed_action::postsolve objects:<br>
<br>
 &nbsp;* r_f_a::postsolve restores the variable as fixed, with equal bounds,
and<br>
 &nbsp; &nbsp;arbitrarily chooses atUpperBound as the status. It hangs
off a<br>
 &nbsp; &nbsp;m_f_a::postsolve object which knows the correct original
bound to restore<br>
 &nbsp; &nbsp;(unfixing the variable), but doesn't twiddle status. &nbsp;If
the original<br>
 &nbsp; &nbsp;upper bound is infinity, the result is a variable with an
upper bound of<br>
 &nbsp; &nbsp;infinity and status atUpperBound.<br>
<br>
 &nbsp;* m_f_a::presolve adjusts row activity when fixing a variable. It
then<br>
 &nbsp; &nbsp;calls r_f_a::presolve, which adjusts the row upper and lower
bounds, and<br>
 &nbsp; &nbsp;row activity. &nbsp;Row activity is thus tweaked twice. &nbsp;This
may be the cause<br>
 &nbsp; &nbsp;of a lot of the `inacc RSOL' warnings. The adjustment also
fails to guard<br>
 &nbsp; &nbsp;against tweaking finite infinity, but this may not be important
here.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Any leads much appreciated.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Lou</tt></font>
<br>
<br>