]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.equation/src/org/simantics/equation/solver/Solver.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.equation / src / org / simantics / equation / solver / Solver.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.equation.solver;\r
13 \r
14 import java.util.Collection;\r
15 import java.util.HashMap;\r
16 import java.util.Map;\r
17 \r
18 import org.simantics.db.ReadGraph;\r
19 import org.simantics.db.Resource;\r
20 import org.simantics.db.WriteGraph;\r
21 import org.simantics.db.exception.DatabaseException;\r
22 import org.simantics.equation.EquationResources;\r
23 \r
24 \r
25 public class Solver {\r
26 \r
27     private static Map<Resource,ExpressionSolver> solvers = new HashMap<Resource, ExpressionSolver>();\r
28 \r
29 \r
30     public static void addSolver(Resource res, ExpressionSolver solver) {\r
31         if (res == null || solver == null)\r
32             throw new NullPointerException("Expression solver must be bound to valid resource");\r
33         solvers.put(res, solver);\r
34     }\r
35 \r
36     public void evaluate(ReadGraph g, Resource r) throws DatabaseException {\r
37         if (g.isInstanceOf(r, EquationResources.equationResource.Expression)) {\r
38             Collection<Resource> types = g.getTypes(r);\r
39             ExpressionSolver solver = null;\r
40 \r
41             for (Resource res : types) {\r
42                 solver = solvers.get(res);\r
43                 if (solver != null)\r
44                     break;\r
45             }\r
46             solver.evaluate(this, g, r);\r
47         } else {\r
48             throw new IllegalArgumentException("Input is not an equation");\r
49         }\r
50     }\r
51 \r
52     Map<Resource,Object> valueMap = new HashMap<Resource,Object>();\r
53 \r
54     public Object getCachedValue(Resource res) {\r
55         return valueMap.get(res);\r
56     }\r
57 \r
58     public void setValue(Resource res, Object o) {\r
59         valueMap.put(res, o);\r
60     }\r
61 \r
62     public void clear() {\r
63         valueMap.clear();\r
64     }\r
65 \r
66     public double getDoubleValue(ReadGraph g, Resource d) throws DatabaseException {\r
67         Object o = getValue(g, d);\r
68         if (o instanceof double[])\r
69             return ((double[])o)[0];\r
70         if (o instanceof float[])\r
71             return ((float[])o)[0];\r
72         if (o instanceof int[])\r
73             return ((int[])o)[0];\r
74         if (o instanceof long[])\r
75             return ((long[])o)[0];\r
76         throw new RuntimeException("Cannot cast object to double " + o + "  " + o.getClass());\r
77     }\r
78 \r
79     public Object getValue(ReadGraph graph, Resource res) throws DatabaseException {\r
80         Object o = getCachedValue(res);\r
81         if (o == null) {\r
82             o = graph.getValue(res);\r
83         }\r
84         return o;\r
85     }\r
86 \r
87     public void pushToGraph(WriteGraph graph) throws DatabaseException {\r
88         for (Resource r : valueMap.keySet()) {\r
89             if (graph.isInstanceOf(r, EquationResources.builtins.Literal)) {\r
90                 Object value = valueMap.get(r);\r
91                 if (value instanceof boolean[] ||\r
92                         value instanceof byte[] ||\r
93                         value instanceof int[] ||\r
94                         value instanceof long[] ||\r
95                         value instanceof float[] ||\r
96                         value instanceof double[] ||\r
97                         value instanceof String[])\r
98                     graph.claimValue(r, value);\r
99                 else {\r
100                     throw new RuntimeException("Internal error, unknown datatype " + value.getClass());\r
101                 }\r
102             }\r
103         }\r
104     }\r
105 \r
106 }\r