⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alphatree.h

📁 Amis - A maximum entropy estimator 一个最大熵模型统计工具
💻 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 + -