Diff Coverage

Diff: upstream/main...HEAD, staged and unstaged changes

Source File Diff Coverage (%) Missing Lines
crates/conjure-cp-core/src/ast/domains/domain.rs 100%  
crates/conjure-cp-core/src/ast/domains/ground.rs 66.7% 265-268,270
crates/conjure-cp-core/src/ast/matrix.rs 75.0% 240
crates/conjure-cp-core/src/utils/combinatorics.rs 50.0% 58,68,70
crates/conjure-cp-rules/src/matrix/indexed_flatten.rs 100%  
crates/conjure-cp-core/src/ast/domains/ground.rs
261
262
263
264
265
266
267
268
269
270
271
272
273
274
            GroundDomain::MSet(mset_attr, inner_domain) => {
                let inner_len = inner_domain.length()?;
                let (min_sz, max_sz) = match mset_attr.size {
                    Range::Unbounded => (0, inner_len),
                    Range::Single(n) => (n, n),
                    Range::UnboundedR(n) => (n, inner_len),
                    Range::UnboundedL(n) => (0, n),
                    Range::Bounded(min, max) => (min, max),
                };
                let mut ans = 0i32;
                for sz in min_sz..=max_sz {
                    // need  "multichoose", ((n  k)) == (n+k-1  k)
                    // Where n=inner_len and k=sz
                    let c = count_combinations(inner_len + sz - 1, sz)?;
crates/conjure-cp-core/src/ast/matrix.rs
236
237
238
239
240
241
242
243
244
            let dom = inner.domain_of().and_then(|dom| dom.resolve())?;
            let GroundDomain::Matrix(_, index_domains) = dom.as_ref() else {
                return None;
            };
            let flat_index = flat_index_to_full_index(index_domains, index - 1);
            let flat_index: Vec<Expr> = flat_index.into_iter().map(Into::into).collect();

            Some(Expr::SafeIndex(Metadata::new(), inner, flat_index))
        }
crates/conjure-cp-core/src/utils/combinatorics.rs
54
55
56
57
58
59
60
61
62
/// P(n, r) = n! / (n-r)!
///
/// Not defined for r > n.
#[allow(dead_code)]
pub fn count_permutations(n_total: i32, n_choose: i32) -> Result<i32, CombinatoricsError> {
    if n_choose > n_total {
        return Err(CombinatoricsError::not_defined(
            "n_choose must be <= n_total",
        ));
64
65
66
67
68
69
70
71
72
73

    let start = n_total
        .checked_sub(n_choose)
        .ok_or(CombinatoricsError::Overflow)?
        .checked_add(1i32)
        .ok_or(CombinatoricsError::Overflow)?;
    (start..=n_total).try_fold(1i32, |acc, val| {
        acc.checked_mul(val).ok_or(CombinatoricsError::Overflow)
    })
}