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