LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp} 命名空间参考

类型定义

using Eigenspaces = std::vector<std::pair<ExprPtr, std::vector<std::vector<ExprPtr>>>>

函数

Result< bool > eigenvalue_already_collected (const ExprPtr &lambda, const Eigenspaces &spaces, ComputationContext &context, const detail::AssumptionFacts &facts)
MatrixEigenvectorResult eigenvalue_nullspace (const MatrixNode &matrix, const ExprPtr &lambda, ComputationContext &context)

类型定义说明

◆ Eigenspaces

using LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::Eigenspaces = std::vector<std::pair<ExprPtr, std::vector<std::vector<ExprPtr>>>>

在文件 symbolic_matrix_eigen.cpp 第 132 行定义.

函数说明

◆ eigenvalue_already_collected()

Result< bool > LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_already_collected ( const ExprPtr & lambda,
const Eigenspaces & spaces,
ComputationContext & context,
const detail::AssumptionFacts & facts )

在文件 symbolic_matrix_eigen.cpp 第 134 行定义.

136 {
137 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
138 (context).limits().max_ast_nodes, "transform");
139 constexpr const char* operation = "matrix_eigenspaces";
140 for (const auto& space : spaces) {
141 if (detail::node(lambda)->equals(*detail::node(space.first))) { return true; }
142 auto difference = SymbolicExpr::add(lambda,
143 SymbolicExpr::multiply(SymbolicExpr::number(-1), space.first));
144 auto proof = detail::classify_exact_zero(difference, context, operation);
145 if (!proof) { return Result<bool>::failure(proof.error()); }
146 if (proof.value() == detail::ZeroProof::Zero) { return true; }
147 auto nonzero = detail::query_nonzero_value(detail::normalize_node(detail::node(difference), transform_budget), facts, Domain::Complex, context);
148 if (!nonzero) { return Result<bool>::failure(nonzero.error()); }
149 if (nonzero.value() != Tribool::True) {
151 "eigenvalues cannot be proved pointwise distinct", operation);
152 }
153 }
154 return false;
155} catch (const CasError& error) {
156 return Result<bool>::failure(error);
157} catch (const std::bad_alloc&) {
158 return Result<bool>::failure(CasErrc::ResourceLimit, "allocation failed", "matrix_eigenspaces");
159} catch (const std::length_error& error) {
160 return Result<bool>::failure(CasErrc::ResourceLimit, error.what(), "matrix_eigenspaces");
161} catch (const std::exception& error) {
162 return Result<bool>::failure(CasErrc::InternalInvariant, error.what(), "matrix_eigenspaces");
163}
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< ZeroProof > classify_exact_zero(const ExprPtr &expression, ComputationContext &context, const std::string &operation)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Complex
Complex numbers (default, least specific)
@ True
Property definitely holds

引用了 LMCAS::detail::classify_exact_zero(), LMCAS::Complex, LMCAS::context, eigenvalue_already_collected(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_nonzero_value(), LMCAS::True , 以及 LMCAS::detail::Zero.

被这些函数引用 eigenvalue_already_collected().

函数调用图:
这是这个函数的调用关系图:

◆ eigenvalue_nullspace()

MatrixEigenvectorResult LMCAS::anonymous_namespace{symbolic_matrix_eigen.cpp}::eigenvalue_nullspace ( const MatrixNode & matrix,
const ExprPtr & lambda,
ComputationContext & context )

在文件 symbolic_matrix_eigen.cpp 第 165 行定义.

166 {
167 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
168 (context).limits().max_ast_nodes, "transform");
169 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> shifted(
170 matrix.rows(),
171 std::vector<std::shared_ptr<SymbolicExpr>>(matrix.cols()));
172 for (std::size_t row = 0; row < matrix.rows(); ++row) {
173 for (std::size_t column = 0; column < matrix.cols(); ++column) {
174 auto value = detail::make_expression_ptr(matrix.get(row, column));
175 shifted[row][column] = row == column
176 ? detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::add(value, SymbolicExpr::multiply(
177 SymbolicExpr::number(-1), lambda))), transform_budget))
178 : std::move(value);
179 }
180 }
181 auto nullspace = matrix_nullspace_checked(SymbolicExpr::matrix(shifted), context);
182 if (!nullspace) { return MatrixEigenvectorResult::failure(nullspace.error()); }
183 if (nullspace.value().empty()) {
185 "eigenvalue has no proved nonzero nullspace basis", "matrix_eigenspaces");
186 }
187 return nullspace;
188} catch (const CasError& error) {
190} catch (const std::bad_alloc&) {
191 return MatrixEigenvectorResult::failure(CasErrc::ResourceLimit, "allocation failed", "eigenvalue_nullspace");
192} catch (const std::length_error& error) {
193 return MatrixEigenvectorResult::failure(CasErrc::ResourceLimit, error.what(), "eigenvalue_nullspace");
194} catch (const std::exception& error) {
195 return MatrixEigenvectorResult::failure(CasErrc::InternalInvariant, error.what(), "eigenvalue_nullspace");
196}
size_t cols() const noexcept
size_t rows() const noexcept
std::shared_ptr< const SymbolicNode > get(size_t r, size_t c) const
获取指定位置的矩阵元素。
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const std::string const ExprPtr & value
MatrixNullspaceResult matrix_nullspace_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)

引用了 LMCAS::MatrixNode::cols(), LMCAS::context, eigenvalue_nullspace(), LMCAS::Result< std::vector< std::vector< std::shared_ptr< SymbolicExpr > > > >::failure(), LMCAS::MatrixNode::get(), LMCAS::Inconclusive, LMCAS::detail::make_expression_ptr(), LMCAS::matrix_nullspace_checked(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::MatrixNode::rows() , 以及 LMCAS::value.

被这些函数引用 eigenvalue_nullspace().

函数调用图:
这是这个函数的调用关系图: