help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Is this code correct in the GMPL implementation ?


From: Domingo Alvarez Duarte
Subject: Re: Is this code correct in the GMPL implementation ?
Date: Sat, 1 Aug 2020 11:26:53 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0

Hello !

This is my fourth time trying to replace the actual TUPLE struct representation https://github.com/mingodad/GLPK/tree/new-tuple and I'm struggling again in understand/rewrite some parts of the code, mainly src/mpl/mpl3.c::saturate_set and other places.

I'm asking for help to try to fix/rewrite the missing pieces on it, I hope that this changes once corrected would give a reduction in memory usage and probably execution time for GMPL.

Thank you in advance for any help you can give !

Cheers !

On 25/7/20 14:51, Andrew Makhorin wrote:
On Sat, 2020-07-25 at 13:35 +0200, Domingo Alvarez Duarte wrote:
Hello !

Trying to change the actual TUPLE structure by:

====

#ifndef TUPLE_SIZE_T
#define TUPLE_SIZE_T int
#endif
struct TUPLE
{
        TUPLE_SIZE_T size;
        TUPLE_SIZE_T refcount;
        SYMBOL sym[1];
        /* symbol, which the component refers to; cannot be NULL */
};

====

I found the code bellow (in src/mpl/mpl3.c) that I'm not sure I
understand it,

it seems that it's only testing the last tuple against
"code->arg.arg.y", shouldn't it be testing inside the loop for every
tuple ?

I would appreciate someone could help understand this code !

====

int is_member(MPL *mpl, CODE *code, const TUPLE *tuple)
{     int value;
...

           case O_CROSS:
              {  int j;
                 value = is_member(mpl, code->arg.arg.x, tuple);
                 if (value)
                 {  for (j = 1; j <= code->arg.arg.x->dim; j++)
                    {  xassert(tuple != NULL);
                       tuple = tuple->next;
                    }
                    value = is_member(mpl, code->arg.arg.y, tuple);
                 }
              }
              break;

====

Cheers !



The routine is_member checks if the given n-tuple (specified by
'tuple') is a member of the given set (specified by 'code'). The check
is performed recursively by traversing the set expression tree. For
example, on evaluating the condition "... (x,y) in X cross Y ..." the
routine will check that x is in X and y is in Y.






reply via email to

[Prev in Thread] Current Thread [Next in Thread]