Java 由于加载标量常量失败,Octave无法计算脚本
我有一个项目,我需要做几个计算使用倍频程。我使用javaoctave桥与Octave通信。下面是我正在做的简化示例代码Java 由于加载标量常量失败,Octave无法计算脚本,java,octave,Java,Octave,我有一个项目,我需要做几个计算使用倍频程。我使用javaoctave桥与Octave通信。下面是我正在做的简化示例代码 // One of the fields of my class that evaluates equations. This class is provided by teh bridge. private OctaveEngine scriptEngine; // The script contains the equation, e.g.: Ampere = PowerC
// One of the fields of my class that evaluates equations. This class is provided by teh bridge.
private OctaveEngine scriptEngine;
// The script contains the equation, e.g.: Ampere = PowerConsumption (Lights, Dryer, Dishwasher, Laptop, Smartphone);
private String script;
public synchronized void evaluate() {
// Variable is a class implementing Cloneable and harbouring a unit as well as its unit and a few utility functions.
LinkedHashSet<Variable> dependentVariables;
String evaluationErrors;
Preconditions.checkState(scriptEngine != null);
try {
engineErrors.reset();
scriptEngine.setErrorWriter(engineErrors);
initParameters();
scriptEngine.eval(this.script);
} catch (Exception exception) {
LOGGER.log(Level.SEVERE, "Error while evaluating script " + this.script, exception); //$NON-NLS-1$
}
// The mapping stores the variables and the interface objects changing or reading their values.
dependentVariables = mapping.getDependentVariables();
for (Variable variable : dependentVariables) {
try {
OctaveDouble result = scriptEngine.get(OctaveDouble.class, variable.getName());
variable.setValue(result.get(1));
} catch (Exception exception) {
LOGGER.log(Level.SEVERE, "Error while retrieving variable " + variable.getName(), exception); //$NON-NLS-1$
}
}
evaluationErrors = engineErrors.toString();
if (evaluationErrors.length() > 0) {
LOGGER.log(Level.WARNING, "Error while evaluating equation :" + evaluationErrors); //$NON-NLS-1$
}
}
private void initParameters() {
for (Variable variable : lockedMapping.getIndependentVariables()) {
Double numericValue = Double.valueOf(variable.getValue().toString());
if (isNegative(numericValue)) {
numericValue *= -1d;
}
scriptEngine.put(variable.getName(), Octave.scalar(numericValue));
}
}
private static boolean isNegative(double _double) {
return Double.doubleToRawLongBits(_double) < 0;
}
用谷歌搜索一点,发现负值(或大输入)会导致这个问题。然而,这一问题被认为已经解决。我没有大的输入,我试图确保我的值是正的(甚至通过使用syso进行测试
我对根本原因进行了更深入的搜索,并偶然发现了它。在类中,调用future.get()
的getFromFuture
方法的第157行,抛出了一个ExecutionException
。下面是即时堆栈跟踪:
java.util.concurrent.ExecutionException: dk.ange.octave.exception.OctaveIOException: IOException during close
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at dk.ange.octave.exec.OctaveExec.getFromFuture(OctaveExec.java:157)
at dk.ange.octave.exec.OctaveExec.eval(OctaveExec.java:142)
at dk.ange.octave.io.OctaveIO.set(OctaveIO.java:56)
at dk.ange.octave.OctaveEngine.put(OctaveEngine.java:141)
at [redacted].OctaveEquation.initParameters(OctaveEquation.java:109)
at [redacted].OctaveEquation.evaluate(OctaveEquation.java:72)
at [redacted].LinearEquationSystem.inputChanged(LinearEquationSystem.java:105)
at [redacted].variable.NumericalVariable.setValue(NumericalVariable.java:127)
at [redacted].widget.ValueWidget.actionDrop(ValueWidget.java:88)
at [redacted].TangibleObjectManager.dropObject(TangibleObjectManager.java:207)
at [redacted].adapter.TuioAdapter.addTangibleObject(TuioAdapter.java:318)
at [redacted].adapter.TuioAdapter.addTuioObject(TuioAdapter.java:295)
at TUIO.TuioClient.acceptMessage(TuioClient.java:339)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchMessage(OSCPacketDispatcher.java:73)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(OSCPacketDispatcher.java:49)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle(OSCPacketDispatcher.java:56)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(OSCPacketDispatcher.java:40)
at com.illposed.osc.OSCPortIn.run(OSCPortIn.java:65)
at java.lang.Thread.run(Unknown Source)
Caused by: dk.ange.octave.exception.OctaveIOException: IOException during close
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:65)
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:1)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
... 1 more
Caused by: java.io.IOException: Pipe to octave-process broken
at dk.ange.octave.exec.OctaveExecuteReader.read(OctaveExecuteReader.java:68)
at java.io.Reader.read(Unknown Source)
at dk.ange.octave.exec.OctaveExecuteReader.close(OctaveExecuteReader.java:96)
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:61)
... 5 more
java.util.concurrent.ExecutionException: dk.ange.octave.exception.OctaveIOException: IOException during close
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at dk.ange.octave.exec.OctaveExec.getFromFuture(OctaveExec.java:157)
at dk.ange.octave.exec.OctaveExec.eval(OctaveExec.java:142)
at dk.ange.octave.io.OctaveIO.set(OctaveIO.java:56)
at dk.ange.octave.OctaveEngine.put(OctaveEngine.java:141)
at [redacted].OctaveEquation.initParameters(OctaveEquation.java:109)
at [redacted].OctaveEquation.evaluate(OctaveEquation.java:72)
at [redacted].LinearEquationSystem.inputChanged(LinearEquationSystem.java:105)
at [redacted].variable.NumericalVariable.setValue(NumericalVariable.java:127)
at [redacted].widget.ValueWidget.actionDrop(ValueWidget.java:88)
at [redacted].TangibleObjectManager.dropObject(TangibleObjectManager.java:207)
at [redacted].adapter.TuioAdapter.addTangibleObject(TuioAdapter.java:318)
at [redacted].adapter.TuioAdapter.addTuioObject(TuioAdapter.java:295)
at TUIO.TuioClient.acceptMessage(TuioClient.java:339)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchMessage(OSCPacketDispatcher.java:73)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(OSCPacketDispatcher.java:49)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle(OSCPacketDispatcher.java:56)
at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(OSCPacketDispatcher.java:40)
at com.illposed.osc.OSCPortIn.run(OSCPortIn.java:65)
at java.lang.Thread.run(Unknown Source)
Caused by: dk.ange.octave.exception.OctaveIOException: IOException during close
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:65)
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:1)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
... 1 more
Caused by: java.io.IOException: Pipe to octave-process broken
at dk.ange.octave.exec.OctaveExecuteReader.read(OctaveExecuteReader.java:68)
at java.io.Reader.read(Unknown Source)
at dk.ange.octave.exec.OctaveExecuteReader.close(OctaveExecuteReader.java:96)
at dk.ange.octave.exec.OctaveReaderCallable.call(OctaveReaderCallable.java:61)
... 5 more
我在一台Windows 7机器上工作,在我的类路径上有八度音阶的路径,不确定我做错了什么。我假设在IO过程中出现了一些错误,但我似乎无法确定
为了确保我所有的输入都是已知的,下面是包含这两个脚本的*.m文件。我所有的输入都是正数,范围从0到2200(双倍)
第二个:
function Ampere = PowerConsumption(Lights, Dryer, Dishwasher, Laptop, Smartphone)
Ampere = (Lights + Dryer + Dishwasher + Laptop + Smartphone) / 230;
function Load = CircuitLoad(Breaker, Lights, Dryer, Dishwasher, Laptop, Smartphone)
Load = Breaker / ((Lights + Dryer + Dishwasher + Laptop + Smartphone) / 230);
function Ampere = PowerConsumption(Lights, Dryer, Dishwasher, Laptop, Smartphone)
Ampere = (Lights + Dryer + Dishwasher + Laptop + Smartphone) / 230;