--- /dev/null
+#!/usr/bin/perl -w
+use strict;
+
+use AlvinMisc;
+use graph_viz;
+use graph_tbx;
+use tiers;
+
+my (%machine);
+$machine{"canaria.ens-lyon.fr"}{"CPU_clock"} = "347.669";
+$machine{"canaria.ens-lyon.fr"}{"CPU_Mflops"} = "34.333";
+$machine{"canaria.ens-lyon.fr"}{"CPU_model"} = "Pentium II (Deschutes)";
+$machine{"canaria.ens-lyon.fr"}{"CPU_num"} = "2";
+$machine{"canaria.ens-lyon.fr"}{"Machine_type"} = "i686";
+$machine{"canaria.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.19pre17";
+
+$machine{"moby.ens-lyon.fr"}{"CPU_clock"} = "996.698";
+$machine{"moby.ens-lyon.fr"}{"CPU_Mflops"} = "114.444";
+$machine{"moby.ens-lyon.fr"}{"CPU_model"} = "Intel(R) Pentium(R) III Mobile CPU 1000MHz";
+$machine{"moby.ens-lyon.fr"}{"CPU_num"} = "1";
+$machine{"moby.ens-lyon.fr"}{"Machine_type"} = "i686";
+$machine{"moby.ens-lyon.fr"}{"OS_version"} = "Linux 2.4.18-accelerated";
+
+$machine{"popc0.ens-lyon.fr"}{"CPU_clock"} = "199.095";
+$machine{"popc0.ens-lyon.fr"}{"CPU_Mflops"} = "22.151";
+$machine{"popc0.ens-lyon.fr"}{"CPU_model"} = "Pentium Pro";
+$machine{"popc0.ens-lyon.fr"}{"CPU_num"} = "1";
+$machine{"popc0.ens-lyon.fr"}{"Machine_type"} = "i686";
+$machine{"popc0.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.19";
+
+$machine{"sci0.ens-lyon.fr"}{"CPU_clock"} = "451.032446";
+$machine{"sci0.ens-lyon.fr"}{"CPU_Mflops"} = "48.492";
+$machine{"sci0.ens-lyon.fr"}{"CPU_model"} = "Pentium II (Deschutes)";
+$machine{"sci0.ens-lyon.fr"}{"CPU_num"} = "2";
+$machine{"sci0.ens-lyon.fr"}{"Machine_type"} = "i686";
+$machine{"sci0.ens-lyon.fr"}{"OS_version"} = "Linux 2.2.13";
+
+$machine{"lancelot.u-strasbg.fr"}{"OS_version"} = "Linux 2.2.17-21mdk";
+$machine{"lancelot.u-strasbg.fr"}{"CPU_clock"} = "400.916";
+$machine{"lancelot.u-strasbg.fr"}{"CPU_model"} = "Celeron (Mendocino)";
+$machine{"lancelot.u-strasbg.fr"}{"CPU_Mflops"} = "42.917000000000002";
+$machine{"lancelot.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"lancelot.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"caseb.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.8-26mdk";
+$machine{"caseb.u-strasbg.fr"}{"CPU_clock"} = "1399.763";
+$machine{"caseb.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) 4 Processor";
+$machine{"caseb.u-strasbg.fr"}{"CPU_Mflops"} = "137.333";
+$machine{"caseb.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"caseb.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"pellinore.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-6mdksmp";
+$machine{"pellinore.u-strasbg.fr"}{"CPU_clock"} = "802.922";
+$machine{"pellinore.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
+$machine{"pellinore.u-strasbg.fr"}{"CPU_Mflops"} = "68.667000000000002";
+$machine{"pellinore.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"pellinore.u-strasbg.fr"}{"CPU_num"} = "2";
+
+$machine{"dinadan.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.19-686";
+$machine{"dinadan.u-strasbg.fr"}{"CPU_clock"} = "933.375";
+$machine{"dinadan.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
+$machine{"dinadan.u-strasbg.fr"}{"CPU_Mflops"} = "85.832999999999998";
+$machine{"dinadan.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"dinadan.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"darjeeling.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-5";
+$machine{"darjeeling.u-strasbg.fr"}{"CPU_clock"} = "1793.371";
+$machine{"darjeeling.u-strasbg.fr"}{"CPU_model"} = "Intel(R) Pentium(R) 4 CPU 1.80GHz";
+$machine{"darjeeling.u-strasbg.fr"}{"CPU_Mflops"} = "98.094999999999999";
+$machine{"darjeeling.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"darjeeling.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"gauvain.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.17";
+$machine{"gauvain.u-strasbg.fr"}{"CPU_clock"} = "1050.034";
+$machine{"gauvain.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) Processor";
+$machine{"gauvain.u-strasbg.fr"}{"CPU_Mflops"} = "114.444";
+$machine{"gauvain.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"gauvain.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"sekhmet.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-k7";
+$machine{"sekhmet.u-strasbg.fr"}{"CPU_clock"} = "1399.803";
+$machine{"sekhmet.u-strasbg.fr"}{"CPU_model"} = "AMD Athlon(tm) 4 Processor";
+$machine{"sekhmet.u-strasbg.fr"}{"CPU_Mflops"} = "171.667";
+$machine{"sekhmet.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"sekhmet.u-strasbg.fr"}{"CPU_num"} = "1";
+
+$machine{"shaitan.u-strasbg.fr"}{"OS_version"} = "Linux 2.4.18-6mdk";
+$machine{"shaitan.u-strasbg.fr"}{"CPU_clock"} = "800.030";
+$machine{"shaitan.u-strasbg.fr"}{"CPU_model"} = "Pentium III (Coppermine)";
+$machine{"shaitan.u-strasbg.fr"}{"CPU_Mflops"} = "76.296000000000006";
+$machine{"shaitan.u-strasbg.fr"}{"Machine_type"} = "i686";
+$machine{"shaitan.u-strasbg.fr"}{"CPU_num"} = "1";
+
+my (%network);
+#0.587500,0.655,0.681
+
+$network{"bw"}{10} = [ [274285,0.514433], [330233,0.059904],
+ [949460,0.136931], [1063823,0.131098],
+ [2041829,7.413073] ];
+
+$network{"bw"}{100} = [ [64121,35.076518], [65264,0.270544],
+ [67418,0.156056], [80797,0.479780], [82517,6.932556],
+ [92951,0.189980], [94763,0.370788],
+ [123015,35.083019], [171318,295.890617],
+ [223570,0.278066], [274285,0.514433],
+ [330233,0.059904] ];
+
+$network{"bw"}{1000} = [ [937,53.930106], [2013,4.455826],
+ [2022,5.704550], [2025,5.652577], [2073,4.460898],
+ [2179,5.922616], [2195,4.669142], [2321,4.522355],
+ [2327,4.477270], [2427,4.062241], [2539,4.583831],
+ [3777,5.161451], [4448,3.101854], [4629,5.473705],
+ [4840,87.981858], [5773,0.006406], [6150,8.762440],
+ [7413,0.601375], [7837,0.424305], [7867,2.885584],
+ [7924,1.742977], [8394,9.647856], [9015,0.287840],
+ [9612,0.468130], [9842,1.502106], [10069,1.340162],
+ [10255,6.104672], [10609,1.402769], [11014,0.449267],
+ [11724,0.863872], [11741,0.869727], [11753,1.114548],
+ [12100,1.200141], [12122,0.844683], [12513,0.788956],
+ [13022,0.278175], [14341,7.877863], [14864,0.820952],
+ [15084,0.950938], [15111,1.081287], [15141,0.162735],
+ [15449,0.951830], [15797,0.380044], [15868,0.848211],
+ [17433,0.320114], [17819,0.907120], [17906,1.043314],
+ [18382,1.087968], [18788,0.259761], [18944,9.547561],
+ [20667,0.410463], [20864,0.637001], [22546,0.247605],
+ [24227,0.677908], [24547,0.040300], [25404,0.472524],
+ [26205,0.658142], [26382,0.595883], [26970,0.666676],
+ [27441,0.536941], [28416,3.870785], [29714,3.866813],
+ [31020,0.863123], [31452,1.913591], [31964,0.678645],
+ [33067,9.693542], [33378,0.728103], [34162,0.672289],
+ [34363,0.539000], [35178,0.677601], [35333,0.019773],
+ [35689,0.106949], [35881,0.126045], [37202,0.705967],
+ [37438,0.848712], [38536,0.117352], [38723,0.751810],
+ [39826,7.164412], [41518,0.630529], [41827,0.039417],
+ [42392,0.520693], [43729,0.272268], [44597,0.227430],
+ [45776,0.789218], [46068,4.760145], [46531,0.164758],
+ [52408,0.522878], [54216,0.533340], [57678,1.461517],
+ [60272,0.125428] ];
+
+sub assign_host_speed{
+ my($nodes,$edges) = @_;
+
+ my($u);
+
+ my(@label_list) = keys %machine;
+ foreach $u (keys %$nodes) {
+ my($mach_type_nb) = scalar(@label_list);
+ my($mach_type) = int rand($mach_type_nb);
+ $$nodes{$u}{Mflops} = $machine{$label_list[$mach_type]}{CPU_Mflops};
+ }
+}
+
+sub assign_host_names{
+ my($nodes,$edges) = @_;
+
+ my(@name_list) = qw(Abbott Adoncourt Aikin Alain Alfred Amadeus
+ Angie Anjou Anne_Marie Apple April Archibald
+ Aubertin Auclair Audy AutoCAD Barry BASIC
+ Beaudoin Beaulac Bellemarre Bellevue
+ Bell_Northern Benoit Bentz Bernard Bescherelle
+ Blais Boily Boivin Borduas Boston Boucherville
+ Bourassa Bousquet Boyer Brian Brosseau Brown
+ Browne Cadieux Cambridge Canada Carole
+ Casavant Chambly Charles Charron Christian
+ Claude Cloutier Colin Comeau Corp Coulombe
+ Cousineau Croteau Daniel Decelles Denis Denise
+ Desjardins Dick Dionne Disney Dodge Domey
+ Dominique Doris Dorval Doyon Drouin Dumoulin
+ EDF Emacs Ethernet Europe Fafard Fernand
+ Fernet Flamand Florient Foisy Forget Fourier
+ FrameMaker France Francine Frank Fraser
+ Freedman Gagnon Gaston Gatien Gaudreault
+ Gauthier Gavrel Gendron Gentilly Geoff
+ Geoffray George Georges Gilles Ginette Girard
+ Goodwin Gordon Gosselin Gratton Greg Gregory
+ Guy Harry Harwell Hayward Hollerbach Horne
+ Houde Hubert Hz Inc Inmos Intel Interleaf
+ Internet iRMX iRMXII iRMXIII Isabelle ISPELL
+ Jackson Jacobsen Jacquelin Jacques
+ Jacques_Cartier Jamie Jean Jean_Claude
+ Jean_Louis Jean_Maurice Jeannine Jean_Paul
+ Jean_Pierre Jean_Yves Jill Jobin Jocelyne John
+ Jones Joynes Jude Julian Julien Juneau Jupiter
+ Kansas Kent Khan King Kuenning kV Lachapelle
+ Laflamme Lafontaine Lamothe Lapointe Laroche
+ LaSalle LaTeX Laugier Laurendeau Laval Lavoie
+ Leblanc Lecavalier Leclerc Lepage Lessard
+ Letarte Linda LISP Longueuil Louis Louise
+ Louis_Marc Ltd Lucie Mahoney Maltais Manseau
+ Marc Marcel Marcoux Marie Marielle Mark
+ Marseille Martin Masson Mathematica Matlab
+ McGee McGill Messier METAFONT Michel Mike
+ Minneapolis Mireille Mongenot Monique
+ Mont_Tremblant Morin Morissette Moshe Mulhouse
+ mW Nagle Nelligan Nestor Nicole OHara Olivier
+ Ontario Ottawa Ouellet Owen Ozias Papineau
+ Paul Pellan Pelletier PERL Phaneuf Phil Pierre
+ Pierrefonds Plante Pointe_Claire PostScript
+ Poussart Pronovost Provost Raymond Re README
+ Renato Ricard Richard Ringuet Riopelle Rioux
+ Roberge Robert Rochefort Roger Romano Ronald
+ Roy Rubin Sacramento Saint_Amand Sainte_Foy
+ Sainte_Julie Saint_Marc_sur_Richelieu Seattle
+ Shawinigan Sherbrooke Sirois Smith Sorel Soucy
+ SPARC SPARCs SPICE St_Antoine St_Bruno
+ Ste_Anne Steele Ste_Julie Stephen St_Jacques
+ St_Jean St_Paul Strasbourg Sun SunOS Suzanne
+ Tanguay Tessier TeX Texas Thibault Thierry
+ Todd Tokyo Toronto Toulouse Tremblay Turcotte
+ Uintas UniPress Unix UNIX Utah Vancouver
+ Varennes Verville Victoria Victoriaville Viger
+ Vincent VxWorks Wilfrid William Williams
+ Wright Yolande Yvan Yves Zawinski);
+
+ AlvinMisc::melange(\@name_list);
+
+ my($u);
+ foreach $u (keys %$nodes) {
+ if($$nodes{$u}{host}==1) {
+ $$nodes{$u}{name} = shift @name_list;
+ }
+ }
+}
+
+sub assign_link_speed{
+ my($nodes,$edges) = @_;
+
+ my($e);
+
+ foreach $e (keys %$edges) {
+ my($bw) = $$edges{$e}{bw};
+
+ my(@choice) = @{$network{"bw"}{$bw}};
+ my($choice_nb) = scalar(@choice);
+ my($chosen_link) = $choice[(int rand($choice_nb))];
+ $$edges{$e}{bw} = $$chosen_link[0]/8000;
+ $$edges{$e}{delay} = $$chosen_link[1];
+ }
+}
+
+
+sub affiche_graph{
+ my($nodes,$edges,$filename) = @_;
+ my($u,$v,$w,$e);
+
+ my(%node_to_export);
+ my(%edge_to_export);
+
+ my(@host_list,@routeur_list,@link_list);
+
+ foreach $u (keys %{$nodes}) {
+ if (!((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1))) { next; }
+ if (!((defined($$nodes{$u}{Mflops}))&&($$nodes{$u}{host}==1))) {
+ die "Lacking Mflops for $u\n";
+ }
+ push @host_list,$u;
+ $node_to_export{$u}=$#host_list;
+ }
+
+ foreach $u (@host_list){
+ foreach $v (@host_list){
+ if($u ne $v) {
+ $w = $u;
+ if(!defined($node_to_export{$w})) {
+ push @routeur_list,$w;
+ $node_to_export{$w}=$#host_list + $#routeur_list + 1;
+ }
+ while ($w ne $v) {
+ my($next) = $$nodes{$w}{shortest_route}{$v};
+ my($e) = $$nodes{$w}{out}{$next};
+ if(!defined($edge_to_export{$e})) {
+ push @link_list,$e;
+ $edge_to_export{$e}=$#link_list;
+ }
+ $w = $next;
+ if(!defined($node_to_export{$w})) {
+ push @routeur_list,$w;
+ $node_to_export{$w}=$#host_list + $#routeur_list + 1;
+ }
+ }
+ }
+ }
+ }
+
+ open VIZ, "> $filename.dot";
+ print VIZ "graph essai { \n";
+ print VIZ " graph [overlap=scale]\n";
+ #print VIZ " graph [overlap=false spline=true]\n";
+ print VIZ " node [shape=box, style=filled]\n";
+ print VIZ " node [width=.3, height=.3, style=filled]\n";
+
+ foreach $u (@host_list) {
+ print VIZ " \"$u\" [label=\"$$nodes{$u}{name}\",color=red,shape=box];\n";
+ }
+ foreach $u (@routeur_list) {
+ print VIZ " \"$u\" [label=\"$$nodes{$u}{name}\",fontsize=2,color=skyblue,shape=circle];\n";
+ }
+ foreach $e (@link_list) {
+ my($src)=$$edges{$e}{src};
+ my($dst)=$$edges{$e}{dst};
+ (defined($$edges{$e}{bw})) or die "Lacking bw for $u\n";
+ (defined($$edges{$e}{delay})) or die "Lacking bw for $u\n";
+ print VIZ " \"$src\" -- \"$dst\";\n";
+ }
+
+ print VIZ "}\n";
+ close VIZ;
+
+ system("neato -Tps $filename.dot > $filename.ps");
+# system("gv $filename.ps");
+ system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null");
+# system("xfig -startg 0 $filename.fig ");
+}
+
+sub build_lat_matrix {
+ my($nodes,$edges) = @_;
+ my($u,$v,$w,$e);
+ my(@host_list)=();
+ my($matrix);
+ foreach $u (keys %{$nodes}) {
+ if (!((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1))) { next; }
+ push @host_list,$u;
+ }
+
+ foreach $u (@host_list){
+ foreach $v (@host_list){
+ $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}=0;
+ if($u ne $v) {
+ $w = $u;
+ while ($w ne $v) {
+ my($next) = $$nodes{$w}{shortest_route}{$v};
+ $e = $$nodes{$w}{out}{$next};
+ $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}+=$$edges{$e}{delay};
+ $w = $next;
+ }
+ }
+ print STDERR "$$nodes{$u}{name} -> $$nodes{$v}{name} : $$matrix{$$nodes{$u}{name}}{$$nodes{$v}{name}}\n";
+ }
+ }
+ return $matrix;
+}
+
+sub cluster_matrix {
+ my($matrix)=@_;
+ my($nodes,$edges) = G_new_graph();
+
+ my(@host_list)=keys %$matrix;
+
+ my($root);
+ my($u,$v);
+ my($min,$min_u,$min_v);
+ my(%taken);
+ foreach $u (@host_list){
+ G_new_node($nodes,$edges,$u);
+ }
+
+ $root=$host_list[0];
+ $taken{$root} = 1;
+
+ while(scalar(keys %taken) != scalar(@host_list)) {
+ $min = 10000000000000;
+ foreach $u (keys %taken) {
+ foreach $v (@host_list) {
+ if(!$taken{$v}) {
+ if($u ne $v) {
+ if($$matrix{$u}{$v}<$min) {
+ $min=$$matrix{$u}{$v};
+ $min_u=$u;
+ $min_v=$v;
+ }
+ }
+ }
+ }
+ }
+ $taken{$min_u} = $taken{$min_v} = 1;
+ G_connect($nodes,$edges,$min_u,$min_v);
+ print STDERR "Connecting $min_u and $min_v\n"
+ }
+ return ($nodes,$edges,$root);
+}
+
+sub PP {
+ my($nodes, $edges, $taken, $root) = @_;
+ my($u);
+ my(@tab) = ();
+ push @tab, $root;
+ foreach $u (keys (%{$$nodes{$root}{out}})) {
+ if($$taken{$u}) { next;}
+ $$taken{$u}=1;
+ push(@tab,PP($nodes,$edges, $taken, $u));
+ }
+ return \@tab;
+}
+
+sub create_orientation {
+ my($nodes,$edges,$root) = @_;
+ my(%taken);
+
+ $taken{$root} = 1;
+
+ return PP($nodes,$edges, \%taken,$root);
+}
+
+sub dump_orientation {
+ my($nodes,$edges, $tab) = @_;
+ my($u,$father);
+ my($root) = shift @$tab;
+
+ print DEPLOYMENT ' <process host="'.$$nodes{$root}{name}.'" function="msma_agent">'."\n";
+ print DEPLOYMENT ' <argument value="blabla"/> <!-- policy -->'."\n";
+
+ { # Need to find my father...
+ my(@sons) = ();
+ my(@neighboors) = keys %{$$nodes{$root}{in}};
+
+ $father = -1;
+
+ foreach $u (@$tab) {
+ push @sons,$$u[0];
+ }
+ @sons = sort @sons;
+ @neighboors = sort @neighboors;
+
+ if($#sons != $#neighboors) {
+ $u = 0;
+ while(defined($sons[$u])&&($sons[$u] eq $neighboors[$u])) {
+ $u++;
+ }
+ $father = $neighboors[$u];
+ }
+ }
+
+ if($father ne -1) {
+ print DEPLOYMENT " <argument value=\"$$nodes{$root}{name}\"/> <!-- father -->\n";
+ } else {
+ print DEPLOYMENT ' <argument value=""/> <!-- father -->'." <!-- I am the master -->\n";
+ }
+
+
+ foreach $u (@$tab) {
+ print DEPLOYMENT " <argument value=\"$$nodes{$$u[0]}{name}\"/>\n";
+ }
+ print DEPLOYMENT " </process>\n";
+ foreach $u (@$tab) {
+ dump_orientation($nodes, $edges, $u);
+ }
+
+ unshift @$tab, $root;
+}
+
+sub main {
+ my($nodes,$edges,$interferences,$host_list,$count_interferences);
+
+ $#ARGV>=0 or die "Need a tiers file!";
+ my($filename)=$ARGV[0];
+ $filename =~ s/\.[^\.]*$//g;
+ if(1) {
+ print STDERR "Reading graph\n";
+ ($nodes,$edges) = parse_tiers_file $ARGV[0];
+
+ print STDERR "Generating host list\n";
+ $host_list = generate_host_list($nodes,$edges,.7);
+ assign_host_speed($nodes,$edges);
+ assign_link_speed($nodes,$edges);
+ assign_host_names($nodes,$edges);
+ print STDERR "Computing Shortest Paths \n";
+ shortest_paths($nodes,$edges);
+ print STDERR "Exporting to surfxml\n";
+ G_surfxml_export($nodes,$edges,"$filename.xml");
+ print STDERR "Calling graphviz\n";
+ affiche_graph($nodes,$edges,"$filename");
+ print STDERR "Getting Latency Matrix\n";
+ my($matrix)=build_lat_matrix($nodes,$edges);
+ print STDERR "Clustering on Latency\n";
+ my($n_nodes,$n_edges,$root)=cluster_matrix($matrix);
+ print STDERR "Creating Orientation\n";
+ my($orientation) = create_orientation($n_nodes,$n_edges,$root);
+ print STDERR "Exporting deployment\n";
+ open DEPLOYMENT, "> $ARGV[0]_deployment.xml";
+ dump_orientation($n_nodes,$n_edges, $orientation);
+ close DEPLOYMENT;
+ }
+}
+
+main;