snow:

http://dpaste.dzfl.pl/e391a268

This code throws me a "Range Exception" in Algorithm.d.

If I use a lower number of random vectors, like 100, the code terminates. Also, if I delete the template instruction like this :

sort(individuals);

I also don't get an exception. Does anybody know, why this is the case?

If I replace your vector with a tuple (that defines automatically a lexicographic opCmp) the problem seems to disappear:


import std.stdio, std.random, std.array,
       std.algorithm, std.range, std.typecons;

alias Vector3D = Tuple!(double,"x", double,"y", double,"z");
alias Individual = Vector3D[];

Vector3D getFitness(in ref Individual individual) pure nothrow {
    return individual[0];
}

bool myComp(in Individual x, in Individual y)  {
    return x.getFitness > y.getFitness;
}

Vector3D[] initializeRandomVectors(in uint count) {
    Vector3D[] result;
    foreach (immutable i; 0 .. count)
        result ~= Vector3D(uniform(0.0, 11.0),
                           uniform(0.0, 11.0),
                           uniform(0.0, 11.0));
    return result;
}

Individual[] initializeRandomIndividuals()  {
    return 1000.iota.map!(_ => 10.initializeRandomVectors).array;
}

void main() {
    auto individuals =  initializeRandomIndividuals;
    individuals.sort!(myComp, SwapStrategy.stable);
    "finished".writeln;
}


Bye,
bearophile

Reply via email to