]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph/src/org/simantics/graph/matching/CanonicalGraph.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph / src / org / simantics / graph / matching / CanonicalGraph.java
1 package org.simantics.graph.matching;\r
2 \r
3 import gnu.trove.map.hash.TIntIntHashMap;\r
4 \r
5 import java.util.ArrayList;\r
6 \r
7 import org.simantics.databoard.binding.mutable.Variant;\r
8 import org.simantics.graph.representation.External;\r
9 import org.simantics.graph.representation.Identity;\r
10 import org.simantics.graph.representation.Internal;\r
11 import org.simantics.graph.representation.Optional;\r
12 import org.simantics.graph.representation.Root;\r
13 import org.simantics.graph.representation.TransferableGraph1;\r
14 import org.simantics.graph.representation.Value;\r
15 \r
16 public class CanonicalGraph {\r
17 \r
18         int resourceCount;\r
19         Stat[][] statements;\r
20         TIntIntHashMap inverses = new TIntIntHashMap();\r
21         Identity[] identities;\r
22         String[] names;\r
23         Variant[] values;\r
24         \r
25         public CanonicalGraph(TransferableGraph1 tg) {\r
26                 this.resourceCount = tg.resourceCount;\r
27                 this.identities = tg.identities;\r
28                 \r
29                 int[] oldStatements = tg.statements;\r
30                 @SuppressWarnings("unchecked")\r
31                 ArrayList<Stat>[] newStatements = new ArrayList[tg.resourceCount];\r
32                 for(int i=0;i<newStatements.length;++i)\r
33                         newStatements[i] = new ArrayList<Stat>(2);\r
34                 \r
35                 for(int i=0;i<oldStatements.length;i+=4) {\r
36                         int p = oldStatements[i+1];\r
37                         int inv = oldStatements[i+2];\r
38                         if(inv >= 0) {\r
39                                 inverses.put(p, inv);\r
40                                 inverses.put(inv, p);\r
41                         }\r
42                 }\r
43                 \r
44                 for(int i=0;i<oldStatements.length;i+=4) {\r
45                         int s = oldStatements[i];\r
46                         int p = oldStatements[i+1];\r
47                         int inv = oldStatements[i+2];\r
48                         int o = oldStatements[i+3];\r
49                         if(inv < 0) {\r
50                                 if(inverses.contains(p))\r
51                                         inv = inverses.get(p);\r
52                                 else {\r
53                                         inv = resourceCount++;\r
54                                         inverses.put(p, inv);\r
55                                         inverses.put(inv, p);\r
56                                 }\r
57                         }\r
58                         newStatements[s].add(new Stat(p, o));\r
59                         newStatements[o].add(new Stat(inv, s));\r
60                 }\r
61                 \r
62                 // Statements\r
63                 Stat[][] statements = new Stat[resourceCount][];\r
64                 for(int i=0;i<tg.resourceCount;++i) {\r
65                         int size = newStatements[i].size();\r
66                         if(size == 0)\r
67                                 statements[i] = Stat.NO_STATS;\r
68                         else\r
69                                 statements[i] = newStatements[i].toArray(new Stat[size]);\r
70                 }\r
71                 for(int i=tg.resourceCount;i<resourceCount;++i)\r
72                         statements[i] = Stat.NO_STATS;\r
73                 this.statements = statements;\r
74                 \r
75                 // Names\r
76                 if(GraphMatching.DEBUG) {\r
77                         names = new String[resourceCount];\r
78                         for(Identity id : identities) {\r
79                                 if(id.definition instanceof External)\r
80                                         names[id.resource] = ((External)id.definition).name;\r
81                                 else if(id.definition instanceof Internal)\r
82                                         names[id.resource] = ((Internal)id.definition).name;\r
83                                 else if(id.definition instanceof Optional)\r
84                                         names[id.resource] = ((Optional)id.definition).name;\r
85                                 else if(id.definition instanceof Root)\r
86                                         names[id.resource] = "ROOT(" + ((Root)id.definition).name + ")";\r
87                         }\r
88                         for(int i=0;i<tg.resourceCount;++i)\r
89                                 if(names[i] == null)\r
90                                         names[i] = "r" + i;\r
91                         for(int i=tg.resourceCount;i<resourceCount;++i)\r
92                                 names[i] = "inverse(" + names[inverses.get(i)] + ")";\r
93                 }\r
94                 \r
95                 // Values\r
96                 {\r
97                         Variant[] values = new Variant[resourceCount];\r
98                         for(Value value : tg.values)\r
99                                 values[value.resource] = value.value;\r
100                         this.values = values;\r
101                 }\r
102         }\r
103         \r
104 }\r