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