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); }
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); }
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]); }