LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
facts_query_adapters.cpp
浏览该文件的文档.
1
#include "
internal/facts_query.hpp
"
2
#include "
computation_context.hpp
"
3
#include "
internal/expression_analysis.hpp
"
4
#include "
internal/rewrite_budget.hpp
"
5
6
#include <limits>
7
#include <new>
8
9
namespace
LMCAS::detail
{
10
11
Result<bool>
ScopedFacts::shadows
(
const
std::shared_ptr<const SymbolicNode>&
node
,
12
ComputationContext
&
context
)
const
{
13
auto
access =
context
.consume_steps(0,
"facts.scoped"
);
14
if
(!access) {
return
Result<bool>::failure
(access.error()); }
15
try
{
16
RewriteBudget
budget
(
context
,
context
.limits().max_recursion_depth,
17
std::numeric_limits<std::size_t>::max(),
"facts.scoped"
);
18
return
expression_depends_on_variable
(
node
,
bound_name_
, &
budget
);
19
}
catch
(
const
CasError
& error) {
20
return
Result<bool>::failure
(error);
21
}
catch
(
const
std::bad_alloc&) {
22
return
Result<bool>::failure
(
CasErrc::ResourceLimit
,
23
"scoped facts allocation failed"
,
"facts.scoped"
);
24
}
25
}
26
27
Result<Tribool>
ScopedFacts::is_positive
(
const
std::shared_ptr<const SymbolicNode>&
node
,
28
ComputationContext
&
context
)
const
{
29
auto
hidden =
shadows
(
node
,
context
);
30
if
(!hidden) {
return
Result<Tribool>::failure
(hidden.error()); }
31
return
hidden.value() ?
Result<Tribool>
(
Tribool::Unknown
) :
outer_
.
is_positive
(
node
,
context
);
32
}
33
34
Result<Tribool>
ScopedFacts::is_negative
(
const
std::shared_ptr<const SymbolicNode>&
node
,
35
ComputationContext
&
context
)
const
{
36
auto
hidden =
shadows
(
node
,
context
);
37
if
(!hidden) {
return
Result<Tribool>::failure
(hidden.error()); }
38
return
hidden.value() ?
Result<Tribool>
(
Tribool::Unknown
) :
outer_
.
is_negative
(
node
,
context
);
39
}
40
41
Result<Tribool>
ScopedFacts::is_nonnegative
(
const
std::shared_ptr<const SymbolicNode>&
node
,
42
ComputationContext
&
context
)
const
{
43
auto
hidden =
shadows
(
node
,
context
);
44
if
(!hidden) {
return
Result<Tribool>::failure
(hidden.error()); }
45
return
hidden.value() ?
Result<Tribool>
(
Tribool::Unknown
) :
outer_
.
is_nonnegative
(
node
,
context
);
46
}
47
48
Result<Tribool>
ScopedFacts::is_nonzero
(
const
std::shared_ptr<const SymbolicNode>&
node
,
49
ComputationContext
&
context
)
const
{
50
auto
hidden =
shadows
(
node
,
context
);
51
if
(!hidden) {
return
Result<Tribool>::failure
(hidden.error()); }
52
return
hidden.value() ?
Result<Tribool>
(
Tribool::Unknown
) :
outer_
.
is_nonzero
(
node
,
context
);
53
}
54
55
Result<Tribool>
ScopedFacts::is_real
(
const
std::shared_ptr<const SymbolicNode>&
node
,
56
ComputationContext
&
context
)
const
{
57
auto
hidden =
shadows
(
node
,
context
);
58
if
(!hidden) {
return
Result<Tribool>::failure
(hidden.error()); }
59
return
hidden.value() ?
Result<Tribool>
(
Tribool::Unknown
) :
outer_
.
is_real
(
node
,
context
);
60
}
61
62
namespace
{
63
64
class
NoFacts
final :
public
FactsQuery
{
65
public
:
66
Result<Tribool>
is_positive
(
const
std::shared_ptr<const SymbolicNode>&,
ComputationContext
&
context
)
const override
{
67
return
unknown
(
context
);
68
}
69
70
Result<Tribool>
is_negative
(
const
std::shared_ptr<const SymbolicNode>&,
ComputationContext
&
context
)
const override
{
71
return
unknown
(
context
);
72
}
73
74
Result<Tribool>
is_nonnegative
(
const
std::shared_ptr<const SymbolicNode>&,
ComputationContext
&
context
)
const override
{
75
return
unknown
(
context
);
76
}
77
78
Result<Tribool>
is_nonzero
(
const
std::shared_ptr<const SymbolicNode>&,
ComputationContext
&
context
)
const override
{
79
return
unknown
(
context
);
80
}
81
82
Result<Tribool>
is_real
(
const
std::shared_ptr<const SymbolicNode>&,
ComputationContext
&
context
)
const override
{
83
return
unknown
(
context
);
84
}
85
86
private
:
87
static
Result<Tribool>
unknown
(
ComputationContext
&
context
) {
88
auto
access =
context
.consume_steps(0,
"facts.empty"
);
89
if
(!access) {
return
Result<Tribool>::failure
(access.error()); }
90
return
Tribool::Unknown
;
91
}
92
};
93
94
}
95
96
const
FactsQuery
&
no_facts
() noexcept {
97
static
const
NoFacts
facts
;
98
return
facts
;
99
}
100
101
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::FactsQuery
定义
facts_query.hpp:16
LMCAS::FactsQuery::is_real
virtual Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
LMCAS::FactsQuery::is_nonnegative
virtual Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
LMCAS::FactsQuery::is_positive
virtual Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
LMCAS::FactsQuery::is_nonzero
virtual Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
LMCAS::FactsQuery::is_negative
virtual Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
LMCAS::Result
定义
result.hpp:39
LMCAS::Result::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::detail::RewriteBudget
定义
rewrite_budget.hpp:15
LMCAS::detail::ScopedFacts::bound_name_
const std::string bound_name_
定义
facts_query.hpp:49
LMCAS::detail::ScopedFacts::is_real
Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
定义
facts_query_adapters.cpp:55
LMCAS::detail::ScopedFacts::is_nonzero
Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
定义
facts_query_adapters.cpp:48
LMCAS::detail::ScopedFacts::is_negative
Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
定义
facts_query_adapters.cpp:34
LMCAS::detail::ScopedFacts::shadows
Result< bool > shadows(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const
定义
facts_query_adapters.cpp:11
LMCAS::detail::ScopedFacts::is_positive
Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
定义
facts_query_adapters.cpp:27
LMCAS::detail::ScopedFacts::outer_
const FactsQuery & outer_
定义
facts_query.hpp:48
LMCAS::detail::ScopedFacts::is_nonnegative
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
定义
facts_query_adapters.cpp:41
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts
定义
facts_query_adapters.cpp:64
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::is_positive
Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
定义
facts_query_adapters.cpp:66
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::is_nonzero
Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
定义
facts_query_adapters.cpp:78
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::is_real
Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
定义
facts_query_adapters.cpp:82
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::unknown
static Result< Tribool > unknown(ComputationContext &context)
定义
facts_query_adapters.cpp:87
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::is_negative
Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
定义
facts_query_adapters.cpp:70
LMCAS::detail::anonymous_namespace{facts_query_adapters.cpp}::NoFacts::is_nonnegative
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &, ComputationContext &context) const override
定义
facts_query_adapters.cpp:74
computation_context.hpp
expression_analysis.hpp
facts_query.hpp
LMCAS::detail
多元 Hensel 提升(单变量步)
定义
assumption_context.hpp:31
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::no_facts
const FactsQuery & no_facts() noexcept
定义
facts_query_adapters.cpp:96
LMCAS::detail::facts
RewriteBudget const FactsQuery & facts
定义
expression_transform.hpp:17
LMCAS::detail::budget
RewriteBudget & budget
定义
expression_transform.hpp:16
LMCAS::detail::context
std::size_t std::size_t ComputationContext & context
定义
exact_algebraic.hpp:27
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::expression_depends_on_variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
定义
expression_analysis.cpp:319
LMCAS::Tribool::Unknown
@ Unknown
Property cannot be determined
定义
assumption.hpp:53
LMCAS::CasError
定义
result.hpp:31
rewrite_budget.hpp
src
facts_query_adapters.cpp
生成于
, 为 LMCAS使用
1.18.0