Search in sources :

Example 36 with MPart

use of gov.sandia.n2a.eqset.MPart in project n2a by frothga.

the class ExportJob method input.

public String input(MPart source, List<Element> parentElements, Synapse synapse) {
    String type = source.get("$metadata", "backend.lems.part");
    List<Element> inputElements = new ArrayList<Element>();
    List<String> skip = new ArrayList<String>();
    for (MNode c : source) {
        MPart p = (MPart) c;
        if (p.isPart()) {
            skip.add(p.key());
            input(p, inputElements, null);
        } else if (p.key().equals("times")) {
            skip.add("times");
            String[] pieces = p.get().split("\\[", 2)[1].split("]", 2)[0].split(";");
            for (int i = 0; i < pieces.length; i++) {
                if (Scalar.convert(pieces[i]) == Double.POSITIVE_INFINITY)
                    continue;
                Element spike = addElement("spike", inputElements);
                spike.setAttribute("id", String.valueOf(i));
                spike.setAttribute("time", biophysicalUnits(pieces[i]));
            }
        }
    }
    if (// decide between them
    type.contains("ramp") && type.contains("pulse")) {
        NameMap nameMap = partMap.importMap("rampGenerator");
        EquationSet sourceEquations = getEquations(source);
        Variable high1 = sourceEquations.find(new Variable(nameMap.importName("startAmplitude"), 0));
        Variable high2 = sourceEquations.find(new Variable(nameMap.importName("finishAmplitude"), 0));
        try {
            double value1 = ((Scalar) high1.eval(context)).value;
            double value2 = ((Scalar) high2.eval(context)).value;
            if (value1 == value2)
                type = "pulseGenerator";
            else
                type = "rampGenerator";
        } catch (// eval can fail if eqset contains fatal errors
        Exception e) {
            if (source.get("high2").equals("high1"))
                type = "pulseGenerator";
            else
                type = "rampGenerator";
        }
    } else if (// more action is needed
    type.contains(",")) {
        if (synapse != null) {
            String[] types = type.split(",");
            for (String t : types) {
                if (// prefix of both "Synapse" and "Synaptic"
                t.contains("Synap")) {
                    type = t;
                    break;
                }
            }
        }
        // remove any remaining ambiguity
        type = type.split(",")[0];
    }
    Element input = addElement(type, parentElements);
    String id;
    if (synapse == null) {
        id = source.get("$metadata", "backend.lems.id");
        if (id.isEmpty())
            id = source.key();
    } else {
        id = synapse.id;
        input.setAttribute("synapse", synapse.chainID);
        input.setAttribute("spikeTarget", "./" + synapse.chainID);
    }
    input.setAttribute("id", id);
    standalone(source, input, inputElements);
    genericPart(source, input, skip.toArray(new String[] {}));
    sequencer.append(input, inputElements);
    return id;
}
Also used : EquationSet(gov.sandia.n2a.eqset.EquationSet) MPart(gov.sandia.n2a.eqset.MPart) AccessVariable(gov.sandia.n2a.language.AccessVariable) Variable(gov.sandia.n2a.eqset.Variable) Element(org.w3c.dom.Element) ArrayList(java.util.ArrayList) NameMap(gov.sandia.n2a.backend.neuroml.PartMap.NameMap) MNode(gov.sandia.n2a.db.MNode) IncommensurableException(javax.measure.IncommensurableException) UnconvertibleException(javax.measure.UnconvertibleException) ParseException(gov.sandia.n2a.language.ParseException) Scalar(gov.sandia.n2a.language.type.Scalar)

Example 37 with MPart

use of gov.sandia.n2a.eqset.MPart in project n2a by frothga.

the class ExportJob method genericPart.

