Boost logo

Boost Users :

Subject: Re: [Boost-users] [ICL] interval_map question
From: Joachim Faulhaber (afojgo_at_[hidden])
Date: 2011-05-25 10:45:21


Hi Antal,

the output of your program is correct. This is because interval_maps
do *not* store interval value pairs (I,v), if v==0 or more precisely,
if v is the identity element of the codomain_type of associated
values.

2011/5/25 Antal A. Buss <abuss_at_[hidden]>:
> Hi all,
>
> I'm trying to use interval_map to implement some kind of range to
> value directory, but I have some non expected results.
>
> The test code I'm using is:
> ------------------------
> #include <iostream>
> #include <boost/icl/interval_map.hpp>
> #include <boost/icl/discrete_interval.hpp>
>
> using namespace std;
> using namespace boost::icl;
>
> int main(int argc, char const **argv)
> {
>  interval_map<size_t, int> imap;

// use
interval_map<size_t, int, partial_enricher> imap;
// if you want to store zeroes as associated values.

>  typedef discrete_interval<size_t> interval_t;
>
>  imap += make_pair(construct<interval_t>(0, 7, interval_bounds::closed()),0);
>  cout << "imap: " << imap << endl;
>
>  imap.set(make_pair(construct<interval_t>(0, 0, interval_bounds::closed()),1));
>  cout << "imap: " << imap << endl;
>
>  imap.erase(construct<interval_t>(3, 3, interval_bounds::closed()));
>  cout << "imap: " << imap << endl;
> }
> ------------------------
>
> The result I got is:
>  imap: {}
>  imap: {([0,0]->1)}
>  imap: {([0,0]->1)}

Correct result, because [0,7]->0 is not stored. There is a MapTraits parameter
http://www.joachim-faulhaber.de/boost_icl/doc/libs/icl/doc/html/boost_icl/concepts/map_traits.html

Default for MapTraits is the value 'partial_absorber'. The _absorber
part of the name indicates, that interval-value-pairs associated to 0
are absorbed. So a segment of the interval_map "quantified" zero
disappears, keeping the map minimal.

If you need to store zeros, choose partial_enricher as MapTrait. It is
called _enricher, because (I,0)-segments, that may occur through
aggregating operations accumulate over time.

So using this type of interval map:
interval_map<size_t, int, partial_enricher> imap;

> but the result I was expecting is:
>  imap: {([0,7]->0)}
>  imap: {([0,0]->1)((0,7]->0)}
>  imap: {([0,0]->1)((0,3)->0)((3,7]->0)}

you will get the desired result.

Best regards,
Joachim

-- 
Interval Container Library [Boost.Icl]
http://www.joachim-faulhaber.de

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net