Changeset 7a120f
- Timestamp:
- 07/30/06 22:03:11 (7 years ago)
- 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)
- Location:
- src/graph
- Files:
-
- 2 edited
-
graph_bind.cc (modified) (1 diff)
-
graph_generation.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/graph/graph_bind.cc
r7cedf8 r7a120f 188 188 { 189 189 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))); 191 191 } 192 192 pair<size_t,size_t> operator()(double r1, double r2, size_t j, size_t k) 193 193 { 194 194 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))); 196 196 } 197 197 object _o; -
src/graph/graph_generation.cc
r7700aa r7a120f 112 112 //============================================================================== 113 113 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 114 class degree_matrix_t 115 { 116 public: 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 130 130 void insert(const pair<size_t, size_t>& v) 131 131 { 132 132 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) 144 150 { 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); 173 152 break; 174 153 } 175 154 } 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]--; 181 161 } 182 162 … … 186 166 { 187 167 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 188 184 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); 227 190 228 191 uniform_int<size_t> sample(0, candidates.size() - 1); … … 231 194 232 195 private: 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(); 240 212 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) 254 221 { 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 } 257 240 } 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 }268 241 } 269 242 270 243 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; 276 250 }; 277 251 … … 292 266 sample_from_distribution<pjk_t, pjk_t, inv_ceil_t> pjk_sample(pjk, ceil_pjk, inv_ceil_pjk, ceil_pjk_bound, rng); 293 267 vector<vertex_t> vertices(N); 294 size_t sum_j=0, sum_k=0, m ax_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; 295 269 if (verbose) 296 270 { … … 313 287 sum_j += v.in_degree; 314 288 sum_k += v.out_degree; 289 min_j = min(v.in_degree,min_j); 290 min_k = min(v.out_degree,min_k); 315 291 max_j = max(v.in_degree,max_j); 316 292 max_k = max(v.out_degree,max_k); … … 370 346 typedef multiset<pair<size_t,size_t>, total_deg_comp> ordered_degrees_t; 371 347 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(), m ax_j, max_k, E/N); // (j,k) pairs layed out in a 2 dimensional matrix348 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 373 349 for(typeof(target_degrees.begin()) iter = target_degrees.begin(); iter != target_degrees.end(); ++iter) 374 350 if (undirected_corr)
Note: See TracChangeset
for help on using the changeset viewer.


