/// <summary> /// Constructs a WinLoss calculator /// </summary> /// <param name="maxDocsPerQuery">the maximum number of documents per query</param> /// <param name="sortingAlgorithm">a string describing the sorting algorithm to use</param> public WinLossCalculator(int maxDocsPerQuery, string sortingAlgorithm) { int numThreads = BlockingThreadPool.NumThreads; _oneTwoThree = Utils.GetIdentityPermutation(maxDocsPerQuery); _permutationBuffers = new int[numThreads][]; for (int i = 0; i < numThreads; ++i) { _permutationBuffers[i] = new int[maxDocsPerQuery]; } _scoreBuffers = new double[numThreads][]; for (int i = 0; i < numThreads; ++i) { _scoreBuffers[i] = new double[maxDocsPerQuery]; } _comparers = new DcgPermutationComparer[numThreads]; for (int i = 0; i < numThreads; ++i) { _comparers[i] = DcgPermutationComparerFactory.GetDcgPermutationFactory(sortingAlgorithm); } }
/// <summary> /// Constructs a DCG calculator /// </summary> /// <param name="maxDocsPerQuery">the maximum number of documents per query</param> /// <param name="sortingAlgorithm">a string describing the sorting algorithm to use</param> /// <param name="topNDocsForIdealDcg">specifies the ideal DCG@ computation.</param> public DcgCalculator(int maxDocsPerQuery, string sortingAlgorithm, int topNDocsForIdealDcg = 0) { int numThreads = BlockingThreadPool.NumThreads; _oneTwoThree = Utils.GetIdentityPermutation(maxDocsPerQuery); _permutationBuffers = new int[numThreads][]; for (int i = 0; i < numThreads; ++i) { _permutationBuffers[i] = new int[maxDocsPerQuery]; } _scoreBuffers = new double[numThreads][]; for (int i = 0; i < numThreads; ++i) { _scoreBuffers[i] = new double[maxDocsPerQuery]; } _comparers = new DcgPermutationComparer[numThreads]; for (int i = 0; i < numThreads; ++i) { _comparers[i] = DcgPermutationComparerFactory.GetDcgPermutationFactory(sortingAlgorithm); // only reorder query/URL pairs, if we have at least two query/URL pairs for reordering if (topNDocsForIdealDcg > 1) { // using lazy initialize for the _secondLevelComparers to make it cheap and easy // later to test, if re-ordering needs to be computed. This way it also only allocates // the memory it really needs if (_secondLevelcomparers == null) { _secondLevelcomparers = new DescendingStableIdealComparer[numThreads]; } _secondLevelcomparers[i] = new DescendingStableIdealComparer(topNDocsForIdealDcg); } } }