[gecode-users] Bug in linear contraint?

Mikael Zayenz Lagerkvist zayenz at gmail.com
Mon Sep 6 06:23:36 CEST 2010


Hi,

My guess would be that when you include the specified constraint, the
current Space becomes immediately failed.

Accidentally overconstraining a problem is quite common when developing
models. The best thing to do is usually to try to find the fewest
constraints that fail when combined, and to understand why it behaves that
way. It may just be that your problem has no solution, or you may have
included a stronger constraint than you intended.

If something else is happening, please include a full compilable example for
me to try.

Cheers,
Mikael

2010/9/5 Tales Pinheiro de Andrade <tales at talesp.inf.br>

> Hello,
>
> First, sorry about my English, I don't  write English so well.
>
> I'm a newbie in Gecode and contraint programming, and I'm geting  a strange
> error, but I don't know if it is a bug or error.
>
> I have  a bidimensional vector filled with 0 and 1 called serie
> representing the time series of a boolean network. Based in the content, I
> try to determine the network.
>
> I have a few linear constrints based in the content of serie. But there is
> a case that, when I post a linear constrint, all the constraint of the space
> is erased. The constrint in case is in the line marked with * in the code.
>
> Here is the code:
>
> class Instancia {
> public:
>     std::vector<std::vector<int > >serie;
>     int num_estados;
>     int num_genes;
>     int gene;
> };
>
>
> namespace {
>     Instancia instancia;
> }
>
> class TimeSeries : public Script {
> private:
>     IntVarArray array;
>     std::vector<std::vector<int > >serie;
>
>
>     const int num_estados;
>     const int num_genes;
>     const int gene;
> public:
>         /// Post constraints
>     TimeSeries(const Options& opt)
>     :array(*this, instancia.num_genes, -1, 1),
>     serie(instancia.serie),
>     num_estados(instancia.num_estados),
>     num_genes(instancia.num_genes),
>     gene(instancia.gene)
>     {
>         for (int i = 1; i < num_estados - 1; i++)
>         {
>             int num_genes_diff = 0, gene_diff = num_genes + 1;
>  for (int j = 0; j < num_genes; j++)
>             {
> if (serie[i-1][j] != serie[i][j])
>                 {
>     num_genes_diff++;
>      gene_diff = j;
>  }
>     }
>             if (num_genes_diff == 1 && gene_diff == gene)
>             {
> for (int j = 0; j < num_genes; j++)
>                 {
>                     if (serie[i+1][j] > serie[i][j])
>                     {
>                         rel(*this, array[j], IRT_EQ, 1);
>                     }
>                     else if (serie[i+1][j] < serie[i][j])
>                     {
>                         rel(*this, array[j], IRT_EQ, -1);
>                     }
>                 }
>             }
>         }
>
>             //passo 2
>         for (int t = 0; t < num_estados-1; t++)
>         {
>             IntArgs x_it(num_genes);
>             int i = gene;
>             for (int j = 0; j < num_genes; j++)
>             {
>                 x_it[j] = serie[t][j];
>             }
>
>
>             if (serie[t][i] == 0 && serie[t + 1][i] == 0)
>             {
>                 linear(*this, x_it, array, IRT_LQ, 0, opt.icl());
>             }
>             else if (serie[t][i] == 0 && serie[t+1][i] == 1)
>             {
>                 linear(*this, x_it, array, IRT_GR, 0, opt.icl());
>             }
>             else if (serie[t][i] == 1 && serie[t+1][i] == 0)
>             {
>                 linear(*this, x_it, array, IRT_LE, 0, opt.icl());
>             }
>             else
>             {
>                 linear(*this, x_it, array, IRT_GQ, 0, opt.icl());
>             }
>         }
>
>
>             //passo 3
>         for (int a = 0; a < num_estados - 2; a++)
>         {
>             for ( int b = a+1; b < num_estados - 1; b++)
>             {
>                 IntArgs x_it(num_genes * 2);
>                 IntVarArgs a_ij = array + array;
>
>                 for (int j = 0; j < num_genes; j++)
>                 {
>                     if (serie[a][j] == 1 && serie[b][j] == 0)
>                     {
>                         x_it[j] = serie[a][j];
>                     }
>                     else {
>                         x_it[j] = 0;
>                     }
>
>
>                     if (serie[b][j] == 1 && serie[a][j] == 0)
>                     {
>                         x_it[num_genes + j] = -serie[b][j];
>                     }
>                     else {
>                         x_it[j + num_genes] = 0;
>                     }
>                 }
>
>
>                 if (serie[a][gene] == 1 && serie[a+1][gene] == 0)
>                 {
>                     if ((serie[b][gene] == 0 && serie[b+1][gene] == 1) ||
>                         (serie[b][gene] == 1 && serie[b+1][gene] == 1))
>                     {
>                         int prop=0;
>                         for (Propagators p(*this); p(); ++p)
>                             prop++;
>                         std::cout << "Prop: " << prop << std::endl;
>                         std::cout << std::endl;
>                             //rest 1 e 8
> ***                     linear(*this, x_it, a_ij, IRT_LE, 0, opt.icl());
>                         prop=0;
>                         for (Propagators p(*this); p(); ++p)
>                             prop++;
>                         std::cout << "Prop: " << prop << std::endl;
>                         std::cout << std::endl;
>
>
>                     }
>                 }else if (serie[a][gene] == 0 && serie[a+1][gene] == 1)
>                 {
>                     if ((serie[b][gene] == 0 && serie[b+1][gene] == 0) ||
>                         (serie[b][gene] == 1 && serie[b+1][gene] == 0))
>                     {
>                             //rest 2 e 5
>                         for ( int i = 0; i < x_it.size(); i++)
>                         {
>                             x_it[i] = -1 * x_it[i];
>                         }
>                         linear(*this, x_it, a_ij, IRT_LE, 0, opt.icl());
>                     }
>                 }
>                 else if (serie[a][gene] == 1 && serie[a+1][gene] == 1)
>                 {
>                     if (serie[b][gene] == 0 && serie[b+1][gene] == 0)
>                     {
>                             //rest 3
>                         for ( int i = 0; i < x_it.size(); i++)
>                         {
>                             x_it[i] = -1 * x_it[i];
>                         }
>                         linear(*this, x_it, a_ij, IRT_LQ, 0, opt.icl());
>                     }
>                     else if (serie[b][gene] == 1 && serie[b+1][gene] == 0)
>                     {
>                             //rest 6
>                         for ( int i = 0; i < x_it.size(); i++)
>                         {
>                             x_it[i] = -1 * x_it[i];
>                         }
>                         linear(*this, x_it, a_ij, IRT_LE, 0, opt.icl());
>                     }
>                 }
>                 else if (serie[a][gene] == 0 && serie[a+1][gene] == 0)
>                 {
>                     if (serie[b][gene] == 0 && serie[b+1][gene] == 1)
>                     {
>                             //rest 4
>                         linear(*this, x_it, a_ij, IRT_LE, 0, opt.icl());
>                     }
>                     else if (serie[b][gene] == 1 && serie[b+1][gene] == 1)
>                     {
>                             //rest 7
>                         linear(*this, x_it, a_ij, IRT_LQ, 0, opt.icl());
>                     }
>                 }
>             }
>         }
>
>         branch(*this, array, INT_VAR_SIZE_MIN, INT_VAL_SPLIT_MIN);
>     }
>         /// Constructor for cloning \a s
>     TimeSeries(bool share, TimeSeries& s) : Script(share,s),
>     num_genes(s.num_genes), num_estados(s.num_estados),
>     gene(s.gene), serie(s.serie)
>     {
>         array.update(*this, share, s.array);
>     }
>
>
>         /// Copy during cloning
>     virtual Space*
>     copy(bool share)
>     {
>         return new TimeSeries(share,*this);
>     }
>         /// Print solution
>     virtual void
>     print(std::ostream& os) const
>     {
>         os << "\t" << array << std::endl;
>     }
>
>
> };
>
> And here is part of the main function:
>
>     instancia.serie = serie;
>     instancia.num_genes = estado.size();
>     instancia.num_estados = serie.size();
>
>
>     Options opt("TimeSeries");
>     opt.solutions(1000);
>         //opt.time(1000);
>     opt.threads(0);
>     opt.iterations(10);
>     opt.parse(argc,argv);
>
>
>     for (int i = 0; i < instancia.num_genes; i++)
>     {
>         unsigned int n_p = t->propagators();
>         unsigned int n_b = t->branchers();
>
>
>         TimeSeries* t = new TimeSeries(opt);
>         DFS<TimeSeries> e(t,so);
>
> So, in the serie vector, gene is the column. I'm comparing to lines of the
> vector and deciding which constraint to post. But with only a column the
> constraints are erased, for all other columns/constraints its OK.
>
> I'm running in a Mac with Gecode 3.4.
>
> Thanks
>
> Tales
>
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users
>
>


-- 
Mikael Zayenz Lagerkvist, http://www.ict.kth.se/~zayenz/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20100906/991ba5a8/attachment-0001.htm>


More information about the users mailing list