Ancient
view release on metacpan or search on metacpan
t/7027-nvec-arithmetic-edge.t view on Meta::CPAN
# Absolute value
my $abs = $v->abs();
is_deeply($abs->to_array, [3, 2, 1, 0, 1, 2, 3], 'abs of mixed');
# Sign
my $sign = $v->sign();
is_deeply($sign->to_array, [-1, -1, -1, 0, 1, 1, 1], 'sign of mixed');
# Square (all positive)
my $sq = $v->pow(2);
is_deeply($sq->to_array, [9, 4, 1, 0, 1, 4, 9], 'square of mixed');
};
# ============================================
# Empty and single-element edge cases
# ============================================
subtest 'single element operations' => sub {
my $single = nvec::new([42]);
my $doubled = $single->scale(2);
is($doubled->get(0), 84, 'single element scale');
my $squared = $single->pow(2);
is($squared->get(0), 1764, 'single element pow');
};
# ============================================
# Chained comparisons for filtering
# ============================================
subtest 'chained: range filtering' => sub {
my $v = nvec::range(1, 11); # 1 to 10
# Find 3 < x <= 7
my $gt3 = $v->gt(3);
my $le7 = $v->le(7);
my $mask = $gt3->mul($le7); # AND via multiplication
my $filtered = $v->where($mask);
is_deeply($filtered->to_array, [4, 5, 6, 7], 'range filter 3 < x <= 7');
};
subtest 'chained: outlier detection' => sub {
my $v = nvec::new([1, 2, 100, 3, 4, -50, 5]);
my $mean = $v->mean();
my $std = $v->std();
# Values within 2 std of mean
my $lower = $mean - 2 * $std;
my $upper = $mean + 2 * $std;
my $gt_lower = $v->gt($lower);
my $lt_upper = $v->lt($upper);
my $in_range = $gt_lower->mul($lt_upper);
my $normal = $v->where($in_range);
# The number of values within range depends on std calculation (sample vs pop)
# and precision. Just verify we filtered something.
ok($normal->len() < $v->len(), 'some outliers were filtered');
ok($normal->len() >= 3, 'at least 3 normal values remain');
};
done_testing();
( run in 1.773 second using v1.01-cache-2.11-cpan-13bb782fe5a )