Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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();
        }