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

annsub.cpp

Blame
  • user avatar
    ilor authored
    1cf10615
    History
    annsub.cpp 2.13 KiB
    #include <libwccl/ops/functions/bool/predicates/annsub.h>
    #include <libwccl/values/match.h>
    #include <libcorpus2/ann/annotatedsentence.h>
    
    namespace Wccl {
    
    AnnSub::BaseRetValPtr AnnSub::apply_internal(const FunExecContext& context) const
    {
    	boost::shared_ptr<Corpus2::AnnotatedSentence> as
    		= boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(
    			context.sentence_context().get_sentence_ptr());
    	if (!as) {
    		throw InvalidArgument("context", "Operator needs an annotated sentence.");
    	}
    
    	boost::shared_ptr<const Match> check_from = check_from_->apply(context);
    	boost::shared_ptr<const Match> check_to =
    		(check_from_ == check_to_) ? check_from : check_to_->apply(context);
    	int abs_left = check_from->first_token(as).get_value();
    	if (abs_left < 0) {
    		throw WcclError("Received starting match that points outside sentence.");
    	}
    	int abs_right = check_to->last_token(as).get_value();
    	if (abs_right >= context.sentence_context().size()) {
    		throw WcclError("Received ending match that points outside sentence.");
    	}
    	if (abs_left > abs_right) {
    		throw WcclError("Received starting match points after the received ending match.");
    	}
    	if (!as->has_channel(chan_name_)) {
    		as->create_channel(chan_name_);
    	}
    	Corpus2::AnnotationChannel& channel = as->get_channel(chan_name_);
    
    	int segment_idx = channel.get_segment_at(abs_left);
    	if (segment_idx == 0) {
    		return Predicate::False(context);
    	} else {
    		for (int i = abs_left + 1; i <= abs_right; ++i) {
    			if (segment_idx != channel.get_segment_at(i)) {
    				return Predicate::False(context);
    			}
    		}
    	}
    	return Predicate::True(context);
    }
    
    std::string AnnSub::to_string(const Corpus2::Tagset& tagset) const
    {
    	std::ostringstream ostream;
    	ostream << raw_name() << "(" << check_from_->to_string(tagset);
    	if (check_from_ != check_to_) {
    		ostream << ", " << check_to_->to_string(tagset);
    	}
    	ostream << ", \"" << chan_name_ << "\")";
    	return ostream.str();
    }
    
    std::ostream& AnnSub::write_to(std::ostream& ostream) const
    {
    	ostream << raw_name() << "(" << *check_from_;
    	if (check_from_ != check_to_) {
    		ostream << ", " << *check_to_;
    	}
    	ostream << ", \"" << chan_name_ << "\")";
    	return ostream;
    }
    
    } /* end ns Wccl */