Skip to content
Snippets Groups Projects
Select Git revision
  • ed5f2256317a0d0172908614b68dbb8213e772ad
  • master default protected
  • fix-words-ann
  • wccl-rules-migration
  • develop
5 results

rulesequence.h

Blame
  • user avatar
    Adam Wardynski authored
    295d24f5
    History
    rulesequence.h 3.14 KiB
    #ifndef LIBWCCL_OPS_RULESEQUENCE_H
    #define LIBWCCL_OPS_RULESEQUENCE_H
    
    #include <libwccl/ops/tagrule.h>
    
    namespace Wccl {
    
    /**
     * Represents a sequence of parsed WCCL Rules. It's a conveniency wrapper around
     * vector of Rule objects, that allows automatic execution of all contained Rules
     * for all positions of a Sentence.
     * @note The class methods are not thread-safe
     */
    class RuleSequence : public std::vector<TagRule>
    {
    public:
    	RuleSequence(std::vector<TagRule> rules);
    
    	RuleSequence();
    
    	/**
    	 * Executes all contained Rules sequentially, once for each position
    	 * starting from 0 to given sentence's end.
    	 * @returns True if any of the Rules made a change on any of the sentence
    	 * positions, False otherwise.
    	 * @param sentence Sentence to execute on.
    	 * @see execute_once() - equivalent method; the \link operator()() operator() \endlink allows
    	 * more convenient functional notation, however if you only have a pointer
    	 * you might prefer the execute_once() method as shown below. The choice is yours.
    	 * @see execute_until_done() - executes all Rules repeatedly, until there are no changes.
    	 * \code
    	 * Bool res;
    	 * res = ruleseq(sentence);
    	 * // versus
             * res = ruleseq.execute_once(sentence);
    	 * // or if you have a pointer...
    	 * res = (*ruleseq_ptr)(sentence);
    	 * // versus
             * res = ruleseq_ptr->execute_once(sentence);
    	 * \endcode
    	 */
    	Bool operator()(const boost::shared_ptr<Corpus2::Sentence>& sentence);
    
    	/**
    	 * Executes all contained Rules sequentially, once for each position
    	 * starting from 0 to given sentence's end.
    	 * @returns True if any of the Rules made a change on any of the sentence's
    	 * positions, False otherwise.
    	 * @param sentence Sentence to execute on.
    	 * @see \link operator()() operator() \endlink - an equivalent of this method that
    	 * allows functional notation, treating RuleSeqence directly as a function object
    	 * @see execute_until_done() - executes all Rules repeatedly, until there are no changes.
    	 */
    	Bool execute_once(const boost::shared_ptr<Corpus2::Sentence>& sentence);
    
    	/**
    	 * Executes all contained Rules sequentially, for each position
    	 * starting from 0 to given sentence's end. Repeats until there are no changes,
    	 * or specified number of iterations have been executed.
    	 * @returns Number of full iterations that have been executed until there were no changes,
    	 * or until max_iter has been reached while changes were still reported.
    	 * @param sentence Sentence to execute on.
    	 * @param max_iter Maximum number of iterations (mostly to safeguard from an infinite loop)
    	 * @see \link operator()() operator() \endlink - Executes Rules but only once
    	 * @see execute_once() - Executes Rules but only once
    	 */
    	int execute_until_done(const boost::shared_ptr<Corpus2::Sentence>& sentence, int max_iter = 1000);
    };
    
    
    
    //
    //--- implementation details ---
    //
    inline
    RuleSequence::RuleSequence(std::vector<TagRule> rules)
    	: std::vector<TagRule>(rules) {
    }
    
    inline
    RuleSequence::RuleSequence()
    	: std::vector<TagRule>() {
    }
    
    inline
    Bool RuleSequence::operator()(const boost::shared_ptr<Corpus2::Sentence>& sentence) {
    	return execute_once(sentence);
    }
    
    } /* end ns Wccl */
    
    #endif // LIBWCCL_OPS_RULESEQUENCE_H