LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expr_serialization_common.hpp
浏览该文件的文档.
1#pragma once
2
6
7#include <array>
8#include <string_view>
9
11
12inline constexpr std::string_view kHeader = "LMCAS_EXPR/1\n";
13inline constexpr const char* kEncode = "LMCAS.serialize_expr";
14inline constexpr const char* kDecode = "LMCAS.parse_serialized_expr";
16
17// These names, not the C++ enum ordinals, are the wire values.
18inline constexpr std::array<std::string_view, 36> kFunctions = {
19 "sin", "cos", "tan", "cot", "sec", "csc", "asin", "acos", "atan",
20 "sinh", "cosh", "tanh", "ln", "log", "abs", "sqrt", "exp",
21 "lambert_w", "atan2", "infinity", "erf", "ei", "si", "ci", "li",
22 "max", "min", "sgn", "floor", "ceil", "round", "real", "imag",
23 "conjugate", "complex_abs", "complex_arg"
24};
25inline constexpr std::array<std::string_view, 6> kRelations = {
26 "eq", "neq", "lt", "gt", "leq", "geq"
27};
28inline constexpr std::array<std::string_view, 4> kLogic = {
29 "and", "or", "not", "implies"
30};
31inline constexpr std::array<std::string_view, 5> kTransforms = {
32 "laplace", "inverse_laplace", "fourier", "inverse_fourier", "z"
33};
34inline constexpr std::array<std::string_view, 2> kQuantifiers = {"forall", "exists"};
35inline constexpr std::array<std::string_view, 3> kDirections = {
36 "both", "below", "above"
37};
38
39template <typename Enum, std::size_t N>
40std::string_view enum_name(Enum value, const std::array<std::string_view, N>& names,
41 const char* operation) {
42 auto index = static_cast<std::size_t>(value);
43 if (index >= names.size()) {
44 throw CasError{CasErrc::UnsupportedExpression, "unsupported expression operator", operation};
45 }
46 return names[index];
47}
48
49inline void check(Result<void> result) {
50 if (!result) throw result.error();
51}
52
53class Recursion {
54public:
55 Recursion(ComputationContext& context, const char* operation)
56 : context_(context) {
57 check(context_.enter_recursion(operation));
58 }
60 Recursion(const Recursion&) = delete;
61 Recursion& operator=(const Recursion&) = delete;
62private:
64};
65
66} // namespace LMCAS::serialization_detail
Result< void > enter_recursion(const std::string &operation={})
CasError & error()
Recursion(const Recursion &)=delete
Recursion(ComputationContext &context, const char *operation)
Recursion & operator=(const Recursion &)=delete
std::shared_ptr< const SymbolicNode > SymbolicNodePtr
std::string_view enum_name(Enum value, const std::array< std::string_view, N > &names, const char *operation)
constexpr std::array< std::string_view, 36 > kFunctions
constexpr std::array< std::string_view, 5 > kTransforms
constexpr std::array< std::string_view, 3 > kDirections
constexpr std::array< std::string_view, 6 > kRelations
constexpr std::array< std::string_view, 2 > kQuantifiers
constexpr std::array< std::string_view, 4 > kLogic
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::string const ExprPtr & value
内部 AST 定义。