[gecode-users] int vs. unsigned int for Matrix dimensions
Gregory Crosswhite
gcross at phys.washington.edu
Mon Jan 24 22:57:13 CET 2011
Oops, I just realized that I forgot to include in the patch an extra
line in Makefile.in to install the new header. The amended patch is
attached to this e-mail.
Also, I forgot in my previous to mention that also included in the patch
is a test for the WrapVal iterator in test/iter.hpp; that test program
includes checks on some of the examples that I described in the e-mail
to make sure that they have the expected result.
Cheers,
Greg
On 01/24/2011 12:12 PM, Gregory Crosswhite wrote:
> Well then, I am glad that I got the patch ready over the weekend. :-)
>
> The patch has been attached to this e-mail as the file "patch"; it is
> the result of running "svn diff" against revision 11556.
>
> I have modified "gecode/kernel/array.hpp" along the lines that we
> discussed, and have added a new test to your suite under
> "test/array.cpp" to verify that it works as expected.
>
> While I was add it, I added another feature. The patch includes a
> file "gecode/iter/wrap-val.hpp" (and a patch to "gecode/iter.hh" to
> include this file) which contains an iterator class "WrapVal" that
> wraps another iterator and upon dereferencing returns the the result
> of calling ".val()" on the dereferenced wrapped iterator, as well as a
> function "wrap_val" that is a convenience function for constructing a
> "WrapVal" (since this causes the template parameters to automatically
> be inferred).
>
> That might sound complicated, but the point of it is to allow someone
> to do the following:
>
> #include <algorithm>
> #include <gecode/iter.hh>
> #include <iterator>
> #include <vector>
> ...
> using namespace Gecode;
> using namespace Gecode::Iter;
> using namespace std;
> ...
> IntVarArray a;
> ...
> vector<int> v;
> copy(wrap_val(a.begin()),wrap_val(a.end()),back_inserter(x));
>
> which has the effect of copying all of the values from the array a
> into the vector v, since a.begin() returns an iterator that
> dereferences to an IntVar and wrap_val(a.begin()) returns a wrapped
> iterator that returns the result of calling .val() on the IntVar.
>
> The basic use case of the iterators is as follows:
>
> IntVarArgs a;
> ...
> for(IntVarArgs::iterator i = a.begin(); i != a.end(); ++i) {
> rel(space,*i,IRT_EQ,0); }
>
> Of course, you could more easily do this with rel(space,a,IRT_EQ,0).
> A more interesting example is:
>
> IntVarArgs a;
> ...
> for(IntVarArgs::iterator i = a.begin(); i != a.end()-1; ++i) {
> rel(space,*i > *(i+1)+2); }
>
> More powerfully, iterators give you the ability to work with STL
> algorithms:
>
> #include <algorithm>
> ...
> void f(IntVar& v) { ... }
> ...
> IntVarArgs a;
> ...
> std::for_each(a.begin(),a.end(),f);
>
> The iterators returned by a.begin() and a.end() dereference to a
> reference to an IntVar/BoolVar (or a view in the case of ViewArray).
> If you are interested in iterating over the *values* of the array ---
> that is, the value currently assigned to to each variable then you can
> use the function wrap_val to wrap these iterators so that
> dereferencing them returns the value assigned to the variable. For
> example, the last two lines in the following have exactly the same
> result:
>
> #include <algorithm>
> #include <iostream>
> ...
> void f(IntVar& v) { std::cout << v.val() << " "; }
> void g(int i) { std::cout << i << " "; }
> ...
> IntVarArgs a;
> ...
> std::for_each(a.begin(),a.end(),f); std::cout << std::endl;
> std::for_each(wrap_val(a.begin()),wrap_val(a.end()),g); std::cout
> << std::endl;
>
> Or if you want to copy the values assigned to the variables into a
> std::vector:
>
> #include <algorithm>
> #include <iterator>
> #include <vector>
> ...
> IntVarArray a;
> ...
> std::vector<int> v;
>
> std::copy(wrap_val(a.begin()),wrap_val(a.end()),std::back_inserter(x));
>
> Or if you are interested in computing the sum of the values in the
> variables:
>
> #include <numeric>
> ...
> IntVarArray a;
> ...
> int sum = std::accumulate(wrap_val(a.begin()),wrap_val(a.end()),0);
>
> Or alternatively if you are interested in counting the number of zeros
> in the variables:
>
> #include <algorithm>
> ...
> IntVarArray a;
> ...
> unsigned int number_of_zeros =
> std::count(wrap_val(a.begin()),wrap_val(a.end()),0);
>
> ===
>
> Anyway, I hope that this patch can make it into Gecode this week; you
> have my official permission to release it under whatever license
> Gecode uses.
>
> Let me know if you have any questions! :-)
>
> Cheers,
> Gregory Crosswhite
>
>
>
> On 01/24/2011 10:54 AM, Christian Schulte wrote:
>> Christian Schulte<cschulte at ...> writes:
>>
>> Hi again,
>>
>> There is one thing I forgot to say: we intend to release end of this
>> week
>> (hopefully). So if your patch arrives until then, it'll be included
>> in the
>> next version.
>>
>> Cheers
>> Christian
>>
>>
>>
>>
>> _______________________________________________
>> Gecode users mailing list
>> users at gecode.org
>> https://www.gecode.org/mailman/listinfo/gecode-users
>
>
>
>
>
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20110124/693199fc/attachment-0001.htm>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch2
URL: <http://www.gecode.org/pipermail/users/attachments/20110124/693199fc/attachment-0001.asc>
More information about the users
mailing list