Re: Adding if/then/else statement to GMPL

Domingo Alvarez Duarte <[email protected]> Thu, 27 Aug 2020 11:44:05 +0200
Newsgroups gmane.comp.gnu.glpk
Message-ID <[email protected]>
Hello Andrew !

Thanks for reply !

You are right in respect to the original implementation, one possible 
way to have multiple solve statements working is to pause the execution 
return a code that would tell the caller to generate the problem, solve 
it, postsolve and then continue the execution from that point (glpsol is 
somehow already doing it but is not looping back to see if there is more 
solve statements to execute).

Anyone can contribute to make this work !

Pseudo code:

=====

       /* generate the model */
       while ((ret = glp_mpl_generate(csa->tran, csa->out_dpy)) == 
GMPL_SOLVE)
      {
          if (glp_mpl_generate(csa->tran, csa->out_dpy)) goto err2;
          /* build the problem instance from the model */
          glp_mpl_build_prob(csa->tran, csa->prob);
          ...
          glp_simplex(csa->prob, &csa->smcp);
          ...
          glp_intopt(csa->prob, &csa->iocp);
          ...
          ret = glp_mpl_postsolve(csa->tran, csa->prob, GLP_SOL);
          //resume the execution
      }
=====

Cheers !

On 27/8/20 11:25, Andrew Makhorin wrote:
> On Thu, 2020-08-27 at 11:01 +0200, Domingo Alvarez Duarte wrote:
>> Hello !
>>
>> I just finished adding the parsing code to parse this dummy model:
>>
>> https://github.com/mingodad/GLPK/blob/local-set-param/examples/cut2.mo
>> d
>>
>> On that branch I've added let/repeat/problem and relaxed the only one
>> solve requirement, only the parsing is done (although corner cases
>> can
>> be missing).
>>
>> Any comment/suggestion/help is welcome !
>>
>> =====
>>
>> ./glpsol --genonly  -m cut2.mod
>>   >./glpsol --genonly  -m cut2.mod
>> GLPSOL: GLPK LP/MIP Solver, v4.65
>> Parameter(s) specified in the command line:
>>    --genonly -m cut2.mod
>> Reading model section from cut2.mod...
>> Reading data section from cut2.mod...
>> 135 lines were read
>> Checking (line 14)...
>> Generating Number...
>> Generating Fill...
>> Generating Reduced_Cost...
>> Generating Width_Limit...
>> Display statement at line 46
>> problem Cutting_Opt: Cut, Number, Fill;
>> problem Pattern_Gen: Use, Reduced_Cost, Width_Limit;
>> problem Mix: Cut, Reduced_Cost;
>> Display statement at line 58
>> price[20] = 0.166667
>> price[45] = 0.416667
>> price[50] = 0.5
>> price[55] = 0.5
>> price[75] = 0.833333
>> Model has been successfully generated
>>   >Exit code: 0
>>
>> =====
>>
>> Cheer !
>>
>>
>> repeat {
>>     solve Cutting_Opt;
>>     let {i in WIDTHS} price[i] := Fill[i].dual;
>>     display price;
>>
>>     solve Pattern_Gen;
>>     if Reduced_Cost < -0.00001 then {
>>        let nPAT := nPAT + 1;
>>        let {i in WIDTHS} nbr[i,nPAT] := Use[i];
>>        display Use;
>>     }
>>     else break;
>> }
> I don't think that the solve statement is executed more than once.
> Internally the solve statement is not a real statement (like display),
> i.e. it doesn't "call" a solver; it is just a marker that separates the
> main part and the post-solving part of the model.