Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Moving platform_generation to contrib/
[simgrid.git] / tools / platform_generation / graph_tbx.pm
diff --git a/tools/platform_generation/graph_tbx.pm b/tools/platform_generation/graph_tbx.pm
deleted file mode 100644 (file)
index 7a7292c..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-# Un graphe c'est un hachage nodes et un hachage edges avec trucs dedans
-# nodes{nom}{type}, nodes{nom}{X}, nodes{nom}{Y}, nodes{nom}{in}, nodes{nom}{out} par exemple
-# edges{nom}{src}, edges{nom}{dst}, edges{nom}{type}, edges{nom}{delay}, edges{nom}{bw}
-
-
-sub G_new_graph {
-    my(%nodes,%edges); # a new graph...
-    return(\%nodes,\%edges);
-}
-
-sub G_new_node {
-    my($nodes,$edges,$name) = @_;
-    $$nodes{$name}{name}=$name;
-    $$nodes{$name}{type}=2;
-}
-
-sub G_connect {
-    my($nodes,$edges,$src,$dst) = @_;
-    my($edge_count)=scalar(keys(%{$edges}));
-    $$edges{$edge_count}{src}=$src;
-    $$edges{$edge_count}{dst}=$dst;
-#    $$edges{$edge_count}{delay} = $delay;
-#    $$edges{$edge_count}{bw} = $bw;
-#    $$edges{$edge_count}{type} = $type;
-#    $$edges{$edge_count}{using_path} = [];
-    $$nodes{$src}{out}{$dst} = $edge_count;
-    $$nodes{$dst}{in}{$src} = $edge_count;
-    $$nodes{$dst}{out}{$src} = $edge_count;
-    $$nodes{$src}{in}{$dst} = $edge_count;
-    return($edge_count);
-}
-
-sub GO_connect {
-    my($nodes,$edges,$src,$dst) = @_;
-    my($edge_count)=scalar(keys(%{$edges}));
-    $$edges{$edge_count}{src}=$src;
-    $$edges{$edge_count}{dst}=$dst;
-#    $$edges{$edge_count}{delay} = $delay;
-#    $$edges{$edge_count}{bw} = $bw;
-#    $$edges{$edge_count}{type} = $type;
-#    $$edges{$edge_count}{using_path} = [];
-    $$nodes{$src}{out}{$dst} = $edge_count;
-    $$nodes{$dst}{in}{$src} = $edge_count;
-    return($edge_count);
-}
-
-sub G_simgrid_export {
-    my($nodes,$edges,$filename) = @_;
-    my($u,$v,$w,$e);
-    my(@host_list)=();
-    
-    open MSG_OUTPUT, "> $filename";
-
-    print MSG_OUTPUT "HOSTS\n";
-    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"; 
-       }
-       print MSG_OUTPUT "$u $$nodes{$u}{Mflops}\n";
-       push @host_list,$u;
-    }
-    print MSG_OUTPUT "LINKS\n";
-    foreach $e (keys %{$edges}) {
-       (defined($$edges{$e}{bw})) or die "Lacking bw for $u\n"; 
-       (defined($$edges{$e}{delay})) or die "Lacking bw for $u\n"; 
-       print MSG_OUTPUT "$e $$edges{$e}{bw} $$edges{$e}{delay}\n";
-    }
-    print MSG_OUTPUT "ROUTES\n";
-    foreach $u (@host_list){
-        foreach $v (@host_list){
-           if($u ne $v) {
-               my(@path)=();
-               $w = $u;
-               while ($w ne $v) {
-                   my($next) = $$nodes{$w}{shortest_route}{$v};
-                   $e = $$nodes{$w}{out}{$next};
-                   push(@path,$e);
-                   $w = $next;
-               }
-               print MSG_OUTPUT "$u $v (@path)\n";
-           }
-       }
-    }
-    close(MSG_OUTPUT);
-}
-
-sub G_surfxml_export {
-    my($nodes,$edges,$filename) = @_;
-    my($u,$v,$w,$e);
-    my(@host_list)=();
-    
-    open MSG_OUTPUT, "> $filename";
-
-    print MSG_OUTPUT "<?xml version='1.0'?>\n";
-    print MSG_OUTPUT "<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n";
-    print MSG_OUTPUT "<platform_description>\n";
-
-    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"; 
-       }
-       print MSG_OUTPUT "  <cpu name=\"$$nodes{$u}{name}\" power=\"$$nodes{$u}{Mflops}\"/>\n";
-       push @host_list,$u;
-    }
-    foreach $e (keys %{$edges}) {
-       (defined($$edges{$e}{bw})) or die "Lacking bw for $u\n"; 
-       (defined($$edges{$e}{delay})) or die "Lacking bw for $u\n"; 
-       my($lat);
-       $lat = $$edges{$e}{delay} / 1000;
-       print MSG_OUTPUT "  <network_link name=\"$e\" bandwidth=\"$$edges{$e}{bw}\" latency=\"$lat\"/>\n";
-    }
-    foreach $u (@host_list){
-        foreach $v (@host_list){
-           if($u ne $v) {
-               my(@path)=();
-               $w = $u;
-               while ($w ne $v) {
-                   my($next) = $$nodes{$w}{shortest_route}{$v};
-                   $e = $$nodes{$w}{out}{$next};
-                   push(@path,$e);
-                   $w = $next;
-               }
-               print MSG_OUTPUT "  <route src=\"$$nodes{$u}{name}\" dst=\"$$nodes{$v}{name}\">";
-               foreach $w (@path) {
-                   print MSG_OUTPUT "<route_element name=\"$w\"/>";
-               }
-               print MSG_OUTPUT "  </route>\n";
-           }
-       }
-    }
-    print MSG_OUTPUT "</platform_description>\n";
-    close(MSG_OUTPUT);
-}
-
-##############################
-###    GRAPH ALGORITHMS    ###
-##############################
-
-sub shortest_paths{
-    my($nodes,$edges) = @_;
-
-    my(%connexion);
-    my(%distance);
-    my(%shortest);
-
-    my(@node_list) = sort (keys %$nodes);
-    my($n) =  scalar(@node_list);
-
-    my($u,$v,$w,$step,$e);
-
-    foreach $u (@node_list){
-        foreach $v (@node_list){
-            $connexion{$u}{$v} = 0;
-            $distance{$u}{$v} = 0;
-            $shortest{$u}{$v} = -1;
-        }
-    }
-
-    foreach $e (sort (keys %$edges)){
-       my($x1)=$$edges{$e}{src};
-       my($x2)=$$edges{$e}{dst};
-        $connexion{$x1}{$x2} = $connexion{$x2}{$x1} = 1;
-        $distance{$x1}{$x2} = $distance{$x2}{$x1} = 1;
-        $shortest{$x1}{$x2} = $x2;
-        $shortest{$x2}{$x1} = $x1;
-    }
-
-#    print_matrix(\%connexion);
-#    matrix2viz(\%connexion);
-
-    foreach $step (0..$n-1){
-       my($modif) = 0;
-        foreach $u (@node_list){
-            foreach $v (@node_list){
-                foreach $w (@node_list){
-                    if(($connexion{$u}{$w} != 0)
-                        && ($distance{$w}{$v}!=0)
-                        && (($distance{$u}{$v} >
-                            $distance{$u}{$w} + $distance{$w}{$v}) || ($distance{$u}{$v}==0))
-                      ){
-                        $distance{$u}{$v} =
-                           $distance{$u}{$w} + $distance{$w}{$v};
-                       $shortest{$u}{$v} = $w;
-                       $modif = 1;
-                    }
-                }
-            }
-        }
-       if($modif == 0) {last;}
-    }
-
-    foreach $u (@node_list){
-       foreach $v (@node_list){
-           if($u eq $v) {
-               $$nodes{$u}{shortest_route}{$v} = $u;
-               $$nodes{$u}{number_hops}{$v} = 0;
-           } else {
-               $$nodes{$u}{shortest_route}{$v} = $shortest{$u}{$v};
-               $$nodes{$u}{number_hops}{$v} = $distance{$u}{$v};
-           }
-       }
-    }
-}
-
-sub build_interferences{
-    my($nodes,$edges,$host_list) = @_;
-
-    my($u,$v,$w,$e);
-    my(%interference);
-
-    foreach $u (@$host_list){
-        foreach $v (@$host_list){
-           if($u ne $v) {
-               $w = $u;
-               push(@{ $$nodes{$u}{using_path}},[$u,$v]);
-               while ($w ne $v) {
-                   my($next) = $$nodes{$w}{shortest_route}{$v};
-                   $e = $$nodes{$w}{out}{$next};
-                   push(@{ $$edges{$e}{using_path}},[$u,$v]);
-                   push(@{ $$nodes{$next}{using_path}},[$u,$v]);
-                   $w = $next;
-               }
-           }
-       }
-    }
-#     foreach $e (keys %$edges){
-#      my($e1,$e2);
-#      foreach $e1 (@{$$edges{$e}{using_path}}) {
-#          my($p1,$q1) = @$e1;
-#          foreach $e2 (@{$$edges{$e}{using_path}}) {
-#              my($p2,$q2) = @$e2;
-#              $interference{$p1}{$p2}{$q1}{$q2} = 1;
-#          }
-#      }       
-#     }
-    my($p1,$p2,$q1,$q2);
-
-    foreach $p1 (@$host_list) {
-        foreach $p2 (@$host_list) {
-            foreach $q1 (@$host_list) {
-                foreach $q2 (@$host_list) {
-                    $interference{$p1}{$p2}{$q1}{$q2}=0;
-                }
-            }
-        }
-    }
-
-    foreach $e (keys %$nodes){
-       my($e1,$e2);
-       foreach $e1 (@{$$nodes{$e}{using_path}}) {
-           my($p1,$q1) = @$e1;
-           foreach $e2 (@{$$nodes{$e}{using_path}}) {
-               my($p2,$q2) = @$e2;
-               $interference{$p1}{$p2}{$q1}{$q2} = 1;
-           }
-       }       
-    }
-
-    foreach $e (keys %$nodes){
-       undef(@{$$nodes{$e}{using_path}});
-    }
-
-    foreach $e (keys %$edges){
-       undef(@{$$edges{$e}{using_path}});
-    }
-
-#    foreach $u (@host_list){
-#        foreach $v (@host_list){
-#          if((defined($interference[$u]))&&(defined($interference[$u][$v]))) {
-#              print_matrix($interference[$u][$v]);
-#          }
-#      }
-#    }
-    return(\%interference);
-}
-
-sub __visit_pp {
-    my($nodes,$edges,$u,$time,$direction,$stamp) = @_;
-    my($v);
-    $$nodes{$u}{"Couleur_$stamp"}=1;
-    $$time++;
-    $$nodes{$u}{"Debut_$stamp"}=$$time;
-    foreach $v (keys (%{$$nodes{$u}{$direction}})) {
-       if ($$nodes{$v}{"Couleur_$stamp"} == 0) {
-           $$nodes{$v}{"PI_$stamp"} = $u;
-           __visit_pp($nodes,$edges,$v,$time,$direction,$stamp);
-       }
-    }
-    $$nodes{$u}{"Couleur_$stamp"}=2;
-    $$time++;
-    $$nodes{$u}{"Fin_$stamp"}=$$time;
-}
-
-sub __PP {
-    my($nodes,$edges,$direction,$stamp,$stampSorter) = @_;
-
-    my(@node_list) = (keys %$nodes);
-    if(defined($stampSorter)) {
-       @node_list = sort {
-           $$nodes{$b}{$stampSorter}
-                       <=>
-           $$nodes{$a}{$stampSorter}
-       } @node_list;
-    }
-
-    my($u,$time);
-
-    foreach $u (@node_list) {
-       $$nodes{$u}{"Couleur_$stamp"} = 0;
-    }
-    $time = 0;
-    foreach $u (@node_list) {
-       if($$nodes{$u}{"Couleur_$stamp"} == 0) {
-           __visit_pp($nodes,$edges,$u,\$time,$direction,$stamp);
-       }
-    }
-    return $time;
-}
-
-
-sub GO_SCC_Topological_Sort{
-    my($nodes,$edges) = @_;
-
-    my(@node_list) = (keys %$nodes);
-
-    ### Strongly Connected Components building
-    __PP($nodes,$edges,"out","1");
-    __PP($nodes,$edges,"in","2","Fin_1");
-
-    @node_list = sort 
-    {
-       if ($$nodes{$a}{"Fin_2"}<$$nodes{$b}{"Debut_2"}) {
-           return -1;
-       } elsif ($$nodes{$a}{"Debut_2"}<$$nodes{$b}{"Debut_2"}) {
-           return -1;
-       } 
-       return 1;
-    }
-    @node_list;
-
-    my($u,$v);
-    my($scc)=$node_list[0];
-    my(%SCC);
-    foreach $u (@node_list) {
-       if($$nodes{$u}{Fin_2} > $$nodes{$scc}{Fin_2}) {
-           $scc = $u;
-       }
-       push @{$SCC{$scc}},$u;
-       $$nodes{$u}{SCC_leader}=$scc;
-    }
-
-    ### Topological Sort
-    my($n_SCC,$e_SCC)=G_new_graph();
-    foreach $scc (keys %SCC) {
-       G_new_node($n_SCC,$e_SCC,$$nodes{$scc}{SCC_leader});
-       foreach $u (@{$SCC{$scc}}) {
-           foreach $v (keys (%{$$nodes{$u}{out}})) {
-               if(!defined($$n_SCC{$$nodes{$u}{SCC_leader}}{out}{$$nodes{$v}{SCC_leader}})) {
-                   GO_connect($n_SCC,$e_SCC,$$nodes{$u}{SCC_leader},$$nodes{$v}{SCC_leader});
-               }
-           }
-       }
-    }
-
-    __PP($n_SCC,$e_SCC,"out","TS");
-    my(@SCC_list) = keys %SCC;
-    @SCC_list = sort {$$n_SCC{$b}{Fin_TS} <=> $$n_SCC{$a}{Fin_TS}} @SCC_list;
-    my(@ordering)=();
-    foreach $scc (@SCC_list) {
-       push @ordering, $SCC{$scc};
-    }
-
-    return \@ordering;
-}
-
-
-1;