Esempio n. 1
0
        public void GenomeWithoutOpenInstancesIsRemovedFromQueue()
        {
            this.RequeueAllEvaluations(this._defaultManager);
            this._defaultManager.StartSynchronizingQueue(this._globalQueue);
            var genomeTournamentKey = new GenomeTournamentKey(this._participants.First(), this._defaultManager.MiniTournamentId);

            for (var i = 0; i < this._instances.Count; i++)
            {
                this._defaultManager.TryGetNextInstanceAndUpdateGenomePriority(genomeTournamentKey, out var _).ShouldBeTrue();
            }

            this._defaultManager.TryGetNextInstanceAndUpdateGenomePriority(genomeTournamentKey, out var _).ShouldBeFalse();
            this._globalQueue.Count.ShouldBe(this._participants.Count - 1);
            this._globalQueue.ShouldNotContain(genomeTournamentKey);
        }
Esempio n. 2
0
        public void RacingRemovesKilledGenomesFromQueue()
        {
            var participants = this.CreateGenomesDescendingByAge(2, 0).ToList();
            var instances    = this._instances.Take(2).ToList();
            var queue        = new SimplePriorityQueue <GenomeTournamentKey, double>();

            // always return second genome as target to kill by racing.
            var evaluatorMock = new Mock <IRunEvaluator <TestInstance, ContinuousResult> >();

            evaluatorMock.Setup(
                e => e.GetGenomesThatCanBeCancelledByRacing(
                    It.IsAny <IReadOnlyList <ImmutableGenomeStats <TestInstance, ContinuousResult> > >(),
                    It.IsAny <int>()))
            .Returns(new[] { participants[1] });

            var manager = new MiniTournamentManager <TestInstance, ContinuousResult>(
                participants,
                instances,
                0,
                0,
                evaluatorMock.Object,
                true,
                1);

            this.RequeueAllEvaluations(manager);
            manager.StartSynchronizingQueue(queue);

            queue.Count.ShouldBe(2);

            // start an instance
            var winnerGenome = new GenomeTournamentKey(participants[0], 0);

            manager.TryGetNextInstanceAndUpdateGenomePriority(winnerGenome, out var instance).ShouldBeTrue();

            // send a result
            var result             = new ContinuousResult(42, TimeSpan.Zero);
            var genomeInstancePair = new GenomeInstancePair <TestInstance>(winnerGenome.Genome, instance);

            manager.UpdateResult(genomeInstancePair, result);

            // second genome should have been killed by racing + removed from queue
            queue.Count.ShouldBe(1);
            queue.First.ShouldBe(winnerGenome);
        }
Esempio n. 3
0
        public void PriorityInQueueIsUpdatedWhenInstancesAreStarted()
        {
            var orderedParticipants = this._participants.OrderBy(p => p.Age).ToList();

            this.RequeueAllEvaluations(this._defaultManager);
            this._defaultManager.StartSynchronizingQueue(this._globalQueue);

            this._globalQueue.First.ShouldNotBeNull();
            this._globalQueue.First.Genome.ShouldBe(orderedParticipants[0]);

            var genomeTournamentKey = new GenomeTournamentKey(orderedParticipants[0], this._defaultManager.MiniTournamentId);

            this._defaultManager.TryGetNextInstanceAndUpdateGenomePriority(genomeTournamentKey, out var instance).ShouldBeTrue();
            instance.ShouldNotBeNull();
            this._defaultManager.TryGetNextInstanceAndUpdateGenomePriority(genomeTournamentKey, out instance).ShouldBeTrue();
            instance.ShouldNotBeNull();

            // after 2 instances have been drawn, age - open instances of 2nd genome have higher priority.
            // (age: 0 - open: 3) > (age: 1 - open: 5) | Priority: firstGenome: -3 > secondGenome: -4
            this._globalQueue.First.ShouldNotBeNull();
            this._globalQueue.First.Genome.ShouldBe(orderedParticipants[1]);
        }