import settings import random from ..BaseBehaviour import * settings.init() class BigMarketModel(BaseBehaviour): """ Settings: Names: enterprises [Array] tweet_probability_enterprises [Array] Users: tweet_probability_users tweet_relevant_probability tweet_probability_about [Array] sentiment_about [Array] """ def __init__(self, environment=None, agent_id=0, state=()): super().__init__(environment=environment, agent_id=agent_id, state=state) self.enterprises = settings.enterprises self.type = "" self.number_of_enterprises = len(settings.enterprises) if self.id < self.number_of_enterprises: # Enterprises self.state['id']=self.id self.type="Enterprise" self.tweet_probability = settings.tweet_probability_enterprises[self.id] else: # normal users self.state['id']=self.number_of_enterprises self.type="User" self.tweet_probability = settings.tweet_probability_users self.tweet_relevant_probability = settings.tweet_relevant_probability self.tweet_probability_about = settings.tweet_probability_about # List self.sentiment_about = settings.sentiment_about # List def step(self, now): if(self.id < self.number_of_enterprises): # Enterprise self.enterpriseBehaviour() else: # Usuario self.userBehaviour() for i in range(self.number_of_enterprises): # So that it never is set to 0 if there are not changes (logs) self.attrs['sentiment_enterprise_%s'% self.enterprises[i]] = self.sentiment_about[i] super().step(now) def enterpriseBehaviour(self): if random.random()< self.tweet_probability: # Tweets aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) #Nodes neighbour users for x in aware_neighbors: if random.uniform(0,10) < 5: x.sentiment_about[self.id] += 0.1 # Increments for enterprise else: x.sentiment_about[self.id] -= 0.1 # Decrements for enterprise # Establecemos limites if x.sentiment_about[self.id] > 1: x.sentiment_about[self.id] = 1 if x.sentiment_about[self.id]< -1: x.sentiment_about[self.id] = -1 x.attrs['sentiment_enterprise_%s'% self.enterprises[self.id]] = x.sentiment_about[self.id] def userBehaviour(self): if random.random() < self.tweet_probability: # Tweets if random.random() < self.tweet_relevant_probability: # Tweets something relevant # Tweet probability per enterprise for i in range(self.number_of_enterprises): random_num = random.random() if random_num < self.tweet_probability_about[i]: # The condition is fulfilled, sentiments are evaluated towards that enterprise if self.sentiment_about[i] < 0: # NEGATIVO self.userTweets("negative",i) elif self.sentiment_about[i] == 0: # NEUTRO pass else: # POSITIVO self.userTweets("positive",i) def userTweets(self,sentiment,enterprise): aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) #Nodes neighbours users for x in aware_neighbors: if sentiment == "positive": x.sentiment_about[enterprise] +=0.003 elif sentiment == "negative": x.sentiment_about[enterprise] -=0.003 else: pass # Establecemos limites if x.sentiment_about[enterprise] > 1: x.sentiment_about[enterprise] = 1 if x.sentiment_about[enterprise] < -1: x.sentiment_about[enterprise] = -1 x.attrs['sentiment_enterprise_%s'% self.enterprises[enterprise]] = x.sentiment_about[enterprise]