20template<
typename T =
double>
31 [[nodiscard]]
constexpr std::size_t
arity() const noexcept {
35 [[nodiscard]]
constexpr T
eval(std::span<T const> args)
const noexcept {
36 assert(args.size() >
dim &&
"Not enough arguments for named variable");
40 [[nodiscard]] [[deprecated(
"use eval() instead")]]
41 constexpr T
evaluate(std::span<T const> args)
const noexcept {
47 template<std::
size_t Dim>
48 [[nodiscard]]
constexpr auto derivative() const noexcept {
49 if constexpr (Dim == 0) {
56 [[nodiscard]]
constexpr auto derivative_rt(std::size_t d)
const noexcept {
61 return std::string(
name);
64 [[nodiscard]]
constexpr std::size_t
dimension() const noexcept {
78template<
typename T =
double>
79[[nodiscard]]
constexpr NamedVar<T> var(std::size_t dim, std::string_view name)
noexcept {
89template<std::
size_t N,
typename T =
double>
92 static constexpr std::size_t
arity_v = N + 1;
99 [[nodiscard]]
constexpr T
eval(std::span<T const> args)
const noexcept {
100 assert(args.size() > N &&
"Not enough arguments for named variable");
104 [[nodiscard]] [[deprecated(
"use eval() instead")]]
105 constexpr T
evaluate(std::span<T const> args)
const noexcept {
109 template<std::
size_t Dim>
111 if constexpr (Dim == N) {
119 return std::string(
name);
122 [[nodiscard]]
static constexpr std::size_t
dimension() noexcept {
130template<std::
size_t N,
typename T>
136template<std::
size_t N,
typename T =
double>
143template<std::size_t N,
typename T, std::size_t... Is>
145 std::index_sequence<Is...>) {
150template<std::size_t N,
typename T = double,
typename... Names>
151 requires (
sizeof...(Names) == N)
153 std::array<std::string_view, N> name_array{names...};
154 return declare_vars_impl<N, T>(name_array, std::make_index_sequence<N>{});
157template<
typename T =
double>
158[[nodiscard]]
constexpr auto vars_xy(std::string_view x_name =
"x",
159 std::string_view y_name =
"y") {
164template<
typename T =
double>
165[[nodiscard]]
constexpr auto vars_xyz(std::string_view x_name =
"x",
166 std::string_view y_name =
"y",
167 std::string_view z_name =
"z") {
Expression layer for composable calculus.
constexpr StaticNamedVar< N, T > named(std::string_view name) noexcept
constexpr auto declare_vars(Names... names)
Usage: auto [x, y, z] = declare_vars<3>("x", "y", "z");.
constexpr bool is_static_named_var_v
constexpr auto vars_xyz(std::string_view x_name="x", std::string_view y_name="y", std::string_view z_name="z")
constexpr auto declare_vars_impl(std::array< std::string_view, N > const &names, std::index_sequence< Is... >)
constexpr bool is_named_var_v
constexpr NamedVar< T > var(std::size_t dim, std::string_view name) noexcept
constexpr auto vars_xy(std::string_view x_name="x", std::string_view y_name="y")
constexpr NamedVar(std::size_t dimension, std::string_view n) noexcept
std::string to_string() const
constexpr std::size_t dimension() const noexcept
constexpr auto derivative_rt(std::size_t d) const noexcept
constexpr auto derivative() const noexcept
constexpr T eval(std::span< T const > args) const noexcept
constexpr std::size_t arity() const noexcept
constexpr T evaluate(std::span< T const > args) const noexcept
static constexpr std::size_t arity_v
constexpr T evaluate(std::span< T const > args) const noexcept
static constexpr std::size_t arity_v
static constexpr std::size_t index_v
std::string to_string() const
constexpr auto derivative() const noexcept
static constexpr std::size_t dimension() noexcept
constexpr T eval(std::span< T const > args) const noexcept
constexpr StaticNamedVar(std::string_view n) noexcept