Diploma Thesis Percolation Simulation C++ Sourcecode Documentation |
Functions | |
void | neighbour_recursion (sphere *array, NUMBER first, NUMBER last, NUMBER actualsph, NUMBER clnumber) |
NUMBER | count_clusters_recursively (sphere *array, NUMBER first, NUMBER last, NUMBER first_clno) |
NUMBER | list_to_temp_array_and_find_cluster (sphere *spheres, NUMLIST &sphlist, NUMBER first_clno) |
NUMBER | neighbour_naive (sphere *array, NUMBER first, NUMBER last, NUMBER actualsph, NUMBER clnumber) |
clock_t | countclusters_naive (sphere *array, NUMBER first, NUMBER last, NUMBER *clustertable) |
NUMBER | neighbour_l (sphere *array, NUMLIST &sphlist, NUMLIST::iterator firstsph, NUMLIST::iterator actualsph, NUMBER clnumber) |
clock_t | countclusters_l (sphere *array, NUMLIST &sphlist, NUMBER *clustertable, NUMBER &clusternumber) |
NUMBER | list_to_given_array_and_find_cluster (sphere *spheres, sphere *copy, NUMLIST &sphlist, NUMBER first_clno) |
NUMBER | count_clusters_iteratively (sphere *array, NUMBER first, NUMBER last, NUMBER first_clno) |
NUMBER | count_clusters_iteratively2 (sphere *array, NUMBER first, NUMBER last, NUMBER first_clno) |
NUMBER | count_clusters_iteratively_only_selected_spherenumbers (sphere *array, std::vector< NUMBER > &sphnumber, NUMBER N, NUMBER first_clno) |
clock_t | naive_count_and_analyze (sphere *spheres, NUMBER first, NUMBER last, NUMBER *histo, NUMBER &biggestcl, REAL &averagecl) |
NUMBER | naive_arraycount_and_analyze (sphere *spheres, NUMBER first, NUMBER last, NUMBER *histo, NUMBER &biggestcl, REAL &averagecl) |
clock_t | sort_naivecount_and_analyze (sphere *spheres, sphere *copy, NUMBER first, NUMBER last, NUMBER *histo, NUMBER &biggestcl, REAL &averagecl) |
clock_t | naive_listcount_and_analyze (sphere *spheres, NUMLIST &sphlist, NUMBER N, NUMBER *histo, NUMBER &biggestcl, REAL &averagecl) |
clock_t | copy_l_count_and_analyze (sphere *spheres, sphere *copy, NUMLIST &sphlist, NUMBER *histo, NUMBER &biggestcl, REAL &averagecl) |
bool | reference_test (NUMBER N, int dim, COUNTER cuts) |
one_result | setR_count_analyze_step (NUMBER N, int dim, sphere *spheres, NUMLIST &L_sph_numbers, REAL radius, string &throwtime, clock_t &clcount_time, clock_t &spclsearch_time) |
one_result | throw_dnc_count_analyze_step (sphere *spheres, NUMLIST &L_sph_numbers, REAL radius, clock_t &clcount_time, clock_t &spclsearch_time) |
void | divide_all_spheres (sphere *array, NUMLIST &original, NUMLIST &lowerlist, NUMLIST &upperlist, COORDFLOAT border, int direction) |
NUMBER | combine (sphere *spheres, NUMLIST &sph1, NUMLIST &sph2, cluson *clst, NUMBER firstclno, NUMBER c1, NUMBER c2, COORDFLOAT border, int direction) |
NUMBER | divide_once_count_and_combine (sphere *spheres, sphere *temp, NUMLIST &all, cluson *clst, NUMBER firstclno, COORDFLOAT border, int direction) |
NUMBER | divide_once_count_and_analyze (sphere *spheres, sphere *temp, NUMLIST &all, NUMBER N, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
NUMBER | divide_two_times_count_and_analyze (sphere *spheres, sphere *temp, NUMLIST &all, NUMBER N, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
NUMBER | divide_three_times_count_and_analyze (sphere *spheres, sphere *temp, NUMLIST &all, NUMBER N, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
COUNTER | maximal_dividings_in_one_coordinate (COORDFLOAT spacelength, REAL radius) |
NUMBER | partcount (sphere *spheres, NUMLIST &all, COORDFLOAT l, COORDFLOAT r, COORDFLOAT lm, COORDFLOAT rm, COUNTER divstep, COUNTER divmax, int direction, int dimension, cluson *clusters, NUMBER firstclno) |
NUMBER | divide_d_times_count_and_analyze (sphere *spheres, NUMLIST &all, NUMBER N, NUMBER d, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
COUNTER | choose_optimal_cuts (int dim, NUMBER N, REAL R) |
void | test_cuts_function () |
NUMBER | dividecount (sphere *spheres, NUMLIST &all, COORDFLOAT l, COORDFLOAT r, COORDFLOAT lm, COORDFLOAT rm, COUNTER divstep, COUNTER divcounter, int direction, int dimension, cluson *clusters, NUMBER firstclno) |
NUMBER | count_analyze_and_return_clusters (NUMBER c, sphere *spheres, NUMLIST &all, cluson *clusters, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
NUMBER | divide_by_c_cuts_count_and_analyze (sphere *spheres, NUMLIST &all, NUMBER c, NUMBER *histogram, NUMBER &biggestcl, REAL &averagecl) |
NUMBER | divide_count_and_analyze (sphere *spheres, NUMLIST &all, NUMBER c, cluson *clusters, NUMBER &biggestcl, REAL &mean_clsz) |
|
Definition at line 732 of file divide_and_conquer.h. References choose_optimal_cuts_ffc(), choose_optimal_cuts_ffs(), COUNTER, ff_critical_guessed(), give_radius(), GRIDSIZE, log(), NUMBER, pow(), REAL, rounded(), and saturating_fillingfactor(). Referenced by starters::into_file7_pt1(), starters::into_file8_pt1(), setR_count_analyze_step(), and test_cuts_function().
00732 { 00733 00734 REAL rc=give_radius(ff_critical_guessed(N, dim), N, GRIDSIZE, dim); 00735 REAL rs=give_radius(saturating_fillingfactor(dim, N), N, GRIDSIZE, dim); 00736 // cout <<"rc="<<rc<<" rs="<<rs<<" this R="<<R<<endl; 00737 REAL lowest_N=39.0625; 00738 NUMBER Nclose=rounded(lowest_N * rounded(pow(2, 1+rounded(log(N/(2*lowest_N))/log(2))))); 00739 if (Nclose>480000) Nclose=480000; 00740 // cout <<"N="<<N<<" Nclose="<<Nclose<<endl; 00741 00742 COUNTER cuts_c=choose_optimal_cuts_ffc(dim, Nclose); 00743 COUNTER cuts_s=choose_optimal_cuts_ffs(dim, Nclose); 00744 if (cuts_s > cuts_c) cuts_s=cuts_c; 00745 00746 if (dim==1) return cuts_c; // because then rs==rc 00747 00748 REAL cuts=cuts_c + (cuts_s-cuts_c)* (R-rc)/(rs-rc); 00749 00750 // cout <<"cuts_c="<<cuts_c<<" cuts_s="<<cuts_s<<" cuts_R="<<cuts<<" return "<<endl; 00751 cuts=rounded(cuts); 00752 return (COUNTER)(cuts>0?cuts:0); 00753 } |
|
Definition at line 39 of file divide_and_conquer.h. References sphere::c, sphere::clno, clusterneighbours::clusno, COORDFLOAT, analyze::edgespheres(), errorout(), find_biggestradius(), lower(), NUMBER, overlap2(), REAL, set_clusternumber(), cluson::sphlist, and swapcluson(). Referenced by divide_once_count_and_combine(), divide_three_times_count_and_analyze(), divide_two_times_count_and_analyze(), dividecount(), and partcount().
00048 { 00049 if (sph1.empty() || sph2.empty()) return c2; // if one of the parts is empty, 00050 // do nothing 00051 00052 sphere s1=spheres[*sph1.begin()]; sphere s2=spheres[*sph2.begin()]; 00053 sphere temp=s1; // for a faster overlap-check 00054 00055 if (s1.clno > s2.clno ) { 00056 errorout("combine is not possible, \nbecause clusno's in first list greater than in second list"); 00057 cout <<s1.clno <<"\t"<< s2.clno<<endl; 00058 exit (1); 00059 } 00060 if (lower(s2.c-s1.c, 0,direction)) { 00061 errorout("combine is not possible, \nbecause coordinates of first list are higher than of second list"); 00062 cout <<"(in direction "<<direction<<" ): s1.c="<<s1.c<<" s2.c="<<s2.c<<endl; 00063 exit(1); 00064 } 00065 00066 REAL radius1=find_biggestradius(spheres,sph1); 00067 REAL radius2=find_biggestradius(spheres,sph2); 00068 REAL radius=( (radius1 > radius2) ? radius1 : radius2); 00069 00070 NUMLIST e1, e2; 00071 edgespheres(spheres, sph1, e1,border, 2*radius, direction); 00072 edgespheres(spheres, sph2, e2,border, 2*radius, -direction); 00073 // cout <<"number of edgespheres: "<< e1.size()<<"\t"<<e2.size()<<endl; 00074 00075 // now find all overlapping edgespheres -> clstoverlap[ ] 00076 // = list of directly overlapping clno's (both ways "forwards" and "backwards"!) 00077 // !!! one clno might be mentioned several times !!! 00078 00079 clusterneighbours *clstoverlap = new clusterneighbours[c2-firstclno]; 00080 // for the clusternumbers [firstclno;...c1.............;c2-1] 00081 // use the (smaller) array [0;...........c1-firstclno...;c2-firstclno-1] 00082 00083 NUMLIST::iterator esph1, esph2; 00084 00085 // idea: sort first perpendicular to cutline, 00086 // then compare only those within a certain distance 00087 // but at the moment, this checks _all_ edgespheres: 00088 for (esph1=e1.begin();esph1!=e1.end();esph1++){ 00089 for (esph2=e2.begin();esph2!=e2.end();esph2++){ 00090 s1= spheres[*esph1]; 00091 s2= spheres[*esph2]; 00092 if (overlap2 (s1,s2,temp)) { // overlapping spheres -> overlapping clusters 00093 clstoverlap[s1.clno-firstclno].clusno.push_back ( s2.clno); // forwards 00094 clstoverlap[s2.clno-firstclno].clusno.push_back ( s1.clno); // backwards 00095 } 00096 } 00097 } 00098 00099 e1.clear(); e2.clear(); 00100 00101 // now follow all cluster-connections in clstoverlap[] 00102 // delete the multiple entries 00103 // and collect all clno's of overlapping clusters 00104 // in the list with the smallest clusternumber 00105 00106 NUMLIST::iterator nneighb ; 00107 NUMBER clno; 00108 for (clno=firstclno;clno<=c1-1;clno++){ 00109 NUMLIST &neighbours=clstoverlap[clno-firstclno].clusno; // alias (!) 00110 00111 if (! neighbours.empty() ){ // no overlap 00112 if ( *(neighbours.begin()) != -1) // already counted 00113 { 00114 for (nneighb=neighbours.begin();nneighb!=neighbours.end();nneighb++){ 00115 00116 while ( (*nneighb==clno) || (*(clstoverlap[*nneighb-firstclno].clusno.begin())==-1 )) { 00117 nneighb=neighbours.erase(nneighb); 00118 if (nneighb==neighbours.end()) break; 00119 } 00120 if (nneighb==neighbours.end()) break; 00121 00122 neighbours.splice(neighbours.end(), clstoverlap[*nneighb-firstclno].clusno); 00123 clstoverlap[*nneighb-firstclno].clusno.push_front(-1); 00124 } 00125 } 00126 else neighbours.clear(); 00127 } 00128 } 00129 00130 00131 /* 00132 // the following is not necessary if the tests below are switched off 00133 // because the combination is done in [firstclno;c1-1] only 00134 // 00135 // clear the backwards connections (that were set to -1 in the above process) 00136 for (clno=c1;clno<=c2-1;clno++){ 00137 NUMLIST &neighbours=clstoverlap[clno-firstclno].clusno; 00138 if ( neighbours.size() != 0 && *(neighbours.begin()) == -1 ) { 00139 neighbours.clear(); 00140 } 00141 } 00142 00143 // only a test (time-consuming!): 00144 // test if all self-references and "-1" have been erased 00145 NUMBER s; 00146 for (clno=firstclno;clno<=c2-1;clno++){ 00147 NUMLIST &neighbours=clstoverlap[clno-firstclno].clusno; 00148 if ( neighbours.size()!=0 && (*(neighbours.begin())) == -1) { 00149 error("ALARM: -1 left"); 00150 cout << "clno="<<clno<<endl; 00151 cout << "firstclno="<<firstclno<<" c1="<<c1<<" c2="<<c2<<endl; 00152 exit(1); 00153 } 00154 s=neighbours.size(); 00155 neighbours.remove(clno); 00156 s=s-neighbours.size(); 00157 if (s !=0) { 00158 error("still self-references in clusterlist"); 00159 cout << " clno="<<clno<<" # of self references=" <<s<<endl; 00160 exit(1); 00161 } 00162 } 00163 00164 // only a test (time consuming!) 00165 // test if all the clusters have been combined 00166 // by looking for non-empty backwards connection lists 00167 for (clno = c1 ; clno<= c2-1;clno++){ 00168 if (clstoverlap[clno-firstclno].clusno.size()!= 0) { 00169 error ("not found every connection during combining"); 00170 cout <<"clno="<<clno; 00171 cout <<" overlap["<<clno<<"].clusno.size = "<<clstoverlap[clno-firstclno].clusno.size()<<endl; 00172 NUMLIST::iterator cl; 00173 for (cl=clstoverlap[clno-firstclno].clusno.begin();cl!=clstoverlap[clno-firstclno].clusno.end();cl++){ 00174 cout <<*cl<< " "; 00175 } 00176 cout <<endl; 00177 exit(1); 00178 } 00179 } 00180 00181 00182 // show the resulting cluster combination 00183 cout <<"\ncombined clusters are"<<endl; 00184 for (clno=firstclno;clno<=c1-1;clno++){ 00185 00186 NUMLIST &neighbours=clstoverlap[clno-firstclno].clusno; 00187 if (! neighbours.empty() ){ 00188 cout <<"{"<< clno<<"+ "; 00189 for (nneighb=neighbours.begin();nneighb!=neighbours.end();nneighb++){ 00190 cout <<*nneighb<< " "<<flush; 00191 } 00192 cout <<"}\t"<<flush; 00193 } 00194 } 00195 */ 00196 00197 // now combine the clusters of spheres according to clstoverlap 00198 // and set the right clusternumber to each sphere 00199 00200 // idea: perhaps renumbering doesn't have to be done here, but below 00201 00202 for (clno=firstclno;clno<=c1-1;clno++){ 00203 NUMLIST &neighbours=clstoverlap[clno-firstclno].clusno; 00204 if (! neighbours.empty() ){ 00205 for (nneighb=neighbours.begin();nneighb!=neighbours.end();nneighb++){ 00206 set_clusternumber (spheres, clst[*nneighb].sphlist,clno); 00207 clst[clno].sphlist.splice(clst[clno].sphlist.end(), clst[*nneighb].sphlist); 00208 } 00209 } 00210 } 00211 00212 delete[] clstoverlap; 00213 00214 00215 // clean clustertable of empty clusters 00216 // and set the right clno to each sphere 00217 00218 NUMBER highest=c2-1; 00219 00220 for (clno=firstclno;clno<=c2-1;clno++){ 00221 if (! clst[clno].sphlist.empty()) highest=clno; 00222 else{ 00223 // find first non-empty 00224 NUMBER j; 00225 for (j=clno+1;j<=c2-1;j++) if (! clst[j].sphlist.empty()) break; 00226 if (j==c2) {clno=c2;break;} // the rest is also empty 00227 00228 else{ 00229 swapcluson(clst[clno],clst[j]); 00230 set_clusternumber (spheres, clst[clno].sphlist,clno); 00231 if (!clst[j].sphlist.empty()) { 00232 errorout ("error in getting rid of empty clusters (after swap)"); 00233 cout <<"should be empty: clno j="<<j<<endl; 00234 cout <<"was swapped: clno ="<<clno<<endl; 00235 exit (1); 00236 } 00237 highest=clno; 00238 } 00239 } 00240 } 00241 c2=highest+1; // first empty clusternumber 00242 00243 return (c2); 00244 } |
|
Definition at line 133 of file counters.h. References naive_count_and_analyze(), NUMBER, and REAL. Referenced by starters::listcount(), and starters::test_list().
00138 { 00139 00140 clock_t time=clock(); 00141 00142 NUMLIST::iterator iter; 00143 NUMBER index=0; 00144 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00145 index++; 00146 copy[index]=spheres[*iter]; 00147 } 00148 00149 naive_count_and_analyze(copy,1,index,histo,biggestcl,averagecl); 00150 00151 index=0; 00152 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00153 index++; 00154 spheres[*iter]=copy[index]; 00155 } 00156 00157 return (clock()-time); 00158 } |
|
Definition at line 910 of file divide_and_conquer.h. References sphere::c, dividecount(), analyze::erasehisto(), errorout(), getdim(), GRIDSIZE, NUMBER, and REAL. Referenced by divide_by_c_cuts_count_and_analyze().
00915 { 00916 // if (c>=1) { 00917 int dimension=getdim( spheres[*all.begin()].c ); 00918 00919 NUMBER nextcluster=dividecount(spheres, all, 00920 0,GRIDSIZE,0,GRIDSIZE, 00921 0, c, 00922 dimension,dimension, 00923 clusters, 1); 00924 00925 erasehisto(histogram,1,all.size()); 00926 NUMBER biggestcl_no; 00927 NUMBER totalnumber= makehistogram ( clusters, 00928 1,nextcluster-1, 00929 histogram, 00930 biggestcl_no, 00931 biggestcl, 00932 averagecl); 00933 00934 if (totalnumber != (NUMBER)all.size()) { 00935 errorout("not all the spheres are in clusters!"); 00936 cout << "number of spheres: N="<<all.size(); 00937 cout <<" counted="<<totalnumber<<endl; 00938 exit(1); 00939 } 00940 else ; // cout <<"N="<<all.size()<<" counted="<<totalnumber<<endl; 00941 00942 // } 00943 // else exit(1); 00944 00945 return (nextcluster-1); // returns the number of clusters (M0) 00946 00947 } |
|
Definition at line 212 of file cellcount.h. References sphere::clno, getdim(), NUMBER, and overlap2(). Referenced by optimize::compare_recursion_and_Stoddard_iteration(), and optimize::new_vs_old_algo().
00216 { 00217 // the idea to this algorithm can be found in 00218 // S.D.Stoddard, J.Comp.Phys 27, 291-293 (1978) 00219 // Identifying clusters in computer experiments on systems of particles 00220 00221 NUMBER i,j,k; 00222 NUMBER N=last-first+1; 00223 NUMBER* neighbour=new NUMBER[N]; // afterwards contains a "list" of linked spheres 00224 for (i=0;i<N;i++) {neighbour[i]=i;} // initialize link"list" 00225 NUMBER ntemp; // used for swapping 00226 sphere temp( getdim(array[first].c) ); // used as a temporary distance vector 00227 00228 for (i=0; i<N-1; i++) { 00229 if (neighbour[i]==i) { 00230 j=i; 00231 do { 00232 for (k=i+1; k<N; k++) { 00233 if (neighbour[k]==k){ 00234 if (overlap2(array[first+j],array[first+k], temp)){ 00235 ntemp=neighbour[j]; 00236 neighbour[j]=neighbour[k]; 00237 neighbour[k]=ntemp; 00238 } 00239 } 00240 } 00241 j=neighbour[j]; 00242 } while (j!=i); 00243 } 00244 } 00245 // cout<<"\n"; 00246 // for (i=0;i<N;i++){cout<<"[L("<<i<<")="<<neighbour[i]<<"] ";} 00247 00248 NUMBER clusternumber=first_clno; 00249 for (i=0; i<N; i++){ 00250 if (array[first+i].clno==0){ 00251 j=i; 00252 do { 00253 array[first+i].clno=clusternumber; 00254 i=neighbour[i]; 00255 } while (i!=j); 00256 clusternumber++; 00257 } 00258 } 00259 00260 delete[] neighbour; 00261 return clusternumber; 00262 } |
|
Definition at line 264 of file cellcount.h. References sphere::clno, getdim(), NUMBER, and overlap2().
00268 { 00269 // the idea to this algorithm can be found in 00270 // S.D.Stoddard, J.Comp.Phys 27, 291-293 (1978) 00271 // Identifying clusters in computer experiments on systems of particles 00272 00273 NUMBER i,j,k; 00274 NUMBER N=last-first+1; 00275 00276 NUMBER* neighbour=new NUMBER[N]; // first~ 1 ; last~ last-first+1 00277 for (i=0;i<N;i++) {neighbour[i]=i;} // initialize linklist 00278 00279 NUMBER ntemp; // used for swapping 00280 sphere temp( getdim(array[first].c) ); // used as a temporary distance vector 00281 00282 NUMBER clusternumber=first_clno; 00283 00284 for (i=0; i<N-1; i++) { 00285 if (neighbour[i]==i) { 00286 array[first+i].clno=clusternumber; 00287 j=i; 00288 do { 00289 for (k=i+1; k<N; k++) { 00290 if (neighbour[k]==k){ 00291 if (overlap2(array[first+j],array[first+k], temp)){ 00292 array[first+k].clno=clusternumber; 00293 ntemp=neighbour[j]; 00294 neighbour[j]=neighbour[k]; 00295 neighbour[k]=ntemp; 00296 } 00297 } 00298 } 00299 j=neighbour[j]; 00300 } while (j!=i); 00301 clusternumber++; 00302 } 00303 } 00304 00305 delete [] neighbour; 00306 return clusternumber; 00307 } |
|
Definition at line 309 of file cellcount.h. References sphere::clno, getdim(), NUMBER, and overlap2(). Referenced by optimize::compare_recursion_and_Stoddard_iteration(), and optimize::new_vs_old_algo().
00313 { 00314 // the idea to this algorithm can be found in 00315 // S.D.Stoddard, J.Comp.Phys 27, 291-293 (1978) 00316 // Identifying clusters in computer experiments on systems of particles 00317 00318 NUMBER i,j,k; 00319 NUMBER* neighbour=new NUMBER[N+1]; // afterwards contains a "list" of linked spheres 00320 for (i=1;i<=N;i++) {neighbour[i]=i;} // initialize link"list" 00321 NUMBER ntemp; // used for swapping 00322 sphere temp( getdim(array[sphnumber[N]].c) ); // used as a temporary distance vector 00323 00324 for (i=1; i<=N-1; i++) { 00325 if (neighbour[i]==i) { 00326 j=i; 00327 do { 00328 for (k=i+1; k<=N; k++) { 00329 if (neighbour[k]==k){ 00330 if (overlap2(array[sphnumber[j]],array[sphnumber[k]], temp)){ 00331 ntemp=neighbour[j]; 00332 neighbour[j]=neighbour[k]; 00333 neighbour[k]=ntemp; 00334 } 00335 } 00336 } 00337 j=neighbour[j]; 00338 } while (j!=i); 00339 } 00340 } 00341 // cout<<"\n"; 00342 // for (i=0;i<N;i++){cout<<"[L("<<i<<")="<<neighbour[i]<<"] ";} 00343 00344 NUMBER clusternumber=first_clno; 00345 for (i=1; i<=N; i++){ 00346 if (array[sphnumber[i]].clno==0){ 00347 j=i; 00348 do { 00349 array[sphnumber[i]].clno=clusternumber; 00350 i=neighbour[i]; 00351 } while (i!=j); 00352 clusternumber++; 00353 } 00354 } 00355 00356 delete[] neighbour; 00357 return clusternumber; 00358 } |
|
Definition at line 34 of file cellcount.h. References sphere::clno, neighbour_recursion(), and NUMBER. Referenced by list_to_given_array_and_find_cluster(), and list_to_temp_array_and_find_cluster().
00038 { 00039 NUMBER clusternumber=first_clno; 00040 for (NUMBER k=first; k<=last; k++) { 00041 if (array[k].clno==0) { // if yet uncounted 00042 neighbour_recursion(array, k,last, k, clusternumber); // the actual counting process 00043 clusternumber++; // increase cluster-counter 00044 } 00045 } 00046 return (clusternumber); 00047 } |
|
Definition at line 164 of file cellcount.h. References neighbour_l(), and NUMBER. Referenced by naive_listcount_and_analyze().
00169 { 00170 clock_t start=clock(); 00171 00172 NUMBER size; 00173 00174 NUMLIST::iterator k; 00175 for (k = sphlist.begin(); k != sphlist.end(); k++){ // search for neighbours from each sphere 00176 00177 if (array[*k].clno==0) { // if yet uncounted 00178 00179 size=neighbour_l(array,sphlist, k, k, clusternumber); // the actual counting process 00180 clustertable[clusternumber]=size; // store size to table of all clusters 00181 clusternumber++; // increase cluster-counter 00182 } 00183 } 00184 clustertable[clusternumber]=0; // mark the end in that table by: "last cluster is of size 0" 00185 return (clock()-start); // return the time (and the clustertable and the next clusternumber!) 00186 } |
|
Definition at line 106 of file cellcount.h. References sphere::clno, neighbour_naive(), and NUMBER. Referenced by naive_arraycount_and_analyze(), and naive_count_and_analyze().
00106 { 00107 clock_t start=clock(); 00108 00109 NUMBER size; 00110 NUMBER clusternumber=0; // start with # 1 00111 00112 for (NUMBER k=first; k<=last; k++) { 00113 if (array[k].clno==0) { // if yet uncounted 00114 00115 clusternumber++; // increase cluster-counter 00116 size=neighbour_naive(array, k,last, k, clusternumber); // the actual counting process 00117 clustertable[clusternumber]=size; // store size to table of all clusters 00118 00119 } 00120 } 00121 clustertable[clusternumber+1]=0; // mark the end in that table by: "last cluster is of size 0" 00122 return (clock()-start); 00123 } |
|
Definition at line 19 of file divide_and_conquer.h. References COORDFLOAT, and lower(). Referenced by divide_once_count_and_combine(), divide_three_times_count_and_analyze(), divide_two_times_count_and_analyze(), dividecount(), partcount(), and starters::test_list().
00024 { 00025 00026 NUMLIST::iterator iter1; 00027 00028 for (iter1 = original.begin(); iter1 != original.end(); ++iter1){ 00029 if ( lower(array[*iter1].c, border, direction)) 00030 lowerlist.insert(lowerlist.end(), *iter1); 00031 else upperlist.insert(upperlist.end(), *iter1); 00032 } 00033 } |
|
Definition at line 951 of file divide_and_conquer.h. References count_analyze_and_return_clusters(), NUMBER, and REAL. Referenced by optimize::choose_cuts_with_reference_algo(), optimize::double_N_and_run_all_faster_cuts(), optimize::double_N_and_run_specified_cuts(), starters::into_file7_pt1(), reference_test(), optimize::run_different_cuts(), optimize::test_average_time_for_specified_cuts(), starters::test_occuring_clusternumbers(), test_occuring_clusternumbers(), and test_spanningclusters().
00956 { 00957 cluson *clusters=new cluson[all.size()+1]; 00958 00959 NUMBER number_of_clusters= count_analyze_and_return_clusters(c, 00960 spheres, all, 00961 clusters, histogram, 00962 biggestcl, averagecl); 00963 00964 delete[] clusters; 00965 00966 return number_of_clusters; 00967 } |
|
Definition at line 975 of file divide_and_conquer.h. References sphere::c, COORDFLOAT, dividecount(), analyze::erasehisto(), errorout(), exit_out_of_memory(), getdim(), GRIDSIZE, NUMBER, REAL, and waitanykey(). Referenced by setR_count_analyze_step().
00980 { 00981 NUMBER *histogram=new NUMBER[all.size()+1]; 00982 if (histogram==NULL) exit_out_of_memory("divide_count_and_analyze(...): NUMBER *histogram"); 00983 erasehisto(histogram,1,all.size()); 00984 00985 int dimension=getdim( spheres[*all.begin()].c ); 00986 00987 NUMBER numberof_cl=dividecount(spheres, all, 00988 0,GRIDSIZE,(COORDFLOAT)0,GRIDSIZE, 00989 0, c, 00990 dimension,dimension, 00991 clusters, 1); 00992 00993 NUMBER biggestcl_no; 00994 NUMBER totalnumber= makehistogram ( clusters, 00995 1,numberof_cl-1, 00996 histogram, 00997 biggestcl_no, 00998 biggestcl, 00999 mean_clsz); 01000 if (totalnumber != (NUMBER)all.size()) { 01001 errorout("not all the spheres are in clusters!"); 01002 cout << "number of spheres: N="<<all.size(); 01003 cout <<" counted="<<totalnumber<<endl; 01004 waitanykey(); 01005 } 01006 01007 delete[] histogram; 01008 01009 return numberof_cl-1; 01010 } |
|
Definition at line 708 of file divide_and_conquer.h. References analyze::analyze_clusters(), sphere::c, COORDFLOAT, getdim(), GRIDSIZE, NUMBER, partcount(), and REAL. Referenced by optimize::choose_dividings().
00715 { 00716 cluson *clusters=new cluson[N+1]; 00717 00718 int dimension=getdim( spheres[*all.begin()].c ); 00719 00720 NUMBER nextcluster=partcount(spheres, all, 0, GRIDSIZE, (COORDFLOAT)0, GRIDSIZE, 1, d, 1,dimension, clusters, 1); 00721 00722 NUMBER biggestcl_no=analyze_clusters (clusters, 1, nextcluster-1,histogram,N,biggestcl,averagecl); 00723 00724 delete[] clusters; 00725 00726 return (biggestcl_no); 00727 } |
|
Definition at line 516 of file divide_and_conquer.h. References analyze::analyze_clusters(), divide_once_count_and_combine(), GRIDSIZE, NUMBER, and REAL. Referenced by optimize::new_vs_old_algo().
00523 { 00524 00525 cluson *clusters=new cluson[N+1]; 00526 NUMBER nextclno; 00527 00528 nextclno=divide_once_count_and_combine (spheres, temp, all, clusters,1,GRIDSIZE/2, 1); 00529 cout <<" -> combined to: "<<nextclno-1<<" clusters"<<endl; 00530 00531 NUMBER biggestcl_no=analyze_clusters (clusters, 1, nextclno-1,histogram,N,biggestcl,averagecl); 00532 00533 delete[] clusters; 00534 00535 return (biggestcl_no); 00536 } |
|
Definition at line 491 of file divide_and_conquer.h. References combine(), COORDFLOAT, divide_all_spheres(), list_to_given_array_and_find_cluster(), make_clusterlist_array(), and NUMBER. Referenced by divide_once_count_and_analyze(), divide_three_times_count_and_analyze(), and divide_two_times_count_and_analyze().
00498 { 00499 00500 NUMBER c1,c2; 00501 NUMLIST sph1,sph2; 00502 divide_all_spheres(spheres, all, sph1,sph2,border,direction); 00503 00504 c1=list_to_given_array_and_find_cluster(spheres, temp, sph1, firstclno); 00505 c2=list_to_given_array_and_find_cluster(spheres, temp, sph2, c1); 00506 cout <<"found "<<c1-firstclno<<" and "<<c2-c1<<" clusters "; 00507 cout <<"(c1="<<c1<<", c2="<<c2<<")"; 00508 00509 make_clusterlist_array (spheres, all, clst); 00510 00511 c2=combine(spheres,sph1,sph2,clst,firstclno,c1,c2,border,direction); 00512 return (c2); 00513 } |
|
Definition at line 577 of file divide_and_conquer.h. References analyze::analyze_clusters(), combine(), COORDFLOAT, divide_all_spheres(), divide_once_count_and_combine(), GRIDSIZE, NUMBER, and REAL.
00584 { 00585 cluson *clusters=new cluson[N+1]; 00586 00587 NUMBER nextclno1, nextclno2; 00588 NUMBER cl1, cl2; 00589 NUMLIST sph1,sph2,sph3,sph4,sph5,sph6; 00590 00591 COORDFLOAT border1=GRIDSIZE/2; 00592 COORDFLOAT border2=GRIDSIZE/4; 00593 00594 divide_all_spheres(spheres, all, sph1,sph2,border1,1); 00595 00596 divide_all_spheres(spheres, sph1,sph3,sph4,border1,2); 00597 nextclno1=divide_once_count_and_combine (spheres, temp, sph3, clusters,1,border1-border2, 1); cout<<endl; 00598 nextclno2=divide_once_count_and_combine (spheres, temp, sph4, clusters,nextclno1,border1-border2, 1); cout<<endl; 00599 cl1=combine (spheres,sph3,sph4,clusters,1,nextclno1,nextclno2,border1,2); 00600 cout <<" -> combined to: "<<cl1-1<<" clusters"<<endl; 00601 00602 divide_all_spheres(spheres, sph2,sph5,sph6,border1,2); 00603 nextclno1=divide_once_count_and_combine (spheres, temp, sph5, clusters,cl1,border1+border2, 1); cout <<endl; 00604 nextclno2=divide_once_count_and_combine (spheres, temp, sph6, clusters,nextclno1,border1+border2, 1); cout<<endl; 00605 cl2=combine (spheres,sph5,sph6,clusters,cl1,nextclno1,nextclno2,border1,2); 00606 cout <<" -> combined to: "<<cl2-cl1<<" clusters"<<endl; 00607 00608 cout <<"Now these two combined to: "; 00609 cl2=combine(spheres,sph1,sph2,clusters,1,cl1,cl2,border1,1); 00610 cout<<cl2-1<<" clusters"<<endl; 00611 00612 NUMBER biggestcl_no=analyze_clusters (clusters, 1, cl2-1,histogram,N,biggestcl,averagecl); 00613 00614 delete[] clusters; 00615 00616 return (biggestcl_no); 00617 } |
|
Definition at line 539 of file divide_and_conquer.h. References analyze::analyze_clusters(), combine(), COORDFLOAT, divide_all_spheres(), divide_once_count_and_combine(), GRIDSIZE, NUMBER, and REAL. Referenced by optimize::choose_dividings(), and optimize::new_vs_old_algo().
00546 { 00547 00548 cluson *clusters=new cluson[N+1]; 00549 00550 NUMBER nextclno1, nextclno2; 00551 NUMBER cl2; 00552 NUMLIST sph1,sph2; 00553 00554 COORDFLOAT border1=GRIDSIZE/2; 00555 00556 divide_all_spheres(spheres, all,sph1,sph2, border1,1); 00557 00558 //cout <<"A) count clusters in left part..."<<endl; 00559 nextclno1=divide_once_count_and_combine (spheres, temp, sph1, clusters,1,border1, 2); 00560 cout <<" -> combined to: "<<nextclno1-1<<" clusters"<<endl; 00561 00562 //cout <<"B) count clusters in right part..."<<endl; 00563 nextclno2=divide_once_count_and_combine (spheres, temp, sph2, clusters,nextclno1,border1, 2); 00564 cout <<" -> combined to: "<<nextclno2-nextclno1<<" clusters"<<endl; 00565 00566 cout <<"Now combine the two results..."; 00567 cl2=combine (spheres,sph1,sph2,clusters,1,nextclno1,nextclno2,border1,1); 00568 cout <<" -> combined to: "<<cl2-1<<" clusters"<<endl; 00569 00570 NUMBER biggestcl_no=analyze_clusters (clusters, 1, cl2-1,histogram,N,biggestcl,averagecl); 00571 00572 delete[] clusters; 00573 00574 return (biggestcl_no); 00575 } |
|
Definition at line 786 of file divide_and_conquer.h. References combine(), COORDFLOAT, COUNTER, divide_all_spheres(), list_to_temp_array_and_find_cluster(), make_clusterlist_array(), and NUMBER. Referenced by count_analyze_and_return_clusters(), divide_count_and_analyze(), and optimize::new_vs_old_algo().
00792 { 00793 NUMBER nextclno; 00794 00795 if (divstep < divcounter/direction ) { 00796 NUMLIST s1, s2; 00797 NUMBER ncl1, ncl2; 00798 divide_all_spheres (spheres, all, s1,s2,(l+r)/2,direction); 00799 ncl1=dividecount(spheres, s1, // RECURSION! 00800 l,(l+r)/2, lm,rm, 00801 divstep+1, divcounter, 00802 direction,dimension, 00803 clusters, firstclno); 00804 ncl2=dividecount(spheres, s2, // RECURSION! 00805 (l+r)/2,r, lm,rm, 00806 divstep+1, divcounter, 00807 direction,dimension, 00808 clusters, ncl1); 00809 nextclno=combine(spheres, s1,s2,clusters,firstclno,ncl1,ncl2,(l+r)/2,direction); 00810 } 00811 00812 else { 00813 if (direction==1) { 00814 // the core clusterCounter 00815 // (naive recursion or iteration with full network) 00816 nextclno=list_to_temp_array_and_find_cluster(spheres, all, firstclno); 00817 make_clusterlist_array (spheres, all, clusters); 00818 } 00819 else { 00820 // continue in next-lower direction (divcounter-divstep cuts left to do) 00821 nextclno=dividecount(spheres, all, 00822 lm,rm, lm,rm, 00823 0, divcounter-divstep, 00824 direction-1,dimension, 00825 clusters, firstclno); 00826 } 00827 } 00828 return nextclno; 00829 } |
|
Definition at line 189 of file cellcount.h. References count_clusters_recursively(), and NUMBER. Referenced by divide_once_count_and_combine().
00193 { 00194 NUMLIST::iterator iter; 00195 NUMBER index=0; 00196 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00197 index++; 00198 copy[index]=spheres[*iter]; 00199 } 00200 00201 NUMBER first_free_clusternumber=count_clusters_recursively(copy,1,index,first_clno); 00202 00203 index=0; 00204 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00205 index++; 00206 spheres[*iter]=copy[index]; 00207 } 00208 return (first_free_clusternumber); 00209 } |
|
Definition at line 50 of file cellcount.h. References count_clusters_recursively(), and NUMBER. Referenced by dividecount(), and partcount().
00053 { 00054 00055 sphere *copy= new sphere[sphlist.size()+1]; 00056 00057 NUMLIST::iterator iter; 00058 NUMBER index=0; 00059 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00060 index++; 00061 copy[index]=spheres[*iter]; 00062 } 00063 00064 NUMBER first_free_clusternumber=count_clusters_recursively(copy,1,index,first_clno); 00065 00066 index=0; 00067 for (iter = sphlist.begin(); iter != sphlist.end(); iter++){ 00068 index++; 00069 spheres[*iter]=copy[index]; 00070 } 00071 00072 delete[] copy; 00073 00074 return (first_free_clusternumber); 00075 } |
|
Definition at line 635 of file divide_and_conquer.h. References COORDFLOAT, COUNTER, log(), and REAL. Referenced by optimize::choose_cuts_with_reference_algo(), optimize::choose_dividings(), optimize::double_N_and_run_all_faster_cuts(), optimize::double_N_and_run_specified_cuts(), and optimize::run_different_cuts().
|
|
Definition at line 51 of file counters.h. References countclusters_naive(), analyze::erasehisto(), NUMBER, REAL, and set_clustersize_to_each_sphere(). Referenced by optimize::choose_cuts_with_reference_algo(), optimize::choose_dividings(), optimize::compare_recursion_and_Stoddard_iteration(), optimize::double_N_and_run_all_faster_cuts(), optimize::new_vs_old_algo(), and optimize::run_different_cuts().
00056 { 00057 00058 NUMBER *tableofclusters=new NUMBER[(last-first+3)]; // must be one bigger than number of spheres because of ending 0 00059 00060 countclusters_naive(spheres, first, last, tableofclusters); //count clusters, vs.1 00061 00062 averagecl=set_clustersize_to_each_sphere(tableofclusters, spheres, first,last); 00063 erasehisto(histo,first, last); 00064 NUMBER biggestcl_no; 00065 makehistogram(tableofclusters,histo,biggestcl,biggestcl_no); 00066 00067 delete[] tableofclusters; 00068 00069 return (biggestcl_no); 00070 } |
|
Definition at line 20 of file counters.h. References countclusters_naive(), analyze::erasehisto(), NUMBER, REAL, and set_clustersize_to_each_sphere(). Referenced by copy_l_count_and_analyze(), starters::listcount(), and sort_naivecount_and_analyze().
00026 { 00027 // returns these results: 00028 // the biggest cluster is of size: << biggestcl 00029 // each sphere is on average part of a cluster of size << averagecl 00030 // the detailed size-distribution is in << histo[...] 00031 00032 clock_t time=clock(); 00033 NUMBER *tableofclusters=new NUMBER[(last-first+3)]; // must be one bigger than number of spheres because of ending 0 00034 00035 countclusters_naive(spheres, first, last, tableofclusters); //count clusters, vs.1 00036 00037 averagecl=set_clustersize_to_each_sphere(tableofclusters, spheres, first,last); 00038 erasehisto(histo,first, last); 00039 00040 NUMBER biggestcl_no; 00041 makehistogram(tableofclusters,histo,biggestcl,biggestcl_no); 00042 00043 delete[] tableofclusters; 00044 00045 return (clock()-time); 00046 } |
|
Definition at line 104 of file counters.h. References countclusters_l(), analyze::erasehisto(), NUMBER, REAL, and set_clustersize_to_each_sphere_l(). Referenced by starters::listcount(), and starters::test_list().
00110 { 00111 // returns these results: 00112 // the biggest cluster is of size: << biggestcl 00113 // each sphere is on average part of a cluster of size << averagecl 00114 // the detailed size-distribution is in << histo[...] 00115 00116 clock_t time=clock(); 00117 NUMBER *tableofclusters=new NUMBER[(sphlist.size()+2)]; // must be one bigger than number of spheres because of ending 0 00118 NUMBER clusternumber=1; // first cluster is "1" 00119 00120 countclusters_l(spheres,sphlist, tableofclusters, clusternumber); 00121 00122 averagecl=set_clustersize_to_each_sphere_l(tableofclusters, spheres, sphlist); 00123 erasehisto(histo,1, N); 00124 NUMBER biggestcl_no; 00125 makehistogram(tableofclusters,histo,biggestcl, biggestcl_no); 00126 00127 delete[] tableofclusters; 00128 00129 return (clock()-time); 00130 } |
|
Definition at line 129 of file cellcount.h. References sphere::c, sphere::clno, distance(), getdim(), length(), NUMBER, and sphere::r. Referenced by countclusters_l().
00134 { 00135 array[*actualsph].clno=clnumber; // this sphere is set to be found in this cluster 00136 00137 myVector distance(getdim(array[*actualsph].c)); 00138 bool overlapped; 00139 00140 NUMBER size=1; 00141 00142 NUMLIST::iterator nextsph; 00143 00144 for (nextsph = firstsph; nextsph != sphlist.end(); nextsph++){ 00145 00146 if ( array[*nextsph].clno==0 ) { 00147 00148 //if ( overlap2(array[*actualsph],array[*nextsph]) ) { 00149 // the following 4 lines do the same, but are faster than that: 00150 // because of not using operator-(vect1, vect2) which needs a myVector temp; 00151 00152 distance=(array[*nextsph].c); 00153 distance-=(array[*actualsph].c); 00154 overlapped=length(distance) < (array[*actualsph].r + array[*nextsph].r) ; 00155 if (overlapped) { 00156 size+=neighbour_l (array, sphlist, firstsph, nextsph, clnumber); // recursion, now with nextsph 00157 } 00158 } 00159 } 00160 return size; 00161 } |
|
Definition at line 78 of file cellcount.h. References sphere::c, sphere::clno, distance(), getdim(), length(), NUMBER, and sphere::r. Referenced by countclusters_naive().
00078 { 00079 array[actualsph].clno=clnumber; 00080 00081 myVector distance(getdim(array[actualsph].c)); 00082 bool overlapped; 00083 00084 NUMBER size=1; 00085 00086 for (NUMBER nextsph=first;nextsph<=last;nextsph++) { 00087 if ( array[nextsph].clno==0 ) { 00088 00089 // if ( overlap(array[actualsph],array[nextsph]) ) { 00090 // the following 3 lines are faster: 00091 // because of not using operator-(vect1, vect2) which needs a vector temp; 00092 00093 distance=(array[nextsph].c); 00094 distance-=(array[actualsph].c); // using -= instead of - is much faster (no vector temp) 00095 overlapped=length(distance) < (array[actualsph].r + array[nextsph].r) ; 00096 00097 if (overlapped) { 00098 00099 size+=neighbour_naive (array, first, last, nextsph, clnumber); // RECURSION! 00100 } 00101 } 00102 } 00103 return size; 00104 } |
|
Definition at line 14 of file cellcount.h. References sphere::clno, getdim(), NUMBER, and overlap2(). Referenced by count_clusters_recursively().
00014 { 00015 00016 array[actualsph].clno=clnumber; // set this sphere as "counted" by assigning clusternumber 00017 00018 sphere temp( getdim(array[actualsph].c) ); // used as a temporary distance vector 00019 00020 for (NUMBER nextsph=first;nextsph<=last;nextsph++) { 00021 if ( array[nextsph].clno==0 ) { 00022 if ( overlap2(array[actualsph],array[nextsph], temp) ) { 00023 // this overlap-function uses a temp-sphere-coordinatevector 00024 // for storing the difference of the two vectors 00025 // (it is much faster than creating one temporary vector 00026 // for each overlap-test by using overlap (sphere, sphere) ) 00027 neighbour_recursion (array, first, last, nextsph, clnumber); 00028 } 00029 } 00030 } 00031 } |
|
Definition at line 642 of file divide_and_conquer.h. References combine(), COORDFLOAT, COUNTER, divide_all_spheres(), list_to_temp_array_and_find_cluster(), make_clusterlist_array(), and NUMBER. Referenced by divide_d_times_count_and_analyze().
00654 { 00655 NUMBER nextclno; 00656 00657 if (divmax==0) 00658 { 00659 nextclno=list_to_temp_array_and_find_cluster(spheres, all, firstclno); 00660 make_clusterlist_array (spheres, all, clusters); 00661 return nextclno; 00662 } 00663 00664 if ( direction==dimension ) { 00665 if ( divstep==divmax ) { 00666 NUMLIST s1, s2; 00667 NUMBER ncl1, ncl2; 00668 divide_all_spheres (spheres, all, s1,s2,(l+r)/2,direction); 00669 //cout <<"\ndir="<<direction<<"\tborders l,r=\t"<<l<<"\t"<<r; 00670 //cout <<"\t# of spheres="<<s1.size()<<" and "<<s2.size()<<endl; 00671 ncl1=list_to_temp_array_and_find_cluster(spheres, s1, firstclno); 00672 ncl2=list_to_temp_array_and_find_cluster(spheres, s2, ncl1); 00673 make_clusterlist_array (spheres, all, clusters); 00674 nextclno=combine(spheres, s1,s2,clusters,firstclno,ncl1,ncl2,(l+r)/2,direction); 00675 } 00676 else { 00677 NUMLIST s1, s2; 00678 NUMBER ncl1, ncl2; 00679 divide_all_spheres (spheres, all, s1,s2,(l+r)/2,direction); 00680 //cout <<"diV "; 00681 ncl1=partcount(spheres, s1, l,(l+r)/2, lm,rm, divstep+1, divmax, direction,dimension, clusters, firstclno); 00682 ncl2=partcount(spheres, s2, (l+r)/2,r, lm,rm, divstep+1, divmax, direction,dimension, clusters, ncl1); 00683 nextclno=combine(spheres, s1,s2,clusters,firstclno,ncl1,ncl2,(l+r)/2,direction); 00684 } 00685 } 00686 00687 else { 00688 if (divstep <= divmax) { 00689 NUMLIST s1, s2; 00690 NUMBER ncl1, ncl2; 00691 divide_all_spheres (spheres, all, s1,s2,(l+r)/2,direction); 00692 //cout <<"diV "; 00693 ncl1=partcount(spheres, s1, l,(l+r)/2, lm,rm, divstep+1, divmax, direction,dimension, clusters, firstclno); 00694 ncl2=partcount(spheres, s2, (l+r)/2,r, lm,rm, divstep+1, divmax, direction,dimension, clusters, ncl1); 00695 nextclno=combine(spheres, s1,s2,clusters,firstclno,ncl1,ncl2,(l+r)/2,direction); 00696 } 00697 00698 else { 00699 //cout <<"diM "; 00700 nextclno=partcount(spheres, all, lm,rm, lm,rm, 1, divmax, direction+1,dimension, clusters, firstclno); 00701 } 00702 } 00703 00704 return nextclno; 00705 } |
|
Definition at line 164 of file counters.h. References COUNTER, divide_by_c_cuts_count_and_analyze(), errorout(), GRIDSIZE, increasing_integers(), ms(), NUMBER, R_critical(), R_critical_guessed(), REAL, analyze::sameresult(), set_clusternumber(), set_dim(), set_radius(), sort_naivecount_and_analyze(), and throw_spheres().
00164 { // test if new and old algo's results are the SAME! 00165 00166 sphere *scatter = new sphere[N+1]; 00167 set_dim(scatter,0,N,dim); 00168 throw_spheres(scatter, 1, N); // randomly throw spheres from 1 to N in array scatter 00169 REAL r=R_critical(N,GRIDSIZE,dim); 00170 if (r==-1) r=R_critical_guessed(N,GRIDSIZE,dim); // with _critical_ sphere radius, if known, otherwise r=guess 00171 set_radius(scatter, 1,N,r); 00172 00173 // new algo 00174 NUMBER *histogram=new NUMBER[(N+1)]; 00175 NUMBER biggestcl; 00176 REAL averagecl; 00177 NUMLIST all; 00178 increasing_integers (all, N); // fill the list "all" with the numbers of all spheres 00179 00180 clock_t speed=clock(); 00181 cout <<"\ndivide_by_c_cuts count (new algo):.."<<flush; 00182 set_clusternumber(scatter,1,N,0); // no sphere is found yet 00183 divide_by_c_cuts_count_and_analyze(scatter, all, cuts,histogram, biggestcl, averagecl); 00184 cout <<" speed: "<<ms(clock()-speed)<<" ms"<<endl; 00185 cout <<" (biggestcluster: "<<biggestcl<<"\taverage cluster: "<<averagecl<<" )"<<endl; 00186 00187 // old algo 00188 sphere *copy = new sphere[N+1]; 00189 set_dim(copy,0,N,dim); 00190 NUMBER *histogramcontrol=new NUMBER[(N+1)]; 00191 00192 speed=clock(); 00193 cout <<"\nsorted-array-count (old, naive algo):.. "<<flush; 00194 set_clusternumber(scatter,1,N,0); // no sphere is found yet 00195 sort_naivecount_and_analyze(scatter, copy, 1, N, histogramcontrol, biggestcl, averagecl); 00196 cout <<" speed: "<<ms(clock()-speed)<<" ms"<<endl; 00197 cout <<" (biggestcluster: "<<biggestcl<<"\taverage cluster: "<<averagecl<<" )"<<endl; 00198 00199 if (sameresult(histogram,histogramcontrol,1,biggestcl)) { 00200 cout <<"\nThe new algorithm was tested. Results are perfect. Let us begin.\n\n"<<endl; 00201 delete [] scatter, copy, histogram, histogramcontrol; 00202 all.clear(); 00203 return true; 00204 } 00205 00206 else { 00207 cout <<".\nTERRIBLE !\n"; 00208 errorout("The new algorithm has different results. \nPlease write to cpp__at__AndreasKrueger__dot__de\n"); 00209 cout<<"cuts="<<cuts<<endl; 00210 00211 delete [] scatter, copy, histogram, histogramcontrol; 00212 all.clear(); 00213 return false; 00214 } 00215 } |
|
Definition at line 220 of file counters.h. References choose_optimal_cuts(), COUNTER, divide_count_and_analyze(), exit_out_of_memory(), give_short_timestamp(), GRIDSIZE, LONGBITS, analyze::mean_without_lr_spanningcls(), NUMBER, REAL, set_clusternumber(), set_radius(), and spanning_dirs_and_clusters(). Referenced by ff::is_the_biggestcluster_bigger_than_a_ratio(), ff::is_the_incl_meancluster_bigger_than_a_ratio(), ff::is_the_numberofcl_smaller_than_a_ratio(), ff::is_there_a_spanning_cluster(), ff::is_there_only_one_cluster(), and throw_dnc_count_analyze_step().
00222 { 00223 COUNTER cuts=choose_optimal_cuts(dim,N, radius); 00224 00225 cluson *clusters=new cluson[N+1]; 00226 if (clusters==NULL) exit_out_of_memory("radiusstep(...): cluson *clusters"); 00227 00228 NUMBER numberof_cl; NUMBER biggestcl; REAL mean_clsz; REAL mean_clsz_without_spcls; 00229 LONGBITS spcl_dirs; NUMLIST L_spanningclusters; L_spanningclusters.clear(); 00230 00231 clock_t time_start=clock(); 00232 set_radius(spheres, 1,N,radius); 00233 set_clusternumber(spheres,1,N,0); 00234 numberof_cl=divide_count_and_analyze(spheres, L_sph_numbers, cuts, clusters, biggestcl, mean_clsz); 00235 clcount_time=(clock()-time_start); 00236 00237 clock_t time_spsearch_start=clock(); 00238 spcl_dirs=spanning_dirs_and_clusters(spheres, L_sph_numbers, 0, GRIDSIZE, radius, dim, 00239 clusters, L_spanningclusters); 00240 mean_clsz_without_spcls= mean_without_lr_spanningcls(mean_clsz, N, clusters, 00241 L_spanningclusters, spcl_dirs); 00242 00243 spclsearch_time=(clock()-time_spsearch_start); 00244 string counttime=give_short_timestamp(); 00245 00246 delete[] clusters; 00247 return one_result(spcl_dirs, numberof_cl, biggestcl, mean_clsz, mean_clsz_without_spcls, 00248 clcount_time + spclsearch_time, throwtime, counttime); 00249 } |
|
Definition at line 74 of file counters.h. References copy_array(), naive_count_and_analyze(), NUMBER, quicksort1(), and REAL. Referenced by starters::into_file(), starters::into_file2(), starters::into_screen(), and reference_test().
00081 { 00082 00083 // returns these results: 00084 // the biggest cluster is of size: << biggestcl 00085 // each sphere is on average part of a cluster of size << averagecl 00086 // the most frequent cluster is of size: << mostfreqcl 00087 // the detailed size-distribution is in << histo[...] 00088 00089 clock_t time=clock(); 00090 00091 copy_array(spheres,copy,1,last); // store it before sorting 00092 quicksort1 (spheres,1,last); // sort by length 00093 naive_count_and_analyze(spheres, first, last, histo, biggestcl, averagecl); 00094 copy_array(copy,spheres,1,last); // copy it back 00095 00096 return (clock()-time); 00097 } |
|
Definition at line 755 of file divide_and_conquer.h. References choose_optimal_cuts(), COUNTER, and REAL.
00755 { 00756 cout<<"type in dim, N"<<endl; 00757 int dim; COUNTER N; 00758 cin>>dim>>N; 00759 REAL R=0; 00760 while (R!=-1){ 00761 cout <<"\ntype in R (-1 for end)"; 00762 cin>>R; 00763 cout <<choose_optimal_cuts(dim, N, R); 00764 } 00765 } |
|
Definition at line 253 of file counters.h. References getdim(), give_short_timestamp(), NUMBER, REAL, setR_count_analyze_step(), and throw_spheres(). Referenced by starters::into_file8_pt1().
00255 { 00256 NUMBER N=L_sph_numbers.size(); 00257 int dim=getdim(spheres[L_sph_numbers.front()]); 00258 00259 throw_spheres(spheres, 1, N); 00260 string throwtime=give_short_timestamp(); 00261 00262 return setR_count_analyze_step(N,dim, spheres, L_sph_numbers, radius, 00263 throwtime, clcount_time, spclsearch_time); 00264 } |
Diploma Thesis Sourcecode
Documentation check out the text and the executable binaries |