Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Putting it here in the meantime.
[simgrid.git] / tools / platform_generation / tiers_simgrid_remi.pl
1 #!/usr/bin/perl -w
2 use strict;
3
4 use AlvinMisc;
5 use graph_viz;
6 use graph_tbx;
7 use tiers;
8
9 my (%machine);
10 $machine{"canaria.ens-lyon.fr"}{"CPU_clock"} = "347.669";
11 $machine{"canaria.ens-lyon.fr"}{"CPU_Mflops"} = "34.333";
12 $machine{"canaria.ens-lyon.fr"}{"CPU_model"} = "Pentium II (Deschutes)";
13 $machine{"canaria.ens-lyon.fr"}{"CPU_num"} = "2";
14 $machine{"canaria.ens-lyon.fr"}{"Machine_type"} = "i686";
15 $machine{"canaria.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.19pre17";
16
17 $machine{"moby.ens-lyon.fr"}{"CPU_clock"} = "996.698";
18 $machine{"moby.ens-lyon.fr"}{"CPU_Mflops"} = "114.444";
19 $machine{"moby.ens-lyon.fr"}{"CPU_model"} = "Intel(R) Pentium(R) III Mobile CPU 1000MHz";
20 $machine{"moby.ens-lyon.fr"}{"CPU_num"} = "1";
21 $machine{"moby.ens-lyon.fr"}{"Machine_type"} = "i686";
22 $machine{"moby.ens-lyon.fr"}{"OS_version"} = "Linux 2.4.18-accelerated";
23
24 $machine{"popc0.ens-lyon.fr"}{"CPU_clock"} = "199.095";
25 $machine{"popc0.ens-lyon.fr"}{"CPU_Mflops"} = "22.151";
26 $machine{"popc0.ens-lyon.fr"}{"CPU_model"} = "Pentium Pro";
27 $machine{"popc0.ens-lyon.fr"}{"CPU_num"} = "1";
28 $machine{"popc0.ens-lyon.fr"}{"Machine_type"} = "i686";
29 $machine{"popc0.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.19";
30
31 $machine{"sci0.ens-lyon.fr"}{"CPU_clock"} = "451.032446";
32 $machine{"sci0.ens-lyon.fr"}{"CPU_Mflops"} = "48.492";
33 $machine{"sci0.ens-lyon.fr"}{"CPU_model"} = "Pentium II (Deschutes)";
34 $machine{"sci0.ens-lyon.fr"}{"CPU_num"} = "2";
35 $machine{"sci0.ens-lyon.fr"}{"Machine_type"} = "i686";
36 $machine{"sci0.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.13";
37
38 $machine{"lancelot.u-strasbg.fr"}{"OS_version"} = "Linux 2.2.17-21mdk";
39 $machine{"lancelot.u-strasbg.fr"}{"CPU_clock"} = "400.916";
40 $machine{"lancelot.u-strasbg.fr"}{"CPU_model"} = "Celeron (Mendocino)";
41 $machine{"lancelot.u-strasbg.fr"}{"CPU_Mflops"} = "42.917000000000002";
42 $machine{"lancelot.u-strasbg.fr"}{"Machine_type"} = "i686";
43 $machine{"lancelot.u-strasbg.fr"}{"CPU_num"} = "1";
44
45 $machine{"caseb.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.8-26mdk";
46 $machine{"caseb.u-strasbg.fr"}{"CPU_clock"} = "1399.763";
47 $machine{"caseb.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) 4 Processor";
48 $machine{"caseb.u-strasbg.fr"}{"CPU_Mflops"} = "137.333";
49 $machine{"caseb.u-strasbg.fr"}{"Machine_type"} = "i686";
50 $machine{"caseb.u-strasbg.fr"}{"CPU_num"} = "1";
51
52 $machine{"pellinore.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-6mdksmp";
53 $machine{"pellinore.u-strasbg.fr"}{"CPU_clock"} = "802.922";
54 $machine{"pellinore.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
55 $machine{"pellinore.u-strasbg.fr"}{"CPU_Mflops"} = "68.667000000000002";
56 $machine{"pellinore.u-strasbg.fr"}{"Machine_type"} = "i686";
57 $machine{"pellinore.u-strasbg.fr"}{"CPU_num"} = "2";
58
59 $machine{"dinadan.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.19-686";
60 $machine{"dinadan.u-strasbg.fr"}{"CPU_clock"} = "933.375";
61 $machine{"dinadan.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
62 $machine{"dinadan.u-strasbg.fr"}{"CPU_Mflops"} = "85.832999999999998";
63 $machine{"dinadan.u-strasbg.fr"}{"Machine_type"} = "i686";
64 $machine{"dinadan.u-strasbg.fr"}{"CPU_num"} = "1";
65
66 $machine{"darjeeling.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-5";
67 $machine{"darjeeling.u-strasbg.fr"}{"CPU_clock"} = "1793.371";
68 $machine{"darjeeling.u-strasbg.fr"}{"CPU_model"} = "Intel(R) Pentium(R) 4 CPU 1.80GHz";
69 $machine{"darjeeling.u-strasbg.fr"}{"CPU_Mflops"} = "98.094999999999999";
70 $machine{"darjeeling.u-strasbg.fr"}{"Machine_type"} = "i686";
71 $machine{"darjeeling.u-strasbg.fr"}{"CPU_num"} = "1";
72
73 $machine{"gauvain.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.17";
74 $machine{"gauvain.u-strasbg.fr"}{"CPU_clock"} = "1050.034";
75 $machine{"gauvain.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) Processor";
76 $machine{"gauvain.u-strasbg.fr"}{"CPU_Mflops"} = "114.444";
77 $machine{"gauvain.u-strasbg.fr"}{"Machine_type"} = "i686";
78 $machine{"gauvain.u-strasbg.fr"}{"CPU_num"} = "1";
79
80 $machine{"sekhmet.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-k7";
81 $machine{"sekhmet.u-strasbg.fr"}{"CPU_clock"} = "1399.803";
82 $machine{"sekhmet.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) 4 Processor";
83 $machine{"sekhmet.u-strasbg.fr"}{"CPU_Mflops"} = "171.667";
84 $machine{"sekhmet.u-strasbg.fr"}{"Machine_type"} = "i686";
85 $machine{"sekhmet.u-strasbg.fr"}{"CPU_num"} = "1";
86
87 $machine{"shaitan.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-6mdk";
88 $machine{"shaitan.u-strasbg.fr"}{"CPU_clock"} = "800.030";
89 $machine{"shaitan.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
90 $machine{"shaitan.u-strasbg.fr"}{"CPU_Mflops"} = "76.296000000000006";
91 $machine{"shaitan.u-strasbg.fr"}{"Machine_type"} = "i686";
92 $machine{"shaitan.u-strasbg.fr"}{"CPU_num"} = "1";
93
94 my (%network);
95 #0.587500,0.655,0.681
96
97 $network{"bw"}{10} = [ [274285,0.514433], [330233,0.059904],
98                 [949460,0.136931], [1063823,0.131098],
99                 [2041829,7.413073] ];
100
101 $network{"bw"}{100} = [ [64121,35.076518], [65264,0.270544],
102                 [67418,0.156056], [80797,0.479780], [82517,6.932556],
103                 [92951,0.189980], [94763,0.370788],
104                 [123015,35.083019], [171318,295.890617],
105                 [223570,0.278066], [274285,0.514433],
106                 [330233,0.059904] ];
107
108 $network{"bw"}{1000} = [ [937,53.930106], [2013,4.455826],
109                 [2022,5.704550], [2025,5.652577], [2073,4.460898],
110                 [2179,5.922616], [2195,4.669142], [2321,4.522355],
111                 [2327,4.477270], [2427,4.062241], [2539,4.583831],
112                 [3777,5.161451], [4448,3.101854], [4629,5.473705],
113                 [4840,87.981858], [5773,0.006406], [6150,8.762440],
114                 [7413,0.601375], [7837,0.424305], [7867,2.885584],
115                 [7924,1.742977], [8394,9.647856], [9015,0.287840],
116                 [9612,0.468130], [9842,1.502106], [10069,1.340162],
117                 [10255,6.104672], [10609,1.402769], [11014,0.449267],
118                 [11724,0.863872], [11741,0.869727], [11753,1.114548],
119                 [12100,1.200141], [12122,0.844683], [12513,0.788956],
120                 [13022,0.278175], [14341,7.877863], [14864,0.820952],
121                 [15084,0.950938], [15111,1.081287], [15141,0.162735],
122                 [15449,0.951830], [15797,0.380044], [15868,0.848211],
123                 [17433,0.320114], [17819,0.907120], [17906,1.043314],
124                 [18382,1.087968], [18788,0.259761], [18944,9.547561],
125                 [20667,0.410463], [20864,0.637001], [22546,0.247605],
126                 [24227,0.677908], [24547,0.040300], [25404,0.472524],
127                 [26205,0.658142], [26382,0.595883], [26970,0.666676],
128                 [27441,0.536941], [28416,3.870785], [29714,3.866813],
129                 [31020,0.863123], [31452,1.913591], [31964,0.678645],
130                 [33067,9.693542], [33378,0.728103], [34162,0.672289],
131                 [34363,0.539000], [35178,0.677601], [35333,0.019773],
132                 [35689,0.106949], [35881,0.126045], [37202,0.705967],
133                 [37438,0.848712], [38536,0.117352], [38723,0.751810],
134                 [39826,7.164412], [41518,0.630529], [41827,0.039417],
135                 [42392,0.520693], [43729,0.272268], [44597,0.227430],
136                 [45776,0.789218], [46068,4.760145], [46531,0.164758],
137                 [52408,0.522878], [54216,0.533340], [57678,1.461517],
138                 [60272,0.125428] ];
139
140 sub assign_host_speed{
141     my($nodes,$edges) = @_;
142
143     my($u);
144
145     my(@label_list) = keys %machine;
146     foreach $u (keys %$nodes) {
147         my($mach_type_nb) = scalar(@label_list);
148         my($mach_type) = int rand($mach_type_nb);
149         $$nodes{$u}{Mflops} = $machine{$label_list[$mach_type]}{CPU_Mflops};
150     }
151 }
152
153 sub assign_host_names{
154     my($nodes,$edges) = @_;
155
156     my(@name_list) = qw(Abbott Adoncourt Aikin Alain Alfred Amadeus
157                         Angie Anjou Anne_Marie Apple April Archibald
158                         Aubertin Auclair Audy AutoCAD Barry BASIC
159                         Beaudoin Beaulac Bellemarre Bellevue
160                         Bell_Northern Benoit Bentz Bernard Bescherelle
161                         Blais Boily Boivin Borduas Boston Boucherville
162                         Bourassa Bousquet Boyer Brian Brosseau Brown
163                         Browne Cadieux Cambridge Canada Carole
164                         Casavant Chambly Charles Charron Christian
165                         Claude Cloutier Colin Comeau Corp Coulombe
166                         Cousineau Croteau Daniel Decelles Denis Denise
167                         Desjardins Dick Dionne Disney Dodge Domey
168                         Dominique Doris Dorval Doyon Drouin Dumoulin
169                         EDF Emacs Ethernet Europe Fafard Fernand
170                         Fernet Flamand Florient Foisy Forget Fourier
171                         FrameMaker France Francine Frank Fraser
172                         Freedman Gagnon Gaston Gatien Gaudreault
173                         Gauthier Gavrel Gendron Gentilly Geoff
174                         Geoffray George Georges Gilles Ginette Girard
175                         Goodwin Gordon Gosselin Gratton Greg Gregory
176                         Guy Harry Harwell Hayward Hollerbach Horne
177                         Houde Hubert Hz Inc Inmos Intel Interleaf
178                         Internet iRMX iRMXII iRMXIII Isabelle ISPELL
179                         Jackson Jacobsen Jacquelin Jacques
180                         Jacques_Cartier Jamie Jean Jean_Claude
181                         Jean_Louis Jean_Maurice Jeannine Jean_Paul
182                         Jean_Pierre Jean_Yves Jill Jobin Jocelyne John
183                         Jones Joynes Jude Julian Julien Juneau Jupiter
184                         Kansas Kent Khan King Kuenning kV Lachapelle
185                         Laflamme Lafontaine Lamothe Lapointe Laroche
186                         LaSalle LaTeX Laugier Laurendeau Laval Lavoie
187                         Leblanc Lecavalier Leclerc Lepage Lessard
188                         Letarte Linda LISP Longueuil Louis Louise
189                         Louis_Marc Ltd Lucie Mahoney Maltais Manseau
190                         Marc Marcel Marcoux Marie Marielle Mark
191                         Marseille Martin Masson Mathematica Matlab
192                         McGee McGill Messier METAFONT Michel Mike
193                         Minneapolis Mireille Mongenot Monique
194                         Mont_Tremblant Morin Morissette Moshe Mulhouse
195                         mW Nagle Nelligan Nestor Nicole OHara Olivier
196                         Ontario Ottawa Ouellet Owen Ozias Papineau
197                         Paul Pellan Pelletier PERL Phaneuf Phil Pierre
198                         Pierrefonds Plante Pointe_Claire PostScript
199                         Poussart Pronovost Provost Raymond Re README
200                         Renato Ricard Richard Ringuet Riopelle Rioux
201                         Roberge Robert Rochefort Roger Romano Ronald
202                         Roy Rubin Sacramento Saint_Amand Sainte_Foy
203                         Sainte_Julie Saint_Marc_sur_Richelieu Seattle
204                         Shawinigan Sherbrooke Sirois Smith Sorel Soucy
205                         SPARC SPARCs SPICE St_Antoine St_Bruno
206                         Ste_Anne Steele Ste_Julie Stephen St_Jacques
207                         St_Jean St_Paul Strasbourg Sun SunOS Suzanne
208                         Tanguay Tessier TeX Texas Thibault Thierry
209                         Todd Tokyo Toronto Toulouse Tremblay Turcotte
210                         Uintas UniPress Unix UNIX Utah Vancouver
211                         Varennes Verville Victoria Victoriaville Viger
212                         Vincent VxWorks Wilfrid William Williams
213                         Wright Yolande Yvan Yves Zawinski);
214
215     AlvinMisc::melange(\@name_list);
216
217     my($u);
218     foreach $u (keys %$nodes) {
219         if($$nodes{$u}{host}==1) {
220             $$nodes{$u}{name} = shift @name_list;
221         }
222     }
223 }
224
225 sub assign_link_speed{
226     my($nodes,$edges) = @_;
227
228     my($e);
229
230     foreach $e (keys %$edges) {
231         my($bw) = $$edges{$e}{bw};
232
233         my(@choice) = @{$network{"bw"}{$bw}};
234         my($choice_nb) = scalar(@choice);
235         my($chosen_link) = $choice[(int rand($choice_nb))];
236         $$edges{$e}{bw} = $$chosen_link[0]/8000;
237         $$edges{$e}{delay} = $$chosen_link[1];
238     }
239 }
240
241
242 sub affiche_graph{
243     my($nodes,$edges,$filename) = @_;
244     my($u,$v,$w,$e);
245     
246     my(%node_to_export);
247     my(%edge_to_export);
248
249     my(@host_list,@routeur_list,@link_list);
250
251     foreach $u (keys %{$nodes}) {
252         if (!((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1))) { next; }
253         if (!((defined($$nodes{$u}{Mflops}))&&($$nodes{$u}{host}==1))) { 
254             die "Lacking Mflops for $u\n"; 
255         }
256         push @host_list,$u;
257         $node_to_export{$u}=$#host_list;
258     }
259
260     foreach $u (@host_list){
261         foreach $v (@host_list){
262             if($u ne $v) {
263                 $w = $u;
264                 if(!defined($node_to_export{$w})) {
265                     push @routeur_list,$w;
266                     $node_to_export{$w}=$#host_list + $#routeur_list + 1;
267                 }
268                 while ($w ne $v) {
269                     my($next) = $$nodes{$w}{shortest_route}{$v};
270                     my($e) = $$nodes{$w}{out}{$next};
271                     if(!defined($edge_to_export{$e})) {
272                         push @link_list,$e;
273                         $edge_to_export{$e}=$#link_list;
274                     }
275                     $w = $next;
276                     if(!defined($node_to_export{$w})) {
277                         push @routeur_list,$w;
278                         $node_to_export{$w}=$#host_list + $#routeur_list + 1;
279                     }
280                 }
281             }
282         }
283     }
284
285     open VIZ, "> $filename.dot";
286     print VIZ "graph essai  { \n";
287     print VIZ "  graph [overlap=scale]\n";
288     #print VIZ "  graph [overlap=false spline=true]\n";
289     print VIZ "  node [shape=box, style=filled]\n";
290     print VIZ "  node [width=.3, height=.3, style=filled]\n";
291
292     foreach $u (@host_list) {
293         print VIZ "  \"$u\" [label=\"$$nodes{$u}{name}\",color=red,shape=box];\n";
294     }
295     foreach $u (@routeur_list) {
296             print VIZ "  \"$u\" [label=\"$$nodes{$u}{name}\",fontsize=2,color=skyblue,shape=circle];\n";
297     }
298     foreach $e (@link_list) {
299         my($src)=$$edges{$e}{src};
300         my($dst)=$$edges{$e}{dst};
301         (defined($$edges{$e}{bw})) or die "Lacking bw for $u\n"; 
302         (defined($$edges{$e}{delay})) or die "Lacking bw for $u\n"; 
303         print VIZ "  \"$src\" -- \"$dst\";\n";
304     }
305
306     print VIZ "}\n";
307     close VIZ;
308
309     system("neato -Tps $filename.dot  > $filename.ps");
310 #    system("gv $filename.ps");
311     system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null");
312 #    system("xfig -startg 0 $filename.fig ");
313 }
314
315 sub build_lat_matrix {
316     my($nodes,$edges) = @_;
317     my($u,$v,$w,$e);
318     my(@host_list)=();
319     my($matrix);
320     foreach $u (keys %{$nodes}) {
321         if (!((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1))) { next; }
322         push @host_list,$u;
323     }
324
325     foreach $u (@host_list){
326         foreach $v (@host_list){
327             $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}=0;
328             if($u ne $v) {
329                 $w = $u;
330                 while ($w ne $v) {
331                     my($next) = $$nodes{$w}{shortest_route}{$v};
332                     $e = $$nodes{$w}{out}{$next};
333                     $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}+=$$edges{$e}{delay};
334                     $w = $next;
335                 }
336             }
337             print STDERR "$$nodes{$u}{name} -> $$nodes{$v}{name} : $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}\n";
338         }
339     }
340     return $matrix;
341 }
342
343 sub cluster_matrix {
344     my($matrix)=@_;
345     my($nodes,$edges) = G_new_graph();
346
347     my(@host_list)=keys %$matrix;
348
349     my($root);
350     my($u,$v);
351     my($min,$min_u,$min_v);
352     my(%taken);
353     foreach $u (@host_list){
354         G_new_node($nodes,$edges,$u);
355     }
356     
357     $root=$host_list[0];
358     $taken{$root} = 1;
359
360     while(scalar(keys %taken) != scalar(@host_list)) {
361         $min = 10000000000000;
362         foreach $u (keys %taken) {
363             foreach $v (@host_list) {
364                 if(!$taken{$v}) {
365                     if($u ne $v) {
366                         if($$matrix{$u}{$v}<$min) {
367                             $min=$$matrix{$u}{$v};
368                             $min_u=$u;
369                             $min_v=$v;
370                         }
371                     }
372                 }
373             }
374         }
375         $taken{$min_u} = $taken{$min_v} = 1;
376         G_connect($nodes,$edges,$min_u,$min_v);
377         print STDERR "Connecting $min_u and $min_v\n"
378     }
379     return ($nodes,$edges,$root);
380 }
381
382 sub PP {
383     my($nodes, $edges, $taken, $root) = @_;
384     my($u);
385     my(@tab) = ();
386     push @tab, $root;
387     foreach $u (keys (%{$$nodes{$root}{out}})) {
388         if($$taken{$u}) { next;}
389         $$taken{$u}=1;
390         push(@tab,PP($nodes,$edges, $taken, $u));
391     }
392     return \@tab;
393 }
394
395 sub create_orientation {
396     my($nodes,$edges,$root) = @_;
397     my(%taken);
398
399     $taken{$root} = 1;
400     
401     return PP($nodes,$edges, \%taken,$root);
402 }
403
404 sub dump_orientation {
405    my($nodes,$edges, $tab) = @_;
406    my($u,$father);
407    my($root) = shift @$tab;
408
409    print DEPLOYMENT '  <process host="'.$$nodes{$root}{name}.'" function="msma_agent">'."\n";
410    print DEPLOYMENT '     <argument value="blabla"/>     <!-- policy -->'."\n";
411
412    {  # Need to find my father...
413        my(@sons) = ();
414        my(@neighboors) = keys %{$$nodes{$root}{in}};
415
416        $father = -1;
417
418        foreach $u (@$tab) {
419            push @sons,$$u[0];
420        }
421        @sons = sort @sons;
422        @neighboors = sort @neighboors;
423
424        if($#sons != $#neighboors) {
425            $u = 0;
426            while(defined($sons[$u])&&($sons[$u] eq $neighboors[$u])) {
427                $u++;
428            }
429            $father = $neighboors[$u];
430        }
431    }
432
433    if($father ne -1) {
434        print DEPLOYMENT "     <argument value=\"$$nodes{$root}{name}\"/>  <!-- father -->\n";
435    } else {
436        print DEPLOYMENT '     <argument value=""/>  <!-- father -->'."  <!-- I am the master -->\n";
437    }
438
439
440    foreach $u (@$tab) {
441        print DEPLOYMENT "     <argument value=\"$$nodes{$$u[0]}{name}\"/>\n";
442    }
443    print DEPLOYMENT "  </process>\n";
444    foreach $u (@$tab) {
445        dump_orientation($nodes, $edges, $u);
446    }
447
448    unshift @$tab, $root;
449 }
450
451 sub main {
452     my($nodes,$edges,$interferences,$host_list,$count_interferences);
453
454     $#ARGV>=0 or die "Need a tiers file!";
455     my($filename)=$ARGV[0];
456     $filename =~ s/\.[^\.]*$//g;
457     if(1) {
458         print STDERR "Reading graph\n";
459         ($nodes,$edges) = parse_tiers_file $ARGV[0];
460
461         print STDERR "Generating host list\n";
462         $host_list = generate_host_list($nodes,$edges,.7);
463         assign_host_speed($nodes,$edges);
464         assign_link_speed($nodes,$edges);
465         assign_host_names($nodes,$edges);
466         print STDERR "Computing Shortest Paths \n";
467         shortest_paths($nodes,$edges);
468         print STDERR "Exporting to surfxml\n";
469         G_surfxml_export($nodes,$edges,"$filename.xml");
470         print STDERR "Calling graphviz\n";
471         affiche_graph($nodes,$edges,"$filename");
472         print STDERR "Getting Latency Matrix\n";
473         my($matrix)=build_lat_matrix($nodes,$edges);
474         print STDERR "Clustering on Latency\n";
475         my($n_nodes,$n_edges,$root)=cluster_matrix($matrix);
476         print STDERR "Creating Orientation\n";
477         my($orientation) = create_orientation($n_nodes,$n_edges,$root);
478         print STDERR "Exporting deployment\n";
479         open DEPLOYMENT, "> $ARGV[0]_deployment.xml";
480         dump_orientation($n_nodes,$n_edges, $orientation);
481         close DEPLOYMENT;
482     }
483 }
484
485 main;