📄 alphatree.h
字号:
//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, Yusuke Miyao/// You may distribute under the terms of the Artistic License.////// <id>$Id: AlphaTree.h,v 1.9 2003/05/16 13:03:46 yusuke Exp $</id>/// <collection>Maximum Entropy Estimator</collection>/// <name>AlphaTree.h</name>/// <overview>Implementation of Alpha Product Tree</overview>/// <desc>/// Implementation of a tree of alpha products./// This class is used by feature forest models./// </desc>/////////////////////////////////////////////////////////////////////////#ifndef Amis_AlphaTree_h_#define Amis_AlphaTree_h_#include <amis/configure.h>#include <amis/Real.h>#include <amis/ModelBase.h>#include <amis/EventTree.h>#include <vector>#include <iostream>AMIS_NAMESPACE_BEGIN///////////////////////////////////////////////////////////////////////// <classdef>/// <name>AlphaTree</name>/// <overview>Alpha product in a tree structure</overview>/// <desc>/// Partially calculated alpha product values are stored in a tree structure/// according to the tree structure of an event./// </desc>/// <body>template < class Feature, class AlphaSet >class AlphaTree {public: typedef typename Feature::FeatureFreq FeatureFreq;private: EventTreeNodeID max_id; FeatureFreq max_freq; std::vector< Real > alpha; std::vector< AlphaSet > inside_prod; std::vector< AlphaSet > outside_prod; std::vector< AlphaSet > work_vector1; std::vector< AlphaSet > work_vector2; Real sum_product;/* private: *//* AlphaTree( const AlphaTree< Feature, AlphaSet >& ) { *//* AMIS_ABORT( "Copy constructor of AlphaProdTree" ); *//* } *//* AlphaTree< Feature, AlphaSet >& operator=( const AlphaTree< Feature, AlphaSet >& ) { *//* AMIS_ABORT( "Operator = of AlphaProdTree" ); *//* } */public: AlphaTree() {} AlphaTree( EventTreeNodeID id, FeatureFreq freq ) { initialize( id, freq ); } /// Initialize with the size _id_ ~AlphaTree() {}public: void initialize( EventTreeNodeID id, FeatureFreq freq ) { max_id = id; max_freq = freq; alpha.resize( max_id ); inside_prod.resize( max_id ); outside_prod.resize( max_id ); sum_product = 0.0; typename std::vector< AlphaSet >::iterator inside_it = inside_prod.begin(); typename std::vector< AlphaSet >::iterator outside_it = outside_prod.begin(); for ( ; inside_it != inside_prod.end(); ++inside_it, ++outside_it ) { inside_it->reserve( max_freq ); outside_it->reserve( max_freq ); } } /// Initialize the tree of the size _id_ with alpha sets of the size _freq_ void setProduct( const ModelBase& model, const EventTree< Feature >& event_tree ) { // Initialize & inside product //cerr << "inside prod" << std::endl; typename std::vector< Real >::iterator alpha_it = alpha.begin(); typename std::vector< AlphaSet >::iterator inside_it = inside_prod.begin(); typename std::vector< AlphaSet >::iterator outside_it = outside_prod.begin(); for ( typename EventTree< Feature >::const_iterator event_node = event_tree.begin(); event_node != event_tree.end(); ++event_node, ++alpha_it, ++inside_it, ++outside_it ) { outside_it->clear(); // initialize outside products if ( event_node->isDisjunctiveNode() ) { AMIS_PROF3( "AlphaTree::inside_prod(disj)" ); // disjunctive node if ( event_node->daughterList().empty() ) { inside_it->init( static_cast< FeatureFreq >( 0 ), 1.0 ); } else { inside_it->accumulate( inside_prod, event_node->daughterList(), max_freq ); } } else { AMIS_PROF3( "AlphaTree:inside_prod(conj)" ); // conjunctive node *alpha_it = ModelFunction< ModelBase, EventTree< Feature > >().product( model, event_node->featureList() ); inside_it->init( event_node->featureList().featureCount(), *alpha_it ); for ( typename std::vector< EventTreeNodeID >::const_iterator dtr = event_node->daughterList().begin(); dtr != event_node->daughterList().end(); ++dtr ) { *inside_it *= inside_prod[ *dtr ]; } } } // summation of products --inside_it; sum_product = inside_it->sumProduct(); // outside products //cerr << "outside prod" << std::endl; --outside_it; --alpha_it; outside_it->init( static_cast< FeatureFreq >( 0 ), 1.0 ); for ( typename EventTree< Feature >::const_reverse_iterator event_node = event_tree.rbegin(); event_node != event_tree.rend(); ++event_node, --outside_it, --alpha_it ) { if ( event_node->isDisjunctiveNode() ) { AMIS_PROF3( "AlphaTree::outside_prod(disj)" ); // disjunctive node // do nothing /* for ( std::vector< EventTreeNodeID >::const_iterator dtr = event_node->daughterList().begin(); dtr != event_node->daughterList().end(); ++dtr ) { outside_prod[ *dtr ] += *outside_it; } */ } else { AMIS_PROF3( "AlphaTree::outside_prod(conj)" ); // conjunctive node outside_it->accumulate( outside_prod, event_node->motherList(), max_freq ); // optimized version const std::vector< EventTreeNodeID >& daughters = event_node->daughterList(); if ( ! daughters.empty() ) { if ( work_vector1.size() < daughters.size() ) { work_vector1.resize( daughters.size() ); work_vector2.resize( daughters.size() ); } work_vector1[ 0 ].init( event_node->featureList().featureCount(), *alpha_it ); work_vector2[ 0 ] = *outside_it; for ( size_t id = 0; id < daughters.size() - 1; ++id ) { work_vector1[ id + 1 ].product( work_vector1[ id ], inside_prod[ daughters[ id ] ] ); work_vector2[ id + 1 ].product( work_vector2[ id ], inside_prod[ daughters[ daughters.size() - id - 1 ] ] ); } for ( size_t id = 0; id < daughters.size(); ++id ) { outside_prod[ daughters[ id ] ].incProduct( work_vector1[ id ], work_vector2[ daughters.size() - id - 1 ] ); } } } } //cerr << "done." << std::endl; } /// Set the products of alpha values to the tree const AlphaSet& insideProd( EventTreeNodeID id ) const { return inside_prod[ id ]; } /// Get the inside product of id-th node const AlphaSet& outsideProd( EventTreeNodeID id ) const { return outside_prod[ id ]; } /// Get the outside product of id-th node Real sumProduct() const { return sum_product; } /// Sum of all inside products};/// </body>/// </classdef>AMIS_NAMESPACE_END#endif // Amis_AlphaTree_h_// end of AlphaTree.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -