2017-02-16 11:20:40 +01:00
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
#ifndef __multi_array_operation_h__
|
|
|
|
#define __multi_array_operation_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <tuple>
|
|
|
|
|
|
|
|
#include "base_def.h"
|
|
|
|
#include "index_base.h"
|
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <typename T>
|
2017-02-16 11:20:40 +01:00
|
|
|
class MultiArrayOperationBase
|
|
|
|
{
|
|
|
|
public:
|
2017-02-24 20:50:58 +01:00
|
|
|
|
2017-03-16 19:30:43 +01:00
|
|
|
MultiArrayOperationBase() /*{ CHECK; }*/ = default;
|
2017-02-24 15:08:42 +01:00
|
|
|
virtual ~MultiArrayOperationBase();
|
|
|
|
|
|
|
|
virtual size_t argNum() const = 0;
|
2017-03-15 22:54:48 +01:00
|
|
|
const IndefinitIndexBase& index() const;
|
2017-03-22 11:44:33 +01:00
|
|
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const = 0;
|
2017-02-24 15:08:42 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const = 0;
|
|
|
|
|
|
|
|
virtual const T& get() const = 0;
|
2017-02-21 21:47:40 +01:00
|
|
|
|
2017-03-23 15:10:56 +01:00
|
|
|
virtual void setInternalLinks() const {}
|
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
virtual void freeIndex() const;
|
2017-03-16 19:30:43 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
protected:
|
2017-03-21 18:12:24 +01:00
|
|
|
mutable IndefinitIndexBase* mIibPtr = nullptr;
|
2017-02-24 15:08:42 +01:00
|
|
|
};
|
|
|
|
|
2017-03-16 19:30:43 +01:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
class MutableMultiArrayOperationBase : public MultiArrayOperationBase<T>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
MutableMultiArrayOperationBase() /*{ CHECK; }*/ = default;
|
|
|
|
virtual T& get() = 0;
|
|
|
|
};
|
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <typename T, class Range>
|
2017-03-16 19:30:43 +01:00
|
|
|
class MultiArrayOperationRoot : public MutableMultiArrayOperationBase<T>
|
2017-02-24 15:08:42 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
typedef MultiArrayOperationBase<T> MAOB;
|
2017-03-15 22:54:48 +01:00
|
|
|
typedef typename Range::IndexType IndexType;
|
|
|
|
//typedef decltype(MultiArray<T,Range>().begin()) IndexType;
|
|
|
|
|
2017-03-20 11:21:33 +01:00
|
|
|
MultiArrayOperationRoot(MutableMultiArrayBase<T,Range>& ma, const Name& nm);
|
2017-02-24 20:50:58 +01:00
|
|
|
MultiArrayOperationRoot& operator=(const MultiArrayOperationRoot& in);
|
|
|
|
|
2017-02-27 17:00:51 +01:00
|
|
|
MultiArrayOperationRoot& operator=(MultiArrayOperationRoot& in);
|
|
|
|
|
|
|
|
template <class Range2>
|
|
|
|
MultiArrayOperationRoot& operator=(MultiArrayOperationRoot<T,Range2>& in);
|
2017-03-15 22:54:48 +01:00
|
|
|
|
2017-03-16 22:42:55 +01:00
|
|
|
|
2017-03-15 22:54:48 +01:00
|
|
|
template <class Range2>
|
|
|
|
const MultiArrayOperationRoot& operator=(const MultiArrayOperationRoot<T,Range2>& in);
|
2017-02-27 17:00:51 +01:00
|
|
|
|
2017-02-24 20:50:58 +01:00
|
|
|
template <class Operation, class... MAOps>
|
|
|
|
MultiArrayOperationRoot& operator=(const MultiArrayOperation<T,Operation,MAOps...>& in);
|
2017-03-22 11:44:33 +01:00
|
|
|
|
|
|
|
template <class Operation, class Range2, class... MAOps>
|
|
|
|
MultiArrayOperationRoot<T,Range>&
|
|
|
|
operator=(const MultiArrayContraction<T,Operation,Range2,MAOps...>& in);
|
|
|
|
|
2017-03-15 22:54:48 +01:00
|
|
|
//template <class Operation, class... MAOps>
|
|
|
|
//MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
|
|
|
|
//operator()(Operation& op, const MAOps&... secs) const;
|
2017-02-22 19:06:23 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class Operation, class... MAOps>
|
|
|
|
MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
|
2017-03-15 22:54:48 +01:00
|
|
|
operator()(const Operation& op, const MAOps&... secs) const;
|
2017-03-21 15:18:34 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
template < class Range2, class ContractOperation, class... MAOps>
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range2,MultiArrayOperationRoot<T,Range>, MAOps...>
|
|
|
|
contract(const ContractOperation& cop, const std::string& indexName,
|
|
|
|
const MAOps&... mao) const;
|
2017-03-21 15:18:34 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
template <class Range2, class ContractOperation, class... MAOps>
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range2,MultiArrayOperationRoot<T,Range>, MAOps...>
|
2017-03-21 15:18:34 +01:00
|
|
|
contract(const ContractOperation& cop, const std::string& indexName,
|
2017-03-21 19:57:00 +01:00
|
|
|
size_t begin,
|
|
|
|
size_t end,
|
2017-03-21 18:12:24 +01:00
|
|
|
const MAOps&... mao) const;
|
2017-03-21 15:18:34 +01:00
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp>
|
|
|
|
auto operator+(const MAOp& sec) -> decltype(operator()(std::plus<T>(), sec));
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp>
|
|
|
|
auto operator-(const MAOp& sec) -> decltype(operator()(std::minus<T>(), sec));
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp>
|
|
|
|
auto operator*(const MAOp& sec) -> decltype(operator()(std::multiplies<T>(), sec));
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp>
|
|
|
|
auto operator/(const MAOp& sec) -> decltype(operator()(std::divides<T>(), sec));
|
2017-03-08 22:53:18 +01:00
|
|
|
|
|
|
|
MultiArrayOperationRoot copyThis();
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
MultiArrayOperationRoot& operator+=(const MAOp& sec);
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
MultiArrayOperationRoot& operator-=(const MAOp& sec);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-03-08 22:53:18 +01:00
|
|
|
template <class MAOp>
|
|
|
|
MultiArrayOperationRoot& operator*=(const MAOp& sec);
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
MultiArrayOperationRoot& operator/=(const MAOp& sec);
|
2017-03-15 22:54:48 +01:00
|
|
|
|
|
|
|
const MultiArrayBase<T,Range>& operator*() const;
|
2017-03-16 19:30:43 +01:00
|
|
|
//MultiArrayBase<T,Range>& operator*();
|
2017-03-15 22:54:48 +01:00
|
|
|
MultiArrayBase<T,Range> const* operator->() const;
|
2017-03-08 22:53:18 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
virtual size_t argNum() const override;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-28 11:27:23 +01:00
|
|
|
// set index -> implement !!!!!
|
2017-02-27 17:00:51 +01:00
|
|
|
MultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind);
|
2017-03-15 22:54:48 +01:00
|
|
|
const MultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind) const;
|
2017-03-22 11:44:33 +01:00
|
|
|
|
|
|
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
2017-02-24 15:08:42 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
2017-02-22 00:43:38 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
virtual T& get() override;
|
|
|
|
virtual const T& get() const override;
|
2017-02-27 17:00:51 +01:00
|
|
|
|
|
|
|
const Name& name() const;
|
2017-02-28 11:27:23 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
virtual void freeIndex() const override;
|
2017-03-16 19:30:43 +01:00
|
|
|
|
|
|
|
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
|
|
|
|
|
2017-02-28 11:27:23 +01:00
|
|
|
template <typename U, class RangeX>
|
|
|
|
friend class MultiArrayOperationRoot;
|
2017-03-16 22:42:55 +01:00
|
|
|
|
|
|
|
template <typename U, class RangeX>
|
|
|
|
friend class ConstMultiArrayOperationRoot;
|
2017-02-24 15:08:42 +01:00
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
protected:
|
2017-02-27 17:00:51 +01:00
|
|
|
|
|
|
|
void performAssignment(const MultiArrayOperationBase<T>& in);
|
|
|
|
|
2017-03-21 15:18:34 +01:00
|
|
|
/*
|
2017-02-27 17:00:51 +01:00
|
|
|
template <class RangeX>
|
|
|
|
MultiArrayOperationRoot& makeSlice(MultiArrayOperationRoot<T,RangeX>& in);
|
2017-03-16 22:42:55 +01:00
|
|
|
|
2017-03-15 22:54:48 +01:00
|
|
|
template <class RangeX>
|
|
|
|
const MultiArrayOperationRoot& makeConstSlice(const MultiArrayOperationRoot<T,RangeX>& in);
|
2017-03-21 15:18:34 +01:00
|
|
|
*/
|
2017-03-20 11:21:33 +01:00
|
|
|
MutableMultiArrayBase<T,Range>& mArrayRef;
|
2017-02-23 20:19:05 +01:00
|
|
|
mutable IndexType mIndex;
|
2017-02-22 19:06:23 +01:00
|
|
|
Name mNm;
|
2017-02-16 11:20:40 +01:00
|
|
|
};
|
2017-03-16 19:30:43 +01:00
|
|
|
|
|
|
|
template <typename T, class Range>
|
|
|
|
class ConstMultiArrayOperationRoot : public MultiArrayOperationBase<T>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
typedef MultiArrayOperationBase<T> MAOB;
|
|
|
|
typedef typename Range::IndexType IndexType;
|
|
|
|
//typedef decltype(MultiArray<T,Range>().begin()) IndexType;
|
|
|
|
|
|
|
|
ConstMultiArrayOperationRoot(const MultiArrayBase<T,Range>& ma, const Name& nm);
|
|
|
|
ConstMultiArrayOperationRoot(const MultiArrayOperationRoot<T,Range>& in);
|
2017-03-16 22:42:55 +01:00
|
|
|
|
2017-03-16 19:30:43 +01:00
|
|
|
template <class Operation, class... MAOps>
|
|
|
|
MultiArrayOperation<T,Operation,ConstMultiArrayOperationRoot<T,Range>, MAOps...>
|
|
|
|
operator()(const Operation& op, const MAOps&... secs) const;
|
2017-03-21 15:18:34 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
template <class Range2, class ContractOperation, class... MAOps>
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range2,ConstMultiArrayOperationRoot<T,Range>, MAOps...>
|
|
|
|
contract(const ContractOperation& cop, const std::string& indexName,
|
|
|
|
const MAOps&... mao) const;
|
2017-03-21 15:18:34 +01:00
|
|
|
|
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
template <class Range2, class ContractOperation, class... MAOps>
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range2,ConstMultiArrayOperationRoot<T,Range>, MAOps...>
|
2017-03-21 15:18:34 +01:00
|
|
|
contract(const ContractOperation& cop, const std::string& indexName,
|
2017-03-21 19:57:00 +01:00
|
|
|
size_t begin,
|
|
|
|
size_t end,
|
2017-03-21 18:12:24 +01:00
|
|
|
const MAOps&... mao) const;
|
2017-03-16 19:30:43 +01:00
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
auto operator+(const MAOp& sec) const -> decltype(operator()(std::plus<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
auto operator-(const MAOp& sec) const -> decltype(operator()(std::minus<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
auto operator*(const MAOp& sec) const -> decltype(operator()(std::multiplies<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp>
|
|
|
|
auto operator/(const MAOp& sec) const -> decltype(operator()(std::divides<T>(), sec));
|
|
|
|
|
|
|
|
ConstMultiArrayOperationRoot copyThis() const;
|
|
|
|
|
|
|
|
const MultiArrayBase<T,Range>& operator*() const;
|
|
|
|
//MultiArrayBase<T,Range>& operator*();
|
|
|
|
MultiArrayBase<T,Range> const* operator->() const;
|
|
|
|
|
|
|
|
virtual size_t argNum() const override;
|
|
|
|
|
|
|
|
// set index -> implement !!!!!
|
|
|
|
const ConstMultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind) const;
|
2017-03-22 11:44:33 +01:00
|
|
|
|
|
|
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
2017-03-16 19:30:43 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
|
|
|
|
|
|
|
virtual const T& get() const override;
|
|
|
|
|
|
|
|
const Name& name() const;
|
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
virtual void freeIndex() const override;
|
2017-03-16 19:30:43 +01:00
|
|
|
|
|
|
|
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
|
|
|
|
|
2017-03-16 22:42:55 +01:00
|
|
|
template <typename U, class RangeX>
|
|
|
|
friend class ConstMultiArrayOperationRoot;
|
|
|
|
|
2017-03-16 19:30:43 +01:00
|
|
|
template <typename U, class RangeX>
|
|
|
|
friend class MultiArrayOperationRoot;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
2017-03-16 22:42:55 +01:00
|
|
|
/*
|
2017-03-16 19:30:43 +01:00
|
|
|
template <class RangeX>
|
2017-03-16 22:42:55 +01:00
|
|
|
const ConstMultiArrayOperationRoot& makeConstSlice(const ConstMultiArrayOperationRoot<T,RangeX>& in);
|
|
|
|
|
|
|
|
template <class RangeX>
|
|
|
|
const ConstMultiArrayOperationRoot& makeConstSlice(const MultiArrayOperationRoot<T,RangeX>& in);
|
|
|
|
*/
|
|
|
|
// const
|
2017-03-16 19:30:43 +01:00
|
|
|
MultiArrayBase<T,Range> const& mArrayRef;
|
|
|
|
mutable IndexType mIndex;
|
|
|
|
Name mNm;
|
|
|
|
};
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <typename T, class Operation, class... MAOps>
|
|
|
|
class MultiArrayOperation : public MultiArrayOperationBase<T>
|
2017-02-16 11:20:40 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
typedef MultiArrayOperationBase<T> MAOB;
|
|
|
|
typedef std::tuple<MAOps...> OBT;
|
|
|
|
|
|
|
|
MultiArrayOperation(Operation& op, const MAOps&... secs);
|
|
|
|
MultiArrayOperation(const Operation& op, const MAOps&... secs);
|
|
|
|
|
|
|
|
template <class Operation2, class... MAOps2>
|
|
|
|
MultiArrayOperation<T,Operation2,MultiArrayOperation<T,Operation,MAOps...>,MAOps2...>
|
2017-03-15 22:54:48 +01:00
|
|
|
operator()(Operation2& op, const MAOps2&... secs) const;
|
2017-02-24 15:08:42 +01:00
|
|
|
|
|
|
|
template <class Operation2, class... MAOps2>
|
|
|
|
MultiArrayOperation<T,Operation2,MultiArrayOperation<T,Operation,MAOps...>,MAOps2...>
|
2017-03-15 22:54:48 +01:00
|
|
|
operator()(const Operation2& op, const MAOps2&... secs) const;
|
2017-03-21 18:12:24 +01:00
|
|
|
|
2017-03-21 23:31:50 +01:00
|
|
|
|
2017-03-22 11:44:33 +01:00
|
|
|
template <class Range2, class ContractOperation, class... MAOps2>
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range2,MultiArrayOperation<T,Operation,MAOps...>,MAOps2...>
|
2017-03-21 18:12:24 +01:00
|
|
|
contract(const ContractOperation& cop, const std::string& indexName,
|
2017-03-22 11:44:33 +01:00
|
|
|
const MAOps2&... mao) const;
|
|
|
|
|
2017-02-17 18:10:03 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp2>
|
|
|
|
auto operator+(const MAOp2& sec) -> decltype(operator()(std::plus<T>(), sec));
|
2017-02-22 19:06:23 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp2>
|
|
|
|
auto operator-(const MAOp2& sec) -> decltype(operator()(std::minus<T>(), sec));
|
2017-02-22 19:06:23 +01:00
|
|
|
|
2017-02-24 15:08:42 +01:00
|
|
|
template <class MAOp2>
|
|
|
|
auto operator*(const MAOp2& sec) -> decltype(operator()(std::multiplies<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp2>
|
|
|
|
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
virtual size_t argNum() const override;
|
2017-03-23 15:10:56 +01:00
|
|
|
|
2017-03-22 11:44:33 +01:00
|
|
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
2017-02-22 00:43:38 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
virtual const T& get() const override;
|
2017-02-24 15:08:42 +01:00
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
protected:
|
|
|
|
|
2017-02-22 00:43:38 +01:00
|
|
|
mutable T mVal;
|
2017-02-16 11:20:40 +01:00
|
|
|
Operation mOp;
|
2017-02-24 15:08:42 +01:00
|
|
|
OBT mArgs; // include first arg also here !!!
|
2017-02-16 11:20:40 +01:00
|
|
|
};
|
|
|
|
|
2017-03-22 11:44:33 +01:00
|
|
|
template <typename T, class ContractOperation, class Range, class... MAOps>
|
|
|
|
class MultiArrayContraction : public MultiArrayOperationBase<T>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
typedef MultiArrayOperationBase<T> MAOB;
|
|
|
|
typedef std::tuple<MAOps...> OBT;
|
2017-03-23 09:54:54 +01:00
|
|
|
|
|
|
|
MultiArrayContraction(const ContractOperation& cop,
|
|
|
|
const typename Range::IndexType& runIndex,
|
|
|
|
const MAOps&... args);
|
|
|
|
|
|
|
|
MultiArrayContraction(const ContractOperation& cop,
|
|
|
|
const typename Range::IndexType& runIndex,
|
|
|
|
size_t begin,
|
|
|
|
size_t end,
|
|
|
|
const MAOps&... mao);
|
|
|
|
|
2017-03-22 11:44:33 +01:00
|
|
|
|
|
|
|
template <class Operation2, class... MAOps2>
|
|
|
|
MultiArrayOperation<T,Operation2,MultiArrayContraction<T,ContractOperation,Range,MAOps...>,MAOps2...>
|
|
|
|
operator()(Operation2& op, const MAOps2&... secs) const;
|
|
|
|
|
|
|
|
template <class Operation2, class... MAOps2>
|
|
|
|
MultiArrayOperation<T,Operation2,MultiArrayContraction<T,ContractOperation,Range,MAOps...>,MAOps2...>
|
|
|
|
operator()(const Operation2& op, const MAOps2&... secs) const;
|
|
|
|
|
|
|
|
|
|
|
|
template <class Range2, class ContractOperation2, class... MAOps2>
|
|
|
|
MultiArrayContraction<T,ContractOperation2,Range2,
|
|
|
|
MultiArrayContraction<T,ContractOperation,Range,MAOps...>,MAOps2...>
|
|
|
|
contract(const ContractOperation2& cop, const std::string& indexName,
|
|
|
|
const MAOps2&... mao) const;
|
|
|
|
|
|
|
|
|
|
|
|
template <class MAOp2>
|
|
|
|
auto operator+(const MAOp2& sec) -> decltype(operator()(std::plus<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp2>
|
|
|
|
auto operator-(const MAOp2& sec) -> decltype(operator()(std::minus<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp2>
|
|
|
|
auto operator*(const MAOp2& sec) -> decltype(operator()(std::multiplies<T>(), sec));
|
|
|
|
|
|
|
|
template <class MAOp2>
|
|
|
|
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
2017-03-23 15:10:56 +01:00
|
|
|
|
|
|
|
virtual void setInternalLinks() const override;
|
2017-03-22 11:44:33 +01:00
|
|
|
|
|
|
|
virtual size_t argNum() const override;
|
|
|
|
|
|
|
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
|
|
|
|
|
|
|
virtual const T& get() const override;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
mutable T mVal;
|
|
|
|
ContractOperation mOp;
|
|
|
|
OBT mArgs; // include first arg also here !!!
|
|
|
|
typename Range::IndexType mBeginIndex;
|
|
|
|
typename Range::IndexType mEndIndex;
|
|
|
|
mutable typename Range::IndexType mRunIndex;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
2017-03-21 18:12:24 +01:00
|
|
|
template <typename T, class ContractOperation, class Range, class... MAOps>
|
|
|
|
class MultiArrayContraction : public MultiArrayOperation<T,ContractOperation,MAOps...>
|
2017-03-21 15:18:34 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef MultiArrayOperationBase<T> MAOB;
|
2017-03-21 18:12:24 +01:00
|
|
|
typedef MultiArrayOperation<T,ContractOperation,MAOps...> MAO;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
MultiArrayContraction(const ContractOperation& cop,
|
|
|
|
const typename Range::IndexType& runIndex,
|
|
|
|
const MAOps&... mao);
|
2017-03-21 15:18:34 +01:00
|
|
|
|
2017-03-21 18:12:24 +01:00
|
|
|
MultiArrayContraction(const ContractOperation& cop,
|
2017-03-21 15:18:34 +01:00
|
|
|
const typename Range::IndexType& runIndex,
|
2017-03-21 19:57:00 +01:00
|
|
|
size_t begin,
|
|
|
|
size_t end,
|
2017-03-21 18:12:24 +01:00
|
|
|
const MAOps&... mao);
|
2017-03-22 11:44:33 +01:00
|
|
|
|
2017-03-21 15:18:34 +01:00
|
|
|
virtual const T& get() const override;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
typename Range::IndexType mBeginIndex;
|
|
|
|
typename Range::IndexType mEndIndex;
|
|
|
|
mutable typename Range::IndexType mRunIndex;
|
|
|
|
};
|
2017-03-22 11:44:33 +01:00
|
|
|
*/
|
2017-02-16 11:20:40 +01:00
|
|
|
}
|
|
|
|
|
2017-02-17 18:10:03 +01:00
|
|
|
#include "multi_array_operation.cc"
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
#endif
|