Почему производительность проверки согласованности двух моделей в Alloy не отличается?

У меня есть две модели, как показано ниже. Первый описывает модель. Пол узла и связанные с ним ребра и ограничения удалены во второй модели. введите здесь описание изображения

//Signatures for nodes
sig NPerson{}
abstract sig NGender{}
abstract sig NCivilStatus{}
lone sig Nmale, Nfemale extends NGender{}
lone sig Nmarried, Nsingle, Ndivorced, Nwidowed extends NCivilStatus{}

//Signatures for edges
sig Ehusband{src:one NPerson, trg:one NPerson}
sig Ewife{src:one NPerson, trg:one NPerson}
sig EpGender{src:one NPerson, trg:one NGender}
sig EpCivstat{src:one NPerson, trg:one NCivilStatus}

//facts
fact HasHusbandIsMarried{
    all h:Ehusband|let P0=h.src,P1=h.trg|
    (P0=h.src and P1=h.trg) implies (some civstat0:EpCivstat|let married=civstat0.trg|
    (civstat0.src=P0 and married in Nmarried)) 
}

fact inv_Ewife_Ehusband{
    all x:NPerson, y:NPerson| (some xy:Ehusband| xy.src=x and xy.trg=y) <=>  (some yx:Ewife| yx.src=y and yx.trg=x) 
}