public void genericPart(MPart part, Element result, String... skip) {
    EquationSet partEquations = getEquations(part);
    List<Element> resultElements = new ArrayList<Element>();
    List<String> skipList = Arrays.asList(skip);
    for (MNode c : part) {
        MPart p = (MPart) c;
        String key = p.key();
        // Skip connection bindings. They are unpacked elsewhere.
        if (partEquations.findConnection(key) != null)
            continue;
        if (key.startsWith("$"))
            continue;
        if (skipList.contains(key))
            continue;
        if (p.isPart()) {
            genericPart(p, resultElements);
        } else {
            // We need to check two things:
            // * Has the variable been overridden after it was declared in the base part?
            // * Is it an expression or a constant?
            // An override that is an expression should trigger a LEMS extension part.
            // A constant that is either overridden or required should be emitted here.
            boolean expression = true;
            String value = p.get();
            Variable v = partEquations.find(new Variable(key));
            try {
                // This could convert an expression to a constant.
                Type evalue = v.eval(context);
                // TODO: if it is a simple AccessVariable, then it shouldn't be viewed as an expression.
                Operator op = Operator.parse(value);
                if (op instanceof Constant) {
                    // "direct" value
                    Type dvalue = ((Constant) op).value;
                    expression = !evalue.equals(dvalue);
                }
            } catch (Exception e) {
            }
            boolean overridden = p.isFromTopDocument() || isOverride(part.get("$inherit").replace("\"", ""), key);
            String name = sequencer.bestFieldName(result, p.get("$metadata", "backend.lems.param"));
            if (name.isEmpty())
                name = key;
            boolean required = sequencer.isRequired(result, name);
            if (required || (overridden && !expression)) {
                // biophysicalUnits() should return strings (non-numbers) unmodified
                result.setAttribute(name, biophysicalUnits(p.get()));
            }
        }
    }
    sequencer.append(result, resultElements);
}
Also used : Operator(gov.sandia.n2a.language.Operator) EquationSet(gov.sandia.n2a.eqset.EquationSet) MPart(gov.sandia.n2a.eqset.MPart) AccessVariable(gov.sandia.n2a.language.AccessVariable) Variable(gov.sandia.n2a.eqset.Variable) Constant(gov.sandia.n2a.language.Constant) Element(org.w3c.dom.Element) ArrayList(java.util.ArrayList) MNode(gov.sandia.n2a.db.MNode) IncommensurableException(javax.measure.IncommensurableException) UnconvertibleException(javax.measure.UnconvertibleException) ParseException(gov.sandia.n2a.language.ParseException) Type(gov.sandia.n2a.language.Type)

Aggregations

MPart (gov.sandia.n2a.eqset.MPart)37 FilteredTreeModel (gov.sandia.n2a.ui.eq.FilteredTreeModel)21 NodeBase (gov.sandia.n2a.ui.eq.tree.NodeBase)20 JTree (javax.swing.JTree)18 PanelModel (gov.sandia.n2a.ui.eq.PanelModel)16 TreeNode (javax.swing.tree.TreeNode)15 FontMetrics (java.awt.FontMetrics)13 NodePart (gov.sandia.n2a.ui.eq.tree.NodePart)10 CannotRedoException (javax.swing.undo.CannotRedoException)10 CannotUndoException (javax.swing.undo.CannotUndoException)9 MNode (gov.sandia.n2a.db.MNode)5 EquationSet (gov.sandia.n2a.eqset.EquationSet)5 NodeVariable (gov.sandia.n2a.ui.eq.tree.NodeVariable)5 Variable (gov.sandia.n2a.eqset.Variable)4 ArrayList (java.util.ArrayList)4 ParseException (gov.sandia.n2a.language.ParseException)3 PanelEquationTree (gov.sandia.n2a.ui.eq.PanelEquationTree)3 NodeAnnotation (gov.sandia.n2a.ui.eq.tree.NodeAnnotation)3 NodeEquation (gov.sandia.n2a.ui.eq.tree.NodeEquation)3 IncommensurableException (javax.measure.IncommensurableException)3