Commit 05b0276d authored by Sylvain Thery's avatar Sylvain Thery

compact + test

parent 614de846
......@@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 2.8)
project(examples)
SET(CMAKE_BUILD_TYPE Release)
#SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTOPOWARNING")
......@@ -26,3 +29,6 @@ target_link_libraries( bench_trav ${CGoGN_LIBS_R} ${CGoGN_EXT_LIBS} )
add_executable(bench_remesh bench_remesh.cpp )
target_link_libraries( bench_remesh ${CGoGN_LIBS_R} ${CGoGN_EXT_LIBS} )
add_executable(bench_compact bench_compact.cpp )
target_link_libraries( bench_compact ${CGoGN_LIBS_R} ${CGoGN_EXT_LIBS} )
......@@ -50,3 +50,7 @@ target_link_libraries( movefrom
add_executable( compact ./compact.cpp)
target_link_libraries( compact
${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS})
add_executable( reusememory ./reusememory.cpp)
target_link_libraries( reusememory
${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS})
......@@ -107,8 +107,8 @@ int main()
myMap.dumpCSV();
std::cout << "MAP with holes dumped in compact_before.csv"<< std::endl;
std::cout << "Total area "<< Algo::Surface::Geometry::totalArea<PFP2>(myMap,position)<< std::endl;
std::cout << "Total area before simplif "<< Algo::Surface::Geometry::totalArea<PFP2>(myMap,position)<< std::endl;
myMap.compact();
......@@ -116,7 +116,7 @@ int main()
myMap.dumpCSV();
std::cout << "Compacted MAP dumped in compact_after.csv"<< std::endl;
std::cout << "Total area "<< Algo::Surface::Geometry::totalArea<PFP2>(myMap,position)<< std::endl;
std::cout << "Total area after simplif"<< Algo::Surface::Geometry::totalArea<PFP2>(myMap,position)<< std::endl;
myMap.saveMapBin("compacted_map2.map");
......
......@@ -231,7 +231,7 @@ public:
unsigned int begin() const;
/**
* return the index of the last line of the container
* return the index after the last line of the container
*/
unsigned int end() const;
......@@ -249,7 +249,7 @@ public:
unsigned int realBegin() const;
/**
* return the index of the last line of the container
* return the index after the last line of the container
*/
unsigned int realEnd() const;
......@@ -260,6 +260,22 @@ public:
void realNext(unsigned int &it) const;
/**
* return the index of the last line of the container
*/
unsigned int realRBegin() const;
/**
* return the index before the first line of the container
*/
unsigned int realREnd() const;
/**
* get the index of the line before "it" in the container
* MUST BE USED INSTEAD OF ++ !
*/
void realRNext(unsigned int &it) const;
/**************************************
* INFO ABOUT ATTRIBUTES *
**************************************/
......
......@@ -224,7 +224,7 @@ inline unsigned int AttributeContainer::memorySize() const
inline bool AttributeContainer::used(unsigned int index) const
{
return m_holesBlocks[index / _BLOCKSIZE_]->used(index % _BLOCKSIZE_);
return m_holesBlocks[index / _BLOCKSIZE_]->used(index % _BLOCKSIZE_) != 0;
}
/**************************************
......@@ -295,6 +295,31 @@ inline void AttributeContainer::realNext(unsigned int &it) const
} while ((it < m_maxSize) && (!used(it)));
}
inline unsigned int AttributeContainer::realRBegin() const
{
unsigned int it = m_maxSize-1;
while ((it != 0xffffffff) && (!used(it)))
--it;
return it;
}
inline unsigned int AttributeContainer::realREnd() const
{
return 0xffffffff; // -1
}
inline void AttributeContainer::realRNext(unsigned int &it) const
{
do
{
--it;
} while ((it !=0xffffffff) && (!used(it)));
}
/**************************************
* LINES MANAGEMENT *
**************************************/
......
......@@ -128,6 +128,14 @@ public:
*/
bool compressFree();
inline void compressFull(unsigned int nb)
{
m_nbfree = 0;
m_nbref = nb;
m_nb = nb;
}
/**
* clear the container of free block
*/
......
......@@ -103,7 +103,7 @@ protected:
template <int I>
inline void permutationUnsew(Dart d);
inline virtual void compactTopo();
virtual void compactTopo();
/****************************************
* DARTS TRAVERSALS *
......
......@@ -186,33 +186,6 @@ inline void MapMono::permutationUnsew(Dart d)
(*m_permutation_inv[I])[e.index] = e ;
}
inline void MapMono::compactTopo()
{
std::vector<unsigned int> oldnew;
m_attribs[DART].compact(oldnew);
for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i))
{
for (unsigned int j = 0; j < m_permutation.size(); ++j)
{
Dart d = (*m_permutation[j])[i];
if (d.index != oldnew[d.index])
(*m_permutation[j])[i] = Dart(oldnew[d.index]);
}
for (unsigned int j = 0; j < m_permutation_inv.size(); ++j)
{
Dart d = (*m_permutation_inv[j])[i];
if (d.index != oldnew[d.index])
(*m_permutation_inv[j])[i] = Dart(oldnew[d.index]);
}
for (unsigned int j = 0; j < m_involution.size(); ++j)
{
Dart d = (*m_involution[j])[i];
if (d.index != oldnew[d.index])
(*m_involution[j])[i] = Dart(oldnew[d.index]);
}
}
}
/****************************************
* DARTS TRAVERSALS *
......
......@@ -213,100 +213,67 @@ void AttributeContainer::clear(bool removeAttrib)
void AttributeContainer::compact(std::vector<unsigned int>& mapOldNew)
{
unsigned int nbe = _BLOCKSIZE_ * m_holesBlocks.size();
unsigned int nbb = m_holesBlocks.size() - 1;
while ((m_holesBlocks[nbb])->empty())
{
--nbb;
nbe -= _BLOCKSIZE_;
}
++nbb;
mapOldNew.clear();
mapOldNew.reserve(nbe);
mapOldNew.resize(realEnd(),0xffffffff);
// now get the holes
unsigned int baseAdr = 0;
for (unsigned int i = 0; i < nbb; ++i)
{
HoleBlockRef* block = m_holesBlocks[i];
// fill the holes with data & create the map Old->New
unsigned int up = realRBegin();
unsigned int down = 0;
for (unsigned int j = 0; j < _BLOCKSIZE_; ++j)
while (down < up)
{
if (!used(down))
{
if (j < block->sizeTable())
{
if (block->used(j))
mapOldNew.push_back(baseAdr);
else
mapOldNew.push_back(0xffffffff);
}
else
mapOldNew.push_back(0xffffffff);
baseAdr++;
mapOldNew[up] = down;
// copy data
copyLine(down,up);
// copy ref counter
setNbRefs(down,getNbRefs(up));
// set next element to catch for hole filling
realRNext(up);
}
down++;
}
unsigned int last = mapOldNew.size() - 1;
// end of table = nb elements
m_maxSize = m_size;
for (unsigned int i = 0 ; i < last; ++i)
{
unsigned int val = mapOldNew[i];
if (val == 0xffffffff)
{
// first find last element
while (mapOldNew[last] == 0xffffffff)
--last;
// store it in the hole
// find the blocks and indices
unsigned int bi = i / _BLOCKSIZE_;
unsigned int ib = i % _BLOCKSIZE_;
unsigned int bj = last / _BLOCKSIZE_;
unsigned int jb = last % _BLOCKSIZE_;
//overwrite attributes
for(unsigned int j = 0; j < m_tableAttribs.size(); ++j)
{
if (m_tableAttribs[j] != NULL)
m_tableAttribs[j]->overwrite(bj, jb, bi, ib);
}
// no more blocks empty
m_tableBlocksEmpty.clear();
// overwrite emptyLine with last line in free blocks
m_holesBlocks[bi]->overwrite(ib, m_holesBlocks[bj], jb);
// only the last block has free indices
m_tableBlocksWithFree.clear();
// set the map value
mapOldNew[last] = i;
--last;
}
}
// compute nb block full
unsigned int nbb = m_size / _BLOCKSIZE_;
// update holeblock
for (unsigned int i=0; i<nbb; ++i)
m_holesBlocks[i]->compressFull(_BLOCKSIZE_);
for (int i = m_holesBlocks.size() - 1; i >= 0; --i)
//update last holeblock
unsigned int nbe = m_size % _BLOCKSIZE_;
if (nbe != 0)
{
HoleBlockRef* ptr = m_holesBlocks[i];
if (ptr->compressFree())
{
delete ptr;
m_holesBlocks.pop_back();
}
m_holesBlocks[nbb]->compressFull(nbe);
m_tableBlocksWithFree.push_back(nbb);
nbb++;
}
// maj de la table de block libre
m_tableBlocksWithFree.clear();
HoleBlockRef* block = m_holesBlocks.back();
if (!block->full())
m_tableBlocksWithFree.push_back(m_holesBlocks.size() - 1);
// free memory and resize
for (int i = m_holesBlocks.size() - 1; i > nbb; --i)
delete m_holesBlocks[i];
m_holesBlocks.resize(nbb);
// detruit les blocks de donnees inutiles
// release unused data memory
for(unsigned int j = 0; j < m_tableAttribs.size(); ++j)
{
if (m_tableAttribs[j] != NULL)
m_tableAttribs[j]->setNbBlocks(m_holesBlocks.size());
}
m_maxSize = (m_holesBlocks.back())->sizeTable() + (m_holesBlocks.size() - 1) * _BLOCKSIZE_;
}
/**************************************
* LINES MANAGEMENT *
**************************************/
......
......@@ -190,4 +190,35 @@ void MapMono::restore_topo_shortcuts()
}
}
void MapMono::compactTopo()
{
std::vector<unsigned int> oldnew;
m_attribs[DART].compact(oldnew);
for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i))
{
for (unsigned int j = 0; j < m_permutation.size(); ++j)
{
Dart d = (*m_permutation[j])[i];
if (oldnew[d.index] != AttributeContainer::UNKNOWN)
(*m_permutation[j])[i] = Dart(oldnew[d.index]);
}
for (unsigned int j = 0; j < m_permutation_inv.size(); ++j)
{
Dart d = (*m_permutation_inv[j])[i];
if (oldnew[d.index] != AttributeContainer::UNKNOWN)
(*m_permutation_inv[j])[i] = Dart(oldnew[d.index]);
}
for (unsigned int j = 0; j < m_involution.size(); ++j)
{
Dart d = (*m_involution[j])[i];
if (oldnew[d.index] != AttributeContainer::UNKNOWN)
(*m_involution[j])[i] = Dart(oldnew[d.index]);
}
}
}
} //namespace CGoGN
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment