public boolean applies( TupleEntry tupleEntry ) { for( FactorInvoker invoker : factorInvokers ) { if( !invoker.applies( tupleEntry ) ) return false; } return true; }
public ParameterExpression createExpression( Fields argumentsFields ) { return new ParameterExpression( argumentsFields, this ); } }
public ParameterExpression( Fields argumentsFields, Parameter parameter ) { this.name = parameter.getName(); this.beta = parameter.getBeta(); factorInvokers = new FactorInvoker[ parameter.getFactors().size() ]; for( int i = 0; i < parameter.getFactors().size(); i++ ) { FactorPredictor predictor = parameter.getFactors().get( i ); int pos = argumentsFields.getPos( predictor.getFieldName() ); factorInvokers[ i ] = new FactorInvoker( pos, predictor ); } covariantInvokers = new CovariantInvoker[ parameter.getCovariants().size() ]; for( int i = 0; i < parameter.getCovariants().size(); i++ ) { CovariantPredictor predictor = parameter.getCovariants().get( i ); int pos = argumentsFields.getPos( predictor.getFieldName() ); covariantInvokers[ i ] = new CovariantInvoker( pos, predictor ); } }
@Override public void operate( FlowProcess flowProcess, FunctionCall<Context<BaseRegressionFunction.ExpressionContext>> functionCall ) { TupleEntry arguments = functionCall.getArguments(); ExpressionEvaluator[] expressions = functionCall.getContext().payload.expressions; double[] results = functionCall.getContext().payload.results; for( int i = 0; i < expressions.length; i++ ) results[ i ] = expressions[ i ].calculate( arguments ); LOG.debug( "raw regression: {}", results ); for( int i = 0; i < expressions.length; i++ ) results[ i ] = getSpec().getLinkFunction().calculate( results[ i ] ); LOG.debug( "link regression: {}", results ); results = getSpec().getNormalization().normalize( results ); LOG.debug( "probabilities: {}", results ); double max = Doubles.max( results ); int index = Doubles.indexOf( results, max ); String category = expressions[ index ].getTargetCategory(); LOG.debug( "category: {}", category ); if( !getSpec().getModelSchema().isIncludePredictedCategories() ) { functionCall.getOutputCollector().add( functionCall.getContext().result( category ) ); return; } Tuple result = functionCall.getContext().tuple; result.set( 0, category ); for( int i = 0; i < results.length; i++ ) result.set( i + 1, results[ i ] ); functionCall.getOutputCollector().add( result ); } }
public double calculate( TupleEntry tupleEntry ) { double result = beta; for( CovariantInvoker invoker : covariantInvokers ) result *= invoker.calculate( tupleEntry ); LOG.debug( "parameter: {}, result: {}", name, result ); return result; } }
ExpressionEvaluator bind( Fields argumentFields ) { if( isNoOp() ) return new ExpressionEvaluator( targetCategory ); ParameterExpression[] expressions = new ParameterExpression[ parameters.size() ]; int count = 0; for( Parameter parameter : parameters.values() ) expressions[ count++ ] = parameter.createExpression( argumentFields ); return new ExpressionEvaluator( targetCategory, expressions ); }
@Override public void operate( FlowProcess flowProcess, FunctionCall<Context<BaseRegressionFunction.ExpressionContext>> functionCall ) { ExpressionEvaluator evaluator = functionCall.getContext().payload.expressions[ 0 ]; LinkFunction linkFunction = getSpec().linkFunction; double result = evaluator.calculate( functionCall.getArguments() ); double linkResult = linkFunction.calculate( result ); LOG.debug( "result: {}", linkResult ); functionCall.getOutputCollector().add( functionCall.getContext().result( linkResult ) ); } }