MessageDataPtr Container::Recognize() { Split(); const TrainingWindowPtr training_window = MakeTrainingWindow(training_image_); const WorkingWindowPtr working_window = MakeWorkingWindow(working_image_); Encoder encoder; encoder.Prepare(); unsigned recognize_slide_count = 0; while (training_window->Next() && working_window->Next()) { training_window->CalculateProbabilities(); unsigned iterations_count = training_window->PixelIterationsCount(); for (unsigned iterations_counter = 0 ; iterations_counter != iterations_count ; ++iterations_counter) { for (int i = 0; i != 3; ++i) { const int context = training_window->GetContext(iterations_counter, i); if (!training_window->IsValidContext(context, i)) { continue; } const std::pair<double, double> probabilities = training_window->GetProbabilitiesByContext(context, i); const double probability0 = probabilities.first; const double probability1 = probabilities.second; encoder.StartModel(probability0, probability1); const unsigned char encoded_symbol = working_window->Read(iterations_counter, i); encoder.DecodeNext(encoded_symbol); } } ++recognize_slide_count; } return encoder.RecognizedData(); }