struct TestParameters { GameOptions options; Player* players[2]; UINT minGameCount, maxGameCount; }; // // New mutations should be granted the average rating at the time // struct ChamberParameters { ChamberParameters() { poolSize = 100; leaderCount = 5; visualizationGameCount = 5000; standardGameCount = 2000; leaderCurveMin = 1.0; leaderCurveMax = 1.5; mutationTerminationProbability = 0.3; } UINT poolSize; UINT leaderCount; UINT visualizationGameCount; UINT standardGameCount; double leaderCurveMin; double leaderCurveMax; double mutationTerminationProbability; }; struct TestResult { double winRatio[2]; Vector buyRatio; }; struct TestPlayer { TestPlayer(PlayerHeuristic *_p) { p = _p; rating = 0.0; } TestPlayer(PlayerHeuristic *_p, double _rating) { p = _p; rating = _rating; } String VisualizationDescription(const Vector &supplyCards, bool ignoreBuyID, bool ignoreCounts = false) const; PlayerHeuristic *p; double rating; String buyID; }; class TestChamber { public: void FreeMemory(); void StrategizeStart(const CardDatabase &cards, const GameOptions &options, const String &directory, const String &metaSuffix); void StrategizeStep(const CardDatabase &cards); TestResult Test(const CardDatabase &cards, const TestParameters ¶ms, bool useConsole=true); private: friend class MetaTestChamber; void ComputeCounters(const CardDatabase &cards, const String &filename); void ComputeProgression(const CardDatabase &cards, TestPlayer* leader, const Vector &players, const String &filename); void ComputeLeaderboard(const CardDatabase &cards, const Vector &players, const String &filename, UINT gameCount); void InitializePool(const CardDatabase &cards); Grid TestPool(const CardDatabase &cards, const String &filename); void AssignBuyIDs(const Grid &poolResults); void AssignNewLeaders(const CardDatabase &cards); void GenerateNewPool(const CardDatabase &cards); void SaveVisualizationFiles(const CardDatabase &cards); Grid RunAllPairsTests(const CardDatabase &cards, const Vector &playersA, const Vector &playersB, UINT minGameCount, UINT maxGameCount); Vector _pool; Vector _leaders; Vector _bestLeaderHistory; Vector _allLeaderHistory; Vector _allLeaderHistoryHashes; Vector _leaderWeights; ChamberParameters _parameters; GameOptions _gameOptions; Vector _supplyCards; String _metaSuffix; int _generation; String _directory; }; struct TestChamberTask : public WorkerThreadTask { void Run(ThreadLocalStorage *threadLocalStorage); TestChamber *chamber; const CardDatabase *cards; TestParameters params; TestResult *result; };