A lazy sumΒΆ

Here is a little functional sum that sums a function f over various domains and accepts lazy expressions as arguments.

#include <triqs/clef.hpp>

template <typename Domain> struct sum_impl {
  Domain d;

  // C++14
  // double operator() (NotClefExpression const & f) const { double s=0; for (int u=0; u<10; ++u) s += f(u/10.0); return s;}

  // C++11 form
  template <typename F> typename std::enable_if<!triqs::clef::is_clef_expression<F>::value, double>::type operator()(F const &f) const {
    double s = 0;
    for (int u = 0; u < 10; ++u) s += f(u / 10.0);
    return s;
  }

  TRIQS_CLEF_IMPLEMENT_LAZY_CALL(sum_impl);

  friend std::ostream &operator<<(std::ostream &out, sum_impl const &x) { return out << "sum"; }
};

// a little factory ...
template <typename Domain> sum_impl<Domain> sum_functional(Domain d) { return {d}; }

struct DOM {};

int main() {
  triqs::clef::placeholder<1> x_;
  triqs::clef::placeholder<2> y_;
  DOM d;

  // integrate_on_d is the integration functional
  auto integrate_on_d = sum_functional(d);

  // This is a simple application of the sum to a function
  std::cout << integrate_on_d(x_ >> 2 * x_ + 1) << std::endl;

  // A function y -> y_ + integrate (x -> 2*x + y)
  auto e1 = y_ + integrate_on_d(x_ >> 2 * x_ + y_);
  std::cout << e1 << std::endl;
  std::cout << eval(e1, y_ = 0) << std::endl;
}