index xpr + h5 table header file

This commit is contained in:
Christian Zimmermann 2023-01-20 01:05:24 +01:00
parent 02174f8371
commit 66d5e5b741
24 changed files with 145 additions and 37 deletions

View file

@ -4,7 +4,7 @@
#include "op_types.h"
//#include "xpr/xpr.h"
//#include "op_utility.h"
#include "op_utility.h"
#include "extensions/extensions.h"
namespace CNORXZ
@ -33,7 +33,7 @@ namespace CNORXZ
template <class F, class... Args>
constexpr decltype(auto) COpInterface<OpT>::o(F&& f, Args&&... args) const
{
return mkOperation(std::forward<F>(f), THIS().r(), args...);
return operation(std::forward<F>(f), THIS().r(), args...);
}
@ -45,7 +45,7 @@ namespace CNORXZ
template <class IndexT, class F, class... Args>
constexpr decltype(auto) OpInterface<OpT>::ax(const Sptr<IndexT>& ind, F&& f, const Args&... args)
{
return ind->ifor( mkOperation(f, OI::THIS().r(), args...), NoF {} );
return ind->ifor( operation(f, OI::THIS().r(), args...), NoF {} );
}
template <class OpT>
@ -117,6 +117,12 @@ namespace CNORXZ
return COpRoot<T,IndexT>(a, ind);
}
template <typename T, class IndexT>
constexpr decltype(auto) coproot(const T* a, const Sptr<IndexT>& ind)
{
return COpRoot<T,IndexT>(a, ind);
}
/****************
* OpCont *
****************/
@ -364,7 +370,7 @@ namespace CNORXZ
}
template <class F, class... Ops>
constexpr decltype(auto) mkOperation(F&& f, const Ops&... ops)
constexpr decltype(auto) operation(F&& f, const Ops&... ops)
{
return Operation<F,Ops...>(std::forward<F>(f), ops...);
}
@ -400,11 +406,21 @@ namespace CNORXZ
}
template <class F, class Op, class IndexT>
constexpr decltype(auto) mkContracion(F&& f, Op&& op, const Sptr<IndexT>& i)
constexpr decltype(auto) contracion(F&& f, Op&& op, const Sptr<IndexT>& i)
{
typedef decltype(i->ifor( op, f )) CXprT; // TODO: implement ifor with func arg!!!
return Contraction<CXprT>( i->ifor( op, f ) );
}
/************************
* various functions *
************************/
template <class IndexT>
constexpr decltype(auto) indexOp(const Sptr<IndexT>& i)
{
return i->xpr(i);
}
}
#endif

View file

@ -94,6 +94,9 @@ namespace CNORXZ
template <typename T, class IndexT>
constexpr decltype(auto) coproot(const CArrayBase<T>& a, const Sptr<IndexT>& ind);
template <typename T, class IndexT>
constexpr decltype(auto) coproot(const T* a, const Sptr<IndexT>& ind);
template <typename T, class IndexT>
class OpCont : public OpInterface<OpCont<T,IndexT>>
{
@ -207,7 +210,7 @@ namespace CNORXZ
};
template <class F, class... Ops>
constexpr decltype(auto) mkOperation(F&& f, const Ops&... ops);
constexpr decltype(auto) operation(F&& f, const Ops&... ops);
template <class F, class... Ops>
struct op_size<Operation<F,Ops...>>
@ -236,7 +239,10 @@ namespace CNORXZ
};
template <class F, class Op, class IndexT>
constexpr decltype(auto) mkContracion(F&& f, Op&& op, const Sptr<IndexT>& i);
constexpr decltype(auto) contracion(F&& f, Op&& op, const Sptr<IndexT>& i);
template <class IndexT>
constexpr decltype(auto) indexOp(const Sptr<IndexT>& i);
}
#endif

View file

@ -33,20 +33,20 @@ namespace CNORXZ
}
template <class F, class PosT, class OpTuple, class OpSizes, SizeT... Is>
inline void pos_unpack_args_i(const F& f, const PosT& pos, const OpTuple& args,
inline auto pos_unpack_args_i(const F& f, const PosT& pos, const OpTuple& args,
OpSizes opsizes, std::index_sequence<Is...> is)
{
f(std::get<Is>(args)(pos_get<sum_index_sequence<Is>(opsizes)>(pos))...);
return f(std::get<Is>(args)(pos_get<sum_index_sequence<Is>(opsizes)>(pos))...);
}
template <class F, class PosT, class... Ops>
inline void pos_unpack_args(const F& f, const PosT& pos, const Tuple<Ops...>& args)
inline auto pos_unpack_args(const F& f, const PosT& pos, const Tuple<Ops...>& args)
{
static_assert(is_pos_type<PosT>::value, "got non-pos-type");
static_assert((is_operation<Ops>::value and ...), "got non-operation type");
typedef std::make_index_sequence<sizeof...(Ops)> Idxs;
typedef std::index_sequence<op_size<Ops>::value...> OpSizes;
pos_unpack_args_i(f, pos, args, OpSizes{}, Idxs{});
return pos_unpack_args_i(f, pos, args, OpSizes{}, Idxs{});
}
}

