In [1]:
import numpy as np
from deap.tools import sortLogNondominated
from pykalman import KalmanFilter
In [2]:
class StoppingCriterion(object):
'''
classdocs
'''
def __init__(self, progress_indicators, evidence_gatherers, stop_decisors, voting=np.all):
'''
Constructor
'''
self.progress_indicators = progress_indicators
self.evidence_gatherers = evidence_gatherers
self.stop_decisors = stop_decisors
self.voting = voting
self.internal_state = InternalState
def is_end_condition_met(self, population):
'''Decides if the evolution can/must/should be stopped.'''
prog_inds_values = [indicator.compute_indicator(population) for indicator in self.progress_indicators]
evidences = [gatherer.gather_evidence(prog_inds_values) for gatherer in self.evidence_gatherers]
decisions = [decisor.must_stop(evidences) for decisor in self.stop_decisors]
return self.voting(decisions), (prog_ind_values, evidences, decisions)
In [3]:
class EvidenceGatherer():
def gather_evidence(self, prog_inds_values):
raise NotImplementedError('Method belongs to abstract class')
class ProgressIndicator():
def compute_indicator(self, population):
raise NotImplementedError('Method belongs to abstract class')
class StopDecisor():
def must_stop(self, evidences):
raise NotImplementedError('Method belongs to abstract class')
In [4]:
class MutualDominationRateIndicator(ProgressIndicator):
def compute_indicator(self, population):
if not self._previous_pop:
self.previous_pop = population
return np.nan
res = self._norm_delta(self._previous_pop, population) - self._norm_delta(population, self._previous_pop)
self._previous_pop = population
return res
def _norm_delta(pop_a, pop_b):
fronts_a = SortLogNonDominated(pop_a)
count_a = 0
for front_a in fronts_a:
front_with_b = SortLogNonDominated(front_a+pop_b, first_front_only=True)
dominators = [ind for ind in front_a if ind in front_with_b]
count_a += len(dominators)
return count_a/len(pop_a)
In [ ]:
class MGBMEvidenceGatherer(EvidenceGatherer):
def __init__(self, r):
self.r = r
def gather_evidence(self, prog_inds_values):
for ind_value in prog_inds_values:
In [ ]:
for j = 1:length(state.PI)
M = state.(state.PI{j});
if ~isfield(state, 'kalman') || ...
size(state.kalman,1) < length(state.PI) || ...
any(isnan(state.kalman(j,:)))
% first generation: initialize Kalman filter with first value and
% initial guess of the noise
if ~isnan(M(end))
state.kalman(j,:) = [M(end) params.R 1];
else
state.kalman(j,:) = [NaN NaN NaN];
end;
elseif ~isnan(M(end))
% configure the Kalman filter
s.x = state.kalman(j,1);
s.z = M(end);
s.A = 1;
s.B = 0;
s.Q = 0;
s.R = params.R;
s.P = state.kalman(j,2);
% compute Kalman filter
out = kalmanf(s);
% update state
state.kalman(j,:) = [out.x out.P state.kalman(j,3)+1];
end;
end;
In [ ]:
KalmanFilter(transition_matrices=[1.], # A
observation_matrices=None,
transition_covariance=[0.], # Q
observation_covariance=[self.r],
transition_offsets= [0.], # b
observation_offsets=None, # d
initial_state_mean=None, # mu_0
initial_state_covariance=None,
random_state=None,
em_vars=['transition_covariance', 'observation_covariance', 'initial_state_mean', 'initial_state_covariance'],
n_dim_state=None, n_dim_obs=None))