]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.mapping/src/org/simantics/mapping/pattern/MappingRule.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.mapping / src / org / simantics / mapping / pattern / MappingRule.java
diff --git a/bundles/org.simantics.mapping/src/org/simantics/mapping/pattern/MappingRule.java b/bundles/org.simantics.mapping/src/org/simantics/mapping/pattern/MappingRule.java
new file mode 100644 (file)
index 0000000..445f53e
--- /dev/null
@@ -0,0 +1,192 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.mapping.pattern;\r
+\r
+\r
+public class MappingRule {\r
+       /*\r
+       static final THashSet<Resource> EMPTY_SET = new THashSet<Resource>();\r
+       \r
+       THashMap<Resource, Resource> resourcesByDomains = new THashMap<Resource, Resource>();\r
+       Collection<IConstraint> constraints = new ArrayList<IConstraint>();\r
+       Collection<ConstraintGroup> constraintGroups = new ArrayList<ConstraintGroup>();\r
+       \r
+       static class ConstraintGroup {\r
+               Collection<IConstraint> constraints;\r
+               Collection<Resource> targets;\r
+               Collection<Resource> dependencies;\r
+       }\r
+       \r
+       class DirectedRuleBuilder {\r
+               THashSet<Resource> sourceResources = new THashSet<Resource>();\r
+               THashSet<Resource> targetResources = new THashSet<Resource>();\r
+               THashSet<IConstraint> sourceConstraints = new THashSet<IConstraint>();\r
+               THashSet<IConstraint> targetConstraints = new THashSet<IConstraint>();\r
+               TObjectIntHashMap<Resource> boundResources;\r
+               int id;\r
+               \r
+               Instruction root = new DummyInstruction();\r
+               Instruction cur = root;\r
+               \r
+               public DirectedRuleBuilder(final THashSet<Resource> sourceDomains,\r
+                               TObjectIntHashMap<Resource> boundResources, int id) {\r
+                       this.boundResources = boundResources;\r
+                       this.id = id;\r
+                       \r
+                       // Classify resources\r
+                       \r
+                       resourcesByDomains.forEachEntry(new TObjectObjectProcedure<Resource, Resource>() {\r
+\r
+                               @Override\r
+                               public boolean execute(Resource domain, Resource resource) {\r
+                                       if(sourceDomains.contains(domain))\r
+                                               sourceResources.add(resource);\r
+                                       else\r
+                                               targetResources.add(resource);\r
+                                       return true;\r
+                               }\r
+                               \r
+                       });\r
+                       \r
+                       // Classify constraints                 \r
+                       \r
+                       for(IConstraint constraint : constraints) {\r
+                               if(sourceResources.containsAll(constraint.binds()))\r
+                                       sourceConstraints.add(constraint);\r
+                               else\r
+                                       targetConstraints.add(constraint);\r
+                       }\r
+               }       \r
+               \r
+               int bestValue;\r
+               IConstraint bestConstraint;\r
+               \r
+               private void findBestConstraint(THashSet<IConstraint> constraints) {\r
+                       bestValue = 0;\r
+                       bestConstraint = null;\r
+                       sourceConstraints.forEach(new TObjectProcedure<IConstraint>() {\r
+                               \r
+                               @Override\r
+                               public boolean execute(IConstraint constraint) {\r
+                                       int temp = constraint.isApplicable(boundResources);\r
+                                       if(temp>bestValue) {\r
+                                               bestValue = temp;\r
+                                               bestConstraint = constraint;\r
+                                       }\r
+                                       return true;\r
+                               }\r
+                               \r
+                       });\r
+               }\r
+               \r
+               private void applyConstraint(THashSet<Resource> resources, IConstraint constraint) {\r
+                       THashSet<Resource> unbounded = new THashSet<Resource>();\r
+                       for(Resource r : constraint.binds())\r
+                               if(resources.remove(r)) {\r
+                                       unbounded.add(r);\r
+                                       boundResources.put(r, id++);\r
+                               }                                       \r
+                       Instruction temp = constraint.createQueryInstruction(boundResources, unbounded);\r
+                       cur.next = temp;\r
+                       cur = temp;                     \r
+               }\r
+               \r
+               private void applyConstraints(THashSet<Resource> resources, THashSet<IConstraint> constraints) {\r
+                       while(!constraints.isEmpty()) {\r
+                               findBestConstraint(constraints);                                \r
+                               if(bestConstraint != null) {\r
+                                       applyConstraint(resources, bestConstraint);\r
+                                       constraints.remove(bestConstraint);\r
+                               }\r
+                               else\r
+                                       throw new RuntimeException("Cannot form a directed mapping.");\r
+                       }\r
+               }\r
+               \r
+               public void orderSourceConstraints() {\r
+                       applyConstraints(sourceResources, sourceConstraints);\r
+                       if(!sourceResources.isEmpty())\r
+                               throw new RuntimeException("Couldn't bind all source resources");\r
+               }\r
+               \r
+               public void orderTargetConstraints() {\r
+                       THashSet<ConstraintGroup> groups = new THashSet<ConstraintGroup>(constraintGroups);\r
+                       while(!groups.isEmpty()) {\r
+                               \r
+                               // Find a suitable group\r
+                               \r
+                               final Ref<ConstraintGroup> possibleGroup = new Ref<ConstraintGroup>();\r
+                               final Collection<ConstraintGroup> removableGroups = new ArrayList<ConstraintGroup>();\r
+                               groups.forEach(new TObjectProcedure<ConstraintGroup>() {\r
+\r
+                                       @Override\r
+                                       public boolean execute(ConstraintGroup group) {\r
+                                               for(Resource target : group.targets)\r
+                                                       if(boundResources.containsKey(target)) {\r
+                                                               removableGroups.add(group);\r
+                                                               return true;\r
+                                                       }\r
+                                               for(Resource dep : group.dependencies)\r
+                                                       if(!boundResources.containsKey(dep))\r
+                                                               return true;\r
+                                               possibleGroup.value = group;\r
+                                               return false;\r
+                                       }\r
+                                       \r
+                               });\r
+                               groups.removeAll(removableGroups);\r
+                               if(possibleGroup.value == null) {\r
+                                       if(!groups.isEmpty())\r
+                                               throw new RuntimeException("Couldn't find a suitable group.");\r
+                                       break;\r
+                               }\r
+                               groups.remove(possibleGroup.value);\r
+                               ConstraintGroup group = possibleGroup.value;\r
+                                       \r
+                               // Order group constraints\r
+                               \r
+                               THashSet<IConstraint> groupConstraints = new THashSet<IConstraint>();\r
+                               for(IConstraint constraint : group.constraints)\r
+                                       if(targetConstraints.remove(constraint))\r
+                                               groupConstraints.add(constraint);\r
+                               \r
+                               applyConstraints(targetResources, groupConstraints);\r
+                               \r
+                               // Apply other constraints\r
+                               \r
+                               final Collection<IConstraint> removableConstraints = new ArrayList<IConstraint>();\r
+                               targetConstraints.forEach(new TObjectProcedure<IConstraint>() {\r
+\r
+                                       @Override\r
+                                       public boolean execute(IConstraint constraint) {\r
+                                               for(Resource r : constraint.binds())\r
+                                                       if(!boundResources.containsKey(r))\r
+                                                               return true;\r
+                                               \r
+                                               Instruction temp = constraint.createQueryInstruction(boundResources, EMPTY_SET);\r
+                                               cur.next = temp;\r
+                                               cur = temp;\r
+                                               \r
+                                               removableConstraints.add(constraint);\r
+                                               return true;\r
+                                       }\r
+                                       \r
+                               });\r
+                               targetConstraints.removeAll(removableConstraints);\r
+                       }\r
+                       if(!targetResources.isEmpty())\r
+                               throw new RuntimeException("Couldn't bind all target resources");\r
+               }\r
+               \r
+       }\r
+       */\r
+}\r