ICEACE Model: Closed Economy  1.0.0
Design Documentation of ICEACE Model
 All Data Structures Files Functions Variables Typedefs Macros Pages
partitioning.c
Go to the documentation of this file.
1 
6 #include "header.h"
7 #include "low_primes.h"
8 
12 static int factors[30];
13 
17 static int powers[30];
18 
24 static int nfactor=0;
25 
38 static void collect_factors( long fact, long power )
39 {
40  factors[nfactor]=fact;
41  powers[nfactor]=power;
42  nfactor+=1;
43 }
44 
58 static int test_fact( long* numP, long fact )
59 {
60  long power, t;
61 
62  power = 0;
63  while ( ( t = *numP / fact ) * fact == *numP )
64  {
65  ++power;
66  *numP = t;
67  }
68 
69  if ( power != 0 )
70  collect_factors( fact, power );
71 
72  if ( t > fact )
73  return 1;
74 
75  return 0;
76 }
77 
87 static void factor( long num )
88 {
89  int p;
90  long lnum, fact;
91 
92  lnum = num;
93 
94  if ( lnum == 0 || lnum == 1 ) {
95  /* If it's a simple factorisation */
96  collect_factors( lnum, 1 );
97  }
98  else {
99  /* Loop over the lower prime numbers till we have the factors.*/
100  for ( p = 0; p < (int)(sizeof(low_primes)/sizeof(*low_primes)); ++p )
101  if ( ! test_fact( &lnum, low_primes[p] ) ) goto done;
102  /* If we didn't find any factors generate some more on the fly. */
103  fact = ( low_primes[p - 1] + 5 ) / 6 * 6 - 1;
104  for ( ; ; )
105  {
106  if ( ! test_fact( &lnum, fact ) )
107  break;
108  fact += 2;
109  if ( ! test_fact( &lnum, fact ) )
110  break;
111  fact += 4;
112  }
113  done:
114  if ( lnum != 1 )
115  collect_factors( lnum, 1 );
116  }
117 }
118 
119 
129 void generate_partitions(double cloud_data[], int partitions, int partition_method)
130 {
131  int geometric = 1;
132  int other = 2;
133 
134  int xdiv=1,ydiv=1;
135  int i,j,id;
136  double xmax=0,xmin=0,ymax=0,ymin=0;
137  double dx,dy,px,py;
138  /* Limits in x and y of partition to be created */
139  double xlo, xhi, ylo, yhi;
140  double margin=0.25; /* small extension of region */
141 
142  /* factor number of partitions */
143  factor((long) partitions);
144 
145  /* build divisions for x and y axes */
146 
147  for ( i=nfactor-1; i >= 0; --i){
148  /* printf("%d : %d \n",factors[i],powers[i]);*/
149  for( j=1; j <=powers[i] ; ++j){
150  if(xdiv<=ydiv) {
151  xdiv=xdiv*factors[i];
152  }
153  else {
154  ydiv=ydiv*factors[i];
155  }
156  }
157  }
158 
159  printf("xdiv=%d ydiv=%d\n",xdiv,ydiv);
160 
161 
162 
163 /* Geometric partitioning */
164 
165  if(partition_method==geometric){
166 
167  xmax=cloud_data[1]; /*+SPINF;*/
168  xmin=cloud_data[0]; /*-SPINF;*/
169  ymax=cloud_data[3]; /*+SPINF;*/
170  ymin=cloud_data[2]; /*-SPINF;*/
171  }
172  else if(partition_method==other){
173 
174  dx=1.0;
175  dy=1.0;
176  xmax=dx;
177  xmin=0.0;
178  ymax=dy;
179  ymin=0.0;
180  margin=0.0;
181  }
182 
183  /* defined agent cloud with small margin */
184  xmax+=fabs(xmax)*margin;
185  xmin-=fabs(xmin)*margin;
186  ymax+=fabs(ymax)*margin;
187  ymin-=fabs(ymin)*margin;
188 
189  /* calculate increments */
190 
191  dx=(xmax-xmin)/(xdiv);
192  dy=(ymax-ymin)/(ydiv);
193  /* generate partitions */
194 
195  /* current = *node_list; */
196  id=0;
197  px=xmin;
198  for (i=0; i < xdiv; ++i){
199  py=ymin;
200  for (j=0; j < ydiv; ++j){
201  xlo = px;
202  xhi = px+dx;
203  ylo = py;
204  yhi = py+dy;
205  if(partition_method==geometric){
206  if (xlo <= xmin+0.01) xlo = -SPINF;
207  if (xhi >= xmax-0.01) xhi = SPINF;
208  if (ylo <= ymin+0.01) ylo = -SPINF;
209  if (yhi >= ymax-0.01) yhi = SPINF;
210  }
211  else {
212  /*
213  if (xlo <= xmin) xlo = -domain_size;
214  if (xhi >= xmax) xhi = domain_size;
215  if (ylo <= ymin) ylo = -domain_size;
216  if (yhi >= ymax) yhi = domain_size;
217  */
218  }
219 
220  printf("Partition %d: %f, %f, %f, %f\n",
221  id,xlo,xhi,ylo,yhi);
222 
223 
224  add_node(id++,xlo,xhi,ylo,yhi,-SPINF,SPINF);
225  py=py+dy;
226  }
227  px=px+dx;
228  }
229 /* } */
230 /* else if(partition_method == other){*/
231 /* Round robin partitions */
232 /* id=0;
233  xlo=0.0;
234  xhi=0.0;
235  ylo=0.0;
236  yhi=0.0;
237  for(i=0;i<partitions;++i){
238  add_node(id++,xlo,xhi,ylo,yhi,-SPINF,SPINF);
239  }
240  }*/
241 }
242 
243 
256 void partition_data(int totalnodes, xmachine ** agent_list, double cloud_data[], int partition_method)
257 {
258 
259 }
260 
261 
262 
263 
270 {
271  FILE *file;
272  char data[100];
273  node_information *node_info;
274 
275  sprintf(data, "%sspace_partitions.xml", outputpath);
276  file = fopen(data, "w");
277  fputs("<spacepartitions>\n" , file);
278  fputs("<partitions>\n" , file);
279  fputs("<number>" , file);
280  sprintf(data, "%d", totalnodes);
281  fputs(data, file);
282  fputs("</number>\n" , file);
283  node_info = *p_node_info;
284  while(node_info) {
285  fputs("<node>\n" , file);
286  fputs("<nodeid>" , file);
287  sprintf(data, "%i", node_info->node_id);
288  fputs(data, file);
289  fputs("</nodeid>\n" , file);
290  fputs("<xmin>" , file);
291  if(node_info->partition_data[0] == SPINF) fputs("SPINF" , file);
292  else if(node_info->partition_data[0] == -SPINF) fputs("-SPINF" , file);
293  else{ sprintf(data, "%f", node_info->partition_data[0]); fputs(data, file); }
294  fputs("</xmin>\n" , file);
295  fputs("<xmax>" , file);
296  if(node_info->partition_data[1] == SPINF) fputs("SPINF" , file);
297  else if(node_info->partition_data[1] == -SPINF) fputs("-SPINF" , file);
298  else{ sprintf(data, "%f", node_info->partition_data[1]); fputs(data, file); }
299  fputs("</xmax>\n" , file);
300  fputs("<ymin>" , file);
301  if(node_info->partition_data[2] == SPINF) fputs("SPINF" , file);
302  else if(node_info->partition_data[2] == -SPINF) fputs("-SPINF" , file);
303  else{ sprintf(data, "%f", node_info->partition_data[2]); fputs(data, file); }
304  fputs("</ymin>\n" , file);
305  fputs("<ymax>" , file);
306  if(node_info->partition_data[3] == SPINF) fputs("SPINF" , file);
307  else if(node_info->partition_data[3] == -SPINF) fputs("-SPINF" , file);
308  else{ sprintf(data, "%f", node_info->partition_data[3]); fputs(data, file); }
309  fputs("</ymax>\n" , file);
310  fputs("<zmin>" , file);
311  if(node_info->partition_data[4] == SPINF) fputs("SPINF" , file);
312  else if(node_info->partition_data[4] == -SPINF) fputs("-SPINF" , file);
313  else{ sprintf(data, "%f", node_info->partition_data[4]); fputs(data, file); }
314  fputs("</zmin>\n" , file);
315  fputs("<zmax>" , file);
316  if(node_info->partition_data[5] == SPINF) fputs("SPINF" , file);
317  else if(node_info->partition_data[5] == -SPINF) fputs("-SPINF" , file);
318  else{ sprintf(data, "%f", node_info->partition_data[5]); fputs(data, file); }
319  fputs("</zmax>\n" , file);
320  fputs("</node>\n" , file);
321 
322  node_info = node_info->next;
323  }
324  fputs("</partitions>\n" , file);
325  fputs("</spacepartitions>" , file);
326  fclose(file);
327 
328 }
329 
330 
331