46# ifndef MATRIX_CHAIN_H
47# define MATRIX_CHAIN_H
67 namespace matrix_chain_detail
73 <<
"matrix_chain_order: overflow while computing " << ctx;
84 <<
"matrix_chain_order: overflow while computing " << ctx;
102 out += std::to_string(i + 1);
131 <<
"matrix_chain_order: dims must have at least 2 entries";
134 <<
"matrix_chain_order: matrix dimensions must be positive";
136 const size_t n =
dims.size() - 1;
143 for (
size_t i = 0; i < n; ++i)
146 for (
size_t j = 0; j < n; ++j)
148 dp.
append(std::move(row));
153 for (
size_t i = 0; i < n; ++i)
156 for (
size_t j = 0; j < n; ++j)
158 split.append(std::move(row));
162 for (
size_t l = 2;
l <= n; ++
l)
163 for (
size_t i = 0; i <= n -
l; ++i)
165 const size_t j = i +
l - 1;
166 dp[i][j] = std::numeric_limits<size_t>::max();
167 for (
size_t k = i;
k < j; ++
k)
187 dp[0][n - 1], std::move(
parens),
Exception handling system with formatted messages for Aleph-w.
#define ah_domain_error_if(C)
Throws std::domain_error if condition holds.
#define ah_runtime_error_if(C)
Throws std::runtime_error if condition holds.
Simple dynamic array with automatic resizing and functional operations.
static Array create(size_t n)
Create an array with n logical elements.
T & append(const T &data)
Append a copy of data
void reserve(size_t cap)
Reserves cap cells into the array.
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_dim_function > > dim(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
size_t checked_add(const size_t a, const size_t b, const char *ctx)
size_t scalar_cost(const size_t di, const size_t dk, const size_t dj)
size_t checked_mul(const size_t a, const size_t b, const char *ctx)
void build_parens(const Array< Array< size_t > > &s, size_t i, size_t j, std::string &out)
Main namespace for Aleph-w library functions.
Matrix_Chain_Result matrix_chain_order(const Array< size_t > &dims)
Compute optimal matrix-chain multiplication order.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
size_t matrix_chain_min_cost(const Array< size_t > &dims)
Compute only the minimum multiplication cost.
std::vector< std::string > & split(const std::string &s, const char delim, std::vector< std::string > &elems)
Split a std::string by a single delimiter character.
Result of matrix-chain multiplication optimization.
Array< Array< size_t > > split
Split table for reconstruction.
size_t min_multiplications
Minimum scalar multiplications.
std::string parenthesization
Optimal parenthesization string.
Dynamic array container with automatic resizing.