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 )