package org.lemsml.jlems.core.type.dynamics; import java.util.ArrayList; import java.util.HashMap; import org.lemsml.jlems.core.annotation.ModelElement; import org.lemsml.jlems.core.annotation.ModelProperty; import org.lemsml.jlems.core.logging.E; import org.lemsml.jlems.core.run.KScheme; import org.lemsml.jlems.core.sim.ContentError; import org.lemsml.jlems.core.type.Children; import org.lemsml.jlems.core.type.Component; import org.lemsml.jlems.core.type.ComponentReference; import org.lemsml.jlems.core.type.ComponentType; @ModelElement(info="A kinetic scheme does not itself introduce any new elements or state variables. " + "It is rather a way of connecting quantities in existing components by saying that " + "quantities in the edge elements should be interpreted as transition rates among " + "quantities in the node elements. ") public class KineticScheme { @ModelProperty(info="") public String name; @ModelProperty(info="Source of notes for scheme") public String nodes; @ModelProperty(info="The element that provides the transitions for the scheme") public String edges; @ModelProperty(info="Name of state variable in state elements") public String stateVariable; @ModelProperty(info="The name of the attribute in the rate element that defines the source of the transition") public String edgeSource; @ModelProperty(info="Attribute tha defines the target") public String edgeTarget; @ModelProperty(info="Name of forward rate exposure") public String forwardRate; @ModelProperty(info="Name of reverse rate exposure") public String reverseRate; public String dependency; public String step; /* <KineticScheme name="ks" nodes="states" stateVariable="occupancy" edges="transitions" edgeSource="from" edgeTarget="to" forwardRate="rf" reverseRate="rr" dependency="v" step="deltaV"/> */ Children r_nodes; Children r_edges; ComponentReference r_srcRef; ComponentReference r_tgtRef; public void resolve(ComponentType r_type) throws ContentError { r_nodes = r_type.getChildrenByName(nodes); r_edges = r_type.getChildrenByName(edges); ComponentType tedge = r_edges.getComponentType(); r_srcRef = tedge.getComponentRef(edgeSource); r_tgtRef = tedge.getComponentRef(edgeTarget); } public KScheme makeKScheme(ArrayList<Component> astat, ArrayList<Component> arat) throws ContentError { int ns = astat.size(); int nr = arat.size(); HashMap<String, Integer> stateIndexHM = new HashMap<String, Integer>(); for (int i = 0; i < ns; i++) { stateIndexHM.put(astat.get(i).getID(), i); } int[][] tbl = new int[nr][2]; for (int i = 0; i < nr; i++) { Component r = arat.get(i); String srcid = r.getStringValue(edgeSource); String tgtid = r.getStringValue(edgeTarget); tbl[i][0] = stateIndexHM.get(srcid); tbl[i][1] = stateIndexHM.get(tgtid); } KScheme ret = new KScheme(name, tbl, nodes, edges, stateVariable, forwardRate, reverseRate); return ret; } public String getNodesName() { return nodes; } public String getEdgesName() { return edges; } public KineticScheme makeCopy() { E.missing(); return null; } }