def _init_experts(self):
        self.keyword = KeyWordsExpert(self.blackboard)
        self.keyword.get_keyphrases()

        ###generating experts ###
        print "Words generating experts..."
        self.word_generating_experts = []
        self.word_generating_experts.append(self.keyword)
        self.word_generating_experts.append(
            WordNetExpert.WordNetExpert(self.blackboard))
        self.word_generating_experts.append(
            EmotionExpert.EmotionExpert(self.blackboard))
        self.word_generating_experts.append(
            CollocationExpert.CollocationExpert(self.blackboard))

        ### Poem making experts... ###
        print "Poem making experts..."
        self.poem_making_experts = []
        self.poem_making_experts.append(self.keyword)
        self.poem_making_experts.append(
            EpithetExpert.EpithetExpert(self.blackboard))
        self.poem_making_experts.append(
            ApostropheExpert.ApostropheExpert(self.blackboard))
        self.poem_making_experts.append(
            SentenceExpert.SentenceExpert(self.blackboard,
                                          self.blackboard.tense,
                                          self.blackboard.person))
        self.poem_making_experts.append(
            ComparisonExpert.ComparisonExpert(self.blackboard))
        self.poem_making_experts.append(
            ExclamationExpert.ExclamationExpert(self.blackboard))
        # self.poem_making_experts.append(NGramExpert.NGramExpert(self.blackboard))
        self.poem_making_experts.append(
            RepetitionExpert.RepetitionExpert(self.blackboard))
        self.poem_making_experts.append(
            OverflowExpert.OverflowExpert(self.blackboard))
        self.poem_making_experts.append(
            RhetoricalExpert.RhetoricalExpert(self.blackboard))
        self.poem_making_experts.append(
            MetaphoreExpert.MetaphoreExpert(self.blackboard))
        self.poem_making_experts.append(
            OxymoronExpert.OxymoronExpert(self.blackboard))

        # self.anaphora = AnaphoraExpert.AnaphoraExpert(self.blackboard)
        # self.epiphora = EpiphoraExpert.EpiphoraExpert(self.blackboard)
        print "Control experts..."
        self.syllables = SyllablesExpert.SyllablesExpert(self.blackboard)
        self.diversity = DiversityExpert.DiversityExpert(self.blackboard)
        self.rhymes = RhymesExpert.RhymesExpert(self.blackboard)
        self.emotion = EmotionExpert.EmotionExpert(self.blackboard)
    def _init_experts(self):
        self.keyword = KeyWordsExpert(self.blackboard)
        self.keyword.get_keyphrases()

        ###generating experts ###
        print "Words generating experts..."
        self.word_generating_experts = []
        self.word_generating_experts.append(self.keyword)
        self.word_generating_experts.append(WordNetExpert.WordNetExpert(self.blackboard))
        self.word_generating_experts.append(EmotionExpert.EmotionExpert(self.blackboard))
        self.word_generating_experts.append(CollocationExpert.CollocationExpert(self.blackboard))

        
        ### Poem making experts... ###
        print "Poem making experts..."
        self.poem_making_experts = []
        self.poem_making_experts.append(self.keyword)
        self.poem_making_experts.append(EpithetExpert.EpithetExpert(self.blackboard))
        self.poem_making_experts.append(ApostropheExpert.ApostropheExpert(self.blackboard))
        self.poem_making_experts.append(SentenceExpert.SentenceExpert(self.blackboard, self.blackboard.tense, self.blackboard.person))
        self.poem_making_experts.append(ComparisonExpert.ComparisonExpert(self.blackboard))
        self.poem_making_experts.append(ExclamationExpert.ExclamationExpert(self.blackboard))
       # self.poem_making_experts.append(NGramExpert.NGramExpert(self.blackboard))
        self.poem_making_experts.append(RepetitionExpert.RepetitionExpert(self.blackboard))
        self.poem_making_experts.append(OverflowExpert.OverflowExpert(self.blackboard))
        self.poem_making_experts.append(RhetoricalExpert.RhetoricalExpert(self.blackboard))
        self.poem_making_experts.append(MetaphoreExpert.MetaphoreExpert(self.blackboard))
        self.poem_making_experts.append(OxymoronExpert.OxymoronExpert(self.blackboard))

       # self.anaphora = AnaphoraExpert.AnaphoraExpert(self.blackboard)
       # self.epiphora = EpiphoraExpert.EpiphoraExpert(self.blackboard)
        print "Control experts..."
        self.syllables = SyllablesExpert.SyllablesExpert(self.blackboard)
        self.diversity = DiversityExpert.DiversityExpert(self.blackboard)
        self.rhymes = RhymesExpert.RhymesExpert(self.blackboard)
        self.emotion = EmotionExpert.EmotionExpert(self.blackboard)
