from:
  https://hal.archives-ouvertes.fr/hal-00868016v2/document
Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/API2/Nodes.pm | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 303a7ffb..9202932a 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -2000,7 +2000,7 @@ __PACKAGE__->register_method ({
                        # fixme: check vmbr available
 
                        my @vec_node = ($node_freecpu, $node_freemem); #? add 
network usage dimension ?
-                       my $weight = dotprod(\@vec_vm,\@vec_node);
+                       my $weight = dotprod(\@vec_vm,\@vec_node, 'normR');
                        $nodes_weight->{$weight} = $node;
                        $highest_weight = $weight if $weight > $highest_weight;
                    }   
@@ -2131,10 +2131,27 @@ sub complete_templet_repo {
 }
 
 sub dotprod {
-    my ($vec_a, $vec_b) = @_;
+    my($vec_a, $vec_b, $mode) = @_;
     die "they must have the same size\n" unless @$vec_a == @$vec_b;
+
     my $sum = 0;
-    $sum += $vec_a->[$_] * $vec_b->[$_] for 0..$#$vec_a;
+    my $norm_a = 0;
+    my $norm_b = 0;
+
+    for(my $i=0; $i < scalar @{$vec_a}; $i++) {
+       my $a = @{$vec_a}[$i];
+       my $b = @{$vec_b}[$i];
+
+       $sum += $a * $b;
+       $norm_a += $a * $a;
+       $norm_b += $b * $b;
+    }
+
+    if($mode eq 'normR') {
+       return $sum / (sqrt($norm_a) * sqrt($norm_b))
+    } elsif ($mode eq 'normC') {
+       return $sum / $norm_b;
+    }
     return $sum;
 }
 
-- 
2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to