1 package org.simantics.graph.matching;
3 import gnu.trove.map.hash.TIntIntHashMap;
5 import java.util.ArrayList;
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;
16 public class CanonicalGraph {
20 TIntIntHashMap inverses = new TIntIntHashMap();
21 Identity[] identities;
25 public CanonicalGraph(TransferableGraph1 tg) {
26 this.resourceCount = tg.resourceCount;
27 this.identities = tg.identities;
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);
35 for(int i=0;i<oldStatements.length;i+=4) {
36 int p = oldStatements[i+1];
37 int inv = oldStatements[i+2];
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];
50 if(inverses.contains(p))
51 inv = inverses.get(p);
53 inv = resourceCount++;
58 newStatements[s].add(new Stat(p, o));
59 newStatements[o].add(new Stat(inv, s));
63 Stat[][] statements = new Stat[resourceCount][];
64 for(int i=0;i<tg.resourceCount;++i) {
65 int size = newStatements[i].size();
67 statements[i] = Stat.NO_STATS;
69 statements[i] = newStatements[i].toArray(new Stat[size]);
71 for(int i=tg.resourceCount;i<resourceCount;++i)
72 statements[i] = Stat.NO_STATS;
73 this.statements = statements;
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 + ")";
88 for(int i=0;i<tg.resourceCount;++i)
91 for(int i=tg.resourceCount;i<resourceCount;++i)
92 names[i] = "inverse(" + names[inverses.get(i)] + ")";
97 Variant[] values = new Variant[resourceCount];
98 for(Value value : tg.values)
99 values[value.resource] = value.value;
100 this.values = values;