Project

General

Profile

EFSM Traversal » History » Version 3

Alexander Kamkin, 02/27/2014 08:18 PM

1 1 Alexander Kamkin
h1. EFSM Traversal
2
3 3 Alexander Kamkin
h2. Веронский алгоритм
4
5 1 Alexander Kamkin
Алгоритм в целом состоит из трёх фаз:
6 3 Alexander Kamkin
# Обучение (learning);
7
# Случайный обход (random walk);
8
# Поиск с возвратами (backjumping).
9 1 Alexander Kamkin
 
10 3 Alexander Kamkin
h3. Обучение
11
12
В ходе первой фазы анализируются зависимости переходов по данным и по управлению. Зависимость по данным: один переход устанавливает значение переменной, которую другой переход использует при вычислении значения другой переменной (внутренней или выходной). Зависимость по управлению: один переход устанавливает значение переменной, которая входит в условие срабатывания другого перехода.
13
14
Эти зависимости можно представить в виде ориентированного графа, в котором вершины — это переходы EFSM, а дуги представляют зависимости по данным/управлению.
15
Тут же происходит выявление счётчиков и зависимых от них переходов. Переменная _x_ считается счётчиком, если существует цикл, в который входит переход с условием срабатывания, зависящим от _x_, а также переход, в действии которого меняется значение _x_, причём значение _x_ прямо или косвенно зависит от предыдущего значения _x_.
16 2 Alexander Kamkin
 
17 3 Alexander Kamkin
h3. Случайный обход
18 1 Alexander Kamkin
19 3 Alexander Kamkin
На вход случайного обходчика подаётся два параметра: количество тестовых последовательностей и длина каждой последовательности. В цикле, пока количество тестовых последовательностей не достигнет максимального числа или пока не будут покрыты все переходы выполняются следующие действия:
20
21 1 Alexander Kamkin
# сброс состояния EFSM;
22
# генерация входных векторов в цикле, пока не будет достигнута максимальная длина текущей последовательности.
23
24
Входной вектор генерируется следующим образом:
25
26
# случайным образом выбирается один из переходов, исходящих из текущего состояния;
27 3 Alexander Kamkin
# делается попытка разрешить его условие срабатывания;
28
# если условие срабатывания разрешено:
29
## невовлечённым в него входным переменным присваиваются случайные значения;
30
## применяется действие перехода и обновляется состояние EFSM;
31
## выполненному переходу ставится в соответствие номер текущей последовательности и номер текущего её элемента.
32
### *TODO: Переходу или состоянию?*
33
# если условие срабатывания не разрешено:
34
## *TODO: Что делается в этом случае?*
35 1 Alexander Kamkin
36 3 Alexander Kamkin
h3. Поиск с возвратами
37 1 Alexander Kamkin
 
38 3 Alexander Kamkin
Составляется список непокрытых переходов, причём переходы, исходящие из посещённых на предыдущем этапе состояний, помещаются в начало списка. Затем циклически выполняются следующие действия:
39 1 Alexander Kamkin
40
# выбирается переход из начала списка;
41 3 Alexander Kamkin
# если его условие срабатывания зависит только от входных переменных:
42
## извлекается сохранённая на предыдущем шаге информация о достижимости начального состояния этого перехода;
43
## на основе этой информации к EFSM применяется соответствующая входная последовательность, и EFSM оказывается в начальном состоянии обрабатываемого перехода;
44
## разрешается условие срабатывания этого перехода;
45
### *TODO: А если условие неразрешимо?*
46
## переход удаляется из списка;
47
# если его условие срабатывания зависит не только от входных переменных:
48
## извлекается сохранённая на предыдущем шаге информация о достижимости начального состояния этого перехода;
49
## на основе этой информации к EFSM применяется соответствующая входная последовательность, и EFSM оказывается в начальном состоянии обрабатываемого перехода; ## делается попытка разрешить условие срабатывания этого перехода:
50
### если она успешна, переход удаляется из списка;
51
### если нет — обработка продолжается;
52
# на основании информации о зависимостях по данным извлекаются переходы, которые определяют значение переменных, входящих в условие срабатывания обрабатываемого перехода;
53
# для каждого из них (пусть это будет _t_) выполняются следующие действия:
54
## получить информацию о достижимости начального состояния _t_, выполнить соответствующую тестовую цепочку;
55
### *TODO: что делать, если начальное состояние _t_ недостижимо?*
56
## если переход _t_ не обновляет значение счётчика, при помощи алгоритма Дейкстры найти путь от _t_ к целевому переходу;
57
## если в _t_ обновляется значение счётчика, алгоритм Дейкстры применяется два раза: сначала, чтобы найти путь от конечного состояния _t_ до целевого перехода, а затем - чтобы найти путь из начального состояния _t_ в самого себя через _t_;
58
## при помощи решателя ограничений определяется, сколько раз необходимо пройти по второму пути (то есть по циклу), чтобы начать двигаться по первому;
59
### *TODO: как это делается?*
60
## построить ограничение в виде композиции действия перехода _t_ и условие срабатывания _t_ и целевого перехода;
61
## если это ограничение неразрешимо:
62
### перейти к следующему _t_;
63
## если это ограничение разрешимо:
64
### подать полученные значения входных переменных в EFSM;
65
### последовательно пройти по каждому переходу из найденного алгоритмом Дейкстры пути;
66
### если условие срабатывания какого-либо из переходов неразрешимо:
67
#### перейти к следующему _t_.