Hi Christian,

OK, I yield! :)  Thanks.  I didn't know that about the integer propagators and 
I guess I should check that I'm careful enough where I'm using them.

Cheers,
Filip

From: Christian Schulte [mailto:cschu...@kth.se]
Sent: Saturday, September 1, 2018 1:40 PM
To: Konvicka Filip; 'users@gecode.org'
Subject: RE: Float overflow exceptions with 'linear' in 6.0.1

Hi Filip,

Actually, it is the other way around: now the float propagators behave as the 
integer propagators always did.

Well, the risk was there before but the system would not tell that.

Best
Christian

--
Christian Schulte, https://chschulte.github.io/
Professor of Computer Science
Software and  Computer Systems
School of Electrical Engineering and Computer Science
KTH Royal Institute of Technology, Sweden

From: users-boun...@gecode.org <users-boun...@gecode.org> On Behalf Of Konvicka 
Filip
Sent: 30 August 2018 21:10
To: Christian Schulte <cschu...@kth.se>; 'users@gecode.org' <users@gecode.org>
Subject: Re: [gecode-users] Float overflow exceptions with 'linear' in 6.0.1

Hi Christian,

Thanks.  I'll see what I can do.  I think I understand the intention.... I 
guess my expectation was that the propagators do the necessary domain pruning 
themselves (like they do with integers), and I guess that this is not being 
done as there could be multiple ways of eliminating the overflow risk, so 
Gecode would in fact influence the results in some "random" way.

My fear is that unless I get to understand in detail what checks are being made 
by each constraint that I post, I'll run the risk of a runtime error, or that 
I'll unnecessarily reduce the solution space.

In my scenario, I have several arithmetic expressions (equations or the like) 
provided by the end user as input, and after parsing this into an AST I'm 
translating these to Gecode constraints.  The intermediates in the AST are 
"fresh" (unconstrained) variables.  Hopefully I can do some domain analysis 
upfront.... but it's still surprising to me, I would guess that e.g. the 
minizinc interface would also be impacted...

Cheers,
Filip

From: Christian Schulte [mailto:cschu...@kth.se]
Sent: Tuesday, August 28, 2018 4:56 PM
To: Konvicka Filip; 'users@gecode.org'
Subject: RE: Float overflow exceptions with 'linear' in 6.0.1

Hi,

This is not a bug: it is really a restriction compared to Gecode 5. You will 
have to do some thinking on the initial variable domains.

The implementation in Gecode 5 _was_ in fact broken: the overflow might not 
have occurred but the new checks make sure that there will never be an overflow.

Cheers
Christian

--
Christian Schulte, https://chschulte.github.io/
Professor of Computer Science
Software and  Computer Systems
School of Electrical Engineering and Computer Science
KTH Royal Institute of Technology, Sweden

From: users-boun...@gecode.org<mailto:users-boun...@gecode.org> 
<users-boun...@gecode.org<mailto:users-boun...@gecode.org>> On Behalf Of 
Konvicka Filip
Sent: 24 August 2018 09:48
To: 'users@gecode.org' <users@gecode.org<mailto:users@gecode.org>>
Subject: [gecode-users] Float overflow exceptions with 'linear' in 6.0.1

Hi,

I'm in process of upgrading our code to Gecode 6.0.1 (which looks great by the 
way!)

I found some cases where code that used to run fine with Gecode 5 now throws 
exceptions.  The following is a simple example that demonstrates this.  I was 
able to work around to defaulting to (Gecode::Float::Limits::max/4) as the 
default max bound of float variables, but I think it's still probably a bug.

Thanks,
Filip

#include <gecode/float.hh>
#include <iostream>
using namespace Gecode;
int main() {
  struct MySpace : public Space {
    Space* copy() { return nullptr;  }
  };
  MySpace s;

  try {
    FloatVarArgs args(2);
    args[0] = FloatVar(s, 0., Gecode::Float::Limits::max);
    args[1] = FloatVar(s, 0., Gecode::Float::Limits::max);
    FloatVar result(s, 0., Gecode::Float::Limits::max);
    linear(s, args, FRT_EQ, result);
  }
  catch (std::exception& e) {
    std::cerr << e.what() << "\n";
  }

  try {
    FloatVarArgs args(2);
    args[0] = FloatVar(s, 1., 1.);
    args[1] = FloatVar(s, 0., Gecode::Float::Limits::max);
    FloatVar result(s, 0., Gecode::Float::Limits::max);
    linear(s, args, FRT_EQ, result);
  }
  catch (std::exception& e) {
    std::cerr << e.what() << "\n";
  }
}
_______________________________________________
Gecode users mailing list
users@gecode.org
https://www.gecode.org/mailman/listinfo/gecode-users

Reply via email to