View file

@ -13,11 +13,11 @@ namespace CNORXZ
constexpr SizeT sum_index_sequence(std::index_sequence<Is...> is);
template <class F, class PosT, class OpTuple, class OpSizes, SizeT... Is>
inline void pos_unpack_args_i(const F& f, const PosT& pos, const OpTuple& args,
inline auto pos_unpack_args_i(const F& f, const PosT& pos, const OpTuple& args,
OpSizes opsizes, std::index_sequence<Is...> is);
template <class F, class PosT, class... Ops>
inline void pos_unpack_args(const F& f, const PosT& pos, const Tuple<Ops...>& args);
inline auto pos_unpack_args(const F& f, const PosT& pos, const Tuple<Ops...>& args);
}

View file

@ -41,6 +41,7 @@ namespace CNORXZ
String stringMeta() const;
SizeT meta() const;
CIndex& at(const SizeT& metaPos);
COpRoot<SizeT,CIndex> xpr(const Sptr<CIndex>& _this) const;
template <class Index>
decltype(auto) format(const Sptr<Index>& ind) const;

View file

@ -53,6 +53,7 @@ namespace CNORXZ
String stringMeta() const;
DType meta() const;
DIndex& at(const DType& meta);
DXpr<SizeT> xpr(const Sptr<DIndex>& _this) const;
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const;

View file

@ -53,6 +53,7 @@ namespace CNORXZ
String stringMeta() const { return THIS().stringMeta(); }
decltype(auto) meta() const { return THIS().meta(); }
I& at(const MetaType& meta) { return THIS().at(meta); }
decltype(auto) xpr(const Sptr<I>& _this) const { return THIS().xpr(_this); }
//template <class Index>
//decltype(auto) format(const Sptr<Index>& ind) const { return THIS().format(ind); }

View file

@ -3,6 +3,9 @@
#define __cxz_mrange_cc_h__
#include "mrange.h"
#include "operation/op_types.h"
#include "operation/op_types.cc.h" // -> do .cc files
#include "operation/op_utility.cc.h" // -> do .cc files
namespace CNORXZ
{
@ -409,6 +412,17 @@ namespace CNORXZ
return *this;
}
template <class FormatT, class... Indices>
decltype(auto) GMIndex<FormatT,Indices...>::xpr(const Sptr<MIndex<Indices...>>& _this) const
{
return iter<0,NI>( [&](auto i) { return _this->pack()[i]->xpr( _this->pack()[i] ); },
[](const auto&... x) {
return operation( [](const auto&... e) {
return std::make_tuple(e...);
}, x... );
} );
}
template <class FormatT, class... Indices>
template <class Xpr, class F>
constexpr decltype(auto) GMIndex<FormatT,Indices...>::ifor(const Xpr& xpr, F&& f) const

View file

@ -65,6 +65,7 @@ namespace CNORXZ
String stringMeta() const;
MetaType meta() const;
GMIndex& at(const MetaType& metaPos);
decltype(auto) xpr(const Sptr<MIndex<Indices...>>& _this) const;
template <class Xpr, class F>
constexpr decltype(auto) ifor(const Xpr& xpr, F&& f) const;

View file

@ -8,6 +8,8 @@
#include "urange.h"
#include "index_mul.h"
#include "xpr/for.h"
#include "operation/op_types.h"
#include "operation/op_types.cc.h"
namespace CNORXZ
{
@ -118,6 +120,12 @@ namespace CNORXZ
return *this;
}
template <typename MetaType>
decltype(auto) UIndex<MetaType>::xpr(const Sptr<UIndex<MetaType>>& _this) const
{
return coproot(mMetaPtr,_this);
}
template <typename MetaType>
size_t UIndex<MetaType>::dim() const // = 1
{

View file

@ -46,6 +46,7 @@ namespace CNORXZ
String stringMeta() const;
const MetaT& meta() const;
UIndex& at(const MetaT& metaPos);
decltype(auto) xpr(const Sptr<UIndex<MetaType>>& _this) const;
template <class Index>
decltype(auto) format(const Sptr<Index>& ind) const;

View file

@ -209,6 +209,13 @@ namespace CNORXZ
return *this;
}
template <class Index, typename Meta>
DXpr<SizeT> XIndex<Index,Meta>::xpr(const XIndexPtr& _this) const
{
auto xthis = std::dynamic_pointer_cast<Index>(_this);
return DXpr<SizeT>( mI->xpr(xthis) );
}
template <class Index, typename Meta>
DXpr<SizeT> XIndex<Index,Meta>::ifor(const DXpr<SizeT>& xpr,
std::function<SizeT(SizeT,SizeT)>&& f) const

View file

