diff --git a/FunctionSpace/PermutationTree.cpp b/FunctionSpace/PermutationTree.cpp index d9b916adbfc6935b5cde7805e9e3d6ae5367e6a6..1713e49ddee8d307baea7eed9892da04e001ad9f 100644 --- a/FunctionSpace/PermutationTree.cpp +++ b/FunctionSpace/PermutationTree.cpp @@ -8,7 +8,7 @@ using namespace std; -PermutationTree::PermutationTree(const vector<size_t>& refSequence){ +PermutationTree::PermutationTree(const std::vector<size_t>& refSequence){ // Sequence size // sequenceSize = refSequence.size(); @@ -42,7 +42,7 @@ PermutationTree::PermutationTree(const char* stream){ populateFromStream(stream); } -PermutationTree::PermutationTree(const string& path){ +PermutationTree::PermutationTree(const std::string& path){ // Read file // // Open Stream ifstream input; @@ -68,7 +68,7 @@ PermutationTree::PermutationTree(const string& path){ } void PermutationTree::populate(node_t* node, - list<node_t*>& listOfLeaf){ + std::list<node_t*>& listOfLeaf){ // Node Id // node->nodeId = nextNodeId; nextNodeId++; @@ -176,7 +176,7 @@ void PermutationTree::unserialize(const char* stream, unlink_t* unlink){ stream + otherIdStart + 2 * sizeof(size_t), sizeof(size_t)); } -void PermutationTree::rebuild(vector<unlink_t>& unlink){ +void PermutationTree::rebuild(std::vector<unlink_t>& unlink){ // Almost linked nodes (node of node_t type but without connected nodes) // vector<node_t*> node(nextNodeId); for(size_t i = 0; i < nextNodeId; i++) @@ -237,7 +237,7 @@ void PermutationTree::destroy(node_t* node){ PermutationTree::node_t* PermutationTree::getLeaf(node_t* root, - const vector<size_t>& sequence, + const std::vector<size_t>& sequence, size_t offset){ // Number of son const size_t nSon = root->son.size(); @@ -262,8 +262,9 @@ PermutationTree::getLeaf(node_t* root, } } -void PermutationTree::fillWithPermutation(size_t permutationId, - vector<size_t>& vectorToFill) const{ +void +PermutationTree::fillWithPermutation(size_t permutationId, + std::vector<size_t>& vectorToFill) const{ // Go from ith leaf to root // // And fill vectorToFill from end to start // @@ -400,7 +401,7 @@ std::pair<size_t, char*> PermutationTree::serialize(void) const{ return pair<size_t, char*>(sSize, stream); } -void PermutationTree::serialize(const string& path) const{ +void PermutationTree::serialize(const std::string& path) const{ // Serialize into byte Stream std::pair<size_t, char*> stream = serialize(); diff --git a/FunctionSpace/PermutationTree.h b/FunctionSpace/PermutationTree.h index ce19b5b1e9e6d52dd8c56065686ffcfd619b4871..364519623c159bd6f1dadaeea5b9f3cbee68896d 100644 --- a/FunctionSpace/PermutationTree.h +++ b/FunctionSpace/PermutationTree.h @@ -123,7 +123,7 @@ class PermutationTree{ @see PermutationTree:serialize(char*) ** - @fn PermutationTree::PermutationTree(std::string path) + @fn PermutationTree::PermutationTree(const std::string& path) @param path A file path Instanciates a new PermutationTree by loading the file given in path @@ -195,7 +195,7 @@ class PermutationTree{ @return Returns a string describing this PermutationTree ** - @fn PermutationTree::serialize(void) + @fn PermutationTree::serialize(void) const Serialize this PermutationTree into a byte stream @@ -204,7 +204,7 @@ class PermutationTree{ @li the second entry is a pointer to the allocated stream ** - @fn PermutationTree::serialize(const std::string&) + @fn PermutationTree::serialize(const std::string&) const @param path A file path Serialize this PermutationTree into the given file path diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp index 7af6d330d24490cad4cd93dedb1224173cd553e5..1eeb3dec43983e65c2aebebef639742911aa6840 100644 --- a/FunctionSpace/ReferenceSpace.cpp +++ b/FunctionSpace/ReferenceSpace.cpp @@ -1,5 +1,7 @@ #include <algorithm> +#include <fstream> #include <sstream> +#include <cstring> #include <set> #include "Exception.h" @@ -13,6 +15,31 @@ ReferenceSpace::ReferenceSpace(void){ // Derived Class // } +ReferenceSpace::ReferenceSpace(const std::string& path){ + // Read file // + // Open Stream + ifstream input; + input.exceptions(std::ifstream::failbit | std::ifstream::badbit); + input.open(path.c_str(), std::ifstream::binary); + + // Get size of stream (go to stream end) + input.seekg(0, std::ifstream::end); + const size_t size = input.tellg(); + + // Reset stream possition + input.seekg(0, std::ifstream::beg); + + // Alloc byte stream & Read file + char* stream = new char[size]; + input.read(stream, size); + + // Init from stream + init(stream); + + // Free stream + delete[] stream; +} + ReferenceSpace::~ReferenceSpace(void){ delete pTree; } @@ -68,6 +95,40 @@ void ReferenceSpace::init(void){ getOrderedFace(); } +void ReferenceSpace::init(const char* stream){ + // nVector + size_t offset = 0; + + memcpy(&nVertex, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Fef {Edge, Face} Node Idx + offset += unserialize(stream + offset, refEdgeNodeIdx); + offset += unserialize(stream + offset, refFaceNodeIdx); + + // Permutation Tree + size_t tSize; // Tree Size + + memcpy(&tSize, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + pTree = new PermutationTree(stream + offset); + offset += tSize; + + // RefSpace Node Id + offset += unserialize(stream + offset, refSpaceNodeId); + + // Index mapping + offset += unserialize(stream + offset, ABCtoUVWIndex); + offset += unserialize(stream + offset, UVWtoABCIndex); + + // Oredered {Edge, Face} Node Idx + offset += unserialize(stream + offset, orderedEdgeNodeIdx); + offset += unserialize(stream + offset, orderedFaceNodeIdx); + + cout << offset << endl; +} + void ReferenceSpace:: findCyclicPermutation(list<size_t>& listOfTrueReferenceSpace, list<vector<size_t> >& listOfRefNodeIndexPermutation, @@ -844,3 +905,277 @@ string ReferenceSpace::toLatex(void) const{ return stream.str(); } + +std::pair<size_t, char*> ReferenceSpace::serialize(void) const{ + // Serialize // + // refEdgeNodeIdx + pair<size_t, char*> sRefEdgeIdx = serialize(refEdgeNodeIdx); + + // refFaceNodeIdx + pair<size_t, char*> sRefFaceIdx = serialize(refFaceNodeIdx); + + // PermutationTree + pair<size_t, char*> sPTree = pTree->serialize(); + + // Reference Space + pair<size_t, char*> sRSpace = serialize(refSpaceNodeId); + + // ABCtoUVW + pair<size_t, char*> sABCtoUVW = serialize(ABCtoUVWIndex); + + // UVWtoUVW + pair<size_t, char*> sUVWtoABC = serialize(UVWtoABCIndex); + + // orderedEdgeNodeIdx + pair<size_t, char*> sEdgeIdx = serialize(orderedEdgeNodeIdx); + + // orderedEdgeNodeIdx + pair<size_t, char*> sFaceIdx = serialize(orderedFaceNodeIdx); + + // Full Serialized Stream // + // Alloc (+ 1 * sizeof(size_t) for nVertex) + const size_t size = sizeof(size_t) + sRefEdgeIdx.first + + sRefFaceIdx.first + + sizeof(size_t) // pTree Size + + sPTree.first // pTree + + sRSpace.first + + sABCtoUVW.first + + sUVWtoABC.first + + sEdgeIdx.first + + sFaceIdx.first; + char* stream = new char[size]; + + // Populate + size_t offset = 0; + + memcpy(stream + offset, &nVertex, sizeof(size_t)); + offset += sizeof(size_t); + + memcpy(stream + offset, sRefEdgeIdx.second, sRefEdgeIdx.first); + offset += sRefEdgeIdx.first; + + memcpy(stream + offset, sRefFaceIdx.second, sRefFaceIdx.first); + offset += sRefFaceIdx.first; + + memcpy(stream + offset, &sPTree.first, sizeof(size_t)); // pTree size + offset += sizeof(size_t); + + memcpy(stream + offset, sPTree.second, sPTree.first); // pTree + offset += sPTree.first; + + memcpy(stream + offset, sRSpace.second, sRSpace.first); + offset += sRSpace.first; + + memcpy(stream + offset, sABCtoUVW.second, sABCtoUVW.first); + offset += sABCtoUVW.first; + + memcpy(stream + offset, sUVWtoABC.second, sABCtoUVW.first); + offset += sABCtoUVW.first; + + memcpy(stream + offset, sEdgeIdx.second, sEdgeIdx.first); + offset += sEdgeIdx.first; + + memcpy(stream + offset, sFaceIdx.second, sFaceIdx.first); + offset += sFaceIdx.first; + + // Free Temp + delete[] sRefEdgeIdx.second; + delete[] sRefFaceIdx.second; + delete[] sPTree.second; + delete[] sRSpace.second; + delete[] sABCtoUVW.second; + delete[] sUVWtoABC.second; + delete[] sEdgeIdx.second; + delete[] sFaceIdx.second; + + // Return + return pair<size_t, char*>(size, stream); +} + +void ReferenceSpace::serialize(const std::string& path) const{ + // Serialize into byte Stream + std::pair<size_t, char*> stream = serialize(); + + // Write byte stream + ofstream output; + output.exceptions(std::ofstream::failbit | std::ofstream::badbit); + output.open(path.c_str(), std::ofstream::binary); + output.write(stream.second, stream.first); + output.close(); + + // Free + delete[] stream.second; +} + +std::pair<size_t, char*> ReferenceSpace:: +serialize(const std::vector<std::vector<size_t> >& source){ + // Vector & Stream size // + size_t nVector = source.size(); + size_t totalSize = sizeof(size_t); // Init to header size (nVector) + + for(size_t i = 0; i < nVector; i++) + totalSize += (source[i].size() + 1) * sizeof(size_t); + // + 1 for subvector size header + + // Alloc Stream // + char* stream = new char[totalSize]; + + // Header (nVector) // + memcpy(stream, &nVector, sizeof(size_t)); + + // SubVectors // + size_t tmpSize; + size_t offset = sizeof(size_t); + + for(size_t i = 0; i < nVector; i++){ + // SubVector size + tmpSize = source[i].size(); + memcpy(stream + offset, &tmpSize, sizeof(size_t)); + offset += sizeof(size_t); + + // SubVector stored values + for(size_t j = 0; j < tmpSize; j++){ + memcpy(stream + offset, &source[i][j], sizeof(size_t)); + offset += sizeof(size_t); + } + } + + // Return // + return pair<size_t, char*>(totalSize, stream); +} + +std::pair<size_t, char*> ReferenceSpace:: +serialize(const std::vector<std::vector<std::vector<size_t> > >& source){ + // Vector & Stream size // + size_t nVector = source.size(); + size_t totalSize = sizeof(size_t); // Init to header size (nVector) + + for(size_t i = 0; i < nVector; i++){ + totalSize += sizeof(size_t); // Subvector size header + + for(size_t j = 0; j < source[i].size(); j++) + totalSize += (source[i][j].size() + 1) * sizeof(size_t); + // + 1 for subsubvector size header + } + + // Alloc Stream // + char* stream = new char[totalSize]; + + // Header (nVector) // + memcpy(stream, &nVector, sizeof(size_t)); + + // SubVectors // + size_t tmpSize; + size_t tmpSubSize; + size_t offset = sizeof(size_t); + + for(size_t i = 0; i < nVector; i++){ + // SubVector size + tmpSize = source[i].size(); + memcpy(stream + offset, &tmpSize, sizeof(size_t)); + offset += sizeof(size_t); + + for(size_t j = 0; j < tmpSize; j++){ + // SubSubVector size + tmpSubSize = source[i][j].size(); + memcpy(stream + offset, &tmpSubSize, sizeof(size_t)); + offset += sizeof(size_t); + + // SubSubVector stored values + for(size_t k = 0; k < tmpSubSize; k++){ + memcpy(stream + offset, &source[i][j][k], sizeof(size_t)); + offset += sizeof(size_t); + } + } + } + + // Return // + return pair<size_t, char*>(totalSize, stream); +} + +size_t ReferenceSpace:: +unserialize(const char* stream, + std::vector<std::vector<size_t> >& dest){ + // Vector size // + size_t nVector; + size_t offset = 0; + + memcpy(&nVector, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Alloc Vector // + dest.resize(nVector); + + // Populate // + size_t tmpSize; + size_t tmpVal; + + for(size_t i = 0; i < nVector; i++){ + // Subvector size + memcpy(&tmpSize, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Alloc Subvector + dest[i].resize(tmpSize); + + // Populate Subvector + for(size_t j = 0; j < tmpSize; j++){ + memcpy(&tmpVal, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + dest[i][j] = tmpVal; + } + } + + // Return size // + return offset; +} + +size_t ReferenceSpace:: + unserialize(const char* stream, + std::vector<std::vector<std::vector<size_t> > >& dest){ + // Vector size // + size_t nVector; + size_t offset = 0; + + memcpy(&nVector, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Alloc Vector // + dest.resize(nVector); + + // Populate // + size_t tmpSize; + size_t tmpSubSize; + size_t tmpVal; + + for(size_t i = 0; i < nVector; i++){ + // Subvector size + memcpy(&tmpSize, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Alloc Subvector + dest[i].resize(tmpSize); + + // Populate Subvector + for(size_t j = 0; j < tmpSize; j++){ + // Subsubvector size + memcpy(&tmpSubSize, stream + offset, sizeof(size_t)); + offset += sizeof(size_t); + + // Alloc Subsubvector + dest[i][j].resize(tmpSubSize); + + // Populate Subsubvector + for(size_t k = 0; k < tmpSubSize; k++){ + memcpy(&tmpVal, stream + offset,sizeof(size_t)); + offset += sizeof(size_t); + + dest[i][j][k] = tmpVal; // AT LAST !! (-: + } + } + } + + // Return size // + return offset; +} diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h index ebaa7becccf11ff111881b327e183701a2fce415..68c26a3717b9b974afb52450b3ba1ba8b3354dee 100644 --- a/FunctionSpace/ReferenceSpace.h +++ b/FunctionSpace/ReferenceSpace.h @@ -16,6 +16,8 @@ This class represents the notion of Reference Space. A Reference Space is the set of all the permutations of the reference element of a particular geometrical entity. + + @todo End ReferenceSpace DOC !!! */ class ReferenceSpace{ @@ -56,6 +58,7 @@ class ReferenceSpace{ std::vector<std::vector<std::vector<size_t> > > orderedFaceNodeIdx; public: + ReferenceSpace(const std::string& path); virtual ~ReferenceSpace(void); size_t getNReferenceSpace(void) const; @@ -93,10 +96,14 @@ class ReferenceSpace{ virtual std::string toString(void) const; virtual std::string toLatex(void) const; + std::pair<size_t, char*> serialize(void) const; + void serialize(const std::string& path) const; + protected: ReferenceSpace(void); void init(void); + void init(const char* stream); private: void getOrderedEdge(void); @@ -147,16 +154,36 @@ class ReferenceSpace{ const std::pair<size_t, size_t>& b); static void regularize(size_t dim, fullMatrix<double>& jac); + + static std::pair<size_t, char*> + serialize(const std::vector<std::vector<size_t> >& source); + + static std::pair<size_t, char*> + serialize(const std::vector<std::vector<std::vector<size_t> > >& source); + + static size_t + unserialize(const char* stream, + std::vector<std::vector<size_t> >& dest); + + static size_t + unserialize(const char* stream, + std::vector<std::vector<std::vector<size_t> > >& dest); }; /** @internal - @fn ReferenceSpace::ReferenceSpace + @fn ReferenceSpace::ReferenceSpace(void) Instatiate a new ReferenceSpace @endinternal ** + @fn ReferenceSpace::ReferenceSpace(const std::string&) + @param path A file path + + Instanciates a new ReferenceSpace by loading the file in the given path + ** + @fn ReferenceSpace::~ReferenceSpace Deletes this ReferenceSpace ** @@ -201,6 +228,22 @@ class ReferenceSpace{ @fn ReferenceSpace::toLatex @return Returns a string (of a Latex file) describing this ReferenceSpace + ** + + @fn ReferenceSpace::serialize(void) const + + Serialize this ReferenceSpace into a byte stream + + @return Returns a pair such that: + @li The first entry is the byte stream size + @li The second entry is a pointer the allocated byte stream + ** + + @fn ReferenceSpace::serialize(const std::string&) const + @param path A file path + + Serialize this ReferenceSpace into the given file + ** */ //////////////////////