fact multi_EpCivstat{
    //mulitplicity on pCivstat:Person->CivilStatusmin:1;max:1
    all n:(NPerson)| let count = #{e:(EpCivstat)| e.src = n}| count>=1 and count <=1}

fact MarriedWithoutHusband{
    all civstat0:EpCivstat|let P0=civstat0.src,married=civstat0.trg|
    married in Nmarried and not (some h:Ehusband|let P2=h.trg|
    h.src=P0) implies (some w:Ewife|let P1=w.trg|
    w.src=P0) 
}

fact HasWifeIsMarried{
    all wife0:Ewife|let P1=wife0.src,Person1=wife0.trg|
    (P1=wife0.src and Person1=wife0.trg) implies (some civstat0:EpCivstat|let married=civstat0.trg|
    (civstat0.src=P1 and married in Nmarried)) 
}

fact multi_EpGender{
    //mulitplicity on pGender:Person->Gendermin:1;max:1
    all n:(NPerson)| let count = #{e:(EpGender)| e.src = n}| count>=1 and count <=1}

fact mult1_Ehusband{
    //mulitplicity on husband:Person->Person[0,1]
    all n:(NPerson)| lone e:(Ehusband)|e.src=n
}

fact mult1_Ewife{
    //mulitplicity on wife:Person->Person[0,1]
    all n:(NPerson)| lone e:(Ewife)|e.src=n
}

fact xor_Ewife_Ehusband{
    //XOR constraint between wife:Person->Person and husband:Person->Person
    all n:(NPerson) | let e1 = (some e : Ewife | e.src = n), e2=(some e : Ehusband | e.src = n)|(e1 or e2) and not(e1 and e2)
}

fact MarriedWithoutWife{
    all s:EpCivstat|let p1=s.src,married=s.trg|
    married in Nmarried and not (some w:Ewife|let p3=w.trg|
    w.src=p1) implies (some h:Ehusband|let p2=h.trg|
    h.src=p1) 
}

fact surj_EpGender{
    //surjective on pGender:Person->Gender
    all n:(NGender)| some e:(EpGender)| e.trg = n
}

fact irr_Ehusband{
    //reflexive on husband:Person->Person
    no e:(Ehusband)| e.src = e.trg
}

fact AtLeastOneSingle{
    some civstat0:EpCivstat|let P0=civstat0.src,single=civstat0.trg|
    single in Nsingle
}

fact surj_EpCivstat{
    //surjective on pCivstat:Person->CivilStatus
    all n:(NCivilStatus)| some e:(EpCivstat)| e.trg = n
}

fact irr_Ewife{
    //reflexive on wife:Person->Person
    no e:(Ewife)| e.src = e.trg
}

Вторая модель из сплава

//Signatures for edges
sig Ehusband{src:one NPerson, trg:one NPerson}
sig Ewife{src:one NPerson, trg:one NPerson}
sig EpCivstat{src:one NPerson, trg:one NCivilStatus}

//facts
fact HasHusbandIsMarried{
    all h:Ehusband|let P0=h.src,P1=h.trg|
    (P0=h.src and P1=h.trg) implies (some civstat0:EpCivstat|let married=civstat0.trg|
    (civstat0.src=P0 and married in Nmarried)) 
}

fact inv_Ewife_Ehusband{
    all x:NPerson, y:NPerson| (some xy:Ehusband| xy.src=x and xy.trg=y) <=>  (some yx:Ewife| yx.src=y and yx.trg=x) 
}

fact multi_EpCivstat{
    //mulitplicity on pCivstat:Person->CivilStatusmin:1;max:1
    all n:(NPerson)| let count = #{e:(EpCivstat)| e.src = n}| count>=1 and count <=1}

fact MarriedWithoutHusband{
    all civstat0:EpCivstat|let P0=civstat0.src,married=civstat0.trg|
    married in Nmarried and not (some h:Ehusband|let P2=h.trg|
    h.src=P0) implies (some w:Ewife|let P1=w.trg|
    w.src=P0) 
}

fact HasWifeIsMarried{
    all wife0:Ewife|let P1=wife0.src,Person1=wife0.trg|
    (P1=wife0.src and Person1=wife0.trg) implies (some civstat0:EpCivstat|let married=civstat0.trg|
    (civstat0.src=P1 and married in Nmarried)) 
}

fact mult1_Ehusband{
    //mulitplicity on husband:Person->Person[0,1]
    all n:(NPerson)| lone e:(Ehusband)|e.src=n
}

fact mult1_Ewife{
    //mulitplicity on wife:Person->Person[0,1]
    all n:(NPerson)| lone e:(Ewife)|e.src=n
}

fact xor_Ewife_Ehusband{
    //XOR constraint between wife:Person->Person and husband:Person->Person
    all n:(NPerson) | let e1 = (some e : Ewife | e.src = n), e2=(some e : Ehusband | e.src = n)|(e1 or e2) and not(e1 and e2)
}

fact MarriedWithoutWife{
    all s:EpCivstat|let p1=s.src,married=s.trg|
    married in Nmarried and not (some w:Ewife|let p3=w.trg|
    w.src=p1) implies (some h:Ehusband|let p2=h.trg|
    h.src=p1) 
}

fact irr_Ehusband{
    //reflexive on husband:Person->Person
    no e:(Ehusband)| e.src = e.trg
}

fact AtLeastOneSingle{
    some civstat0:EpCivstat|let P0=civstat0.src,single=civstat0.trg|
    single in Nsingle
}

fact surj_EpCivstat{
    //surjective on pCivstat:Person->CivilStatus
    all n:(NCivilStatus)| some e:(EpCivstat)| e.trg = n
}

fact irr_Ewife{
    //reflexive on wife:Person->Person
    no e:(Ewife)| e.src = e.trg
}

Я использую run{} для проверки согласованности двух моделей. Две модели не имеют экземпляра. Я хочу увидеть разницу в производительности. Поэтому я использую прицел до 23. Но результат не тот, что я ожидал.

Модель несовместима. Таким образом, чтобы найти действительный экземпляр модели или установить, что экземпляров нет, я ожидаю, что анализатору потребуется проверить все возможные экземпляры модели. Интуитивно понятно, что если мы удалим часть структуры, должно быть меньше возможных экземпляров для проверки, а это означает, что проверка должна занимать меньше времени.

Но производительность второй модели еще хуже, чем у первой модели. Ниже указано время проверки в мс для двух моделей.

Scope m1    m2
3   158     11
4   95      59
5   109     105
6   245     157
7   364     256
8   871     402
9   1652    646
10  1861    1479
11  1406    2418
12  5421    4343
13  6886    2609
14  10425   6553
15  13081   5871
16  19731   19453
17  16491   22249
18  21984   18191
19  39671   45510
20  60001   49958
21  67709   67892
22  101256  97801
23  135082  168585

Кто-нибудь может объяснить причину?


person wxlfrank    schedule 27.03.2015    source источник


Ответы (1)


На очень высоком уровне абстракции я думаю, что ответ на вашу загадку лежит в обсуждении в разделе 2.2 Джексона Абстракции программного обеспечения:

Разумеется, анализатор не строит и не проверяет каждый случай отдельно; даже если он использовал только один процессорный цикл на случай, 1030 случаев [как в примере, приведенном ранее в разд. 2.2] все равно займет больше времени, чем возраст Вселенной. Обрезая дерево возможностей, можно исключить большие подпространства, не исследуя их полностью.

Можно предположить (но я этого не измерял!), что когда вторая модель устраняет некоторые ограничения, становится труднее сократить пространство поиска. (Чтобы измерить это, я хотел бы посмотреть, смогу ли я построить третью модель, которая сохраняет дополнительные подписи, но не ограничения, и посмотреть, как сравниваются ее времена.)

Производительность — это почти всегда сложный вопрос; вы сделали правильный первый шаг, измеряя, а не просто размышляя.

[Postscript] На более низком уровне абстракции я добавил пустой предикат и команду run к каждой из двух моделей, включенных в вопрос, восстановил некоторые отсутствующие объявления подписи во второй и сравнил время потребовался поиск экземпляра в области по умолчанию. Мне не ясно, есть ли постоянная разница между двумя моделями с точки зрения производительности. На первый взгляд кажется, что иногда различия между запусками одной и той же модели в одном и том же объеме больше, чем между моделями 1 и 2.

Scope  Model 1...............  Model 2...............
       Trans.   Solve   Total  Trans.   Solve   Total

    3     132      32     164      17      11      28
           68      13      81      12      15      27 
           31      13      44      14       6      20
           23      12      35      10      47      57 
           13      16      29       9      15      24

    5      59      86     145      38     180     218
           37      88     125      54     103     157
           45      95     140      51     106     157
           31      89     120      24      89     113
           58      93     151      24      91     115

   10     640    6997    7637     140   13746   13886
          169    7237    7406     214   13717   13931
          189    6704    6893     188   15107   15295

   15     592   82872   83464     472   15522   15994
          543   78690   79233     574   16396   16970

   20    2701  840961  843662    1179 1082708 1083887

И снова взглянув на время, которое вы сообщаете, я не вижу никаких указаний на состояние дел, которое вы описываете:

Но производительность второй модели еще хуже, чем у первой модели.

Напротив, в 16 из 21 прицелов, для которых вы указываете время, модель 2 работает быстрее, а не медленнее. И в любом случае разница не особенно бросается в глаза: время, которое вы сообщаете для двух моделей, находится в пределах десяти-пятнадцати процентов для большинства осциллографов и примерно одного порядка почти для всех осциллографов. (Поэтому, если вы теперь скажете мне, что столбцы были перевернуты для некоторых или всех строк, мой ответ по-прежнему будет «скажите мне, почему вы думаете, что это указывает на загадочную разницу в производительности».)

person C. M. Sperberg-McQueen    schedule 27.03.2015
comment
Вторая модель удаляет не только ограничения, но и часть структуры: две подписи. - person wxlfrank; 28.03.2015
comment
Да, это так. (На самом деле, больше похоже на восемь подписей, судя по разнице между двумя файлами, которые вы показали выше, но похоже, что некоторые из них были удалены случайно в версии, которую вы вставили сюда.) удаление двух подписей больше повлияет на скорость, чем удаление ограничений. Вы говорите, что вторая модель медленнее; если да, то вы знаете, какое изменение имело большее значение. Но данные, которые вы сообщаете, говорят об обратном. - person C. M. Sperberg-McQueen; 28.03.2015
comment
Но теоретически, если рассматривать анализ в Alloy как проверку дерева возможностей. Дерево возможностей для M2 содержится в дереве для M1 для каждой области. Структура M1-M2 и связанные с ней ограничения не влияют на дерево возможностей для M2. Подумай об этом. Поскольку каждый тестовый пример M2 не является экземпляром M2, он никогда не станет экземпляром M1 при добавлении элементов, типизированных Gender или gGender (M1-M2). - person wxlfrank; 15.05.2015
comment
Это означает, что тестовых случаев, проверенных на соответствие M2, меньше, чем тестовых случаев, проверенных на соответствие M1. Таким образом, производительность для M2 всегда должна быть лучше, чем для M1, особенно при увеличении объема. Однако ваш отчет также показывает результат, противоположный ожидаемому. - person wxlfrank; 15.05.2015
comment
Два очка. (1) Вы, кажется, предполагаете, что чем больше пространство возможных экземпляров, тем Анализатору придется исследовать больше случаев, чтобы исчерпать пространство. Но количество случаев, которые будет исследовать Анализатор, зависит не только от размера пространства возможностей, но и от количества возможностей, которые Анализатор может исключить, обрезав дерево, которое будет зависеть от многих других вещей, кроме размера дерева. И (2) вы, кажется, считаете, что здесь есть значительная и постоянная разница в производительности; Зачем? Цифры, кажется, не показывают. - person C. M. Sperberg-McQueen; 29.05.2015
comment
Я согласен со следующим вашим утверждением. количество случаев, которые будет исследовать Анализатор, зависит не только от размера пространства возможностей, но также и от количества возможностей, которые Анализатор может исключить путем обрезки дерева, что будет зависеть от многих других вещей, кроме размера tree Чтобы показать, что я правильно понимаю ваше высказывание, я даю демонстрацию. В примере у человека должен быть пол. Таким образом, когда Анализатор проверяет тестовые наборы, тестовые наборы, в которых человек не имеет пола или имеет более одного пола, НЕ будут проверяться. Я прав? - person wxlfrank; 01.06.2015