4 * @brief A framework for sample-based CAD algorithms.
5 *
6 * This is a highly modular framework for sample-based CAD algorithms, i.e. single cell construction and coverings.
7 *
8 * The basic idea is to have properties (of some polynomials or real root functions); each property has a level w.r.t. to a variable ordering (i.e. the index of the main variable of a polynomial) and rules operating on them, each replacing a property by a "simpler" set of properties (eventually reducing the level).
9 * At some stage, we delineate properties (that is, ordering the root under a partial sample), determine an ordering and cell boundaries (called representation) to continue proving properties. For more details on the general framework, we refer to the paper.
10 *
11 * The structure of this implementation is as follows:
12 *
13 * - @ref cadcells::datastructures contains the main datastructures. Read here for more details on the general structure of the framework.
14 * - @ref cadcells::operators defines the properties, the rules and methods to delineate properties. These are used by operators which provide an interface for performing projections on certain steps.
15 * - @ref cadcells::representation provides heuristics for computing the representations for cells, coverings and delineations.
16 * - @ref cadcells::algorithms contains helper methods, building blocks for algorithms as well as algorithms themselves. Go here for usage of the framework and high-level interfaces.
17 *
18 *
19 * ## Quick start
20 *
21 * For an introduction, we refer to the code of @ref algorithms::onecell.
22 *
23 */
24namespace cadcells {
25
26/**
27 * @brief Main datastructures.
28 *
29 * ## Polynomials and projection results
30 * We assume a fixed variable ordering @ref VariableOrdering.
31 * All polynomials are pooled in @ref PolyPool w.r.t. this ordering, that is, they are identified by a @ref PolyRef (a pair of the polynomial's level and an ID on this level).
32 * Projection results are cached in @ref Projections. The latter holds a reference to a @ref PolyPool. An instance @ref Projections will be required for all kinds of operations and passed during various function calls. Thus, we initialize these data structures as follows:
33 *
34 * VariableOrdering vars; // a variable ordering of all variables that will occur.
35 * datastructures::PolyPool pool(vars);
36 * datastructures::Projections proj(pool);
37 *
38 * Note that @ref PolyPool and @ref Projections do not do reference counting; the cache needs to be cleared explicitly, see @ref Projections::clear_cache and @ref Projections::clear_assignment_cache.
39 *
40 * ## Basic datastructures
41 *
42 * The basic datastructures for representing mathematical objects are @ref datastructures::IndexedRoot, @ref datastructures::SymbolicInterval, @ref datastructures::CoveringDescription, and @ref datastructures::IndexedRootOrdering.
43 *
44 * ## Properties
45 *
46 * @ref datastructures::PropertiesT is the datastructure for storing properties on a single level.
47 *
48 * If you work on an algorithm using this framework, you don't need to know this datastructure. If you need to implement a new property, then you find the interfaces a property needs to implement there.
49 *
50 * ## Delineations
51 *
52 * @ref datastructures::Delineation is the datastructure for storing the delineation of the indexed roots that stem from properties.
53 *
54 * If you work on an algorithm using this framework, you don't need to know this datastructure. If you need to implement a new property or a heuristic for describing a cell (i.e. compute a representation), then you might be interested in this.
55 *
56 * ## Derivations
57 *
58 * In the derivation datastructures, all data regarding the derivation is stored - that is the current sample points, the set of properties, the delineation of roots and the possible cell boundaries.
59 *
60 * This datastructure is recursive, that is, each derivation object handles only a single level and holds a pointer to a derivation object of the next lower level (the underyling derivation). All operations are forwarded to lower levels whenever neccessary.
61 *
62 * Furthermore, there are three types of derivations:
63 * - @ref datastructures::BaseDerivation assumes no sample point or whatever. It simply stores properties.
64 * - @ref datastructures::DelineatedDerivation extends the @ref datastructures::BaseDerivation; it requires that the underlying derivation is a @ref datastructures::SampledDerivation, thus a sample for all lower levels is present under which the properties of the current level can be delineated (i.e. their zeros can be isolated and sorted).
65 * - @ref datastructures::SampledDerivation extends the @ref datastructures::DelineatedDerivation, thus a full sample point is available for which a cell can be isolated.
66 * The derivation datastructures are thus two-dimensional recursive. Note that multiple derivation objects can have common underlying cells or even share the same base or delineated derivation.
67 *
68 * @ref datastructures::DerivationRef allows to reference a derivation independent of its type.
69 *
70 * For initializing derivations properly, use @ref datastructures::make_derivation. To create a sampled derivation from a delineated derivation and a sample, use @ref datastructures::make_sampled_derivation. For merging underlying derivations, use @ref datastructures::merge_underlying.
71 *
72 * For more information on memory management read @ref datastructures::DerivationRef.
73 *
74 * ## Representations
75 *
76 * The derivation objects do not store heuristic decisions, they just describe the current state. At some point, a representation of this state needs to be determined that is passed to the operator. This heuristic decision is stored in @ref datastructures::CellRepresentation or @ref datastructures::CoveringRepresentation.
77 *
78 * The heuristics for computing representations are in @ref representation.
79 *
80 * ## Operators
81 *
82 * The @ref operators work on derivations and representations.
83 *
84 */
85namespace datastructures {
86
87 }
88
89// docs are in operators/operator.h
90namespace operators {
91
92 }
93
94// docs are in representation/heuristics.h
95namespace representation {
96
97 }
98
99/**
100 * Various algorithms as well as helper functions for developing new algorithms.