MatrixWrapper::ColumnVector NonLinearAnalyticConditionalGaussian_Ginac::ExpectedValueGet() const { MatrixWrapper::ColumnVector u_num (u_size); MatrixWrapper::ColumnVector x_num (x_size); MatrixWrapper::ColumnVector func_num(func_size); GiNaC::ex substitute (func_size); MatrixWrapper::ColumnVector expected(func_size); u_num = ConditionalArgumentGet(1); x_num = ConditionalArgumentGet(0); // use Mu of additive noise if (cond_size!=0) for (unsigned int i=0; i<u_size; i++) for (unsigned int j=0; j<cond_size; j++) if (u_sym[i] == cond_sym[j]) u_num(i+1) += (this->AdditiveNoiseMuGet())(j+1); // evaluate func for (unsigned int i=0; i<func_size; i++) { // temp variable to substitute in substitute = func_sym(i,0); // substitute all u_sym with u_num for (unsigned int j=0; j<u_size; j++) substitute = substitute.subs( u_sym[j]==u_num(j+1) ); // substitute all x_sym with x_num for (unsigned int j=0; j<x_size; j++) substitute = substitute.subs( x_sym[j]==x_num(j+1) ); // build matrix func_num func_num(i+1) = GiNaC::ex_to<GiNaC::numeric>( substitute.evalf() ).to_double(); } expected = func_num; if (cond_size==0) expected += AdditiveNoiseMuGet(); return expected; }
void ExtensibleGraph::propagate_arguments_in_function_graph( Nodecl::NodeclBase arguments ) { ERROR_CONDITION( _nodecl.is_null( ), "Found a null nodecl for a graph that is supposed to contain a FunctionCode", 0 ); ERROR_CONDITION( !_nodecl.is<Nodecl::FunctionCode>( ), "Expected FunctionCode but '%s' found", ast_print_node_type( _nodecl.get_kind( ) ) ); Symbol func_sym( _nodecl.get_symbol( ) ); ERROR_CONDITION( !func_sym.is_valid( ), "Invalid symbol for a nodecl that is supposed to contain a FunctionCode", 0 ); Nodecl::List args = arguments.as<Nodecl::List>( ); ObjectList<Symbol> params = func_sym.get_function_parameters( ); int n_common_params = std::max( args.size( ), params.size( ) ); sym_to_nodecl_map rename_map; for( int i = 0; i < n_common_params; ++i ) { rename_map[params[i]] = args[i]; } RenameVisitor rv( rename_map ); Node* graph_entry = _graph->get_graph_entry_node( ); propagate_argument_rec( graph_entry, &rv ); ExtensibleGraph::clear_visits( graph_entry ); }