notice and save changes to graph name / stemma identifier (tla/stemmaweb#28)
[scpubgit/stemmatology.git] / analysis / idp_server / findGroupings.idp
1 vocabulary V1 {
2   extern vocabulary V
3   SourceOf(Variant): Manuscript
4 }
5
6 theory T1 : V1 {
7   ! x : (x ~= SourceOf(VariantOf(x))) => ? y : CopiedBy(y,x) & VariantOf(y) = VariantOf(x).
8 }
9
10 procedure check(sample) {
11   stdoptions.groundwithbounds=false
12   stdoptions.symmetrybreaking="static"
13   idpintern.setvocabulary(sample,V1)
14   return onemodel(T1,sample)
15 }
16
17 procedure findGroupings(samples) {
18   local result = {}
19   for _,sample in ipairs(samples) do
20   -- Find out whether the sample fits the stemma.
21     local model = check(sample)
22     if model then
23       table.insert(result,{ getGrouping(model), true })
24     else
25       table.insert(result,{ getGrouping(sample), false })
26     end
27   end
28   return result
29 }
30
31 procedure getGrouping(model) {
32   local grouping = {}
33   for tuple in tuples(model[V::VariantOf].graph.ct) do
34     local manuscript, variant = tuple[1], tuple[2]
35     if grouping[variant] == nil then 
36       grouping[variant] = {manuscript}
37     else
38       table.insert(grouping[variant],manuscript)
39     end
40   end
41   return grouping
42 }