LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
rewrite_budget.hpp
浏览该文件的文档.
1#pragma once
2
4
5#include <cstddef>
6#include <memory>
7#include <string>
8#include <unordered_map>
9
10namespace LMCAS {
11class SymbolicNode;
12}
13
14namespace LMCAS::detail {
16public:
17 RewriteBudget(ComputationContext& context, std::size_t max_depth,
18 std::size_t max_nodes, const char* operation);
19 RewriteBudget(ComputationContext& context, std::size_t max_steps,
20 std::size_t max_depth, std::size_t max_nodes,
21 const char* operation);
22 RewriteBudget(const RewriteBudget&) = delete;
24 ComputationContext& context() const noexcept { return context_; }
25 std::size_t max_nodes() const noexcept { return max_nodes_; }
26 void consume();
27
28 void enter();
29 void leave() noexcept;
30 void require_nodes(std::size_t nodes) const;
31 std::size_t measure(const std::shared_ptr<const SymbolicNode>& node);
32 std::size_t measure_result(const std::shared_ptr<const SymbolicNode>& node);
33 std::size_t append_size(std::size_t current, std::size_t child);
34 static std::size_t input_nodes(
35 const std::shared_ptr<const SymbolicNode>& lhs,
36 const std::shared_ptr<const SymbolicNode>& rhs,
37 ComputationContext& context, std::size_t max_depth, const char* operation);
38
39private:
41 struct Shape {
42 std::size_t nodes = 0;
43 std::size_t height = 0;
44 };
45 struct Entry {
46 std::weak_ptr<const SymbolicNode> owner;
48 };
49 class Measurement;
50 Shape measure_shape(const std::shared_ptr<const SymbolicNode>& node,
51 std::size_t path_depth, std::size_t active_depth);
52 void require_shape(const Shape& shape, std::size_t path_depth,
53 std::size_t active_depth) const;
54 void check_step_access() const;
55 void commit_step();
56
58 std::size_t remaining_steps_;
59 std::size_t max_depth_;
60 std::size_t max_nodes_;
61 std::size_t depth_ = 0;
63 const std::string operation_;
64 std::unordered_map<const SymbolicNode*, Entry> shapes_;
65};
67public:
69 if (budget_) { budget_->enter(); }
70 }
72 if (budget_) { budget_->leave(); }
73 }
74 RewriteScope(const RewriteScope&) = delete;
76
77private:
79};
80
81}
std::unordered_map< const SymbolicNode *, Entry > shapes_
ComputationContext & context() const noexcept
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
void require_nodes(std::size_t nodes) const
RewriteBudget & operator=(const RewriteBudget &)=delete
std::size_t append_size(std::size_t current, std::size_t child)
RewriteBudget(ComputationContext &context, std::size_t max_depth, std::size_t max_nodes, const char *operation)
std::size_t measure_result(const std::shared_ptr< const SymbolicNode > &node)
std::weak_ptr< const SymbolicNode > owner
RewriteBudget(const RewriteBudget &)=delete
std::size_t max_nodes() const noexcept
Shape measure_shape(const std::shared_ptr< const SymbolicNode > &node, std::size_t path_depth, std::size_t active_depth)
static std::size_t input_nodes(const std::shared_ptr< const SymbolicNode > &lhs, const std::shared_ptr< const SymbolicNode > &rhs, ComputationContext &context, std::size_t max_depth, const char *operation)
void require_shape(const Shape &shape, std::size_t path_depth, std::size_t active_depth) const
RewriteScope(RewriteBudget *budget)
RewriteScope(const RewriteScope &)=delete
RewriteScope & operator=(const RewriteScope &)=delete
多元 Hensel 提升(单变量步)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExactRealAlgebraic rhs
ComputationContext const std::string & operation
std::size_t std::size_t ComputationContext & context