limes 3.1.0
Composable Calculus Expressions for C++20
Loading...
Searching...
No Matches
var.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <span>
4#include <string>
5#include <cstddef>
6#include <cassert>
7#include "const.hpp"
8
9namespace limes::expr {
10
11// Var<N, T>: A variable reference at position N (arity = N + 1)
12template<std::size_t N, typename T = double>
13struct Var {
14 using value_type = T;
15 static constexpr std::size_t arity_v = N + 1;
16 static constexpr std::size_t index_v = N;
17
18 constexpr Var() noexcept = default;
19
20 [[nodiscard]] constexpr T eval(std::span<T const> args) const noexcept {
21 assert(args.size() > N && "Not enough arguments for variable");
22 return args[N];
23 }
24
25 [[nodiscard]] [[deprecated("use eval() instead")]]
26 constexpr T evaluate(std::span<T const> args) const noexcept {
27 return eval(args);
28 }
29
30 // Returns One<T>/Zero<T> marker types for compile-time simplification
31 template<std::size_t Dim>
32 [[nodiscard]] constexpr auto derivative() const noexcept {
33 if constexpr (Dim == N) {
34 return One<T>{};
35 } else {
36 return Zero<T>{};
37 }
38 }
39
40 [[nodiscard]] std::string to_string() const {
41 return "x" + std::to_string(N);
42 }
43};
44
45template<typename T = double>
46inline constexpr Var<0, T> x{};
47
48template<typename T = double>
49inline constexpr Var<1, T> y{};
50
51template<typename T = double>
52inline constexpr Var<2, T> z{};
53
54template<std::size_t N, typename T = double>
55inline constexpr Var<N, T> arg{};
56
57} // namespace limes::expr
Expression layer for composable calculus.
Definition analysis.hpp:7
constexpr Var< 2, T > z
Definition var.hpp:52
constexpr Var< N, T > arg
Definition var.hpp:55
constexpr Var< 1, T > y
Definition var.hpp:49
constexpr Var< 0, T > x
Definition var.hpp:46
static constexpr std::size_t arity_v
Definition var.hpp:15
constexpr auto derivative() const noexcept
Definition var.hpp:32
constexpr T evaluate(std::span< T const > args) const noexcept
Definition var.hpp:26
std::string to_string() const
Definition var.hpp:40
static constexpr std::size_t index_v
Definition var.hpp:16
constexpr T eval(std::span< T const > args) const noexcept
Definition var.hpp:20
constexpr Var() noexcept=default