|
Boost Users : |
Subject: Re: [Boost-users] [Review] ITL review starts today, February 18th
From: Joachim Faulhaber (afojgo_at_[hidden])
Date: 2010-02-23 16:13:34
2010/2/23 Mathias Gaunard <mathias.gaunard_at_[hidden]>:
> Hartmut Kaiser wrote:
>
>> Interval containers allow to access and manipulate collections of
>> intervals
>> on an abstract level as sets and maps (of elements), but also to exploit
>> segmental information that is given by the interval borders. Interval
>> containers are fairly generic. They can be instantiated with discrete
>> domain
>> (or key) types like integral numeric types or boost::date or time types.
>> But
>> they also work with continuous domain types like double, rational or
>> string.
>> Using the latter allows to represent infinite sets and maps.
>>
>> The interface of the interval containers strives to be very intuitive and
>> in
>> line with the stl and other boost libraries.
>>
>> * The set theoretic operations union, difference, intersection
>> and symmetric difference are available as operators for all
>> interval containers and for many useful overloads between them.
>
> I have no knowledge of the problem domain (nor did I actually look at the
> library yet, sorry about that), but I simply have a question: how does this
> compare to geometry libraries or spatial indexes that provide that kind of
> facilities for arbitrary dimensions?
>
> I certainly wouldn't want to force over-generalization to the authors, but I
> am wondering how much is gained by limiting things to one dimension.
So can this library survive in a field of power called boost of an ever
abstracting ever generalizing and ever optimizing bunch of thinkers?
A few points:
* Geometry usually is based on a numeric coordinate type
that comes with a distance measure. Many algorithms in
geometry libraries rely on that. Intervals and interval containers
of the ITL, similar to SortedAssociativeContainers, only require a
strict weak ordering on their key type. So interval containers
are less restricted and allow for a larger class of instantiations.
You may for example want to work with interval sets of strings.
* Interval containers implement interval combining styles that
can be useful in providing and manipulating certain time grids. E.g.
http://www.herold-faulhaber.de/boost_itl/doc/libs/itl/doc/html/boost_itl/examples/time_grids_for_months_and_weeks.html
I'm not aware of something like that in geometry.
* There are not only interval sets but also interval maps.
itl::interval_map is the real workhorse in those real world
applications that already exist. interval_maps provide a
general idiom of aggregation of associated values. This
idiom is very useful for computing statistical data through
aggregation that occur in time.
* Sometimes a more simple and basic class of data structures
is advantageous. It may be simpler to implement
optimizations. Like Lukes Manhattan integral polygons
compared to more general GGL polygons.
* Transfer of geometry knowledge to the more simple models
of interval sets and maps may be a step users may not
come up with.
* The basic set and map concepts of the ITL allow for a
variety of applications that may go beyond the scope of
geometry. One such example is the self compressing
large bitset, which not really has the look and feel of
geometry ...
http://www.herold-faulhaber.de/boost_itl/doc/libs/itl/doc/html/boost_itl/projects.html
... or the example of a system of authorisations. See
the example user_groups
http://www.herold-faulhaber.de/boost_itl/doc/libs/itl/doc/html/boost_itl/examples/user_groups.html
* Well known data structures from geometry like interval_tree or
spatial indices do have different focuses and different applications.
An interval_tree is more space efficient than an interval_map that
can computes all overlaps at once. This may be desired if you
need all of them. If you don't and you have reoccurring arbitrary
stabbing queries interval_trees are the better choice.
* itl::Maps are defining a generalized addition, which I think
is a quite powerful feature that accounts for most of the
goodies in the applications that we have done. This addition
function is a generalisation of the common insert function on
SortedAssociativeContainers and it introduces the aggregating
properties of itl::Maps. The aggregate on overlap idiom is
independent of the question, if the domain_type of the
map or interval_map is a scalar or a tuple (has dimensions)
or something else. There are already interesting applications
of aggregations using itl::maps of tuples, but this exceeds the
scope of the core library.
Cheers,
Joachim
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