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;
}
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);
}
Aggregations