<p>我通过做两个改变来解决这个问题。在查看了奥古斯都的源代码并确定,实际上,<code>_setupCalculate</code>在任何地方都没有定义之后,我monkey将它补上了。我的脚本现在如下所示:</p>
<pre><code># Monkey-patch augustus
import augustus.pmml.DefineFunction
def _setupCalculate(self, dataTable, functionTable, performanceTable):
return (dataTable, functionTable, performanceTable)
augustus.pmml.DefineFunction.DefineFunction._setupCalculate = _setupCalculate
# Now the actual script
from augustus.strict import modelLoader
# Load model
add_two_numbers_file = 'addTwoNumbers.pmml'
with open(add_two_numbers_file, 'r') as model_file:
model_str = model_file.read()
model = modelLoader.loadXml(model_str)
# Run model
print model.calc({'x':[1,2,3],'y':[4,5,6]}).look()
</code></pre>
<p>我天真地假设<code>_setupCalculate</code>不需要做任何重要的事情。我现在得到了一个不同的,更难以理解的错误:</p>
^{pr2}$
<p>在那条线上</p>
^{3}$
<p>在字段类型.py. 在调试器中运行了几次之后,我发现这行代码只在类型转换期间执行,并注意到我在PMML中同时使用了float和double类型。通过删除不必要的数据类型属性,我能够实现以下功能:</p>
<pre><code><PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1">
<Header/>
<DataDictionary>
<DataField name="x" dataType="double" optype="continuous"/>
<DataField name="y" dataType="double" optype="continuous"/>
</DataDictionary>
<TransformationDictionary>
<DefineFunction optype="continuous" name="add">
<ParameterField optype="continuous" name="first"></ParameterField>
<ParameterField optype="continuous" name="second"></ParameterField>
<Apply function="+" invalidValueTreatment="returnInvalid">
<FieldRef field="first"></FieldRef>
<FieldRef field="second"></FieldRef>
</Apply>
</DefineFunction>
<DerivedField name="z" dataType="double" optype="continuous">
<Apply function="add">
<FieldRef field="x"/>
<FieldRef field="y"/>
</Apply>
</DerivedField>
</TransformationDictionary>
</PMML>
</code></pre>
<p>我使用的augustus的主干版本相当于0.6-beta3版本。似乎我遇到的问题只是bug,而这个答案中使用的技巧在不久的将来很可能变得不必要。在</p>