Author: sandervanderburg
Date: Wed Feb 23 12:49:34 2011
New Revision: 26069
URL: https://svn.nixos.org/websvn/nix/?rev=26069&sc=1

Log:
Fixed an unclear issue with the minimum set cover approximation: services which 
are already mapped should be left out. In the pseudo code of the algorithm this 
is not clear

Modified:
   disnix/dydisnix/trunk/release.nix
   disnix/dydisnix/trunk/src/minsetcover/minsetcover.c

Modified: disnix/dydisnix/trunk/release.nix
==============================================================================
--- disnix/dydisnix/trunk/release.nix   Wed Feb 23 12:32:17 2011        (r26068)
+++ disnix/dydisnix/trunk/release.nix   Wed Feb 23 12:49:34 2011        (r26069)
@@ -276,12 +276,30 @@
            }
            
            # Execute minimum set cover approximation method, by looking to the
-           # cost attribute in the infrastructure model. All services should
-           # be distributed to testtarget1.
+           # cost attribute in the infrastructure model. testService1 and
+           # testService2 should be distributed to testtarget1. testService3
+           # should be distributed to testtarget2.
            
            my $result = 
$machine->mustSucceed("NIXPKGS_ALL=${nixpkgs}/pkgs/top-level/all-packages.nix 
dydisnix-gendist -s ${tests}/services.nix -i ${tests}/infrastructure.nix -q 
${tests}/qos/qos-minsetcover2.nix");
-           print("result is: $result\n");
-           $machine->mustSucceed("(cat $result) >&2");
+           my @distribution = split('\n', $machine->mustSucceed("cat 
$result"));
+           
+           if(@distribution[7] =~ /testtarget1/) {
+               print "line 7 contains testtarget1!\n";
+           } else {
+               print "line 7 should contain testtarget1!\n";
+           }
+           
+           if(@distribution[12] =~ /testtarget1/) {
+               print "line 12 contains testtarget1!\n";
+           } else {
+               die "line 12 should contain testtarget1!\n";
+           }
+           
+           if(@distribution[17] =~ /testtarget2/) {
+               print "line 17 contains testtarget2!\n";
+           } else {
+               die "line 17 should contain testtarget2!\n";
+           }
          '';
        };
       };

Modified: disnix/dydisnix/trunk/src/minsetcover/minsetcover.c
==============================================================================
--- disnix/dydisnix/trunk/src/minsetcover/minsetcover.c Wed Feb 23 12:32:17 
2011        (r26068)
+++ disnix/dydisnix/trunk/src/minsetcover/minsetcover.c Wed Feb 23 12:49:34 
2011        (r26069)
@@ -23,6 +23,7 @@
        GArray *result = g_array_new(FALSE, FALSE, sizeof(DistributionItem*));
        unsigned int i;
     
+        /* Create a result array with the same services as in the input 
distribution model and empty candidate hosts */
        for(i = 0; i < candidate_target_array->len; i++)
        {
            DistributionItem *item = g_array_index(candidate_target_array, 
DistributionItem*, i);
@@ -34,13 +35,15 @@
            g_array_append_val(result, result_item);
        }
     
+       /* Execute minimum set cover approximation */
+       
        while(g_hash_table_size(covered_services_table) < 
service_property_array->len)
        {
            unsigned int i;
            double min_cost = -1;
            int min_cost_index = -1;
            TargetMappingItem *min_cost_target_mapping;
-       
+                   
            for(i = 0; i < target_mapping_array->len; i++)
            {
                TargetMappingItem *target_mapping = 
g_array_index(target_mapping_array, TargetMappingItem*, i);
@@ -59,7 +62,7 @@
                    if(g_hash_table_lookup(covered_services_table, 
service_name) == NULL)
                        count++;
                }
-           
+               
                cost = atoi(infrastructure_prop->value) / (double)count;
            
                if(min_cost == -1 || cost < min_cost)
@@ -77,12 +80,15 @@
                int index = distribution_item_index(result, service);
                DistributionItem *item = g_array_index(result, 
DistributionItem*, index);
            
-               g_hash_table_insert(covered_services_table, service, service);
-
-               g_array_append_val(item->targets, 
min_cost_target_mapping->target);
+               if(g_hash_table_lookup(covered_services_table, service) == NULL)
+               {
+                   g_array_append_val(item->targets, 
min_cost_target_mapping->target);
+                   g_hash_table_insert(covered_services_table, service, 
service);
+               }
            }
        }
     
+       /* Print resulting expression to stdout */
        print_expr_of_candidate_target_array(result);
     
        /* Cleanup */
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to