mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Merge branch 'feature/hadrons' of https://github.com/paboyle/Grid into feature/hadrons
This commit is contained in:
		@@ -28,130 +28,152 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
    /*  END LEGAL */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
  
 | 
			
		||||
  GRID_SERIALIZABLE_ENUM(myenum, undef, red, 1, blue, 2, green, 3);
 | 
			
		||||
    
 | 
			
		||||
  class myclass: Serializable {
 | 
			
		||||
  public:
 | 
			
		||||
    
 | 
			
		||||
    GRID_SERIALIZABLE_CLASS_MEMBERS(myclass,
 | 
			
		||||
                            myenum, e,
 | 
			
		||||
                            std::vector<myenum>, ve,
 | 
			
		||||
                            std::string, name,
 | 
			
		||||
                            int, x,
 | 
			
		||||
                            double, y,
 | 
			
		||||
                            bool , b,
 | 
			
		||||
                            std::vector<double>, array,
 | 
			
		||||
                            std::vector<std::vector<double>>, twodimarray,
 | 
			
		||||
                            );
 | 
			
		||||
    
 | 
			
		||||
    myclass() {}
 | 
			
		||||
    myclass(int i)
 | 
			
		||||
    : array(4,5.1), twodimarray(3,std::vector<double>(2,1.23456)), ve(2, myenum::blue)
 | 
			
		||||
    {
 | 
			
		||||
      e=myenum::red;
 | 
			
		||||
      x=i;
 | 
			
		||||
      y=2*i;
 | 
			
		||||
      b=true;
 | 
			
		||||
      name="bother said pooh";
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
 | 
			
		||||
int16_t i16 = 1;
 | 
			
		||||
GRID_SERIALIZABLE_ENUM(myenum, undef, red, 1, blue, 2, green, 3);
 | 
			
		||||
  
 | 
			
		||||
class myclass: Serializable {
 | 
			
		||||
public:
 | 
			
		||||
  GRID_SERIALIZABLE_CLASS_MEMBERS(myclass,
 | 
			
		||||
                          myenum, e,
 | 
			
		||||
                          std::vector<myenum>, ve,
 | 
			
		||||
                          std::string, name,
 | 
			
		||||
                          int, x,
 | 
			
		||||
                          double, y,
 | 
			
		||||
                          bool , b,
 | 
			
		||||
                          std::vector<double>, array,
 | 
			
		||||
                          std::vector<std::vector<double>>, twodimarray,
 | 
			
		||||
                          std::vector<std::vector<std::vector<Complex>>>, cmplx3darray
 | 
			
		||||
                          );
 | 
			
		||||
  myclass() {}
 | 
			
		||||
  myclass(int i)
 | 
			
		||||
  : array(4,5.1)
 | 
			
		||||
  , twodimarray(3,std::vector<double>(5, 1.23456))
 | 
			
		||||
  , cmplx3darray(3,std::vector<std::vector<Complex>>(5, std::vector<Complex>(7, Complex(1.2, 3.4))))
 | 
			
		||||
  , ve(2, myenum::blue)
 | 
			
		||||
  {
 | 
			
		||||
    e=myenum::red;
 | 
			
		||||
    x=i;
 | 
			
		||||
    y=2*i;
 | 
			
		||||
    b=true;
 | 
			
		||||
    name="bother said pooh";
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int16_t  i16 = 1;
 | 
			
		||||
uint16_t u16 = 2;
 | 
			
		||||
int32_t i32 = 3;
 | 
			
		||||
int32_t  i32 = 3;
 | 
			
		||||
uint32_t u32 = 4;
 | 
			
		||||
int64_t i64 = 5;
 | 
			
		||||
int64_t  i64 = 5;
 | 
			
		||||
uint64_t u64 = 6;
 | 
			
		||||
float    f = M_PI;
 | 
			
		||||
double   d = 2*M_PI;
 | 
			
		||||
bool     b = false;
 | 
			
		||||
float    f   = M_PI;
 | 
			
		||||
double   d   = 2*M_PI;
 | 
			
		||||
bool     b   = false;
 | 
			
		||||
 | 
			
		||||
template <typename W, typename R, typename O>
 | 
			
		||||
void ioTest(const std::string &filename, const O &object, const std::string &name)
 | 
			
		||||
{
 | 
			
		||||
  // writer needs to be destroyed so that writing physically happens
 | 
			
		||||
  {
 | 
			
		||||
    W writer(filename);
 | 
			
		||||
    
 | 
			
		||||
    write(writer, "testobject", object);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  R    reader(filename);
 | 
			
		||||
  O    buf;
 | 
			
		||||
  bool good;
 | 
			
		||||
  
 | 
			
		||||
  read(reader, "testobject", buf);
 | 
			
		||||
  good = (object == buf);
 | 
			
		||||
  std::cout << name << " IO test: " << (good ? "success" : "failure");
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  if (!good) exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc,char **argv)
 | 
			
		||||
{
 | 
			
		||||
  {
 | 
			
		||||
    XmlWriter WR("bother.xml");
 | 
			
		||||
    
 | 
			
		||||
    // test basic type writing
 | 
			
		||||
    push(WR,"BasicTypes");
 | 
			
		||||
    write(WR,std::string("i16"),i16);
 | 
			
		||||
    write(WR,"u16",u16);
 | 
			
		||||
    write(WR,"i32",i32);
 | 
			
		||||
    write(WR,"u32",u32);
 | 
			
		||||
    write(WR,"i64",i64);
 | 
			
		||||
    write(WR,"u64",u64);
 | 
			
		||||
    write(WR,"f",f);
 | 
			
		||||
    write(WR,"d",d);
 | 
			
		||||
    write(WR,"b",b);
 | 
			
		||||
    pop(WR);
 | 
			
		||||
    
 | 
			
		||||
    // test serializable class writing
 | 
			
		||||
    myclass obj(1234); // non-trivial constructor
 | 
			
		||||
    write(WR,"obj",obj);
 | 
			
		||||
    WR.write("obj2", obj);
 | 
			
		||||
    std::cout << obj << std::endl;
 | 
			
		||||
    
 | 
			
		||||
    std::vector<myclass> vec;
 | 
			
		||||
    vec.push_back(myclass(1234));
 | 
			
		||||
    vec.push_back(myclass(5678));
 | 
			
		||||
    vec.push_back(myclass(3838));
 | 
			
		||||
    write(WR, "objvec", vec);
 | 
			
		||||
  };
 | 
			
		||||
  std::cout << "==== basic IO" << std::endl;
 | 
			
		||||
  XmlWriter WR("bother.xml");
 | 
			
		||||
  
 | 
			
		||||
  // test basic type writing
 | 
			
		||||
  std::cout << "-- basic writing to 'bother.xml'..." << std::endl;
 | 
			
		||||
  push(WR,"BasicTypes");
 | 
			
		||||
  write(WR,std::string("i16"),i16);
 | 
			
		||||
  write(WR,"u16",u16);
 | 
			
		||||
  write(WR,"i32",i32);
 | 
			
		||||
  write(WR,"u32",u32);
 | 
			
		||||
  write(WR,"i64",i64);
 | 
			
		||||
  write(WR,"u64",u64);
 | 
			
		||||
  write(WR,"f",f);
 | 
			
		||||
  write(WR,"d",d);
 | 
			
		||||
  write(WR,"b",b);
 | 
			
		||||
  pop(WR);
 | 
			
		||||
  
 | 
			
		||||
  // test serializable class writing
 | 
			
		||||
  myclass              obj(1234); // non-trivial constructor
 | 
			
		||||
  std::vector<myclass> vec;
 | 
			
		||||
  
 | 
			
		||||
  std::cout << "-- serialisable class writing to 'bother.xml'..." << std::endl;
 | 
			
		||||
  write(WR,"obj",obj);
 | 
			
		||||
  WR.write("obj2", obj);
 | 
			
		||||
  vec.push_back(myclass(1234));
 | 
			
		||||
  vec.push_back(myclass(5678));
 | 
			
		||||
  vec.push_back(myclass(3838));
 | 
			
		||||
  write(WR, "objvec", vec);
 | 
			
		||||
  std::cout << "-- serialisable class writing to std::cout:" << std::endl;
 | 
			
		||||
  std::cout << obj << std::endl;
 | 
			
		||||
  std::cout << "-- serialisable class comparison:" << 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;
 | 
			
		||||
  
 | 
			
		||||
  // read tests
 | 
			
		||||
  myclass copy1, copy2, copy3;
 | 
			
		||||
  std::vector<myclass> veccopy1, veccopy2, veccopy3;
 | 
			
		||||
  std::cout << "\n==== IO self-consistency tests" << std::endl;
 | 
			
		||||
  //// XML
 | 
			
		||||
  {
 | 
			
		||||
    XmlReader RD("bother.xml");
 | 
			
		||||
    read(RD,"obj",copy1);
 | 
			
		||||
    read(RD,"objvec", veccopy1);
 | 
			
		||||
    std::cout << "Loaded (XML) -----------------" << std::endl;
 | 
			
		||||
    std::cout << copy1 << std::endl << veccopy1 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  ioTest<XmlWriter, XmlReader>("iotest.xml", obj, "XML    (object)           ");
 | 
			
		||||
  ioTest<XmlWriter, XmlReader>("iotest.xml", vec, "XML    (vector of objects)");
 | 
			
		||||
  //// binary
 | 
			
		||||
  {
 | 
			
		||||
    BinaryWriter BWR("bother.bin");
 | 
			
		||||
    write(BWR,"discard",copy1 );
 | 
			
		||||
    write(BWR,"discard",veccopy1 );
 | 
			
		||||
  }
 | 
			
		||||
  {
 | 
			
		||||
    BinaryReader BRD("bother.bin");
 | 
			
		||||
    read (BRD,"discard",copy2 );
 | 
			
		||||
    read (BRD,"discard",veccopy2 );
 | 
			
		||||
    std::cout << "Loaded (bin) -----------------" << std::endl;
 | 
			
		||||
    std::cout << copy2 << std::endl << veccopy2 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  ioTest<BinaryWriter, BinaryReader>("iotest.bin", obj, "binary (object)           ");
 | 
			
		||||
  ioTest<BinaryWriter, BinaryReader>("iotest.bin", vec, "binary (vector of objects)");
 | 
			
		||||
  //// text
 | 
			
		||||
  {
 | 
			
		||||
    TextWriter TWR("bother.txt");
 | 
			
		||||
    write(TWR,"discard",copy1 );
 | 
			
		||||
    write(TWR,"discard",veccopy1 );
 | 
			
		||||
  }
 | 
			
		||||
  {
 | 
			
		||||
    TextReader TRD("bother.txt");
 | 
			
		||||
    read (TRD,"discard",copy3 );
 | 
			
		||||
    read (TRD,"discard",veccopy3 );
 | 
			
		||||
    std::cout << "Loaded (txt) -----------------" << std::endl;
 | 
			
		||||
    std::cout << copy3 << std::endl << veccopy3 << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  ioTest<TextWriter, TextReader>("iotest.dat", obj, "text   (object)           ");
 | 
			
		||||
  ioTest<TextWriter, TextReader>("iotest.dat", vec, "text   (vector of objects)");
 | 
			
		||||
  //// HDF5
 | 
			
		||||
#ifdef HAVE_HDF5
 | 
			
		||||
  ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", obj, "HDF5   (object)           ");
 | 
			
		||||
  ioTest<Hdf5Writer, Hdf5Reader>("iotest.h5", vec, "HDF5   (vector of objects)");
 | 
			
		||||
#endif
 | 
			
		||||
  
 | 
			
		||||
  std::vector<int> iv = strToVec<int>("1 2 2 4");
 | 
			
		||||
  std::vector<std::string> sv = strToVec<std::string>("bli bla blu");
 | 
			
		||||
  std::cout << "\n==== vector flattening/reconstruction" << std::endl;
 | 
			
		||||
  typedef std::vector<std::vector<std::vector<double>>> vec3d;
 | 
			
		||||
  
 | 
			
		||||
  for (auto &e: iv)
 | 
			
		||||
  vec3d dv, buf;
 | 
			
		||||
  double d = 0.;
 | 
			
		||||
  
 | 
			
		||||
  dv.resize(4);
 | 
			
		||||
  for (auto &v1: dv)
 | 
			
		||||
  {
 | 
			
		||||
    std::cout << e << " ";
 | 
			
		||||
    v1.resize(3);
 | 
			
		||||
    for (auto &v2: v1)
 | 
			
		||||
    {
 | 
			
		||||
      v2.resize(5);
 | 
			
		||||
      for (auto &x: v2)
 | 
			
		||||
      {
 | 
			
		||||
        x = d++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  for (auto &e: sv)
 | 
			
		||||
  {
 | 
			
		||||
    std::cout << e << " ";
 | 
			
		||||
  }
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  std::cout << "original 3D vector:" << std::endl;
 | 
			
		||||
  std::cout << dv << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  Flatten<vec3d> flatdv(dv);
 | 
			
		||||
  
 | 
			
		||||
  std::cout << "\ndimensions:" << std::endl;
 | 
			
		||||
  std::cout << flatdv.getDim() << std::endl;
 | 
			
		||||
  std::cout << "\nflattened vector:" << std::endl;
 | 
			
		||||
  std::cout << flatdv.getFlatVector() << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  Reconstruct<vec3d> rec(flatdv.getFlatVector(), flatdv.getDim());
 | 
			
		||||
  std::cout << "\nreconstructed vector:" << std::endl;
 | 
			
		||||
  std::cout << flatdv.getVector() << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user