我用奥古斯都作为PMML模型的消费者。我修改了add two numbers example以包含DefineFunction元素,如下所示:
<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 dataType="float" 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>
我将此模型保存在一个文件中并尝试按如下方式运行:
^{pr2}$但是,我得到一个错误:
AttributeError: 'DefineFunction' object has no attribute '_setupCalculate'
我使用的是最新的trunk(修订版794),并且能够毫无问题地运行未修改的示例(没有DefineFunction)。DefineFunction是由奥古斯都支持的吗?在
我通过做两个改变来解决这个问题。在查看了奥古斯都的源代码并确定,实际上,
_setupCalculate
在任何地方都没有定义之后,我monkey将它补上了。我的脚本现在如下所示:我天真地假设
^{pr2}$_setupCalculate
不需要做任何重要的事情。我现在得到了一个不同的,更难以理解的错误:在那条线上
^{3}$在字段类型.py. 在调试器中运行了几次之后,我发现这行代码只在类型转换期间执行,并注意到我在PMML中同时使用了float和double类型。通过删除不必要的数据类型属性,我能够实现以下功能:
我使用的augustus的主干版本相当于0.6-beta3版本。似乎我遇到的问题只是bug,而这个答案中使用的技巧在不久的将来很可能变得不必要。在
jcrudy,你说得对:这是个bug。(API已更改,DefineFunction未更新。)它现在已在public SVN repository中修复:使用Augustus>;=r795,您可以按照最初的意图运行示例。在
顺便说一下,您的PMML来自一个外部文件,但是您将它加载到一个字符串中,然后加载到pmmldom中。只需传递
loadXML
文件名,就可以跳过中间步骤:(这可能与非常大的PMML文件相关;还要注意,它们可以gzip压缩。)
相关问题 更多 >
编程相关推荐