Changeset 7a120f


Ignore:
Timestamp:
07/30/06 22:03:11 (7 years ago)
Author:
Tiago de Paula Peixoto <tiago@…>
Children:
de90a1
Parents:
ddae34
git-author:
Tiago de Paula Peixoto <tiago@…> (07/30/06 22:03:11)
git-committer:
Tiago de Paula Peixoto <tiago@…> (07/30/06 22:03:11)
Message:
* much improved directed correlation generation
* fixed bug related to negative sampled degrees


git-svn-id: https://svn.forked.de/graph-tool/trunk@14 d4600afd-f417-0410-95de-beed9576f240
Location:
src/graph
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/graph/graph_bind.cc

    r7cedf8 r7a120f  
    188188    { 
    189189        object retval = _o(r1,r2); 
    190         return make_pair(size_t(extract<size_t>(retval[0])), size_t(extract<size_t>(retval[1]))); 
     190        return make_pair(size_t(max(int(extract<int>(retval[0])),0)), size_t(max(int(extract<int>(retval[1])),0))); 
    191191    } 
    192192    pair<size_t,size_t> operator()(double r1, double r2, size_t j, size_t k) 
    193193    { 
    194194        object retval = _o(r1,r2,j,k); 
    195         return make_pair(size_t(extract<size_t>(retval[0])), size_t(extract<size_t>(retval[1]))); 
     195        return make_pair(size_t(max(int(extract<int>(retval[0])),0)), size_t(max(int(extract<int>(retval[1])),0))); 
    196196    } 
    197197    object _o; 
  • src/graph/graph_generation.cc

    r7700aa r7a120f  
    112112//============================================================================== 
    113113 
    114 class degree_matrix_t: public vector<vector<vector<pair<size_t,size_t> > > > 
    115 { 
    116 public: 
    117     typedef vector<vector<vector<pair<size_t,size_t> > > > base_t; 
    118     degree_matrix_t(size_t N, size_t max_j, size_t max_k, size_t avg_deg) 
    119     { 
    120     _L = size_t(sqrt(N)); 
    121     base_t &base = *this; 
    122     base = base_t(_L, vector<vector<pair<size_t,size_t> > >(_L)); 
    123     _cj = pow(max_j+1,1.0/(_L-1)) - 1.0; 
    124     _ck = pow(max_k+1,1.0/(_L-1)) - 1.0; 
    125     _avg_deg = avg_deg; 
    126     _nearest_bins = base_t(_L, vector<vector<pair<size_t,size_t> > >(_L)); 
    127     _size = 0; 
    128     } 
    129      
     114class degree_matrix_t 
     115{ 
     116public:     
     117    degree_matrix_t(size_t N, size_t minj, size_t mink, size_t maxj, size_t maxk) 
     118    { 
     119    _L = max(size_t(pow(2,ceil(log2(sqrt(N))))),size_t(2)); 
     120    _minj = minj; 
     121    _mink = mink; 
     122    _maxj = max(maxj,_L); 
     123    _maxk = max(maxk,_L); 
     124    _bins.resize(_L, vector<vector<pair<size_t,size_t> > >(_L)); 
     125    _high_bins.resize(size_t(log2(_L))); 
     126    for(size_t i = 0; i < _high_bins.size(); ++i) 
     127        _high_bins[i].resize(_L/(1<<(i+1)), vector<size_t>(_L/(1<<(i+1)))); 
     128    } 
     129 
    130130    void insert(const pair<size_t, size_t>& v) 
    131131    { 
    132132    size_t j_bin, k_bin; 
    133     tie(j_bin, k_bin) = get_bin(v.first, v.second); 
    134     if ((*this)[j_bin][k_bin].empty()) 
    135         _size++; 
    136     (*this)[j_bin][k_bin].push_back(v); 
    137  
    138     } 
    139  
    140     void arrange_proximity() 
    141     { 
    142     for(size_t j = 0; j < _L; ++j) 
    143         for(size_t k = 0; k < _L; ++k) 
     133    tie(j_bin, k_bin) = get_bin(v.first, v.second, 0); 
     134    _bins[j_bin][k_bin].push_back(v); 
     135    for (size_t i = 0; i < _high_bins.size(); ++i) 
     136    { 
     137        size_t hj,hk; 
     138        tie(hj,hk) = get_bin(j_bin,k_bin, i+1); 
     139        _high_bins[i][hj][hk]++; 
     140    } 
     141    } 
     142     
     143    void erase(const pair<size_t,size_t>& v) 
     144    { 
     145    size_t j_bin, k_bin; 
     146    tie(j_bin, k_bin) = get_bin(v.first, v.second, 0); 
     147    for(size_t i = 0; i < _bins[j_bin][k_bin].size(); ++i) 
     148    { 
     149        if (_bins[j_bin][k_bin][i] == v) 
    144150        { 
    145         _nearest_bins[j][k].clear(); 
    146         if ((*this)[j][k].empty()) 
    147         { 
    148             for(size_t w = 1; w < _L; ++w) 
    149             { 
    150             for (size_t i = ((j>w)?j-w:0); i < ((j+w<=_L)?j+w:_L); ++i) 
    151                 for (size_t l = ((k>w)?k-w:0); l < ((k+w<=_L)?k+w:_L); ++l) 
    152                 { 
    153                 if (!(*this)[i][l].empty()) 
    154                     _nearest_bins[j][k].push_back(make_pair(i,l)); 
    155                 } 
    156             if (!_nearest_bins[j][k].empty()) 
    157                 break; 
    158             } 
    159         } 
    160         } 
    161     } 
    162  
    163  
    164     void erase(const pair<size_t,size_t>& v) 
    165     { 
    166     size_t j_bin, k_bin; 
    167     tie(j_bin, k_bin) = get_bin(v.first, v.second); 
    168     for(size_t i = 0; i < (*this)[j_bin][k_bin].size(); ++i) 
    169     { 
    170         if ((*this)[j_bin][k_bin][i] == v) 
    171         { 
    172         (*this)[j_bin][k_bin].erase((*this)[j_bin][k_bin].begin()+i); 
     151        _bins[j_bin][k_bin].erase(_bins[j_bin][k_bin].begin()+i); 
    173152        break; 
    174153        } 
    175154    } 
    176     if ((*this)[j_bin][k_bin].empty()) 
    177     { 
    178         _size--; 
    179         if (_size > _L) 
    180         arrange_proximity(); 
     155     
     156    for (size_t i = 0; i < _high_bins.size(); ++i) 
     157    { 
     158        size_t hj,hk; 
     159        tie(hj,hk) = get_bin(j_bin,k_bin, i+1); 
     160        _high_bins[i][hj][hk]--; 
    181161    } 
    182162     
     
    186166    { 
    187167    vector<pair<size_t,size_t> > candidates; 
     168 
     169    size_t level; 
     170 
     171    // find the appropriate level on which to operate 
     172    for (level = _high_bins.size(); level <= 0; --level) 
     173    { 
     174        size_t hj, hk; 
     175        tie(hj,hk) = get_bin(j,k,level); 
     176        if (get_bin_count(hj,hk,level) == 0) 
     177        { 
     178        if (level < _high_bins.size()) 
     179            level++; 
     180        break; 
     181        } 
     182    } 
     183 
    188184    size_t j_bin, k_bin; 
    189     tie(j_bin, k_bin) = get_bin(j, k); 
    190  
    191     if ((*this)[j_bin][k_bin].empty()) 
    192     { 
    193         if (_size > _L) 
    194         { 
    195         if (_nearest_bins[j_bin][k_bin].empty()) 
    196             arrange_proximity(); 
    197         for(size_t i = 0; i < _nearest_bins[j_bin][k_bin].size(); ++i) 
    198         { 
    199             size_t jb,kb; 
    200             tie(jb,kb) = _nearest_bins[j_bin][k_bin][i]; 
    201             search_bin(jb, kb, j, k, candidates); 
    202         } 
    203         } 
    204         else 
    205         { 
    206         for(size_t jb = 0; jb < _L; ++jb) 
    207             for(size_t kb = 0; kb < _L; ++kb) 
    208             search_bin(jb, kb, j, k, candidates); 
    209         } 
    210     } 
    211     else 
    212     {        
    213         search_bin(j_bin, k_bin, j, k, candidates); 
    214  
    215         size_t distance = size_t(sqrt(dist(candidates.front(), vertex_t(j,k)))); 
    216          
    217         for (int x = -1; x < 2; ++x) 
    218         for (int y = -1; y < 2; ++y) 
    219         {  
    220             size_t jb,kb; 
    221             tie(jb,kb) = get_bin(max(int(j+x*distance),0), max(int(k+y*distance),0)); 
    222             if (tie(jb,kb) == tie(j_bin,k_bin)) 
    223             continue; 
    224             search_bin(jb, kb, j, k, candidates); 
    225         } 
    226     } 
     185    tie(j_bin, k_bin) = get_bin(j, k, level); 
     186 
     187    for (size_t hj = ((j_bin>0)?j_bin-1:j_bin); hj < j_bin + 1 && hj <= get_bin(_maxj, _maxk, level).first; ++hj) 
     188        for (size_t hk = ((k_bin>0)?k_bin-1:k_bin); hk < k_bin + 1 && hk <= get_bin(_maxj, _maxk, level).second; ++hk) 
     189        search_bin(hj,hk,j,k,level,candidates); 
    227190     
    228191    uniform_int<size_t> sample(0, candidates.size() - 1); 
     
    231194 
    232195private: 
    233     pair<size_t,size_t> get_bin(size_t j, size_t k)  
    234     { 
    235     // uses logarithmic binning... 
    236     size_t j_bin, k_bin, lim; 
    237     lim = size_t(1.5*_avg_deg); 
    238     if (j < lim) 
    239         j_bin = j; 
     196     
     197    pair<size_t,size_t> get_bin(size_t j, size_t k, size_t level)  
     198    { 
     199    if (level == 0) 
     200        return make_pair(((j-_minj)*(_L-1))/_maxj, ((k-_mink)*(_L-1))/_maxk); 
     201 
     202    pair<size_t, size_t> bin = get_bin(j,k,0); 
     203    bin.first /=  1 << level; 
     204    bin.second /= 1 << level; 
     205    return bin; 
     206    } 
     207 
     208    size_t get_bin_count(size_t bin_j, size_t bin_k, size_t level) 
     209    { 
     210    if (level == 0) 
     211        return _bins[bin_j][bin_k].size(); 
    240212    else 
    241         j_bin = size_t(log(j)/log(_cj+1)) - size_t(log(lim)/log(_cj+1)) + lim; 
    242     if (k < lim) 
    243         k_bin = k; 
    244     else 
    245         k_bin = size_t(log(k)/log(_ck+1)) - size_t(log(lim)/log(_cj+1)) + lim; 
    246     return make_pair(min(j_bin, _L-1), min(k_bin,_L-1)); 
    247     } 
    248      
    249     void search_bin(size_t j_bin, size_t k_bin, size_t j, size_t k, vector<pair<size_t,size_t> >& candidates) 
    250     { 
    251     for (typeof((*this)[j_bin][k_bin].begin()) iter = (*this)[j_bin][k_bin].begin(); iter != (*this)[j_bin][k_bin].end(); ++iter) 
    252     { 
    253         if (candidates.empty()) 
     213        return _high_bins[level-1][bin_j][bin_k]; 
     214    } 
     215 
     216    void search_bin(size_t hj, size_t hk, size_t j, size_t k, size_t level, vector<pair<size_t,size_t> >& candidates) 
     217    { 
     218    size_t w = 1 << level; 
     219    for (size_t j_bin = hj*w; j_bin < (hj+1)*w; ++j_bin) 
     220        for (size_t k_bin = hk*w; k_bin < (hk+1)*w; ++k_bin) 
    254221        { 
    255         candidates.push_back(*iter); 
    256         continue; 
     222        for (size_t i = 0; i < _bins[j_bin][k_bin].size(); ++i) 
     223        { 
     224            pair<size_t, size_t>& v = _bins[j_bin][k_bin][i]; 
     225            if (candidates.empty()) 
     226            { 
     227            candidates.push_back(v); 
     228            continue; 
     229            } 
     230            if (dist(vertex_t(v), vertex_t(j,k)) < dist(vertex_t(candidates.front()),vertex_t(j,k))) 
     231            { 
     232            candidates.clear(); 
     233            candidates.push_back(v); 
     234            } 
     235            else if (dist(vertex_t(v), vertex_t(j,k)) == dist(vertex_t(candidates.front()),vertex_t(j,k))) 
     236            { 
     237            candidates.push_back(v); 
     238            } 
     239        } 
    257240        } 
    258         if (dist(vertex_t(*iter), vertex_t(j,k)) < dist(vertex_t(candidates.front()),vertex_t(j,k))) 
    259         { 
    260         candidates.clear(); 
    261         candidates.push_back(*iter); 
    262         } 
    263         else if (dist(vertex_t(*iter), vertex_t(j,k)) == dist(vertex_t(candidates.front()),vertex_t(j,k))) 
    264         { 
    265         candidates.push_back(*iter); 
    266         } 
    267     } 
    268241    } 
    269242 
    270243    size_t _L; 
    271     double _cj; 
    272     double _ck; 
    273     size_t _avg_deg; 
    274     base_t _nearest_bins; 
    275     size_t _size; 
     244    vector<vector<vector<pair<size_t,size_t> > > > _bins; 
     245    vector<vector<vector<size_t> > > _high_bins; 
     246    size_t _minj; 
     247    size_t _mink; 
     248    size_t _maxj; 
     249    size_t _maxk; 
    276250}; 
    277251 
     
    292266    sample_from_distribution<pjk_t, pjk_t, inv_ceil_t> pjk_sample(pjk, ceil_pjk, inv_ceil_pjk, ceil_pjk_bound, rng); 
    293267    vector<vertex_t> vertices(N); 
    294     size_t sum_j=0, sum_k=0, max_j=0, max_k=0; 
     268    size_t sum_j=0, sum_k=0, min_j=0, min_k=0, max_j=0, max_k=0; 
    295269    if (verbose) 
    296270    { 
     
    313287    sum_j += v.in_degree; 
    314288    sum_k += v.out_degree; 
     289    min_j = min(v.in_degree,min_j); 
     290    min_k = min(v.out_degree,min_k); 
    315291    max_j = max(v.in_degree,max_j); 
    316292    max_k = max(v.out_degree,max_k);  
     
    370346    typedef multiset<pair<size_t,size_t>, total_deg_comp> ordered_degrees_t; 
    371347    ordered_degrees_t ordered_degrees; // (j,k) pairs ordered by (j+k), i.e, total degree 
    372     degree_matrix_t degree_matrix(target_degrees.size(), max_j, max_k, E/N); // (j,k) pairs layed out in a 2 dimensional matrix 
     348    degree_matrix_t degree_matrix(target_degrees.size(), min_j, min_k, max_j, max_k); // (j,k) pairs layed out in a 2 dimensional matrix 
    373349    for(typeof(target_degrees.begin()) iter = target_degrees.begin(); iter != target_degrees.end(); ++iter) 
    374350    if (undirected_corr) 
Note: See TracChangeset for help on using the changeset viewer.