Ignore:
Timestamp:
08/26/16 15:07:20 (8 years ago)
Author:
ymipsl
Message:

Improve remapper :

  • increase stability for smal grid remapping
  • increase stability for large number of processes

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/extern/remap/src/tree.cpp

    r694 r923  
    88#include <time.h>       /* time */ 
    99#include <vector> 
     10#include <list> 
    1011#include <set> 
    1112 
     
    2021using namespace std; 
    2122 
     23/* 
    2224CBasicTree::CBasicTree() : ri(0), levelSize(MAX_LEVEL_SIZE), root(NULL) 
    2325{ 
    2426} 
     27*/ 
    2528 
    2629void CBasicTree::routeNodes(vector<int>& route, vector<Node>& nodes, int assignLevel) 
     
    5154void CBasicTree::slim(int nbIts) 
    5255{ 
    53         //if (!isSampleTree) 
    5456        for (int i = 0; i < nbIts; i++) 
    5557        { 
    5658                for (int level = root->level - 1; level > 0; level--) 
    5759                { 
    58       cout<<"before Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    5960                        slim2(root, level); 
    60       cout<<"after Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    6161                        ri = 0; 
    6262                        emptyPool(); 
    63       cout<<"after empty pool "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    64  
    6563                } 
    6664 
    6765                for (int level = 2; level < root->level; level++) 
    6866                { 
    69       cout<<"before Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    7067                        slim2(root, level); 
    71       cout<<"after Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    7268                        ri = 0; 
    7369                        emptyPool(); 
    74       cout<<"after empty pool "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ; 
    75                 } 
    76         } 
    77 } 
     70                } 
     71        } 
     72} 
     73 
     74 
    7875 
    7976void CBasicTree::insertNode(NodePtr node) 
     
    141138{ 
    142139        root = new Node; 
    143         if (level > 1) cout << " newRoot level " << level << endl; 
     140        // if (level > 1) cout << " newRoot level " << level << endl; 
    144141        root->level = level; 
    145142        root->parent = 0; 
     
    186183  int i ; 
    187184   
    188   cout<<"CSampleTree::insertNodes  : nb node to be inserted : "<<nodes.size()<<endl ; 
     185//  cout<<"CSampleTree::insertNodes  : nb node to be inserted : "<<nodes.size()<<endl ; 
    189186  for (i = 0; i < nodes.size(); i++) 
    190187        { 
    191 //    cout<<"insert new node"<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    192188    insertNode(&nodes[i]); 
    193 //    cout<<"new node inserted"<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    194189 
    195190                if (root->leafCount > stepSlim && levelSize[assignLevel] < keepNodes-2) // time for slim down 
     
    202197    if (levelSize[assignLevel] == keepNodes-2 && first1) 
    203198                { 
    204       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    205199      slim(); 
    206       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
     200                        first1 = false; 
     201                } 
     202 
     203                if (levelSize[assignLevel] == keepNodes-1 && first2) 
     204                { 
    207205      slim(); 
    208       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    209       slim(); 
    210       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    211                         first1 = false; 
    212                 } 
    213  
    214                 if (levelSize[assignLevel] == keepNodes-1 && first2) 
    215                 { 
    216       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    217       slim(); 
    218       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    219206      first2=false ; 
    220207                } 
    221208 
    222         if (levelSize[assignLevel] > keepNodes) 
    223                 { 
    224       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    225       slim(); 
    226       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
    227                 } 
    228     if (levelSize[assignLevel] >= keepNodes) 
    229                 { 
    230       cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
     209        if (levelSize[assignLevel] >= keepNodes) slim(); 
     210        if (levelSize[assignLevel] > keepNodes) slim(); 
     211    if (levelSize[assignLevel] > keepNodes) slimAssignedLevel() ; 
     212 
     213    if (levelSize[assignLevel] >= keepNodes)  
     214                { 
     215      if (levelSize[assignLevel] > keepNodes) 
     216      { 
     217//        cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ; 
     218        removeExtraNode() ; 
     219      } 
    231220      break ; 
    232221                } 
    233222        } 
    234         cout << "SampleTree build : nb Node inserted : " << i << endl; 
    235  
    236 } 
    237  
    238 } 
     223//      cout << "SampleTree build : nb Node inserted : " << i << endl; 
     224 
     225} 
     226 
     227void CSampleTree::slimAssignedLevel() 
     228{ 
     229  for(int i=MIN_NODE_SZ;i<=MAX_NODE_SZ;i++) 
     230  { 
     231    int levelSizeOrigin=levelSize[assignLevel] ; 
     232    slim2(root, assignLevel,i); 
     233    ri = 0; 
     234    int levelSizeBefore=levelSize[assignLevel] ; 
     235    isActiveOkSplit=true ; 
     236    emptyPool(); 
     237//    cout<<"assign Level : "<<assignLevel<<"  MinNodeSize :"<<i<< "     levelSize[assignLevel] : "<<levelSizeOrigin<<"->"<<levelSizeBefore<<"->" <<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<"  "<<"CanSplit " <<canSplit()<<endl ; 
     238    if (levelSize[assignLevel]<=keepNodes) break ; 
     239  } 
     240 
     241} 
     242 
     243void CSampleTree::removeExtraNode(void) 
     244{ 
     245  std::list<NodePtr> nodeList ; 
     246  std::list<NodePtr>::iterator it1,it2, rm ; 
     247 
     248  root->getNodeLevel(assignLevel,nodeList) ; 
     249  double dist,minDist ; 
     250  
     251   
     252  for (int n=0; n<levelSize[assignLevel]-keepNodes ; ++n) 
     253  { 
     254    minDist=-1 ; 
     255    for(it1=nodeList.begin();it1!=nodeList.end();++it1) 
     256    { 
     257      dist=0 ; 
     258      for(it2=nodeList.begin();it2!=nodeList.end();++it2) dist+=arcdist((*it1)->centre,(*it2)->centre) ; 
     259      if (minDist > dist || minDist < 0.) 
     260      { 
     261        minDist=dist ; 
     262        rm=it1 ; 
     263      } 
     264    } 
     265    (*rm)->toDelete=true ; 
     266    nodeList.erase(rm) ; 
     267     
     268  } 
     269  root->removeDeletedNodes(assignLevel) ; 
     270  isActiveOkSplit=true ; 
     271  emptyPool(); 
     272} 
     273 
     274} 
Note: See TracChangeset for help on using the changeset viewer.