cnorxz/src/multi_array_operation.h

376 lines
12 KiB
C
Raw Normal View History

2017-02-16 11:20:40 +01:00
// -*- C++ -*-
#ifndef __multi_array_operation_h__
#define __multi_array_operation_h__
#include <cstdlib>
#include <tuple>
2017-03-22 21:51:54 +01:00
#include <cmath>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
#include "index_base.h"
namespace MultiArrayTools
{
2017-05-22 18:21:14 +02:00
typedef std::vector<std::shared_ptr<IndefinitIndexBase> > IndexList;
template <typename T>
2017-02-16 11:20:40 +01:00
class MultiArrayOperationBase
{
public:
2017-02-24 20:50:58 +01:00
typedef T value_type;
MultiArrayOperationBase() /*{ CHECK; }*/ = default;
virtual ~MultiArrayOperationBase();
virtual size_t argNum() const = 0;
2017-05-22 18:21:14 +02:00
const IndefinitIndexBase& index() const = 0;
virtual const T& get() const = 0;
2017-05-22 18:21:14 +02:00
virtual IndexList getIndices() const = 0;
virtual void setInternalIndex(const IndexList& il) = 0;
};
template <typename T>
class MutableMultiArrayOperationBase : public MultiArrayOperationBase<T>
{
public:
MutableMultiArrayOperationBase() /*{ CHECK; }*/ = default;
virtual T& get() = 0;
};
template <typename T, class Range>
class MultiArrayOperationRoot : public MutableMultiArrayOperationBase<T>
{
public:
typedef MultiArrayOperationBase<T> MAOB;
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-03-22 21:51:54 +01:00
MultiArrayOperationRoot(const MultiArrayOperationRoot& in);
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);
template <class Range2>
const MultiArrayOperationRoot& operator=(const MultiArrayOperationRoot<T,Range2>& in);
2017-03-29 17:05:50 +02:00
template <class Range2>
MultiArrayOperationRoot& operator=(ConstMultiArrayOperationRoot<T,Range2>& in);
template <class Range2>
const MultiArrayOperationRoot& operator=(const ConstMultiArrayOperationRoot<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);
//template <class Operation, class... MAOps>
//MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
//operator()(Operation& op, const MAOps&... secs) const;
template <class Operation, class... MAOps>
MultiArrayOperation<T,Operation,MultiArrayOperationRoot<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,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
template<class TotalInRange, class InRange, class OutRange>
MultiArrayOperationMap<T,InRange,TotalInRange,OutRange,Range>
map(const IndexMapFunction<InRange,OutRange>& imf);
2017-02-16 11:20:40 +01:00
template <class MAOp>
auto operator+(const MAOp& sec) -> decltype(operator()(std::plus<T>(), sec));
2017-02-16 11:20:40 +01:00
template <class MAOp>
auto operator-(const MAOp& sec) -> decltype(operator()(std::minus<T>(), sec));
2017-02-16 11:20:40 +01:00
template <class MAOp>
auto operator*(const MAOp& sec) -> decltype(operator()(std::multiplies<T>(), sec));
2017-02-16 11:20:40 +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);
const MultiArrayBase<T,Range>& operator*() const;
//MultiArrayBase<T,Range>& operator*();
MultiArrayBase<T,Range> const* operator->() const;
2017-03-08 22:53:18 +01:00
virtual size_t argNum() const override;
2017-02-16 11:20:40 +01:00
// set index -> implement !!!!!
2017-02-27 17:00:51 +01:00
MultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind);
const MultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind) const;
2017-03-22 11:44:33 +01:00
virtual T& get() override;
virtual const T& get() const override;
2017-02-27 17:00:51 +01:00
const Name& name() const;
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
template <typename U, class RangeX>
friend class MultiArrayOperationRoot;
template <typename U, class RangeX>
friend class ConstMultiArrayOperationRoot;
2017-02-16 11:20:40 +01:00
protected:
2017-02-27 17:00:51 +01:00
void performAssignment(const MultiArrayOperationBase<T>& in);
2017-05-22 18:21:14 +02:00
2017-03-20 11:21:33 +01:00
MutableMultiArrayBase<T,Range>& mArrayRef;
mutable IndexType mIndex;
Name mNm;
2017-02-16 11:20:40 +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-22 21:51:54 +01:00
ConstMultiArrayOperationRoot(const ConstMultiArrayOperationRoot& in);
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;
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;
virtual const T& get() const override;
const Name& name() const;
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
template <typename U, class RangeX>
friend class ConstMultiArrayOperationRoot;
template <typename U, class RangeX>
friend class MultiArrayOperationRoot;
protected:
MultiArrayBase<T,Range> const& mArrayRef;
mutable IndexType mIndex;
Name mNm;
};
2017-02-16 11:20:40 +01:00
template <typename T, class InRange, class TotalInRange, class OutRange, class TotalRange>
class MultiArrayOperationMap : public MutableMultiArrayOperationBase<T>
{
public:
typedef MultiArrayOperationBase<T> MAOB;
MultiArrayOperationMap(MultiArrayOperationRoot<T,TotalRange>& root,
const IndexMapFunction<InRange,OutRange>& mf);
2017-03-28 17:55:12 +02:00
MultiArrayOperationMap(const MultiArrayOperationMap& in) = default;
MultiArrayOperationMap& operator=(const MultiArrayOperationRoot<T,TotalInRange>& in);
MultiArrayOperationMap& operator=(const ConstMultiArrayOperationRoot<T,TotalInRange>& in);
virtual size_t argNum() const override;
virtual const T& get() const override;
virtual T& get() override;
// !!!!
protected:
IndexMapFunction<InRange,OutRange> mMF;
MultiArrayOperationRoot<T,TotalRange>& mRoot;
mutable typename TotalInRange::IndexType mIndex; // Index of incoming range
Name mNm; // Name of incoming range
};
template <typename T, class Operation, class... MAOps>
class MultiArrayOperation : public MultiArrayOperationBase<T>
2017-02-16 11:20:40 +01:00
{
public:
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...>
operator()(Operation2& op, const MAOps2&... secs) const;
template <class Operation2, class... MAOps2>
MultiArrayOperation<T,Operation2,MultiArrayOperation<T,Operation,MAOps...>,MAOps2...>
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;
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-02-16 11:20:40 +01:00
virtual size_t argNum() const override;
virtual const T& get() const override;
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;
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-05-22 18:21:14 +02:00
typedef typename Range::IndexType RunIndexType;
2017-03-23 09:54:54 +01:00
MultiArrayContraction(const ContractOperation& cop,
2017-05-22 18:21:14 +02:00
const RunIndexType& runIndex,
2017-03-23 21:16:18 +01:00
const MAOps&... mao);
2017-03-23 09:54:54 +01:00
MultiArrayContraction(const ContractOperation& cop,
2017-05-22 18:21:14 +02:00
const RunIndexType& runIndex,
2017-03-23 09:54:54 +01:00
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));
virtual size_t argNum() const override;
virtual const T& get() const override;
protected:
mutable T mVal;
ContractOperation mOp;
OBT mArgs; // include first arg also here !!!
2017-05-22 18:21:14 +02:00
RunIndexType mBeginIndex;
RunIndexType mEndIndex;
mutable RunIndexType mRunIndex;
2017-03-22 11:44:33 +01:00
};
2017-02-16 11:20:40 +01:00
}
#include "multi_array_operation.cc"
2017-02-16 11:20:40 +01:00
#endif