LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
integral.hpp
浏览该文件的文档.
1
/** @file internal/symbolic_ast/integral.hpp */
2
#pragma once
3
4
#include "
internal/symbolic_ast/relations.hpp
"
5
6
namespace
LMCAS
{
7
8
class
IntegralNode
:
public
SymbolicNode
{
9
private
:
10
template
<
typename
Node,
typename
... Args>
11
friend
std::shared_ptr<const Node>
12
LMCAS::detail::make_node
(Args&&... args);
13
const
std::shared_ptr<const SymbolicNode>
body_
;
14
const
std::string
variable_
;
15
const
std::shared_ptr<const SymbolicNode>
lower_
;
16
const
std::shared_ptr<const SymbolicNode>
upper_
;
17
18
IntegralNode
(std::shared_ptr<const SymbolicNode>
body
,
19
std::string
variable
,
20
std::shared_ptr<const SymbolicNode>
lower
=
nullptr
,
21
std::shared_ptr<const SymbolicNode>
upper
=
nullptr
)
22
:
body_
(std::move(
body
)),
variable_
(std::move(
variable
)),
23
lower_
(std::move(
lower
)),
upper_
(std::move(
upper
)) {
24
if
(!
body_
)
throw
std::invalid_argument(
"integral body cannot be null"
);
25
if
(
variable_
.empty())
throw
std::invalid_argument(
"integral variable cannot be empty"
);
26
if (
static_cast<
bool
>
(
lower_
) !=
static_cast<
bool
>
(
upper_
)) {
27
throw
std::invalid_argument(
"integral bounds must both be present or absent"
);
28
}
29
}
30
31
public
:
32
const
auto
&
body
() const noexcept {
return
body_
; }
33
const
std::string&
variable
() const noexcept {
return
variable_
; }
34
const
auto
&
lower
() const noexcept {
return
lower_
; }
35
const
auto
&
upper
() const noexcept {
return
upper_
; }
36
bool
is_definite
() const noexcept {
return
lower_
&&
upper_
; }
37
int
type_priority
()
const override
{
return
108; }
38
39
protected
:
40
std::size_t
compute_hash
()
const override
{
41
std::size_t seed =
static_cast<
std::size_t
>
(
type_priority
());
42
hash_combine
(seed,
body_
->hash());
43
hash_combine
(seed, std::hash<std::string>{}(
variable_
));
44
if
(
lower_
)
hash_combine
(seed,
lower_
->hash());
45
if
(
upper_
)
hash_combine
(seed,
upper_
->hash());
46
return
seed;
47
}
48
49
int
compare_same_type
(
const
SymbolicNode
& other)
const override
{
50
const
auto
& integral =
static_cast<
const
IntegralNode
&
>
(other);
51
int
comparison =
variable_
.compare(integral.variable_);
52
if
(comparison != 0) {
53
return
comparison;
54
}
55
comparison =
body_
->compare(*integral.body_);
56
if
(comparison != 0) {
57
return
comparison;
58
}
59
if
(
is_definite
() != integral.is_definite()) {
60
return
is_definite
() ? 1 : -1;
61
}
62
if
(!
is_definite
()) {
63
return
0;
64
}
65
comparison =
lower_
->compare(*integral.lower_);
66
return
comparison != 0 ? comparison :
upper_
->compare(*integral.upper_);
67
}
68
69
public
:
70
void
accept
(
LMCAS::detail::SymbolicVisitor
& visitor)
const override
{
71
LMCAS::detail::SymbolicVisitor::DepthGuard
guard(visitor);
72
visitor.
visit
(*
this
);
73
}
74
75
std::shared_ptr<const SymbolicNode>
clone
()
const override
{
76
return
LMCAS::detail::make_node<IntegralNode>
(
77
body_
->clone(),
variable_
,
78
lower_
?
lower_
->clone() :
nullptr
,
79
upper_
?
upper_
->clone() :
nullptr
);
80
}
81
};
82
83
}
LMCAS::IntegralNode::lower_
const std::shared_ptr< const SymbolicNode > lower_
定义
integral.hpp:15
LMCAS::IntegralNode::body
const auto & body() const noexcept
定义
integral.hpp:32
LMCAS::IntegralNode::upper
const auto & upper() const noexcept
定义
integral.hpp:35
LMCAS::IntegralNode::type_priority
int type_priority() const override
定义
integral.hpp:37
LMCAS::IntegralNode::upper_
const std::shared_ptr< const SymbolicNode > upper_
定义
integral.hpp:16
LMCAS::IntegralNode::lower
const auto & lower() const noexcept
定义
integral.hpp:34
LMCAS::IntegralNode::compare_same_type
int compare_same_type(const SymbolicNode &other) const override
定义
integral.hpp:49
LMCAS::IntegralNode::IntegralNode
IntegralNode(std::shared_ptr< const SymbolicNode > body, std::string variable, std::shared_ptr< const SymbolicNode > lower=nullptr, std::shared_ptr< const SymbolicNode > upper=nullptr)
定义
integral.hpp:18
LMCAS::IntegralNode::is_definite
bool is_definite() const noexcept
定义
integral.hpp:36
LMCAS::IntegralNode::body_
const std::shared_ptr< const SymbolicNode > body_
定义
integral.hpp:13
LMCAS::IntegralNode::variable
const std::string & variable() const noexcept
定义
integral.hpp:33
LMCAS::IntegralNode::variable_
const std::string variable_
定义
integral.hpp:14
LMCAS::IntegralNode::compute_hash
std::size_t compute_hash() const override
定义
integral.hpp:40
LMCAS::IntegralNode::clone
std::shared_ptr< const SymbolicNode > clone() const override
定义
integral.hpp:75
LMCAS::IntegralNode::accept
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
定义
integral.hpp:70
LMCAS::SymbolicNode::SymbolicNode
SymbolicNode()=default
LMCAS::detail::SymbolicVisitor
定义
base.hpp:216
LMCAS::detail::SymbolicVisitor::visit
virtual void visit(const NumberNode &node)=0
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS
定义
assumption.hpp:11
LMCAS::hash_combine
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.
定义
base.hpp:144
relations.hpp
LMCAS::detail::SymbolicVisitor::DepthGuard
定义
base.hpp:227
src
internal
symbolic_ast
integral.hpp
生成于
, 为 LMCAS使用
1.18.0