class ControlComponent(object):
    """Control of experts priorities and actions, ending process"""
    def __init__(self, blackboard=None):
        logging.basicConfig(filename='poem.log', level=logging.INFO)
        #text_nr = randint(0,8)
        text_file = text_dir + ".txt"
        print "Making blackboard..."
        self.blackboard = Blackboard(text_file, [8, 8, 8, 8, 0, 8, 8, 8, 8])
        print self.blackboard.text
        logging.info(self.blackboard.text)

    def _init_experts(self):
        self.keyword = KeyWordsExpert(self.blackboard)
        self.keyword.get_keyphrases()

        ###generating experts ###
        print "Words generating experts..."
        self.word_generating_experts = []
        self.word_generating_experts.append(self.keyword)
        self.word_generating_experts.append(
            WordNetExpert.WordNetExpert(self.blackboard))
        self.word_generating_experts.append(
            EmotionExpert.EmotionExpert(self.blackboard))
        self.word_generating_experts.append(
            CollocationExpert.CollocationExpert(self.blackboard))

        ### Poem making experts... ###
        print "Poem making experts..."
        self.poem_making_experts = []
        self.poem_making_experts.append(self.keyword)
        self.poem_making_experts.append(
            EpithetExpert.EpithetExpert(self.blackboard))
        self.poem_making_experts.append(
            ApostropheExpert.ApostropheExpert(self.blackboard))
        self.poem_making_experts.append(
            SentenceExpert.SentenceExpert(self.blackboard,
                                          self.blackboard.tense,
                                          self.blackboard.person))
        self.poem_making_experts.append(
            ComparisonExpert.ComparisonExpert(self.blackboard))
        self.poem_making_experts.append(
            ExclamationExpert.ExclamationExpert(self.blackboard))
        # self.poem_making_experts.append(NGramExpert.NGramExpert(self.blackboard))
        self.poem_making_experts.append(
            RepetitionExpert.RepetitionExpert(self.blackboard))
        self.poem_making_experts.append(
            OverflowExpert.OverflowExpert(self.blackboard))
        self.poem_making_experts.append(
            RhetoricalExpert.RhetoricalExpert(self.blackboard))
        self.poem_making_experts.append(
            MetaphoreExpert.MetaphoreExpert(self.blackboard))
        self.poem_making_experts.append(
            OxymoronExpert.OxymoronExpert(self.blackboard))

        # self.anaphora = AnaphoraExpert.AnaphoraExpert(self.blackboard)
        # self.epiphora = EpiphoraExpert.EpiphoraExpert(self.blackboard)
        print "Control experts..."
        self.syllables = SyllablesExpert.SyllablesExpert(self.blackboard)
        self.diversity = DiversityExpert.DiversityExpert(self.blackboard)
        self.rhymes = RhymesExpert.RhymesExpert(self.blackboard)
        self.emotion = EmotionExpert.EmotionExpert(self.blackboard)

    def _evaluate_pools_inspiration(self):
        ### estimating words for pool... ###
        for pool in self.blackboard.pool_of_ideas.values():
            print
            print pool.title
            ### estimating pool of words ###
            print "Estimating words..."

            for wg_e in self.word_generating_experts:
                try:
                    inspirations = wg_e.estimate_ideas_size(pool)
                    pool.inspiration += inspirations
                except:
                    print "Error: couldn't estimate words by expert: ", wg_e.name
        ### select best pool...  ###
        print "Evaluation expert..."
        self.evaluation = EvaluationExpert.EvaluationExpert(self.blackboard)
        pool = self.evaluation.select_pool()
        print "Generating poem for title: ", pool.title
        self.blackboard.pool = PoolOfIdeas(pool.title,
                                           self.blackboard.syllables,
                                           pool.sentences)

    def _generate_pool(self):
        ### generate words... ###
        for wg_e in self.word_generating_experts:
            try:
                wg_e.generate_words(self.blackboard.pool)
            except:
                print "Error: couldn't generate words by expert: ", wg_e.name

        print self.blackboard.pool
        logging.info(self.blackboard.pool)

        ### generating phrases... ###
        if len(self.blackboard.pool.nouns) > 0:
            for line in range(len(self.blackboard.syllables)):
                if line > 0:
                    ### making phrases ###
                    print "Making phrases for line " + str(line)
                    # if len(self.blackboard.pool.next_line)>0:
                    #    self.blackboard.pool.poem.append(self.blackboard.pool.next_line)
                    # else:
                    # self.anaphora.add_anaphora(self.blackboard.pool)
                    #  self.epiphora.add_epiphora(self.blackboard.pool)
                    for i in range(5):
                        for e in self.poem_making_experts:
                            try:
                                e.add_phrase(self.blackboard.pool)

                            except:
                                print "Warning - couldn't add phrase by expert: ", e.name
                        logging.info(self.blackboard.pool.phrases_dict)
                        logging.info(
                            "Number of phrases: " +
                            str(len(self.blackboard.pool.phrases_dict)))

                    ### selection...###

                    self.rhymes.select_phrases(self.blackboard.pool, line)
                    logging.info("Rhymes selection: " +
                                 str(len(self.blackboard.pool.phrases_dict)))
                    logging.info(self.blackboard.pool.phrases_dict)

                    self.syllables.select_phrases(self.blackboard.pool, line)
                    logging.info("Syllables selection: " +
                                 str(len(self.blackboard.pool.phrases_dict)))
                    logging.info(self.blackboard.pool.phrases_dict)

                    self.emotion.select_phrases(self.blackboard.pool, line)
                    logging.info("Emotion selection: " +
                                 str(len(self.blackboard.pool.phrases_dict)))
                    logging.info(self.blackboard.pool.phrases_dict)
                    poem_line = self.diversity.select_phrase(
                        self.blackboard.pool.phrases_dict)
                    self.blackboard.pool.poem.append(poem_line)

                    ### cleaning... ###
                    self.blackboard.pool.phrases = self.blackboard.pool.next_line  #overflow sentences
                    self.blackboard.pool.next_line = []
                    self.blackboard.pool.ngram_seed = []
                    self.blackboard.pool.phrases_dict = []

                elif line == 0:
                    self.blackboard.pool.poem.append([])

    def make_poem(self):
        self._init_experts()
        self._evaluate_pools_inspiration()
        self._generate_pool()
        poem = self.blackboard.pool.str_poem()
        logging.info(self.blackboard.pool.print_experts())
        print poem
        logging.info(poem)
        print
