Автоматик коде. СанктПетербургский государственный
Скачать 0.58 Mb.
|
Расширенная модель корректного кодаНовые признаки и их извлечениеНовое исправление изменяет два места в программе: добавляет утвер- ждение перед вызывающим кодом и удаляет утверждение внутри функ- ции, поэтому необходимо при обходе кандидата учитывать и извлекать признаки с двух мест в программе. Внутри кандидата хранится набор базовых действий, которые необ- ходимы для реализации исправления. При обходе кандидата Prophet учитывал только первое действие, так как второе возможное действие было изменение выражения внутри утверждения, признаки которого извлекались отдельно. В итоге при обходе была добавлена поддержка нескольких различных действий, в результате общий набор признаков можно вычислить по формуле: F= R+ n∗ M (1) F – общий набор признаков, соответствующий исправлению; R – вид исправления; M – все исходные признаки состояния и признаки модификаций без вида исправления; n – максимальное число действий, поддерживаемое изменением (при n = 1 получится исходная формула). В результате признаков стало 7206 (было 3515) из-за добавления нового вида исправления (MoveStmtRepair) и задания максимального числа действий (n), равное двум. Обучение моделиДля процесса обучения была добавлена поддержка исправлений ви- да FunctionMutationв скрипт, сравнивающий исправления разработчи- ка с сгенерированным исправлением. Впоследствии с использованием данного скрипта был проведен анализ тренировочной выборки по ви- дам исправлений, необходимых для исправления ошибки. Результаты показаны в таблице 1. Таблица 1: Число ошибок каждого вида в тренировочном наборе, где по горизонтали – название проектов из тренировочного датасета, по вертикали – вид исправления В силу того, что примеров для обучения мало и данные в трени- ровочном и тестирующем наборе пересекаются, Prophet для каждого проекта обучает свою модель на общих данных посредством исключе- ния этого проекта из обучающего датасета. Интересно, что ошибка, требующая инициализации переменной (php- 309516-309535), исправлятся в тестовом наборе данных, несмотря на отсутствие примеров в обучающем датасете. Это можно объяснить от- сутствием в пространстве поиска других исправлений, проходящих все тесты, и использованием ранга локации при подсчете конечной оценки. В ходе анализа было выявлено, что исправлений вида FunctionMutationв тренировочной выборке нет (единственный пример соответствует ошиб- ке в тестовом наборе). В итоге пришлось добавить искусственные при- меры для обучения модели. Зависимость числа примеров и ранга схемы трансформации3 для правильного исправления для php-308525-308529 3Схемы трансформации включают в себя конкретные схемы изменений и схемы с абстрактным условием. Ранг схемы трансформации – порядковый номер схемы трансформации, упорядоченный по вероятностной оценке, где низкий приоритет имеют ранги исправлений наиболее соответствующие успешным исправлениям с высокой оценкой. показана в таблице 2. Таблица 2: Зависимость числа дополнительных примеров и ранжиро- вания правильного исправления для php-308525-308529 Среди добавленных примеров первый пример соответствует зануле- нию индекса массива, который передается функции как указатель. Вто- рой пример соответствует присваиванию глобальной переменной значе- ния глобальной константы. В третьем примере происходит обнуление массива внутри объекта, переданного по ссылке в качестве входного параметра функции. В четвертом примере происходит присваивание значения по умолчанию глобальной переменной. В результате четырех примеров было достаточно для обучения мо- дели. Следует отметить, что все три исправления вида FunctionMutationимеют достаточно высокий ранг схемы трансформации, поэтому не бы- ло необходимости в добавлении новых примеров. Данное наблюдение можно объяснить генерацией малого число исправлений такого вида и следовательно слабым влиянием на среднюю долю кандидатов, ко- торые имеют ранг выше, чем правильное исправление разработчика в тренировочной выборке. |