@ -45,6 +45,7 @@ namespace CNORXZ
virtual String stringMeta() const = 0;
virtual DType meta() const = 0;
virtual XIndexBase& at(const DType& meta) = 0;
virtual DXpr<SizeT> xpr(const XIndexPtr& _this) const = 0;
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr,
std::function<SizeT(SizeT,SizeT)>&& f) const = 0;
@ -97,6 +98,7 @@ namespace CNORXZ
virtual String stringMeta() const override final;
virtual DType meta() const override final;
virtual XIndexBase& at(const DType& meta) override final;
virtual DXpr<SizeT> xpr(const XIndexPtr& _this) const override final;
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr,
std::function<SizeT(SizeT,SizeT)>&& f) const override final;

View file

@ -53,6 +53,7 @@ namespace CNORXZ
String stringMeta() const;
Vector<DType> meta() const;
YIndex& at(const Vector<DType>& meta);
DXpr<SizeT> xpr(const Sptr<YIndex>& _this) const;
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const;

View file

@ -25,13 +25,17 @@ namespace CNORXZ
template <typename T, class Xpr>
T VXpr<T,Xpr>::vexec(const DPos& last) const
{
return (*this)(last);
CXZ_ERROR("IMPLEMENT!!!" << last.val());
//(*this)(last);
return T();
}
template <typename T, class Xpr>
T VXpr<T,Xpr>::vexec() const
{
return (*this)();
CXZ_ERROR("IMPLEMENT!!!");
//(*this)();
return T();
}
template <typename T, class Xpr>

View file

@ -1,5 +1,6 @@
#include "ranges/ranges.h"
#include "operation/operation.h"
namespace CNORXZ
{
@ -107,6 +108,19 @@ namespace CNORXZ
return *this;
}
COpRoot<SizeT,CIndex> CIndex::xpr(const Sptr<CIndex>& _this) const
{
// preliminary solution (TODO: implement xpr that simply returns PosT value):
static Vector<SizeT> m;
if(m.size() < _this->lmax().val()){
m.resize(_this->lmax().val());
for(SizeT i = 0; i != m.size(); ++i) {
m[i] = i;
}
}
return coproot(m.data(), _this);
}
/**********************
* CRangeFactory *

View file

@ -162,6 +162,11 @@ namespace CNORXZ
return *this;
}
DXpr<SizeT> DIndex::xpr(const Sptr<DIndex>& _this) const
{
return mI->xpr(_this->xptr());
}
DXpr<SizeT> DIndex::ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const
{
return DXpr<SizeT>(mI->ifor(xpr, std::forward<std::function<SizeT(SizeT,SizeT)>>(f)) );

View file

@ -338,6 +338,12 @@ namespace CNORXZ
return *this;
}
DXpr<SizeT> YIndex::xpr(const Sptr<YIndex>& _this) const
{
CXZ_ERROR("IMPLEMENT!!!" << _this->lmax().val());
return DXpr<SizeT>();
}
DXpr<SizeT> YIndex::ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const
{
return mkIFor(0, xpr, std::forward<std::function<SizeT(SizeT,SizeT)>>(f));

View file

@ -28,7 +28,6 @@ namespace CNORXZ
virtual ContentType type() const = 0;
virtual bool ro() const = 0;
virtual ContentBase& open() = 0;
virtual ContentBase& write() = 0;
virtual ContentBase& close() = 0;
virtual String path() const = 0;
virtual String filename() const = 0;

View file

@ -23,7 +23,6 @@ namespace CNORXZ
virtual ContentType type() const override final;
virtual bool ro() const override final;
virtual File& open() override final;
virtual File& write() override final;
virtual File& close() override final;
virtual String path() const override final;
virtual String filename() const override final;

View file

@ -18,7 +18,6 @@ namespace CNORXZ
virtual ContentType type() const override;
virtual bool ro() const override;
virtual Group& open() override; // load group if existing, else create new group
virtual Group& write() override;
virtual Group& close() override;
virtual String path() const override;
virtual String filename() const override;

View file

@ -0,0 +1,38 @@
#ifndef __cxz_h5_table_h__
#define __cxz_h5_table_h__
#include "h5_content_base.h"
namespace CNORXZ
{
namespace hdf5
{
class Table : public ContentBase
{
public:
DEFAULT_MEMBERS(Table);
Table(const String& name, const ContentBase* _parent);
~Table();
virtual ContentType type() const override final;
virtual bool ro() const override final;
virtual Table& open() override final;
virtual Table& close() override final;
virtual String path() const override final;
virtual String filename() const override final;
template <class F>
decltype(auto) readRecords(F&& f) const;
private:
RangePtr mRecords;
RangePtr mFields; // -> FIndex (position -> offset)
MArray mSizes;
MArray mOffsets;
MArray mTypes;
};
}
}
#endif

View file

@ -49,15 +49,6 @@ namespace CNORXZ
return *this;
}
File& File::write()
{
CXZ_ASSERT( not mRo, "could not write to file: opened as read-only" );
for(auto& x: mCont){
x->write();
}
return *this;
}
File& File::close()
{
if(mCont.range() != nullptr){

View file

@ -40,12 +40,6 @@ namespace CNORXZ
return *this;
}
Group& Group::write()
{
// ...!!!
return *this;
}
Group& Group::close()
{
if(mId != 0){