LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
expr_values.cpp
浏览该文件的文档.
1
#include "
expr.hpp
"
2
#include "
internal/symbolic_ast.hpp
"
3
#include "
internal/expr_common.hpp
"
4
#include "
internal/expression_analysis.hpp
"
5
#include "
internal/expression_construction.hpp
"
6
#include <cmath>
7
#include <exception>
8
#include <memory>
9
#include <string>
10
#include <utility>
11
12
namespace
LMCAS
{
13
14
using namespace
expr_detail::expr_common
;
15
16
std::optional<std::string_view>
symbol_name
(
const
ExprPtr
& expression)
noexcept
{
17
const
auto
*
variable
=
18
dynamic_cast<
const
VariableNode
*
>
(
detail::node
(expression).get());
19
if
(!
variable
||
variable
->is_constant())
return
std::nullopt;
20
return
variable
->name();
21
}
22
23
std::optional<RelationOp>
relation_op
(
const
ExprPtr
& expression)
noexcept
{
24
const
auto
*
relation
=
25
dynamic_cast<
const
RelationalNode
*
>
(
detail::node
(expression).get());
26
if
(!
relation
)
return
std::nullopt;
27
return
relation
->op();
28
}
29
30
ExprResult
sym
(
const
std::string&
name
) {
31
if
(
name
.empty()) {
32
return
expression_failure
(
CasErrc::InvalidArgument
,
33
"symbol name cannot be empty"
,
kSymOperation
);
34
}
35
if
(
is_reserved_symbol_name
(
name
)) {
36
if
(
detail::is_imaginary_unit_name
(
name
)) {
37
return
expression_failure
(
CasErrc::InvalidArgument
,
38
"imaginary unit symbol is reserved"
,
39
kSymOperation
);
40
}
41
return
expression_failure
(
CasErrc::InvalidArgument
,
42
"reserved mathematical constants cannot be shadowed"
,
43
kSymOperation
);
44
}
45
try
{
46
auto
expression = SymbolicExpr::variable(
name
);
47
if
(!expression) {
48
return
expression_failure
(
CasErrc::InternalInvariant
,
49
"symbol factory returned null"
,
kSymOperation
);
50
}
51
return
ExprResult::success
(std::move(expression));
52
}
catch
(
const
std::bad_alloc&) {
53
return
expression_failure
(
CasErrc::ResourceLimit
,
54
"symbol allocation failed"
,
kSymOperation
);
55
}
catch
(
const
std::exception& error) {
56
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
kSymOperation
);
57
}
58
}
59
60
ExprResult
integer
(
int
value
) {
61
try
{
62
return
ExprResult::success
(SymbolicExpr::number(
value
));
63
}
catch
(
const
std::bad_alloc&) {
64
return
expression_failure
(
CasErrc::ResourceLimit
,
65
"integer allocation failed"
,
kIntegerOperation
);
66
}
catch
(
const
std::exception& error) {
67
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
kIntegerOperation
);
68
}
69
}
70
71
ExprResult
integer
(
const
BigInt&
value
) {
72
try
{
73
return
ExprResult::success
(SymbolicExpr::number(
value
));
74
}
catch
(
const
std::bad_alloc&) {
75
return
expression_failure
(
CasErrc::ResourceLimit
,
76
"integer allocation failed"
,
kIntegerOperation
);
77
}
catch
(
const
std::exception& error) {
78
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
kIntegerOperation
);
79
}
80
}
81
82
ExprResult
rational
(
const
Rational&
value
) {
83
try
{
84
return
ExprResult::success
(SymbolicExpr::number(
value
));
85
}
catch
(
const
std::bad_alloc&) {
86
return
expression_failure
(
CasErrc::ResourceLimit
,
87
"rational allocation failed"
,
kRationalOperation
);
88
}
catch
(
const
std::exception& error) {
89
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
kRationalOperation
);
90
}
91
}
92
93
ExprResult
approx_real
(
double
value
) {
94
if
(!std::isfinite(
value
)) {
95
return
expression_failure
(
CasErrc::InvalidArgument
,
96
"approximate real must be finite"
,
kApproxOperation
);
97
}
98
try
{
99
return
ExprResult::success
(SymbolicExpr::number(
value
));
100
}
catch
(
const
std::bad_alloc&) {
101
return
expression_failure
(
CasErrc::ResourceLimit
,
102
"approximate real allocation failed"
,
kApproxOperation
);
103
}
catch
(
const
std::exception& error) {
104
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
kApproxOperation
);
105
}
106
}
107
108
ExprResult
pi
() {
109
return
detail::constant_expression
(
"pi"
);
110
}
111
112
ExprResult
e
() {
113
return
detail::constant_expression
(
"e"
);
114
}
115
116
ExprResult
phi
() {
117
return
detail::constant_expression
(
"phi"
);
118
}
119
120
ExprResult
imaginary_unit
() {
121
auto
zero =
integer
(0);
122
if
(!zero)
return
ExprResult::failure
(zero.error());
123
auto
one =
integer
(1);
124
if
(!one)
return
ExprResult::failure
(one.error());
125
return
complex
(zero.value(), one.value());
126
}
127
128
ExprResult
complex
(
ExprPtr
real
,
ExprPtr
imag
) {
129
if
(!
real
|| !
imag
) {
130
return
expression_failure
(
CasErrc::InvalidArgument
,
131
"complex expression parts cannot be null"
,
132
kComplexOperation
);
133
}
134
try
{
135
auto
node =
SymbolicFactory::create_complex
(
LMCAS::detail::node
(
real
),
136
LMCAS::detail::node
(
imag
));
137
return
ExprResult::success
(
LMCAS::detail::make_expression_ptr
(std::move(node)));
138
}
catch
(
const
std::bad_alloc&) {
139
return
expression_failure
(
CasErrc::ResourceLimit
,
140
"complex expression allocation failed"
,
141
kComplexOperation
);
142
}
catch
(
const
std::exception& error) {
143
return
expression_failure
(
CasErrc::InternalInvariant
, error.what(),
144
kComplexOperation
);
145
}
146
}
147
148
}
LMCAS::RelationalNode
定义
relations.hpp:6
LMCAS::Result< ExprPtr >::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::Result< ExprPtr >::success
static Result success(ExprPtr value)
定义
result.hpp:48
LMCAS::SymbolicFactory::create_complex
static std::shared_ptr< const SymbolicNode > create_complex(std::shared_ptr< const SymbolicNode > real, std::shared_ptr< const SymbolicNode > imag)
创建复数节点,自动简化(若虚部为 0,则返回实部).
定义
symbolic_factory.cpp:167
LMCAS::VariableNode
变量节点,表示一个符号变量。
定义
arithmetic.hpp:10
expr.hpp
expr_common.hpp
expression_analysis.hpp
expression_construction.hpp
LMCAS::detail::is_imaginary_unit_name
bool is_imaginary_unit_name(const std::string &name)
定义
expression_analysis.cpp:302
LMCAS::detail::make_expression_ptr
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
定义
base.hpp:111
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::constant_expression
ExpressionResult constant_expression(const char *name)
定义
symbolic_construction.cpp:30
LMCAS::expr_detail::expr_common
定义
expr_facade.cpp:12
LMCAS::expr_detail::expr_common::kIntegerOperation
constexpr const char * kIntegerOperation
定义
expr_common.hpp:13
LMCAS::expr_detail::expr_common::kSymOperation
constexpr const char * kSymOperation
定义
expr_common.hpp:12
LMCAS::expr_detail::expr_common::kApproxOperation
constexpr const char * kApproxOperation
定义
expr_common.hpp:15
LMCAS::expr_detail::expr_common::kComplexOperation
constexpr const char * kComplexOperation
定义
expr_common.hpp:16
LMCAS::expr_detail::expr_common::kRationalOperation
constexpr const char * kRationalOperation
定义
expr_common.hpp:14
LMCAS::expr_detail::expr_common::expression_failure
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
定义
expr_facade.cpp:13
LMCAS::expr_detail::expr_common::is_reserved_symbol_name
bool is_reserved_symbol_name(const std::string &name)
定义
expr_facade.cpp:99
LMCAS
定义
assumption.hpp:11
LMCAS::variable
const std::string & variable
定义
expr.hpp:286
LMCAS::imaginary_unit
ExprResult imaginary_unit()
定义
expr_values.cpp:120
LMCAS::e
ExprResult e()
定义
expr_values.cpp:112
LMCAS::integer
ExprResult integer(Integer)=delete
LMCAS::real
ExprResult real(const ExprPtr &expression, ComputationContext &context)
定义
expr_arithmetic.cpp:98
LMCAS::approx_real
ExprResult approx_real(double value)
定义
expr_values.cpp:93
LMCAS::CasErrc::InvalidArgument
@ InvalidArgument
定义
result.hpp:13
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::ExprResult
Result< ExprPtr > ExprResult
定义
expr.hpp:28
LMCAS::complex
ExprResult complex(ExprPtr real, ExprPtr imag)
定义
expr_values.cpp:128
LMCAS::symbol_name
std::optional< std::string_view > symbol_name(const ExprPtr &expression) noexcept
定义
expr_values.cpp:16
LMCAS::imag
ExprPtr imag
定义
expr.hpp:144
LMCAS::ExprPtr
std::shared_ptr< SymbolicExpr > ExprPtr
定义
conditional_result.hpp:19
LMCAS::sym
ExprResult sym(const std::string &name)
定义
expr_values.cpp:30
LMCAS::pi
ExprResult pi()
定义
expr_values.cpp:108
LMCAS::relation
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
定义
expr_facade.cpp:174
LMCAS::value
const std::string const ExprPtr & value
定义
expr.hpp:293
LMCAS::phi
ExprResult phi()
定义
expr_values.cpp:116
LMCAS::name
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
定义
equivalence_options.hpp:41
LMCAS::rational
ExprResult rational(const Rational &value)
定义
expr_values.cpp:82
LMCAS::relation_op
std::optional< RelationOp > relation_op(const ExprPtr &expression) noexcept
定义
expr_values.cpp:23
symbolic_ast.hpp
内部 AST 定义。
src
expr_values.cpp
生成于
, 为 LMCAS使用
1.18.0