Ancient

 view release on metacpan or  search on metacpan

t/7013-nvec-boolean-truth.t  view on Meta::CPAN

    is_deeply($gt->to_array, [0, 0, 0, 1, 1], 'gt threshold');
    is($gt->count, 2, 'gt count');

    my $ge = $a->ge($thresh);
    is_deeply($ge->to_array, [0, 0, 1, 1, 1], 'ge threshold');
    is($ge->count, 3, 'ge count');
};

# ============================================
# Conditional selection with where()
# ============================================

subtest 'where with boolean masks' => sub {
    my $data = nvec::range(0, 10);  # 0-9

    # Select even numbers
    my $is_even = nvec::new([1, 0, 1, 0, 1, 0, 1, 0, 1, 0]);
    my $evens = $data->where($is_even);
    is_deeply($evens->to_array, [0, 2, 4, 6, 8], 'where: even numbers');

    # Select values > 5
    my $thresh = nvec::fill(10, 5);
    my $gt5 = $data->gt($thresh);
    my $big = $data->where($gt5);
    is_deeply($big->to_array, [6, 7, 8, 9], 'where: > 5');

    # Chained: values > 3 AND < 7
    my $gt3 = $data->gt(nvec::fill(10, 3));
    my $lt7 = $data->lt(nvec::fill(10, 7));
    my $mask = $gt3->mul($lt7);  # AND via multiplication
    my $mid = $data->where($mask);
    is_deeply($mid->to_array, [4, 5, 6], 'where: 3 < x < 7');
};

# ============================================
# Sign function truth
# ============================================

subtest 'sign function' => sub {
    my $v = nvec::new([-5, -0.001, 0, 0.001, 5]);
    my $s = $v->sign;

    is_deeply($s->to_array, [-1, -1, 0, 1, 1], 'sign values');

    # Sign of zeros
    my $zeros = nvec::zeros(3);
    is_deeply($zeros->sign->to_array, [0, 0, 0], 'sign of zeros');

    # Sign of ones
    my $ones = nvec::ones(3);
    is_deeply($ones->sign->to_array, [1, 1, 1], 'sign of ones');
};

# ============================================
# Special value checks
# ============================================

subtest 'isfinite, isnan, isinf' => sub {
    use POSIX qw(HUGE_VAL);
    my $inf = HUGE_VAL;
    my $nan = $inf - $inf;  # NaN

    my $v = nvec::new([1.0, $nan, $inf, -$inf, 0]);

    my $finite = $v->isfinite;
    is($finite->get(0), 1, 'isfinite: 1.0');
    is($finite->get(1), 0, 'isfinite: NaN');
    is($finite->get(2), 0, 'isfinite: Inf');
    is($finite->get(3), 0, 'isfinite: -Inf');
    is($finite->get(4), 1, 'isfinite: 0');

    my $is_nan = $v->isnan;
    is($is_nan->get(0), 0, 'isnan: 1.0');
    is($is_nan->get(1), 1, 'isnan: NaN');
    is($is_nan->get(2), 0, 'isnan: Inf');

    my $is_inf = $v->isinf;
    is($is_inf->get(0), 0, 'isinf: 1.0');
    is($is_inf->get(1), 0, 'isinf: NaN');
    is($is_inf->get(2), 1, 'isinf: Inf');
    is($is_inf->get(3), 1, 'isinf: -Inf');
};

# ============================================
# Chained boolean operations
# ============================================

subtest 'chained truth operations' => sub {
    my $data = nvec::new([1, 0, 3, 0, 5, 0, 7, 0, 9, 0]);

    # Filter nonzero, then check if any > 5
    my $nonzero_mask = $data->gt(nvec::zeros(10));
    my $nonzero = $data->where($nonzero_mask);
    ok($nonzero->gt(nvec::fill($nonzero->len, 5))->any, 'chained: some > 5');

    # Count how many satisfy complex condition
    my $gt3 = $data->gt(nvec::fill(10, 3));
    my $lt8 = $data->lt(nvec::fill(10, 8));
    my $both = $gt3->mul($lt8);
    is($both->count, 2, 'chained: count 3 < x < 8');
};

done_testing;



( run in 0.540 second using v1.01-cache-2.11-cpan-df04353d9ac )