def __init__(self, rewardAssigner): self.n_sensor = 2 # Number of sensors. Useful to know how many possible correlations there are self.min_ep = 5 # Minimum number of episodes to consider the correlation possible self.same_values_accepted = 1 # Number of sensor admitted to be equal # Correlations Traces Memories and certainty evaluators self.S1_pos = DistancesCertainty() self.S1_neg = DistancesCertainty() self.S2_neg = DistancesCertainty() self.S2_pos = DistancesCertainty() # self.S3_neg = DistancesCertainty() # self.S3_pos = DistancesCertainty() self.corr_active = 0 # 1 - Sensor 1, 2 - Sensor 2, ... n- sensor n, 0 - no hay correlacion self.corr_type = '' # 'pos' - Correlacion positiva, 'neg' - Correlacion negativa, '' - no hay correlacion self.corr_threshold = 0.1 # Threshold to know when to consider Extrinsic Motivation and when Intrinsic self.established = 0 self.corr_established = 0 self.corr_established_type = '' self.i_reward = rewardAssigner # Valor que indica el indice de la correlacion encargada de # asignarle el reward. Si el indice es null, sera el escenario el encargado de hacerlo ########## self.i_reward_assigned = 0 # Valor para conocer si ya le ha sido asignada una correlacion asignadora de reward ########## self.Tb_max = 25 #15 # Tb_max: Number of goals without antitraces needed to consider the correlation established self.figure = plt.figure()
class Correlations(object): """Class that represents the Correlations module. This module identifies new correlations and contains the set of existing correlations. It contains the Correlation Evaluator that is an algorithm that has to be executed each time a trace is added to the Traces Memory and searches for possible correlations to be stored in the Traces Correlation Memory. It also has the Distances Certainty module that makes possible the creation of certainty maps using the traces stored as positive-traces, negative-traces and weak-traces, which aim is to obtain the certainty value for a point p given """ def __init__(self, rewardAssigner): self.n_sensor = 2 # Number of sensors. Useful to know how many possible correlations there are self.min_ep = 5 # Minimum number of episodes to consider the correlation possible self.same_values_accepted = 1 # Number of sensor admitted to be equal # Correlations Traces Memories and certainty evaluators self.S1_pos = DistancesCertainty() self.S1_neg = DistancesCertainty() self.S2_neg = DistancesCertainty() self.S2_pos = DistancesCertainty() # self.S3_neg = DistancesCertainty() # self.S3_pos = DistancesCertainty() self.corr_active = 0 # 1 - Sensor 1, 2 - Sensor 2, ... n- sensor n, 0 - no hay correlacion self.corr_type = '' # 'pos' - Correlacion positiva, 'neg' - Correlacion negativa, '' - no hay correlacion self.corr_threshold = 0.1 # Threshold to know when to consider Extrinsic Motivation and when Intrinsic self.established = 0 self.corr_established = 0 self.corr_established_type = '' self.i_reward = rewardAssigner # Valor que indica el indice de la correlacion encargada de # asignarle el reward. Si el indice es null, sera el escenario el encargado de hacerlo ########## self.i_reward_assigned = 0 # Valor para conocer si ya le ha sido asignada una correlacion asignadora de reward ########## self.Tb_max = 25 #15 # Tb_max: Number of goals without antitraces needed to consider the correlation established self.figure = plt.figure() # self.figure.canvas.set_window_title('PRUEBA') def correlationEvaluator(self, Trace): """This method evaluates the possible correlations existing in a trace T and save them in the proper Correlation Traces Memory Buffer Keyword arguments: Trace -- List of tuples, it is a List of episodes-sensorization(tuples) """ if len(Trace) >= self.min_ep: for i in range(self.n_sensor): p_corr = 1 # Positive correlation n_corr = 1 # Negative correlation same_value = 0 # Number of times a sensor has the same value in two consecutive episodes for j in reversed(range(len(Trace) - self.min_ep, len(Trace))): # No es necesario llegar al 0 porque estoy contemplandolo ya en el [j-1] if p_corr: # The case when positive correlation is active if Trace[j][i] > Trace[j - 1][i]: n_corr = 0 # Negative correlation is no longer possible for this sensor elif Trace[j][i] < Trace[j - 1][i]: p_corr = 0 # Positive correlation is no longer possible for this sensor else: # Trace[j][i]=Trace[j-1][i] same_value += 1 if same_value > self.same_values_accepted: n_corr = 0 p_corr = 0 elif n_corr: # The case when negative correlation is active if Trace[j][i] > Trace[j - 1][i]: n_corr = 0 # Negative correlation is no longer possible for this sensor elif Trace[j][i] < Trace[j - 1][i]: p_corr = 0 # Positive correlation is no longer possible for this sensor else: # Trace[j][i]=Trace[j-1][i] same_value += 1 if same_value > self.same_values_accepted: n_corr = 0 p_corr = 0 # If there is a correlation, save it in the pertinent correlation trace memory if p_corr: # Si esto esta bien corregirlo, porque es redundante self.addWeakTrace(Trace, i + 1, 'pos') # self.addTrace(Trace, i + 1, 'pos') # print "Traza debil positiva en sensor : ", i + 1 # print "Traza: ", Trace elif n_corr: self.addWeakTrace(Trace, i + 1, 'neg') # self.addTrace(Trace, i + 1, 'neg') # print "Traza debil negativa en sensor : ", i + 1 # print "Traza: ", Trace def getActiveCorrelation(self, p): """ # Este metodo despues ira dentro del motivation manager, y lo de correlaciones importado alli tambien (dentro de un modulo que sea modelos de utilidad) # Evaluo la certeza del nuevo punto en todas las correlaciones para ver si pertenece a alguna # Si es mayor que un umbral para alguna de ellas, considero la mayor y si hay empate, una al azar # Si es menor que el umbral, considero la motivacion intrinseca :param p: :return: """ c1_pos = self.S1_pos.getCertaintyValue(p) c1_neg = self.S1_neg.getCertaintyValue(p) c2_pos = self.S2_pos.getCertaintyValue(p) c2_neg = self.S2_neg.getCertaintyValue(p) # c3_pos = self.S3_pos.getCertaintyValue(p) # c3_neg = self.S3_neg.getCertaintyValue(p) n_c1_pos = self.S1_pos.numberOfGoalsWithoutAntiTraces n_c1_neg = self.S1_neg.numberOfGoalsWithoutAntiTraces n_c2_pos = self.S2_pos.numberOfGoalsWithoutAntiTraces n_c2_neg = self.S2_neg.numberOfGoalsWithoutAntiTraces # n_c3_pos = self.S3_pos.numberOfGoalsWithoutAntiTraces # n_c3_neg = self.S3_neg.numberOfGoalsWithoutAntiTraces if self.established: ### Poido non estar de acordo en esto # j = (n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, n_c3_neg).index( # max(n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, # n_c3_neg)) # Save index of the correlated correlation # if self.corr_threshold > (c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg)[ # j]: # Si el umbral es mayor que el valor de certeza de la correlacion consolidada # self.corr_active = 0 # self.corr_type = '' # else: # i = (n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, n_c3_neg).index( # max(n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, # n_c3_neg)) # Redundante, ya podria usar el indice j de arriba # if i < 2: # self.corr_active = 1 # Sensor 1 # elif i < 4: # self.corr_active = 2 # Sensor 2 # else: # self.corr_active = 3 # Sensor 3 # if i % 2 == 0: # Posicion par # self.corr_type = 'pos' # else: # self.corr_type = 'neg' if self.corr_established == 1: if self.corr_established_type == 'pos': j = 0 else: j = 1 elif self.corr_established == 2: if self.corr_established_type == 'pos': j = 2 else: j = 3 # else: # if self.corr_established_type == 'pos': # j = 4 # else: # j = 5 # if self.corr_threshold > (c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg)[ # j]: # Si el umbral es mayor que el valor de certeza de la correlacion consolidada if self.corr_threshold > ( c1_pos, c1_neg, c2_pos, c2_neg )[j]: # Si el umbral es mayor que el valor de certeza de la correlacion consolidada self.corr_active = 0 self.corr_type = '' else: self.corr_active = self.corr_established self.corr_type = self.corr_established_type else: # if self.corr_threshold > max(c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg): if self.corr_threshold > max(c1_pos, c1_neg, c2_pos, c2_neg): self.corr_active = 0 # Al no haber correlacion activa doy por hecho que se usa la motivInt self.corr_type = '' else: # Guardo posicion valor maximo # i = (c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg).index( # max(c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg)) i = (c1_pos, c1_neg, c2_pos, c2_neg).index(max(c1_pos, c1_neg, c2_pos, c2_neg)) if i < 2: self.corr_active = 1 # Sensor 1 elif i < 4: self.corr_active = 2 # Sensor 2 # else: # self.corr_active = 3 # Sensor 3 if i % 2 == 0: # Posicion par self.corr_type = 'pos' else: self.corr_type = 'neg' # certainty_value = max(c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg) return self.corr_active, self.corr_type # , certainty_value def getCertainty(self, p): """This method provides the maximum certainty value of the correlations :param p: :return: """ c1_pos = self.S1_pos.getCertaintyValue(p) c1_neg = self.S1_neg.getCertaintyValue(p) c2_pos = self.S2_pos.getCertaintyValue(p) c2_neg = self.S2_neg.getCertaintyValue(p) # c3_pos = self.S3_pos.getCertaintyValue(p) # c3_neg = self.S3_neg.getCertaintyValue(p) if self.established: # n_c1_pos = self.S1_pos.numberOfGoalsWithoutAntiTraces # n_c1_neg = self.S1_neg.numberOfGoalsWithoutAntiTraces # n_c2_pos = self.S2_pos.numberOfGoalsWithoutAntiTraces # n_c2_neg = self.S2_neg.numberOfGoalsWithoutAntiTraces # n_c3_pos = self.S3_pos.numberOfGoalsWithoutAntiTraces # n_c3_neg = self.S3_neg.numberOfGoalsWithoutAntiTraces # # j = (n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, n_c3_neg).index( # max(n_c1_pos, n_c1_neg, n_c2_pos, n_c2_neg, n_c3_pos, # n_c3_neg)) # Save index of the correlated correlation # # certainty_value = (c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg)[ # j] # Certainty value of the correlated correlation if self.corr_established == 1: if self.corr_established_type == 'pos': j = 0 else: j = 1 elif self.corr_established == 2: if self.corr_established_type == 'pos': j = 2 else: j = 3 # else: # if self.corr_established_type == 'pos': # j = 4 # else: # j = 5 # certainty_value = (c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg)[j] certainty_value = (c1_pos, c1_neg, c2_pos, c2_neg)[j] else: # certainty_value = max(c1_pos, c1_neg, c2_pos, c2_neg, c3_pos, c3_neg) certainty_value = max(c1_pos, c1_neg, c2_pos, c2_neg) return certainty_value def addTrace(self, Trace, sensor, corr_type, IntrinsicGuided=0): if not self.established and len(Trace) > 0: # Guardo solo hasta donde se cumple la correlacion for i in reversed(range(len(Trace))): if corr_type == 'neg': if Trace[i][sensor - 1] >= Trace[i - 1][sensor - 1]: break elif corr_type == 'pos': if Trace[i][sensor - 1] <= Trace[i - 1][sensor - 1]: break if sensor == 1: if corr_type == 'pos': self.S1_pos.addTraces(Trace[i:], IntrinsicGuided) # print "Traza fuerte: ", sensor, corr_type # print "Traza: ", Trace[i:] elif corr_type == 'neg': self.S1_neg.addTraces(Trace[i:], IntrinsicGuided) # print "Traza fuerte: ", sensor, corr_type # print "Traza: ", Trace[i:] elif sensor == 2: if corr_type == 'pos': self.S2_pos.addTraces(Trace[i:], IntrinsicGuided) # print "Traza fuerte: ", sensor, corr_type # print "Traza: ", Trace[i:] elif corr_type == 'neg': self.S2_neg.addTraces(Trace[i:], IntrinsicGuided) # print "Traza fuerte: ", sensor, corr_type # print "Traza: ", Trace[i:] # elif sensor == 3: # if corr_type == 'pos': # self.S3_pos.addTraces(Trace[i:], IntrinsicGuided) # # print "Traza fuerte: ", sensor, corr_type # # print "Traza: ", Trace[i:] # elif corr_type == 'neg': # self.S3_neg.addTraces(Trace[i:], IntrinsicGuided) # # print "Traza fuerte: ", sensor, corr_type # # print "Traza: ", Trace[i:] # Check if the correlation is established (it could only happen after adding a trace) self.isCorrelationEstablished() def addAntiTrace(self, Trace, sensor, corr_type, IntrinsicGuided=0): # Filtro aqui para guardar los valores obtenidos con motivacion extrinseca # if not self.established: if sensor == 1: if corr_type == 'pos': self.S1_pos.addAntiTraces(Trace, IntrinsicGuided) # print "Antitraza: ", sensor, corr_type # print "Traza: ", Trace elif corr_type == 'neg': self.S1_neg.addAntiTraces(Trace, IntrinsicGuided) # print "Antitraza: ", sensor, corr_type # print "Traza: ", Trace elif sensor == 2: if corr_type == 'pos': self.S2_pos.addAntiTraces(Trace, IntrinsicGuided) # print "Antitraza: ", sensor, corr_type # print "Traza: ", Trace elif corr_type == 'neg': self.S2_neg.addAntiTraces(Trace, IntrinsicGuided) # print "Antitraza: ", sensor, corr_type # print "Traza: ", Trace # elif sensor == 3: # if corr_type == 'pos': # self.S3_pos.addAntiTraces(Trace, IntrinsicGuided) # # print "Antitraza: ", sensor, corr_type # # print "Traza: ", Trace # elif corr_type == 'neg': # self.S3_neg.addAntiTraces(Trace, IntrinsicGuided) # # print "Antitraza: ", sensor, corr_type # # print "Traza: ", Trace def addWeakTrace(self, Trace, sensor, corr_type): # plt.figure() if not self.established: # Guardo solo hasta donde se cumple la correlacion for i in reversed(range(len(Trace))): if corr_type == 'neg': if Trace[i][sensor - 1] >= Trace[i - 1][sensor - 1]: break elif corr_type == 'pos': if Trace[i][sensor - 1] <= Trace[i - 1][sensor - 1]: break if sensor == 1: if corr_type == 'pos': self.S1_pos.addWeakTraces(Trace[i:]) elif corr_type == 'neg': self.S1_neg.addWeakTraces(Trace[i:]) elif sensor == 2: if corr_type == 'pos': self.S2_pos.addWeakTraces(Trace[i:]) elif corr_type == 'neg': self.S2_neg.addWeakTraces(Trace[i:]) # elif sensor == 3: # if corr_type == 'pos': # self.S3_pos.addWeakTraces(Trace[i:]) # elif corr_type == 'neg': # self.S3_neg.addWeakTraces(Trace[i:]) def addIgTrace(self, Trace, sensor, corr_type, IntrinsicGuided=0): # Guardo toda la traza if sensor == 1: if corr_type == 'pos': self.S1_pos.addIgTraces(Trace, IntrinsicGuided) elif corr_type == 'neg': self.S1_neg.addIgTraces(Trace, IntrinsicGuided) elif sensor == 2: if corr_type == 'pos': self.S2_pos.addIgTraces(Trace, IntrinsicGuided) elif corr_type == 'neg': self.S2_neg.addIgTraces(Trace, IntrinsicGuided) def isCorrelationEstablished(self): # n_traces = 10 # 8#20 # Number of goals without antitraces needed to consider the correlation established corr1_pos = self.S1_pos.numberOfGoalsWithoutAntiTraces corr1_neg = self.S1_neg.numberOfGoalsWithoutAntiTraces corr2_pos = self.S2_pos.numberOfGoalsWithoutAntiTraces corr2_neg = self.S2_neg.numberOfGoalsWithoutAntiTraces # corr3_pos = self.S3_pos.numberOfGoalsWithoutAntiTraces # corr3_neg = self.S3_neg.numberOfGoalsWithoutAntiTraces # max_traces = max(corr1_pos, corr1_neg, corr2_pos, corr2_neg, corr3_pos, corr3_neg) max_traces = max(corr1_pos, corr1_neg, corr2_pos, corr2_neg) if not self.established: if max_traces >= self.Tb_max: #n_traces: self.established = 1 # i = (corr1_pos, corr1_neg, corr2_pos, corr2_neg, corr3_pos, corr3_neg).index(max_traces) i = (corr1_pos, corr1_neg, corr2_pos, corr2_neg).index(max_traces) if i < 2: self.corr_established = 1 # Sensor 1 elif i < 4: self.corr_established = 2 # Sensor 2 # else: # self.corr_established = 3 # Sensor 3 if i % 2 == 0: # Posicion par self.corr_established_type = 'pos' else: self.corr_established_type = 'neg' else: self.established = 0