/// <summary> /// Tworzy tablicę kalkulatorów kontekstu dla każdego z tokenów parametru wejściowego calculatedForRows /// </summary> /// <param name="threadsNum">Semafor maksymalnej liczby jednocześnie zakolejkowanych wątków ThreadPool</param> /// <param name="calculatedForRows">Tablica par ID tokenu => wiersz, dla której elementów mają być utworzone indywidualne /// kalkulatory</param> /// <returns>Tablica kalkulatorów kontekstu</returns> public static IxHalTokenContextCalculator[] create(Semaphore threadsNum, KeyValuePair<uint, ArrayRow<uint>>[] calculatedForRows) { IxHalTokenContextCalculator[] result = new IxHalTokenContextCalculator[calculatedForRows.Length]; for (int i = 0, count = calculatedForRows.Length; i < count; i++) result[i] = new IxHalTokenContextCalculator(threadsNum, calculatedForRows[i]); return result; }
/// <summary> /// Oblicza kontekst dla tokenu o wskazanym ID /// /// Jeśli token nie posiada wiersza w tablicy, zwracany jest pusty kontekst (pusta tablica). /// </summary> /// <param name="tokenId">ID tokenu do obliczenia kontekstu</param> /// <returns>Kontekst tokenu lub pusta tablica</returns> public KeyValuePair<uint, int>[] calculateContextForTokenId(uint tokenId) { /* Obiekt czytający macierz */ IxHalMatrixReader matrixReader = new IxHalMatrixReader(workingDirPath); /* Semafor - maksymalna liczba jednocześnie zakolejkowanych wątków ThreadPool */ Semaphore semaphore = new Semaphore(IxSettings.halAnalyzerThreadsNum, IxSettings.halAnalyzerThreadsNum); /* Wiersz tokenu, dla którego liczymy kontekst */ KeyValuePair<uint, ArrayRow<uint>> calculatedForRow = getArrayRow(tokenId); /* Jeśli wiersz tego tokenu nie istnieje, nie obliczysz kontekstu */ if (calculatedForRow.Key == 0) return new KeyValuePair<uint, int>[0]; /* Kalkulator odległości - kontekstu */ IxHalTokenContextCalculator calculator = new IxHalTokenContextCalculator(semaphore, calculatedForRow); /* Wczytaj pierwszą porcję wierszy do porównywania (liczenia odległości) dla tokenu */ KeyValuePair<uint, ArrayRow<uint>>[] calculatedAgainstRows = matrixReader.readArrayRowsChunk(1000); while (calculatedAgainstRows.Length != 0) { /* Zakolejkuj obliczenie odległości dla wczytanych wierszy */ calculator.calculate(calculatedAgainstRows); /* Wczytaj następną porcję wierszy */ calculatedAgainstRows = matrixReader.readArrayRowsChunk(1000); } matrixReader.finalize(); Misc.waitFullSemaphore(semaphore, IxSettings.halAnalyzerThreadsNum); calculator.computeFinalResult(); Misc.waitFullSemaphore(semaphore, IxSettings.halAnalyzerThreadsNum); return calculator.getCalculatedContext(); }