I have a PMML generated from SAS Miner that I can't get properly evaluated using JPMML 1.1.4. JPMML 1.1.4 says it supports PMML 4.2 and the PMML says it is PMML version 4.2.
Is the FMTWIDTH in the below function "SAS-EM-String-Normalize" proper PMML syntax?
Any ideas why I can't evaluation this function using JPMML?
I have the function in my TransformationDictionary that looks like,
1
FMTWIDTH
And I get the following exception,
Exception in thread "main" org.jpmml.evaluator.TypeCheckException:
Expected INTEGER, but got STRING (FMTWIDTH) at
org.jpmml.evaluator.FieldValue.asInteger(FieldValue.java:125) at
org.jpmml.evaluator.FunctionRegistry$36.evaluate(FunctionRegistry.java:463)
at org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:38)
at
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:203)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
at org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:76)
at org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:43)
at
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:203)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
at
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:188)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:58)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:45)
at
org.jpmml.evaluator.ExpressionUtil.evaluateMapValues(ExpressionUtil.java:169)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:87)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:58)
at
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:45)
at
org.jpmml.evaluator.RegressionModelEvaluator.evaluateRegressionTable(RegressionModelEvaluator.java:150)
at
org.jpmml.evaluator.RegressionModelEvaluator.evaluateClassification(RegressionModelEvaluator.java:107)
at
org.jpmml.evaluator.RegressionModelEvaluator.evaluate(RegressionModelEvaluator.java:57)
at
org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:65)
at
ValidPMMLTesterRandomScores.randomEvaluation(ValidPMMLTesterRandomScores.java:116)
at
ValidPMMLTesterRandomScores.printModelInformation(ValidPMMLTesterRandomScores.java:94)
at
ValidPMMLTesterRandomScores.readModelFromFile(ValidPMMLTesterRandomScores.java:142)
at
ValidPMMLTesterRandomScores.main(ValidPMMLTesterRandomScores.java:160)
解决方案
According to the formal definition of the PMML built-in function "substring", it requires a string argument and two integer arguments. The SAS EM generated PMML code attempts to invoke this function with a string argument, an integer argument, and another string argument substring($AnyCInput, 1, "FMTWIDTH").
This PMML fragment can be fixed by accessing the value of the "FMTWIDTH" parameter using the FieldRef element:
1
In conclusion, JPMML is a correct and SAS EM is wrong.