/// <summary> /// Standardowy konstruktor /// </summary> /// <param name="workingDirPath">Ścieżka do katalogu z danymi HAL</param> /// <param name="fwdIndex">Indeks wprzód (używany w trybie IxHalCalculationMode.CALCULATE_HAL_ON_DEMAND, inaczej /// może być null)</param> /// <param name="invIndex">Odwrócony indeks (używany w trybie IxHalCalculationMode.CALCULATE_HAL_ON_DEMAND, inaczej /// może być null)</param> public IxHalContextObtainer(string workingDirPath, IxStdDiskFwdIndex fwdIndex, IxStdDiskRIIndex invIndex) { switch (IxSettings.halSearchMode) { case IxHalCalculationMode.CALCULATE_HAL_ON_DEMAND: halContextOnDemandComputer = new IxHalOnDemCtxComp(workingDirPath, invIndex, fwdIndex); break; case IxHalCalculationMode.CALCULATE_CONTEXT_ON_PREPARED_HAL: halContextComputer = new IxHalCtxComp(workingDirPath); break; case IxHalCalculationMode.USE_PRECALCULATED_CONTEXT: halContext = new IxHalContext(workingDirPath, IxHalContext.Mode.READ); break; default: throw new NotImplementedException(); break; } }
/// <summary> /// Tworzy kontekst dla wszystkich tokenów w macierzy i zapisuje go do pliku /// /// Kontekst jest zarządzalny przez IxHalContext. /// </summary> public void calculateContext() { ProgressReport progressReport; /* Posłuży do zapisywania wyników */ IxHalContext contextWriter = new IxHalContext(workingDirPath, IxHalContext.Mode.CREATE); /* Obiekt czytający dla tokenów, dla których będzie liczony kontekst */ IxHalMatrixReader matrixReader = new IxHalMatrixReader(workingDirPath); matrixReader.setProgressReportPrefix("!"); /* Obiekt czytający dla tokenów, od których liczone będą odległości do kontekstów */ IxHalMatrixReader matrixReaderSub = new IxHalMatrixReader(workingDirPath); /* Semafor maksymalnej liczby jednocześnie zakolejkowanych wątków ThreadPool */ Semaphore semaphore = new Semaphore(IxSettings.halAnalyzerThreadsNum, IxSettings.halAnalyzerThreadsNum); /* Seria wierszy tokenów, dla których aktualnie liczony jest kontekst */ KeyValuePair<uint, ArrayRow<uint>>[] calculatedForRows = matrixReader.readArrayRowsChunk(1000); while (calculatedForRows.Length != 0) { /* Kalkulatory kontekstów */ IxHalTokenContextCalculator[] calculators = IxHalTokenContextCalculator.create(semaphore, calculatedForRows); int calculatorsCount = calculators.Length; /* Porcja wierszy tokenów, od których liczone będą odległości do kontekstów */ KeyValuePair<uint, ArrayRow<uint>>[] calculatedAgainstRows = matrixReaderSub.readArrayRowsChunk(1000); while (calculatedAgainstRows.Length != 0) { progressReport = new ProgressReport(calculatorsCount, 10, "c"); /* Zleć uzupełnianie kontekstów kalkulatorom */ for (int i = 0; i < calculatorsCount; i++) { calculators[i].calculate(calculatedAgainstRows); progressReport.progressOne(); } /* Pobierz następną porcję tokenów, od których liczone są odległości do kontekstów */ calculatedAgainstRows = matrixReaderSub.readArrayRowsChunk(1000); progressReport.done(); } /* Obliczono już cały kontekst dla tej porcji calculatedForRows - zresetuj obiekt czytający */ matrixReaderSub.reset(); Misc.waitFullSemaphore(semaphore, IxSettings.halAnalyzerThreadsNum); progressReport = new ProgressReport(calculatorsCount, 10, "f"); /* Finalizuj obliczanie kontekstów w kalkulatorach */ for (int i = 0; i < calculatorsCount; i++) { calculators[i].computeFinalResult(); progressReport.progressOne(); } Misc.waitFullSemaphore(semaphore, IxSettings.halAnalyzerThreadsNum); progressReport.done(); progressReport = new ProgressReport(calculatorsCount, 10, "w"); /* Przekaż w kolejności wyniki do contextWriter */ for (int i = 0; i < calculatorsCount; i++) { calculators[i].writeDownResult(contextWriter); progressReport.progressOne(); } /* Pobierz kolejną porcję wierszy tokenów, dla których będzie liczony kontekst */ calculatedForRows = matrixReader.readArrayRowsChunk(100); progressReport.done(); } /* Zakończ pracę */ contextWriter.finalize(); }
/// <summary> /// Zapisuje wynik - kontekst tokenu - do obiektu IxHalContext /// </summary> /// <param name="contextWriter">Obiekt IxHalContext do zapisu kontekstu</param> public void writeDownResult(IxHalContext contextWriter) { contextWriter.addContext(calculatedForRow.Key, tokenNearest); }