Полигон алгоритмов/Пошаговая реализация собственного алгоритма
Материал из MachineLearning.
(Новая: __NOTOC__ В данной инструкции описывается реализация программы, отвечающей за проведение тестирования В...) |
(→4. Напишите логику работы с сервисом) |
||
Строка 90: | Строка 90: | ||
=4. Напишите логику работы с сервисом= | =4. Напишите логику работы с сервисом= | ||
+ | Данный код следует писать в функции ''Main'' файла ''Program.cs''. | ||
+ | |||
+ | a. Поскольку при вызове любой функции сервиса требуются параметры авторизации, введите переменные, отвечающие за эти данные. | ||
+ | :<code> | ||
+ | :const string algSynonim = "algSynonim"; | ||
+ | :const string algPassword = "algPassword";</code> | ||
+ | |||
+ | b. Рассмотрим схему получения и обработки одного задания алгоритмом со вставками кода: | ||
+ | |||
+ | # запрос задания для алгоритма | ||
+ | #:<code>ProcessingTask procTask = procService.GetTask(algSynonim, algPassword);</code> | ||
+ | # если задание получено и не было ошибки, то запрос данных задачи | ||
+ | #:<code>ProblemData data = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);</code> | ||
+ | # тестирование алгоритма на полученном задании (подробнее в пункте Логика тестирования алгоритма на задании) | ||
+ | #:В результате тестирования возвращаются наборы результатов теста на обучении и на контроле: | ||
+ | #:<code>//Определение числа тестов | ||
+ | #:int learnTaskCount = procTask.LearnIndexes.Length; | ||
+ | #://создание наборов результатов тестов | ||
+ | #:var learnResults = new List<TestResult>(learnTaskCount); | ||
+ | #:var testResults = new List<TestResult>(learnTaskCount);</code> | ||
+ | # регистрация результатов | ||
+ | #:<code> | ||
+ | #:ProcessingState state = procService.RegisterResult | ||
+ | #:(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray()); | ||
+ | #:</code> | ||
+ | Полный код простой логики запроса и обработки одного задания: | ||
+ | :<code> | ||
+ | ://Запрос задания для алгоритма | ||
+ | |||
+ | :ProcessingTask procTask = procService.GetTask(algSynonim, algPassword); | ||
+ | |||
+ | |||
+ | |||
+ | :if (procTask != null) | ||
+ | |||
+ | :{ | ||
+ | |||
+ | :://Проверка на ошибку при получении задания | ||
+ | |||
+ | ::if (procTask.ProcessingState.Status == StatusType.Error) | ||
+ | |||
+ | :::throw new Exception("Задание возвращено с ошибкой: " + procTask.ProcessingState.Message); | ||
+ | |||
+ | |||
+ | :://Если задание есть и не было ошибки, надо получить данные по задаче | ||
+ | |||
+ | ::ProblemData data = procService.GetProblem(algSynonim, algPassword,procTask.ProblemSynonim); | ||
+ | |||
+ | |||
+ | :://Проверка на ошибку при получении данных задачи | ||
+ | |||
+ | ::if (data.ProcessingState.Status == StatusType.Error) | ||
+ | |||
+ | :::throw new Exception("Данные задачи возвращены с ошибкой: " + procTask.ProcessingState.Message); | ||
+ | |||
+ | |||
+ | :://Определение числа тестов | ||
+ | |||
+ | ::int learnTaskCount = procTask.LearnIndexes.Length; | ||
+ | |||
+ | |||
+ | :://создание наборов результатов тестов | ||
+ | |||
+ | ::var learnResults = new List<TestResult>(learnTaskCount); | ||
+ | |||
+ | ::var testResults = new List<TestResult>(learnTaskCount); | ||
+ | |||
+ | |||
+ | ::/* | ||
+ | |||
+ | ::Код обработки задания (заполнение списков learnResults и testResults) | ||
+ | |||
+ | :: */ | ||
+ | |||
+ | |||
+ | :://Регистрация результатов | ||
+ | |||
+ | ::ProcessingState state = procService.RegisterResult(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray()); | ||
+ | |||
+ | |||
+ | :://Проверка на ошибки при сохранении результатов: | ||
+ | |||
+ | ::if (state.Status == StatusType.Warning) | ||
+ | |||
+ | :::throw new Exception("При сохранении результата" + procTask.PocketId + " было выдано предупреждение: " + state.Message); | ||
+ | |||
+ | ::if (state.Status == StatusType.Error) | ||
+ | |||
+ | :::throw new Exception("Произошла ошибка при сохранении результата" + procTask.PocketId + ": " + state.Message); | ||
+ | |||
+ | :}</code> | ||
=5. Напишите логику тестирования алгоритма на задании= | =5. Напишите логику тестирования алгоритма на задании= |
Версия 20:38, 2 апреля 2010
В данной инструкции описывается реализация программы, отвечающей за проведение тестирования Вашего алгоритма системой Полигон. Взаимодействие с системой происходит при помощи веб-сервиса, к которому обращается программа. Алгоритм должен периодически запрашивать новые задания на тестирование, каждое из которых содержит несколько тестов (т.е. несколько обучающих и контрольных подвыборок данных задачи). При получении задания алгоритм должен рассчитать его и сохранить полученные результаты через веб-сервис. Подробнее о взаимодействии системы Полигон с пользовательскими алгоритмами и описание функций веб-сервиса смотрите здесь.
Далее описывается написание программы алгоритма на C# в Microsoft Visual Studio 2008. Соответствующую реализованную программу можно скачать по адресу http://poligon.machinelearning.ru/files/ExampleAlg.rar
Скачать данную инструкцию в формате pdf можно здесь
- Создайте новый проект
- Добавьте в проект Web Reference на обрабатывающий сервис системы
- Добавьте Web Reference на тестовый сервис системы
- Напишите логику работы с сервисом
- Напишите логику тестирования алгоритма на задании
- Напишите код самого алгоритма
- Протестируйте взаимодействие алгоритма с системой, работу алгоритма
- Зарегистрируйте алгоритм на сайте
- Проверьте работоспособность алгоритма на сайте: создание отчета, запуск программы алгоритма, просмотр отчета
1. Создайте новый проект
Создайте новый проект типа ConsoleApplication. Дайте ему название. В нашем примере используется название TestServiceAlgorithm.
2. Добавьте в проект Web Reference на обрабатывающий сервис системы
a. Правой кнопкой нажмите на название проекта в Solution Explorer, выберете пункт Add Service Reference
b. В появившемся окне в левом нижнем углу нажмите на кнопку “Advanced…”
c. В появившемся окне в левом нижнем углу нажмите на кнопку “Add Web Reference…”
d. Введите URL-адрес веб-сервиса: http://poligon.machinelearning.ru/ProcessingService.asmx. Нажмите на кнопку “Go”
e. Назовите новый Web Reference подходящим образом
f.Нажмите на кнопку "Add Reference"
В нашем проекте появляется новый namespace <название проекта>.<объявленное название web reference> (в нашем случае TestServiceAlgorithm.ProcessService), содержащий все типы и функции веб-сервиса. Включите данный namespace во все используемые файлы кода (Program.cs):
using TestServiceAlgorithm.ProcessService
;
Для обращения к функциям сервиса создайте экземпляр класса ProcessingService, описание которого находится в подключенном namespace:
var procService = new ProcessingService()
;
3. Добавьте Web Reference на тестовый сервис системы
Аналогичным образом добавьте в проект тестовый веб-сервис, который расположен по адресу http://poligon.machinelearning.ru/TestService.asmx. В данном примере этот web reference называется TestService. Тогда для использования функций тестового сервиса вместо обрабатывающего нужно подключать namespace, соответствующий тестовому сервису:
using TestServiceAlgorithm.TestService;
И для обращения к функциям тестового сервиса нужно создать экземпляр класса TestService, находящийся в данном namespace:
var procService = new TestService();
При настройке взаимодействия и отладке работы алгоритма следует обращаться именно к тестовому сервису.
Далее считаем, что переменная procService соответствует нужному нам сервису.
4. Напишите логику работы с сервисом
Данный код следует писать в функции Main файла Program.cs.
a. Поскольку при вызове любой функции сервиса требуются параметры авторизации, введите переменные, отвечающие за эти данные.
- const string algSynonim = "algSynonim";
- const string algPassword = "algPassword";
b. Рассмотрим схему получения и обработки одного задания алгоритмом со вставками кода:
- запрос задания для алгоритма
ProcessingTask procTask = procService.GetTask(algSynonim, algPassword);
- если задание получено и не было ошибки, то запрос данных задачи
ProblemData data = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);
- тестирование алгоритма на полученном задании (подробнее в пункте Логика тестирования алгоритма на задании)
- В результате тестирования возвращаются наборы результатов теста на обучении и на контроле:
//Определение числа тестов
- int learnTaskCount = procTask.LearnIndexes.Length;
- //создание наборов результатов тестов
- var learnResults = new List<TestResult>(learnTaskCount);
- var testResults = new List<TestResult>(learnTaskCount);
- регистрация результатов
- ProcessingState state = procService.RegisterResult
- (algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());
Полный код простой логики запроса и обработки одного задания:
- //Запрос задания для алгоритма
- ProcessingTask procTask = procService.GetTask(algSynonim, algPassword);
- if (procTask != null)
- {
- //Проверка на ошибку при получении задания
- if (procTask.ProcessingState.Status == StatusType.Error)
- throw new Exception("Задание возвращено с ошибкой: " + procTask.ProcessingState.Message);
- //Если задание есть и не было ошибки, надо получить данные по задаче
- ProblemData data = procService.GetProblem(algSynonim, algPassword,procTask.ProblemSynonim);
- //Проверка на ошибку при получении данных задачи
- if (data.ProcessingState.Status == StatusType.Error)
- throw new Exception("Данные задачи возвращены с ошибкой: " + procTask.ProcessingState.Message);
- //Определение числа тестов
- int learnTaskCount = procTask.LearnIndexes.Length;
- //создание наборов результатов тестов
- var learnResults = new List<TestResult>(learnTaskCount);
- var testResults = new List<TestResult>(learnTaskCount);
- /*
- Код обработки задания (заполнение списков learnResults и testResults)
- */
- //Регистрация результатов
- ProcessingState state = procService.RegisterResult(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());
- //Проверка на ошибки при сохранении результатов:
- if (state.Status == StatusType.Warning)
- throw new Exception("При сохранении результата" + procTask.PocketId + " было выдано предупреждение: " + state.Message);
- if (state.Status == StatusType.Error)
- throw new Exception("Произошла ошибка при сохранении результата" + procTask.PocketId + ": " + state.Message);
- }
5. Напишите логику тестирования алгоритма на задании
6. Напишите код самого алгоритма
7. Протестируйте взаимодействие алгоритма с системой, работу алгоритма
8. Зарегистрируйте алгоритм на сайте
9. Проверьте работоспособность алгоритма на сайте: создание отчета, запуск программы алгоритма, просмотр отчета
Статья в настоящий момент дорабатывается. Sintsova 00:16, 3 апреля 2010 (MSD) |