SMT-RAT  24.02
Toolbox for Strategic and Parallel Satisfiability-Modulo-Theories Solving
smtrat-cadcells.h
Go to the documentation of this file.
1 namespace smtrat {
2 
3 /**
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  */
24 namespace 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  */
85 namespace datastructures {
86 
87 }
88 
89 // docs are in operators/operator.h
90 namespace operators {
91 
92 }
93 
94 // docs are in representation/heuristics.h
95 namespace representation {
96 
97 }
98 
99 /**
100  * Various algorithms as well as helper functions for developing new algorithms.
101  */
102 namespace algorithms {
103 
104 }
105 
106 }
107 }
Class to create the formulas for axioms.