Combinations

Lazy Forward range of Combinations. It always generates combinations from 0 to n - 1, use indexedRoR to map it to your range.

Generating a new combination is in O(k), the number of combinations is binomial(n, k).

Constructors

this
this(size_t n, T[] state)

state should have the length of repeat

Members

Aliases

DeepElement
alias DeepElement = T

Functions

popFront
void popFront()
empty
bool empty [@property getter]

Input range primitives

Properties

front
Slice!(const(T)*) front [@property getter]
length
size_t length [@property getter]

Input range primitives

save
Combinations save [@property getter]

Forward range primitive. Allocates using GC.

shape
size_t[2] shape [@property getter]

Examples

import mir.ndslice.fuse;
import mir.ndslice.topology: iota;
assert(iota(3).combinations(2).fuse == [[0, 1], [0, 2], [1, 2]]);
assert("AB"d.combinations(2).fuse == ["AB"d]);
assert("ABC"d.combinations(2).fuse == ["AB"d, "AC"d, "BC"d]);
import mir.algorithm.iteration: equal;
import mir.ndslice.slice: sliced;
import mir.ndslice.topology: iota;

import std.experimental.allocator.mallocator;
auto alloc = Mallocator.instance;

static immutable expected3r2 = [
    0, 1,
    0, 2,
    1, 2];
auto r = iota(3);
auto rc = alloc.makeCombinations(r.length, 2);
assert(expected3r2.sliced(3, 2).equal(rc.indexedRoR(r)));
alloc.dispose(rc);

See Also

Meta