mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Grid tensor serialisation fully implemented and tested
This commit is contained in:
parent
caf2f6b274
commit
360cface33
@ -198,7 +198,7 @@ namespace Grid {
|
|||||||
typedef typename vsimd::scalar_type scalar;\
|
typedef typename vsimd::scalar_type scalar;\
|
||||||
return Comparison(functor<scalar,scalar>(),lhs,rhs);\
|
return Comparison(functor<scalar,scalar>(),lhs,rhs);\
|
||||||
}\
|
}\
|
||||||
template<class vsimd>\
|
template<class vsimd,IfSimd<vsimd> = 0>\
|
||||||
inline vInteger operator op(const iScalar<vsimd> &lhs,const iScalar<vsimd> &rhs)\
|
inline vInteger operator op(const iScalar<vsimd> &lhs,const iScalar<vsimd> &rhs)\
|
||||||
{ \
|
{ \
|
||||||
return lhs._internal op rhs._internal; \
|
return lhs._internal op rhs._internal; \
|
||||||
|
@ -32,178 +32,9 @@ Author: Guido Cossu <guido.cossu@ed.ac.uk>
|
|||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <Grid/tensors/Tensors.h>
|
#include <Grid/tensors/Tensors.h>
|
||||||
|
#include <Grid/serialisation/VectorUtils.h>
|
||||||
|
|
||||||
namespace Grid {
|
namespace Grid {
|
||||||
// Grid scalar tensors to nested std::vectors //////////////////////////////////
|
|
||||||
template <typename T>
|
|
||||||
struct TensorToVec
|
|
||||||
{
|
|
||||||
typedef T type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct TensorToVec<iScalar<T>>
|
|
||||||
{
|
|
||||||
typedef typename TensorToVec<T>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
struct TensorToVec<iVector<T, N>>
|
|
||||||
{
|
|
||||||
typedef typename std::vector<typename TensorToVec<T>::type> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
struct TensorToVec<iMatrix<T, N>>
|
|
||||||
{
|
|
||||||
typedef typename std::vector<std::vector<typename TensorToVec<T>::type>> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
typename TensorToVec<T>::type tensorToVec(const T &t)
|
|
||||||
{
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
typename TensorToVec<iScalar<T>>::type tensorToVec(const iScalar<T>& t)
|
|
||||||
{
|
|
||||||
return tensorToVec(t._internal);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
typename TensorToVec<iVector<T, N>>::type tensorToVec(const iVector<T, N>& t)
|
|
||||||
{
|
|
||||||
typename TensorToVec<iVector<T, N>>::type v;
|
|
||||||
|
|
||||||
v.resize(N);
|
|
||||||
for (unsigned int i = 0; i < N; i++)
|
|
||||||
{
|
|
||||||
v[i] = tensorToVec(t._internal[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
typename TensorToVec<iMatrix<T, N>>::type tensorToVec(const iMatrix<T, N>& t)
|
|
||||||
{
|
|
||||||
typename TensorToVec<iMatrix<T, N>>::type v;
|
|
||||||
|
|
||||||
v.resize(N);
|
|
||||||
for (unsigned int i = 0; i < N; i++)
|
|
||||||
{
|
|
||||||
v[i].resize(N);
|
|
||||||
for (unsigned int j = 0; j < N; j++)
|
|
||||||
{
|
|
||||||
v[i][j] = tensorToVec(t._internal[i][j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void vecToTensor(T &t, const typename TensorToVec<T>::type &v)
|
|
||||||
{
|
|
||||||
t = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void vecToTensor(iScalar<T> &t, const typename TensorToVec<iScalar<T>>::type &v)
|
|
||||||
{
|
|
||||||
vecToTensor(t._internal, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
void vecToTensor(iVector<T, N> &t, const typename TensorToVec<iVector<T, N>>::type &v)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < N; i++)
|
|
||||||
{
|
|
||||||
vecToTensor(t._internal[i], v[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
void vecToTensor(iMatrix<T, N> &t, const typename TensorToVec<iMatrix<T, N>>::type &v)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < N; i++)
|
|
||||||
for (unsigned int j = 0; j < N; j++)
|
|
||||||
{
|
|
||||||
vecToTensor(t._internal[i][j], v[i][j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vector element trait //////////////////////////////////////////////////////
|
|
||||||
template <typename T>
|
|
||||||
struct element
|
|
||||||
{
|
|
||||||
typedef T type;
|
|
||||||
static constexpr bool is_number = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct element<std::vector<T>>
|
|
||||||
{
|
|
||||||
typedef typename element<T>::type type;
|
|
||||||
static constexpr bool is_number = std::is_arithmetic<T>::value
|
|
||||||
or is_complex<T>::value
|
|
||||||
or element<T>::is_number;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Vector flattening utility class ////////////////////////////////////////////
|
|
||||||
// Class to flatten a multidimensional std::vector
|
|
||||||
template <typename V>
|
|
||||||
class Flatten
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef typename element<V>::type Element;
|
|
||||||
public:
|
|
||||||
explicit Flatten(const V &vector);
|
|
||||||
const V & getVector(void);
|
|
||||||
const std::vector<Element> & getFlatVector(void);
|
|
||||||
const std::vector<size_t> & getDim(void);
|
|
||||||
private:
|
|
||||||
void accumulate(const Element &e);
|
|
||||||
template <typename W>
|
|
||||||
void accumulate(const W &v);
|
|
||||||
void accumulateDim(const Element &e);
|
|
||||||
template <typename W>
|
|
||||||
void accumulateDim(const W &v);
|
|
||||||
private:
|
|
||||||
const V &vector_;
|
|
||||||
std::vector<Element> flatVector_;
|
|
||||||
std::vector<size_t> dim_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Class to reconstruct a multidimensional std::vector
|
|
||||||
template <typename V>
|
|
||||||
class Reconstruct
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef typename element<V>::type Element;
|
|
||||||
public:
|
|
||||||
Reconstruct(const std::vector<Element> &flatVector,
|
|
||||||
const std::vector<size_t> &dim);
|
|
||||||
const V & getVector(void);
|
|
||||||
const std::vector<Element> & getFlatVector(void);
|
|
||||||
const std::vector<size_t> & getDim(void);
|
|
||||||
private:
|
|
||||||
void fill(std::vector<Element> &v);
|
|
||||||
template <typename W>
|
|
||||||
void fill(W &v);
|
|
||||||
void resize(std::vector<Element> &v, const unsigned int dim);
|
|
||||||
template <typename W>
|
|
||||||
void resize(W &v, const unsigned int dim);
|
|
||||||
private:
|
|
||||||
V vector_;
|
|
||||||
const std::vector<Element> &flatVector_;
|
|
||||||
std::vector<size_t> dim_;
|
|
||||||
size_t ind_{0};
|
|
||||||
unsigned int dimInd_{0};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Pair IO utilities /////////////////////////////////////////////////////////
|
// Pair IO utilities /////////////////////////////////////////////////////////
|
||||||
// helper function to parse input in the format "<obj1 obj2>"
|
// helper function to parse input in the format "<obj1 obj2>"
|
||||||
template <typename T1, typename T2>
|
template <typename T1, typename T2>
|
||||||
@ -252,42 +83,6 @@ namespace Grid {
|
|||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vector IO utilities ///////////////////////////////////////////////////////
|
|
||||||
// helper function to read space-separated values
|
|
||||||
template <typename T>
|
|
||||||
std::vector<T> strToVec(const std::string s)
|
|
||||||
{
|
|
||||||
std::istringstream sstr(s);
|
|
||||||
T buf;
|
|
||||||
std::vector<T> v;
|
|
||||||
|
|
||||||
while(!sstr.eof())
|
|
||||||
{
|
|
||||||
sstr >> buf;
|
|
||||||
v.push_back(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
// output to streams for vectors
|
|
||||||
template < class T >
|
|
||||||
inline std::ostream & operator<<(std::ostream &os, const std::vector<T> &v)
|
|
||||||
{
|
|
||||||
os << "[";
|
|
||||||
for (auto &x: v)
|
|
||||||
{
|
|
||||||
os << x << " ";
|
|
||||||
}
|
|
||||||
if (v.size() > 0)
|
|
||||||
{
|
|
||||||
os << "\b";
|
|
||||||
}
|
|
||||||
os << "]";
|
|
||||||
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Abstract writer/reader classes ////////////////////////////////////////////
|
// Abstract writer/reader classes ////////////////////////////////////////////
|
||||||
// static polymorphism implemented using CRTP idiom
|
// static polymorphism implemented using CRTP idiom
|
||||||
class Serializable;
|
class Serializable;
|
||||||
@ -307,6 +102,12 @@ namespace Grid {
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
typename std::enable_if<!std::is_base_of<Serializable, U>::value, void>::type
|
typename std::enable_if<!std::is_base_of<Serializable, U>::value, void>::type
|
||||||
write(const std::string& s, const U &output);
|
write(const std::string& s, const U &output);
|
||||||
|
template <typename U>
|
||||||
|
void write(const std::string &s, const iScalar<U> &output);
|
||||||
|
template <typename U, int N>
|
||||||
|
void write(const std::string &s, const iVector<U, N> &output);
|
||||||
|
template <typename U, int N>
|
||||||
|
void write(const std::string &s, const iMatrix<U, N> &output);
|
||||||
private:
|
private:
|
||||||
T *upcast;
|
T *upcast;
|
||||||
};
|
};
|
||||||
@ -326,6 +127,12 @@ namespace Grid {
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
typename std::enable_if<!std::is_base_of<Serializable, U>::value, void>::type
|
typename std::enable_if<!std::is_base_of<Serializable, U>::value, void>::type
|
||||||
read(const std::string& s, U &output);
|
read(const std::string& s, U &output);
|
||||||
|
template <typename U>
|
||||||
|
void read(const std::string &s, iScalar<U> &output);
|
||||||
|
template <typename U, int N>
|
||||||
|
void read(const std::string &s, iVector<U, N> &output);
|
||||||
|
template <typename U, int N>
|
||||||
|
void read(const std::string &s, iMatrix<U, N> &output);
|
||||||
protected:
|
protected:
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void fromString(U &output, const std::string &s);
|
void fromString(U &output, const std::string &s);
|
||||||
@ -339,203 +146,9 @@ namespace Grid {
|
|||||||
};
|
};
|
||||||
template<typename T> struct isWriter {
|
template<typename T> struct isWriter {
|
||||||
static const bool value = false;
|
static const bool value = false;
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Generic writer interface
|
|
||||||
// serializable base class
|
|
||||||
class Serializable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename T>
|
|
||||||
static inline void write(Writer<T> &WR,const std::string &s,
|
|
||||||
const Serializable &obj)
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static inline void read(Reader<T> &RD,const std::string &s,
|
|
||||||
Serializable &obj)
|
|
||||||
{}
|
|
||||||
|
|
||||||
friend inline std::ostream & operator<<(std::ostream &os,
|
|
||||||
const Serializable &obj)
|
|
||||||
{
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Flatten class template implementation /////////////////////////////////////
|
// Writer template implementation
|
||||||
template <typename V>
|
|
||||||
void Flatten<V>::accumulate(const Element &e)
|
|
||||||
{
|
|
||||||
flatVector_.push_back(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
template <typename W>
|
|
||||||
void Flatten<V>::accumulate(const W &v)
|
|
||||||
{
|
|
||||||
for (auto &e: v)
|
|
||||||
{
|
|
||||||
accumulate(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
void Flatten<V>::accumulateDim(const Element &e) {};
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
template <typename W>
|
|
||||||
void Flatten<V>::accumulateDim(const W &v)
|
|
||||||
{
|
|
||||||
dim_.push_back(v.size());
|
|
||||||
accumulateDim(v[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
Flatten<V>::Flatten(const V &vector)
|
|
||||||
: vector_(vector)
|
|
||||||
{
|
|
||||||
accumulate(vector_);
|
|
||||||
accumulateDim(vector_);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const V & Flatten<V>::getVector(void)
|
|
||||||
{
|
|
||||||
return vector_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const std::vector<typename Flatten<V>::Element> &
|
|
||||||
Flatten<V>::getFlatVector(void)
|
|
||||||
{
|
|
||||||
return flatVector_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const std::vector<size_t> & Flatten<V>::getDim(void)
|
|
||||||
{
|
|
||||||
return dim_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reconstruct class template implementation /////////////////////////////////
|
|
||||||
template <typename V>
|
|
||||||
void Reconstruct<V>::fill(std::vector<Element> &v)
|
|
||||||
{
|
|
||||||
for (auto &e: v)
|
|
||||||
{
|
|
||||||
e = flatVector_[ind_++];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
template <typename W>
|
|
||||||
void Reconstruct<V>::fill(W &v)
|
|
||||||
{
|
|
||||||
for (auto &e: v)
|
|
||||||
{
|
|
||||||
fill(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
void Reconstruct<V>::resize(std::vector<Element> &v, const unsigned int dim)
|
|
||||||
{
|
|
||||||
v.resize(dim_[dim]);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
template <typename W>
|
|
||||||
void Reconstruct<V>::resize(W &v, const unsigned int dim)
|
|
||||||
{
|
|
||||||
v.resize(dim_[dim]);
|
|
||||||
for (auto &e: v)
|
|
||||||
{
|
|
||||||
resize(e, dim + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
Reconstruct<V>::Reconstruct(const std::vector<Element> &flatVector,
|
|
||||||
const std::vector<size_t> &dim)
|
|
||||||
: flatVector_(flatVector)
|
|
||||||
, dim_(dim)
|
|
||||||
{
|
|
||||||
resize(vector_, 0);
|
|
||||||
fill(vector_);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const V & Reconstruct<V>::getVector(void)
|
|
||||||
{
|
|
||||||
return vector_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const std::vector<typename Reconstruct<V>::Element> &
|
|
||||||
Reconstruct<V>::getFlatVector(void)
|
|
||||||
{
|
|
||||||
return flatVector_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
const std::vector<size_t> & Reconstruct<V>::getDim(void)
|
|
||||||
{
|
|
||||||
return dim_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic writer interface //////////////////////////////////////////////////
|
|
||||||
template <typename T>
|
|
||||||
inline void push(Writer<T> &w, const std::string &s) {
|
|
||||||
w.push(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void push(Writer<T> &w, const char *s)
|
|
||||||
{
|
|
||||||
w.push(std::string(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void pop(Writer<T> &w)
|
|
||||||
{
|
|
||||||
w.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename U>
|
|
||||||
inline void write(Writer<T> &w, const std::string& s, const U &output)
|
|
||||||
{
|
|
||||||
w.write(s, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic reader interface
|
|
||||||
template <typename T>
|
|
||||||
inline bool push(Reader<T> &r, const std::string &s)
|
|
||||||
{
|
|
||||||
return r.push(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool push(Reader<T> &r, const char *s)
|
|
||||||
{
|
|
||||||
return r.push(std::string(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void pop(Reader<T> &r)
|
|
||||||
{
|
|
||||||
r.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename U>
|
|
||||||
inline void read(Reader<T> &r, const std::string &s, U &output)
|
|
||||||
{
|
|
||||||
r.read(s, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writer template implementation ////////////////////////////////////////////
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
Writer<T>::Writer(void)
|
Writer<T>::Writer(void)
|
||||||
{
|
{
|
||||||
@ -569,6 +182,27 @@ namespace Grid {
|
|||||||
{
|
{
|
||||||
upcast->writeDefault(s, output);
|
upcast->writeDefault(s, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U>
|
||||||
|
void Writer<T>::write(const std::string &s, const iScalar<U> &output)
|
||||||
|
{
|
||||||
|
upcast->writeDefault(s, tensorToVec(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U, int N>
|
||||||
|
void Writer<T>::write(const std::string &s, const iVector<U, N> &output)
|
||||||
|
{
|
||||||
|
upcast->writeDefault(s, tensorToVec(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U, int N>
|
||||||
|
void Writer<T>::write(const std::string &s, const iMatrix<U, N> &output)
|
||||||
|
{
|
||||||
|
upcast->writeDefault(s, tensorToVec(output));
|
||||||
|
}
|
||||||
|
|
||||||
// Reader template implementation
|
// Reader template implementation
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -604,7 +238,37 @@ namespace Grid {
|
|||||||
{
|
{
|
||||||
upcast->readDefault(s, output);
|
upcast->readDefault(s, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U>
|
||||||
|
void Reader<T>::read(const std::string &s, iScalar<U> &output)
|
||||||
|
{
|
||||||
|
typename TensorToVec<iScalar<U>>::type v;
|
||||||
|
|
||||||
|
upcast->readDefault(s, v);
|
||||||
|
vecToTensor(output, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U, int N>
|
||||||
|
void Reader<T>::read(const std::string &s, iVector<U, N> &output)
|
||||||
|
{
|
||||||
|
typename TensorToVec<iVector<U, N>>::type v;
|
||||||
|
|
||||||
|
upcast->readDefault(s, v);
|
||||||
|
vecToTensor(output, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename U, int N>
|
||||||
|
void Reader<T>::read(const std::string &s, iMatrix<U, N> &output)
|
||||||
|
{
|
||||||
|
typename TensorToVec<iMatrix<U, N>>::type v;
|
||||||
|
|
||||||
|
upcast->readDefault(s, v);
|
||||||
|
vecToTensor(output, v);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void Reader<T>::fromString(U &output, const std::string &s)
|
void Reader<T>::fromString(U &output, const std::string &s)
|
||||||
@ -623,6 +287,76 @@ namespace Grid {
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// serializable base class ///////////////////////////////////////////////////
|
||||||
|
class Serializable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename T>
|
||||||
|
static inline void write(Writer<T> &WR,const std::string &s,
|
||||||
|
const Serializable &obj)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static inline void read(Reader<T> &RD,const std::string &s,
|
||||||
|
Serializable &obj)
|
||||||
|
{}
|
||||||
|
|
||||||
|
friend inline std::ostream & operator<<(std::ostream &os,
|
||||||
|
const Serializable &obj)
|
||||||
|
{
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Generic writer interface //////////////////////////////////////////////////
|
||||||
|
template <typename T>
|
||||||
|
inline void push(Writer<T> &w, const std::string &s) {
|
||||||
|
w.push(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void push(Writer<T> &w, const char *s)
|
||||||
|
{
|
||||||
|
w.push(std::string(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void pop(Writer<T> &w)
|
||||||
|
{
|
||||||
|
w.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
inline void write(Writer<T> &w, const std::string& s, const U &output)
|
||||||
|
{
|
||||||
|
w.write(s, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic reader interface //////////////////////////////////////////////////
|
||||||
|
template <typename T>
|
||||||
|
inline bool push(Reader<T> &r, const std::string &s)
|
||||||
|
{
|
||||||
|
return r.push(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline bool push(Reader<T> &r, const char *s)
|
||||||
|
{
|
||||||
|
return r.push(std::string(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void pop(Reader<T> &r)
|
||||||
|
{
|
||||||
|
r.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
inline void read(Reader<T> &r, const std::string &s, U &output)
|
||||||
|
{
|
||||||
|
r.read(s, output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,12 +38,6 @@ namespace Grid
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
typename std::enable_if<!element<std::vector<U>>::is_number, void>::type
|
typename std::enable_if<!element<std::vector<U>>::is_number, void>::type
|
||||||
writeDefault(const std::string &s, const std::vector<U> &x);
|
writeDefault(const std::string &s, const std::vector<U> &x);
|
||||||
template <typename T>
|
|
||||||
void writeDefault(const std::string &s, const iScalar<T> &t);
|
|
||||||
template <typename T, int N>
|
|
||||||
void writeDefault(const std::string &s, const iVector<T, N> &t);
|
|
||||||
template <typename T, int N>
|
|
||||||
void writeDefault(const std::string &s, const iMatrix<T, N> &t);
|
|
||||||
private:
|
private:
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void writeSingleAttribute(const U &x, const std::string &name,
|
void writeSingleAttribute(const U &x, const std::string &name,
|
||||||
@ -154,24 +148,6 @@ namespace Grid
|
|||||||
}
|
}
|
||||||
pop();
|
pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void Hdf5Writer::writeDefault(const std::string &s, const iScalar<T> &t)
|
|
||||||
{
|
|
||||||
writeDefault(s, tensorToVec(t));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
void Hdf5Writer::writeDefault(const std::string &s, const iVector<T, N> &t)
|
|
||||||
{
|
|
||||||
writeDefault(s, tensorToVec(t));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, int N>
|
|
||||||
void Hdf5Writer::writeDefault(const std::string &s, const iMatrix<T, N> &t)
|
|
||||||
{
|
|
||||||
writeDefault(s, tensorToVec(t));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reader template implementation ////////////////////////////////////////////
|
// Reader template implementation ////////////////////////////////////////////
|
||||||
template <typename U>
|
template <typename U>
|
||||||
|
336
lib/serialisation/VectorUtils.h
Normal file
336
lib/serialisation/VectorUtils.h
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
#ifndef GRID_SERIALISATION_VECTORUTILS_H
|
||||||
|
#define GRID_SERIALISATION_VECTORUTILS_H
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <Grid/tensors/Tensors.h>
|
||||||
|
|
||||||
|
namespace Grid {
|
||||||
|
// Grid scalar tensors to nested std::vectors //////////////////////////////////
|
||||||
|
template <typename T>
|
||||||
|
struct TensorToVec
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct TensorToVec<iScalar<T>>
|
||||||
|
{
|
||||||
|
typedef typename TensorToVec<T>::type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
struct TensorToVec<iVector<T, N>>
|
||||||
|
{
|
||||||
|
typedef typename std::vector<typename TensorToVec<T>::type> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
struct TensorToVec<iMatrix<T, N>>
|
||||||
|
{
|
||||||
|
typedef typename std::vector<std::vector<typename TensorToVec<T>::type>> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
typename TensorToVec<T>::type tensorToVec(const T &t)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
typename TensorToVec<iScalar<T>>::type tensorToVec(const iScalar<T>& t)
|
||||||
|
{
|
||||||
|
return tensorToVec(t._internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
typename TensorToVec<iVector<T, N>>::type tensorToVec(const iVector<T, N>& t)
|
||||||
|
{
|
||||||
|
typename TensorToVec<iVector<T, N>>::type v;
|
||||||
|
|
||||||
|
v.resize(N);
|
||||||
|
for (unsigned int i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
v[i] = tensorToVec(t._internal[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
typename TensorToVec<iMatrix<T, N>>::type tensorToVec(const iMatrix<T, N>& t)
|
||||||
|
{
|
||||||
|
typename TensorToVec<iMatrix<T, N>>::type v;
|
||||||
|
|
||||||
|
v.resize(N);
|
||||||
|
for (unsigned int i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
v[i].resize(N);
|
||||||
|
for (unsigned int j = 0; j < N; j++)
|
||||||
|
{
|
||||||
|
v[i][j] = tensorToVec(t._internal[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void vecToTensor(T &t, const typename TensorToVec<T>::type &v)
|
||||||
|
{
|
||||||
|
t = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void vecToTensor(iScalar<T> &t, const typename TensorToVec<iScalar<T>>::type &v)
|
||||||
|
{
|
||||||
|
vecToTensor(t._internal, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
void vecToTensor(iVector<T, N> &t, const typename TensorToVec<iVector<T, N>>::type &v)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
vecToTensor(t._internal[i], v[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, int N>
|
||||||
|
void vecToTensor(iMatrix<T, N> &t, const typename TensorToVec<iMatrix<T, N>>::type &v)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < N; i++)
|
||||||
|
for (unsigned int j = 0; j < N; j++)
|
||||||
|
{
|
||||||
|
vecToTensor(t._internal[i][j], v[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector element trait //////////////////////////////////////////////////////
|
||||||
|
template <typename T>
|
||||||
|
struct element
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
static constexpr bool is_number = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct element<std::vector<T>>
|
||||||
|
{
|
||||||
|
typedef typename element<T>::type type;
|
||||||
|
static constexpr bool is_number = std::is_arithmetic<T>::value
|
||||||
|
or is_complex<T>::value
|
||||||
|
or element<T>::is_number;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Vector flattening utility class ////////////////////////////////////////////
|
||||||
|
// Class to flatten a multidimensional std::vector
|
||||||
|
template <typename V>
|
||||||
|
class Flatten
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename element<V>::type Element;
|
||||||
|
public:
|
||||||
|
explicit Flatten(const V &vector);
|
||||||
|
const V & getVector(void);
|
||||||
|
const std::vector<Element> & getFlatVector(void);
|
||||||
|
const std::vector<size_t> & getDim(void);
|
||||||
|
private:
|
||||||
|
void accumulate(const Element &e);
|
||||||
|
template <typename W>
|
||||||
|
void accumulate(const W &v);
|
||||||
|
void accumulateDim(const Element &e);
|
||||||
|
template <typename W>
|
||||||
|
void accumulateDim(const W &v);
|
||||||
|
private:
|
||||||
|
const V &vector_;
|
||||||
|
std::vector<Element> flatVector_;
|
||||||
|
std::vector<size_t> dim_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Class to reconstruct a multidimensional std::vector
|
||||||
|
template <typename V>
|
||||||
|
class Reconstruct
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename element<V>::type Element;
|
||||||
|
public:
|
||||||
|
Reconstruct(const std::vector<Element> &flatVector,
|
||||||
|
const std::vector<size_t> &dim);
|
||||||
|
const V & getVector(void);
|
||||||
|
const std::vector<Element> & getFlatVector(void);
|
||||||
|
const std::vector<size_t> & getDim(void);
|
||||||
|
private:
|
||||||
|
void fill(std::vector<Element> &v);
|
||||||
|
template <typename W>
|
||||||
|
void fill(W &v);
|
||||||
|
void resize(std::vector<Element> &v, const unsigned int dim);
|
||||||
|
template <typename W>
|
||||||
|
void resize(W &v, const unsigned int dim);
|
||||||
|
private:
|
||||||
|
V vector_;
|
||||||
|
const std::vector<Element> &flatVector_;
|
||||||
|
std::vector<size_t> dim_;
|
||||||
|
size_t ind_{0};
|
||||||
|
unsigned int dimInd_{0};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Flatten class template implementation
|
||||||
|
template <typename V>
|
||||||
|
void Flatten<V>::accumulate(const Element &e)
|
||||||
|
{
|
||||||
|
flatVector_.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
template <typename W>
|
||||||
|
void Flatten<V>::accumulate(const W &v)
|
||||||
|
{
|
||||||
|
for (auto &e: v)
|
||||||
|
{
|
||||||
|
accumulate(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
void Flatten<V>::accumulateDim(const Element &e) {};
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
template <typename W>
|
||||||
|
void Flatten<V>::accumulateDim(const W &v)
|
||||||
|
{
|
||||||
|
dim_.push_back(v.size());
|
||||||
|
accumulateDim(v[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
Flatten<V>::Flatten(const V &vector)
|
||||||
|
: vector_(vector)
|
||||||
|
{
|
||||||
|
accumulate(vector_);
|
||||||
|
accumulateDim(vector_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const V & Flatten<V>::getVector(void)
|
||||||
|
{
|
||||||
|
return vector_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const std::vector<typename Flatten<V>::Element> &
|
||||||
|
Flatten<V>::getFlatVector(void)
|
||||||
|
{
|
||||||
|
return flatVector_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const std::vector<size_t> & Flatten<V>::getDim(void)
|
||||||
|
{
|
||||||
|
return dim_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reconstruct class template implementation
|
||||||
|
template <typename V>
|
||||||
|
void Reconstruct<V>::fill(std::vector<Element> &v)
|
||||||
|
{
|
||||||
|
for (auto &e: v)
|
||||||
|
{
|
||||||
|
e = flatVector_[ind_++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
template <typename W>
|
||||||
|
void Reconstruct<V>::fill(W &v)
|
||||||
|
{
|
||||||
|
for (auto &e: v)
|
||||||
|
{
|
||||||
|
fill(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
void Reconstruct<V>::resize(std::vector<Element> &v, const unsigned int dim)
|
||||||
|
{
|
||||||
|
v.resize(dim_[dim]);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
template <typename W>
|
||||||
|
void Reconstruct<V>::resize(W &v, const unsigned int dim)
|
||||||
|
{
|
||||||
|
v.resize(dim_[dim]);
|
||||||
|
for (auto &e: v)
|
||||||
|
{
|
||||||
|
resize(e, dim + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
Reconstruct<V>::Reconstruct(const std::vector<Element> &flatVector,
|
||||||
|
const std::vector<size_t> &dim)
|
||||||
|
: flatVector_(flatVector)
|
||||||
|
, dim_(dim)
|
||||||
|
{
|
||||||
|
resize(vector_, 0);
|
||||||
|
fill(vector_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const V & Reconstruct<V>::getVector(void)
|
||||||
|
{
|
||||||
|
return vector_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const std::vector<typename Reconstruct<V>::Element> &
|
||||||
|
Reconstruct<V>::getFlatVector(void)
|
||||||
|
{
|
||||||
|
return flatVector_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
const std::vector<size_t> & Reconstruct<V>::getDim(void)
|
||||||
|
{
|
||||||
|
return dim_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vector IO utilities ///////////////////////////////////////////////////////
|
||||||
|
// helper function to read space-separated values
|
||||||
|
template <typename T>
|
||||||
|
std::vector<T> strToVec(const std::string s)
|
||||||
|
{
|
||||||
|
std::istringstream sstr(s);
|
||||||
|
T buf;
|
||||||
|
std::vector<T> v;
|
||||||
|
|
||||||
|
while(!sstr.eof())
|
||||||
|
{
|
||||||
|
sstr >> buf;
|
||||||
|
v.push_back(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// output to streams for vectors
|
||||||
|
template < class T >
|
||||||
|
inline std::ostream & operator<<(std::ostream &os, const std::vector<T> &v)
|
||||||
|
{
|
||||||
|
os << "[";
|
||||||
|
for (auto &x: v)
|
||||||
|
{
|
||||||
|
os << x << " ";
|
||||||
|
}
|
||||||
|
if (v.size() > 0)
|
||||||
|
{
|
||||||
|
os << "\b";
|
||||||
|
}
|
||||||
|
os << "]";
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -55,5 +55,38 @@ LOGICAL_BINOP(&);
|
|||||||
LOGICAL_BINOP(||);
|
LOGICAL_BINOP(||);
|
||||||
LOGICAL_BINOP(&&);
|
LOGICAL_BINOP(&&);
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
strong_inline bool operator==(const iScalar<T> &t1, const iScalar<T> &t2)
|
||||||
|
{
|
||||||
|
return (t1._internal == t2._internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, int N>
|
||||||
|
strong_inline bool operator==(const iVector<T, N> &t1, const iVector<T, N> &t2)
|
||||||
|
{
|
||||||
|
bool res = true;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
res = (res && (t1._internal[i] == t2._internal[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, int N>
|
||||||
|
strong_inline bool operator==(const iMatrix<T, N> &t1, const iMatrix<T, N> &t2)
|
||||||
|
{
|
||||||
|
bool res = true;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < N; ++i)
|
||||||
|
for (unsigned int j = 0; j < N; ++j)
|
||||||
|
{
|
||||||
|
res = (res && (t1._internal[i][j] == t2._internal[i][j]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -45,7 +45,8 @@ public:
|
|||||||
bool , b,
|
bool , b,
|
||||||
std::vector<double>, array,
|
std::vector<double>, array,
|
||||||
std::vector<std::vector<double> >, twodimarray,
|
std::vector<std::vector<double> >, twodimarray,
|
||||||
std::vector<std::vector<std::vector<Complex> > >, cmplx3darray
|
std::vector<std::vector<std::vector<Complex> > >, cmplx3darray,
|
||||||
|
SpinColourMatrix, scm
|
||||||
);
|
);
|
||||||
myclass() {}
|
myclass() {}
|
||||||
myclass(int i)
|
myclass(int i)
|
||||||
@ -59,6 +60,12 @@ public:
|
|||||||
y=2*i;
|
y=2*i;
|
||||||
b=true;
|
b=true;
|
||||||
name="bother said pooh";
|
name="bother said pooh";
|
||||||
|
scm()(0, 1)(2, 1) = 2.356;
|
||||||
|
scm()(3, 0)(1, 1) = 1.323;
|
||||||
|
scm()(2, 1)(0, 1) = 5.3336;
|
||||||
|
scm()(0, 2)(1, 1) = 6.336;
|
||||||
|
scm()(2, 1)(2, 2) = 7.344;
|
||||||
|
scm()(1, 1)(2, 0) = 8.3534;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -113,6 +120,10 @@ void tensorConvTestFn(GridSerialRNG &rng, const std::string label)
|
|||||||
|
|
||||||
int main(int argc,char **argv)
|
int main(int argc,char **argv)
|
||||||
{
|
{
|
||||||
|
GridSerialRNG rng;
|
||||||
|
|
||||||
|
rng.SeedFixedIntegers(std::vector<int>({42,10,81,9}));
|
||||||
|
|
||||||
std::cout << "==== basic IO" << std::endl;
|
std::cout << "==== basic IO" << std::endl;
|
||||||
XmlWriter WR("bother.xml");
|
XmlWriter WR("bother.xml");
|
||||||
|
|
||||||
@ -138,7 +149,7 @@ int main(int argc,char **argv)
|
|||||||
std::cout << "-- serialisable class writing to 'bother.xml'..." << std::endl;
|
std::cout << "-- serialisable class writing to 'bother.xml'..." << std::endl;
|
||||||
write(WR,"obj",obj);
|
write(WR,"obj",obj);
|
||||||
WR.write("obj2", obj);
|
WR.write("obj2", obj);
|
||||||
vec.push_back(myclass(1234));
|
vec.push_back(obj);
|
||||||
vec.push_back(myclass(5678));
|
vec.push_back(myclass(5678));
|
||||||
vec.push_back(myclass(3838));
|
vec.push_back(myclass(3838));
|
||||||
pair = std::make_pair(myenum::red, myenum::blue);
|
pair = std::make_pair(myenum::red, myenum::blue);
|
||||||
@ -149,8 +160,6 @@ int main(int argc,char **argv)
|
|||||||
std::cout << "-- serialisable class comparison:" << std::endl;
|
std::cout << "-- serialisable class comparison:" << std::endl;
|
||||||
std::cout << "vec[0] == obj: " << ((vec[0] == obj) ? "true" : "false") << std::endl;
|
std::cout << "vec[0] == obj: " << ((vec[0] == obj) ? "true" : "false") << std::endl;
|
||||||
std::cout << "vec[1] == obj: " << ((vec[1] == obj) ? "true" : "false") << std::endl;
|
std::cout << "vec[1] == obj: " << ((vec[1] == obj) ? "true" : "false") << std::endl;
|
||||||
|
|
||||||
write(WR, "objpair", pair);
|
|
||||||
std::cout << "-- pair writing to std::cout:" << std::endl;
|
std::cout << "-- pair writing to std::cout:" << std::endl;
|
||||||
std::cout << pair << std::endl;
|
std::cout << pair << std::endl;
|
||||||
|
|
||||||
@ -159,26 +168,20 @@ int main(int argc,char **argv)
|
|||||||
//// XML
|
//// XML
|
||||||
ioTest<XmlWriter, XmlReader>("iotest.xml", obj, "XML (object) ");
|
ioTest<XmlWriter, XmlReader>("iotest.xml", obj, "XML (object) ");
|
||||||
ioTest<XmlWriter, XmlReader>("iotest.xml", vec, "XML (vector of objects)");
|
ioTest<XmlWriter, XmlReader>("iotest.xml", vec, "XML (vector of objects)");
|
||||||
ioTest<XmlWriter, XmlReader>("iotest.xml", pair, "XML (pair of objects)");
|
|
||||||
//// binary
|
//// binary
|
||||||
ioTest<BinaryWriter, BinaryReader>("iotest.bin", obj, "binary (object) ");
|
ioTest<BinaryWriter, BinaryReader>("iotest.bin", obj, "binary (object) ");
|
||||||
ioTest<BinaryWriter, BinaryReader>("iotest.bin", vec, "binary (vector of objects)");
|
ioTest<BinaryWriter, BinaryReader>("iotest.bin", vec, "binary (vector of objects)");
|
||||||
ioTest<BinaryWriter, BinaryReader>("iotest.bin", pair, "binary (pair of objects)");
|
|
||||||
//// text
|
//// text
|
||||||
ioTest<TextWriter, TextReader>("iotest.dat", obj, "text (object) ");
|
ioTest<TextWriter, TextReader>("iotest.dat", obj, "text (object) ");
|
||||||
ioTest<TextWriter, TextReader>("iotest.dat", vec, "text (vector of objects)");
|
ioTest<TextWriter, TextReader>("iotest.dat", vec, "text (vector of objects)");
|
||||||
ioTest<TextWriter, TextReader>("iotest.dat", pair, "text (pair of objects)");
|
|
||||||
//// text
|
//// text
|
||||||
ioTest<JSONWriter, JSONReader>("iotest.json", obj, "JSON (object) ");
|
ioTest<JSONWriter, JSONReader>("iotest.json", obj, "JSON (object) ");
|
||||||
ioTest<JSONWriter, JSONReader>("iotest.json", vec, "JSON (vector of objects)");
|
ioTest<JSONWriter, JSONReader>("iotest.json", vec, "JSON (vector of objects)");
|
||||||
ioTest<JSONWriter, JSONReader>("iotest.json", pair, "JSON (pair of objects)");
|
|
||||||
|
|
||||||
//// HDF5
|
//// HDF5
|
||||||
#undef HAVE_HDF5
|
|
||||||
#ifdef HAVE_HDF5
|
#ifdef HAVE_HDF5
|
||||||
ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", obj, "HDF5 (object) ");
|
ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", obj, "HDF5 (object) ");
|
||||||
ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", vec, "HDF5 (vector of objects)");
|
ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", vec, "HDF5 (vector of objects)");
|
||||||
ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", pair, "HDF5 (pair of objects)");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::cout << "\n==== vector flattening/reconstruction" << std::endl;
|
std::cout << "\n==== vector flattening/reconstruction" << std::endl;
|
||||||
@ -216,10 +219,6 @@ int main(int argc,char **argv)
|
|||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
std::cout << "==== Grid tensor to vector test" << std::endl;
|
std::cout << "==== Grid tensor to vector test" << std::endl;
|
||||||
|
|
||||||
GridSerialRNG rng;
|
|
||||||
|
|
||||||
rng.SeedFixedIntegers(std::vector<int>({42,10,81,9}));
|
|
||||||
tensorConvTest(rng, SpinColourMatrix);
|
tensorConvTest(rng, SpinColourMatrix);
|
||||||
tensorConvTest(rng, SpinColourVector);
|
tensorConvTest(rng, SpinColourVector);
|
||||||
tensorConvTest(rng, ColourMatrix);
|
tensorConvTest(rng, ColourMatrix);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user