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