class ControlComponent(object):
    """Control of experts priorities and actions, ending process"""

    def __init__(self, blackboard = None):
        logging.basicConfig(filename='poem.log',level=logging.INFO)
        #text_nr = randint(0,8)
        text_file = text_dir+".txt"
        print "Making blackboard..."
        self.blackboard = Blackboard(text_file,[8,8,8,8,0,8,8,8,8])
        print self.blackboard.text
        logging.info(self.blackboard.text)


    def _init_experts(self):
        self.keyword = KeyWordsExpert(self.blackboard)
        self.keyword.get_keyphrases()

        ###generating experts ###
        print "Words generating experts..."
        self.word_generating_experts = []
        self.word_generating_experts.append(self.keyword)
        self.word_generating_experts.append(WordNetExpert.WordNetExpert(self.blackboard))
        self.word_generating_experts.append(EmotionExpert.EmotionExpert(self.blackboard))
        self.word_generating_experts.append(CollocationExpert.CollocationExpert(self.blackboard))

        
        ### Poem making experts... ###
        print "Poem making experts..."
        self.poem_making_experts = []
        self.poem_making_experts.append(self.keyword)
        self.poem_making_experts.append(EpithetExpert.EpithetExpert(self.blackboard))
        self.poem_making_experts.append(ApostropheExpert.ApostropheExpert(self.blackboard))
        self.poem_making_experts.append(SentenceExpert.SentenceExpert(self.blackboard, self.blackboard.tense, self.blackboard.person))
        self.poem_making_experts.append(ComparisonExpert.ComparisonExpert(self.blackboard))
        self.poem_making_experts.append(ExclamationExpert.ExclamationExpert(self.blackboard))
       # self.poem_making_experts.append(NGramExpert.NGramExpert(self.blackboard))
        self.poem_making_experts.append(RepetitionExpert.RepetitionExpert(self.blackboard))
        self.poem_making_experts.append(OverflowExpert.OverflowExpert(self.blackboard))
        self.poem_making_experts.append(RhetoricalExpert.RhetoricalExpert(self.blackboard))
        self.poem_making_experts.append(MetaphoreExpert.MetaphoreExpert(self.blackboard))
        self.poem_making_experts.append(OxymoronExpert.OxymoronExpert(self.blackboard))

       # self.anaphora = AnaphoraExpert.AnaphoraExpert(self.blackboard)
       # self.epiphora = EpiphoraExpert.EpiphoraExpert(self.blackboard)
        print "Control experts..."
        self.syllables = SyllablesExpert.SyllablesExpert(self.blackboard)
        self.diversity = DiversityExpert.DiversityExpert(self.blackboard)
        self.rhymes = RhymesExpert.RhymesExpert(self.blackboard)
        self.emotion = EmotionExpert.EmotionExpert(self.blackboard)

    def _evaluate_pools_inspiration(self):
        ### estimating words for pool... ###
        for pool in self.blackboard.pool_of_ideas.values():
            print
            print pool.title
            ### estimating pool of words ###
            print "Estimating words..."
        
            for wg_e in self.word_generating_experts:
                try:
                    inspirations = wg_e.estimate_ideas_size(pool)
                    pool.inspiration += inspirations
                except:
                    print "Error: couldn't estimate words by expert: ", wg_e.name
        ### select best pool...  ###
        print "Evaluation expert..."
        self.evaluation = EvaluationExpert.EvaluationExpert(self.blackboard)
        pool = self.evaluation.select_pool()
        print "Generating poem for title: ", pool.title
        self.blackboard.pool = PoolOfIdeas(pool.title,self.blackboard.syllables, pool.sentences)


    def _generate_pool(self):
        ### generate words... ###
        for wg_e in self.word_generating_experts:
            try:
                wg_e.generate_words(self.blackboard.pool)
            except:
                print "Error: couldn't generate words by expert: ", wg_e.name

        print self.blackboard.pool
        logging.info(self.blackboard.pool)

        ### generating phrases... ###
        if len(self.blackboard.pool.nouns)>0:
            for line in range(len(self.blackboard.syllables)):
                if line > 0:
                    ### making phrases ###
                    print "Making phrases for line "+str(line)
                   # if len(self.blackboard.pool.next_line)>0:
                    #    self.blackboard.pool.poem.append(self.blackboard.pool.next_line)
                   # else:
                       # self.anaphora.add_anaphora(self.blackboard.pool)
                      #  self.epiphora.add_epiphora(self.blackboard.pool)
                    for i in range(5):
                        for e in self.poem_making_experts:
                            try:
                                e.add_phrase(self.blackboard.pool)
                                    
                            except:
                                print "Warning - couldn't add phrase by expert: ", e.name
                        logging.info(self.blackboard.pool.phrases_dict)
                        logging.info("Number of phrases: "+str(len(self.blackboard.pool.phrases_dict)))
                        
                        
                    ### selection...###
                    
                    self.rhymes.select_phrases(self.blackboard.pool, line)
                    logging.info("Rhymes selection: "+str(len(self.blackboard.pool.phrases_dict)) )
                    logging.info( self.blackboard.pool.phrases_dict)
                    
                    self.syllables.select_phrases(self.blackboard.pool, line)
                    logging.info("Syllables selection: "+str(len(self.blackboard.pool.phrases_dict) ))
                    logging.info( self.blackboard.pool.phrases_dict)
                    
                    self.emotion.select_phrases(self.blackboard.pool, line)                   
                    logging.info("Emotion selection: "+str(len(self.blackboard.pool.phrases_dict)) )
                    logging.info( self.blackboard.pool.phrases_dict)
                    poem_line = self.diversity.select_phrase(self.blackboard.pool.phrases_dict)
                    self.blackboard.pool.poem.append(poem_line)

                    ### cleaning... ###
                    self.blackboard.pool.phrases = self.blackboard.pool.next_line #overflow sentences
                    self.blackboard.pool.next_line = []
                    self.blackboard.pool.ngram_seed = []
                    self.blackboard.pool.phrases_dict = []

                elif line == 0:
                    self.blackboard.pool.poem.append([])

    def make_poem(self):
        self._init_experts()
        self._evaluate_pools_inspiration()
        self._generate_pool()        
        poem = self.blackboard.pool.str_poem()
        logging.info(self.blackboard.pool.print_experts())
        print poem
        logging.info(poem)
        print