示例#1
0
      static void traverse(scheduler::statement const & statement, scheduler::statement_node const & root_node, Fun const & fun, bool recurse_structurewise_function /* see forwards.h for default argument */){
        bool recurse = recurse_structurewise_function || root_node.op.type_subfamily!=scheduler::OPERATION_FUNCTION_TYPE_SUBFAMILY;

        fun.call_before_expansion(&root_node);

        //Lhs:
        if(recurse){
          if(root_node.lhs.type_family==scheduler::COMPOSITE_OPERATION_FAMILY)
            traverse(statement, statement.array()[root_node.lhs.node_index], fun, recurse_structurewise_function);
          if(root_node.lhs.type_family != scheduler::INVALID_TYPE_FAMILY)
            fun(&statement, &root_node, LHS_NODE_TYPE);
        }

        //Self:
        fun(&statement, &root_node, PARENT_NODE_TYPE);

        //Rhs:
        if(recurse){
          if(root_node.rhs.type_family==scheduler::COMPOSITE_OPERATION_FAMILY)
            traverse(statement, statement.array()[root_node.rhs.node_index], fun, recurse_structurewise_function);
          if(root_node.rhs.type_family != scheduler::INVALID_TYPE_FAMILY)
            fun(&statement, &root_node, RHS_NODE_TYPE);
        }

        fun.call_after_expansion(&root_node);


      }
 vcl_size_t get_vector_size(scheduler::statement const & statement) const
 {
   scheduler::statement_node const & root = statement.array()[statement.root()];
   if(root.lhs.type_family==scheduler::COMPOSITE_OPERATION_FAMILY)
   {
     scheduler::statement_node lhs = statement.array()[root.lhs.node_index];
     if(lhs.op.type==scheduler::OPERATION_BINARY_MATRIX_DIAG_TYPE)
     {
       vcl_size_t size1 = up_to_internal_size_?utils::call_on_matrix(lhs.lhs, utils::internal_size1_fun()): utils::call_on_matrix(lhs.lhs, utils::size1_fun());
       vcl_size_t size2 = up_to_internal_size_?utils::call_on_matrix(lhs.lhs, utils::internal_size2_fun()): utils::call_on_matrix(lhs.lhs, utils::size2_fun());
       return std::min(size1, size2);
     }
     throw generator_not_supported_exception("Vector AXPY : Unimplemented LHS size deduction");
   }
   return up_to_internal_size_?utils::call_on_vector(root.lhs, utils::internal_size_fun()): utils::call_on_vector(root.lhs, utils::size_fun());
 }