Skip to content

Commit 55cf1cb

Browse files
committed
structure update
1 parent 981b73f commit 55cf1cb

5 files changed

Lines changed: 66 additions & 36 deletions

File tree

epde/operators/common/right_part_selection.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@ def apply(self, objective : Equation, arguments : dict):
4949
while not (objective.simplified and objective.is_correct_right_part):
5050
objective.reset_state(True)
5151
min_fitness = np.inf
52-
weights_internal = np.zeros_like(objective.structure)
52+
weights_internal = np.zeros(len(objective.structure) - 1)
5353
min_idx = 0
54-
if not any(term.contains_deriv(objective.main_var_to_explain) for term in objective.structure):
54+
while not any(term.contains_deriv(objective.main_var_to_explain) for term in objective.structure):
55+
# while not any(term.contains_deriv() for term in objective.structure):
5556
objective.restore_property(mandatory_family=False, deriv=True)
5657

5758
for target_idx, target_term in enumerate(objective.structure):
5859
if not objective.structure[target_idx].contains_deriv(objective.main_var_to_explain):
60+
# if not objective.structure[target_idx].contains_deriv():
5961
continue
6062
objective.target_idx = target_idx
6163
fitness = self.suboperators['fitness_calculation'].apply(objective, arguments = subop_args['fitness_calculation'], force_out_of_place = True)
@@ -66,12 +68,17 @@ def apply(self, objective : Equation, arguments : dict):
6668
else:
6769
pass
6870

71+
if all(weights_internal == 0):
72+
objective.randomize()
73+
continue
74+
6975
objective.weights_internal = weights_internal
7076
objective.weights_internal_evald = True
7177
objective.target_idx = min_idx
7278
if not self.simplify_equation(objective):
7379
objective.simplified = True
7480
if objective.structure[objective.target_idx].contains_deriv(objective.main_var_to_explain):
81+
# if objective.structure[objective.target_idx].contains_deriv():
7582
objective.is_correct_right_part = True
7683
else:
7784
objective.right_part_selected = True

epde/operators/multiobjective/moeadd_specific.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def apply(self, objective: Tuple[Union[SoEq, ParetoLevels]], arguments: dict):
225225

226226
# TODO: Init normalizer here!
227227
# print('objective is ', objective)
228-
objective[1].set_normalizer()
228+
# objective[1].set_normalizer()
229229

230230
objective[1].update(objective[0]) # levels_updated = ndl_update(offspring, levels)
231231
if len(objective[1].levels) == 1:
@@ -582,17 +582,19 @@ def has_subset_pair(collection_of_sets):
582582
return False, None, None
583583

584584
def is_rps_in_other_equation(objective):
585-
rsterms = set()
585+
rsterms = [None for _ in objective.vals]
586586
replaced = [False for _ in objective.vals]
587-
for equation in objective.vals:
588-
rsterms.add(equation.structure[equation.target_idx].described_variables_full)
589587
for equation_idx, equation in enumerate(objective.vals):
588+
rsterms[equation_idx] = equation.structure[equation.target_idx].described_variables_full
589+
590+
for equation_idx, equation in enumerate(objective.vals):
591+
rs = rsterms[:equation_idx] + rsterms[equation_idx + 1:]
590592
for term_idx, term in enumerate(equation.structure):
591-
if term_idx != equation.target_idx and term.described_variables_full in rsterms:
593+
if any(rsterm.issubset(term.described_variables_full) for rsterm in rs):
592594
replaced[equation_idx] = True
593595
term.randomize()
594596
term.reset_saved_state()
595-
while len(equation.described_variables_full) != len(equation.structure):
597+
while any(rsterm.issubset(term.described_variables_full) for rsterm in rs) or len(equation.described_variables_full) != len(equation.structure):
596598
term.randomize()
597599
term.reset_saved_state()
598600
return replaced

epde/operators/multiobjective/variation.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ def apply(self, objective : ParetoLevels, arguments : dict):
8787

8888
arguments = subop_args['chromosome_crossover'])
8989

90-
# if len(new_system_1.vars_to_describe) > 1 and np.random.random() < 0.2:
91-
# key = np.random.choice(new_system_1.vars_to_describe)
92-
# temp = deepcopy(new_system_1.vals.chromosome[key])
93-
# new_system_1.vals.chromosome[key] = new_system_2.vals.chromosome[key]
94-
# new_system_2.vals.chromosome[key] = temp
90+
if len(new_system_1.vars_to_describe) > 1 and np.random.random() < 0.2:
91+
key = np.random.choice(new_system_1.vars_to_describe)
92+
temp = deepcopy(new_system_1.vals.chromosome[key])
93+
new_system_1.vals.chromosome[key] = new_system_2.vals.chromosome[key]
94+
new_system_2.vals.chromosome[key] = temp
9595

9696
offsprings.extend([new_system_1, new_system_2])
9797

epde/optimizers/moeadd/population_constr.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,29 @@ def applyToPassed(self, passed_solution: SoEq, **kwargs):
3939
passed_solution.use_default_multiobjective_function(self.use_pic)
4040

4141
def create(self, **kwargs):
42-
sparsity = kwargs.get('sparsity', 10 ** (np.random.uniform(low = np.log10(self.sparsity_interval[0]),
43-
high = np.log10(self.sparsity_interval[1]),
44-
size = len(self.vars_demand_equation))))
42+
# sparsity = kwargs.get('sparsity', 10 ** (np.random.uniform(low = np.log10(self.sparsity_interval[0]),
43+
# high = np.log10(self.sparsity_interval[1]),
44+
# size = len(self.vars_demand_equation))))
45+
# # nonzero_terms = kwargs.get('nonzero_terms', np.random.randint(low=1,
46+
# high=self.terms_number,
47+
# size=len(self.vars_demand_equation)))
48+
# nu = kwargs.get('nu', 10 ** (np.random.uniform(low=np.log10(self.sparsity_interval[0]),
49+
# high=np.log10(self.sparsity_interval[1]),
50+
# size=len(self.vars_demand_equation))))
51+
# threshold = kwargs.get('threshold', 10 ** (np.random.uniform(low=np.log10(self.sparsity_interval[0]),
52+
# high=np.log10(self.sparsity_interval[1]),
53+
# size=len(self.vars_demand_equation))))
4554
terms_number = kwargs.get('terms_number', self.terms_number)
4655
max_factors_in_term = kwargs.get('max_factors_in_term', self.max_factors_in_term)
4756

48-
print(f'Creating new equation, sparsity value {sparsity}')
57+
# print(f'Creating new equation, sparsity value {sparsity}')
4958
metaparameters = {'terms_number' : {'optimizable' : False, 'value' : terms_number},
5059
'max_factors_in_term' : {'optimizable' : False, 'value' : max_factors_in_term}}
51-
for idx, variable in enumerate(self.vars_demand_equation):
52-
metaparameters[('sparsity', variable)] = {'optimizable' : True, 'value' : sparsity[idx]}
60+
# for idx, variable in enumerate(self.vars_demand_equation):
61+
# metaparameters[('sparsity', variable)] = {'optimizable' : True, 'value' : sparsity[idx]}
62+
# metaparameters[('nonzero_terms', variable)] = {'optimizable': True, 'value': nonzero_terms[idx]}
63+
# metaparameters[('threshold', variable)] = {'optimizable': True, 'value': threshold[idx]}
64+
# metaparameters[('nu', variable)] = {'optimizable': True, 'value': nu[idx]}
5365

5466
created_solution = SoEq(pool = self.pool, metaparameters = metaparameters)
5567

epde/structure/main_structures.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -306,13 +306,13 @@ def latex_form(self):
306306

307307
def contains_deriv(self, variable=None):
308308
if variable is None:
309-
return any([factor.is_deriv and factor.deriv_code != [None,] and
309+
return sum([factor.is_deriv and factor.deriv_code != [None,] and
310310
factor.evaluator._evaluator == simple_function_evaluator
311-
for factor in self.structure])
311+
for factor in self.structure]) == 1
312312
else:
313-
return any([factor.variable == variable and factor.deriv_code != [None,] and
313+
return sum([factor.variable == variable and factor.is_deriv and factor.deriv_code != [None,] and
314314
factor.evaluator._evaluator == simple_function_evaluator
315-
for factor in self.structure])
315+
for factor in self.structure]) == 1
316316

317317
def contains_variable(self, variable):
318318
return any([factor.variable == variable for factor in self.structure])
@@ -369,7 +369,13 @@ def described_variables(self):
369369
def described_variables_full(self):
370370
described = set()
371371
for factor in self.structure:
372-
described.add(factor.cache_label)
372+
if factor.ftype == 'trigonometric':
373+
label = (factor.cache_label[0], tuple(
374+
factor.cache_label[1][i] for i, param in factor.params_description.items() if
375+
param['name'] != 'freq'))
376+
described.add(label)
377+
else:
378+
described.add(factor.cache_label)
373379
described = frozenset(described)
374380
return described
375381

@@ -443,16 +449,18 @@ def __init__(self, pool: TFPool, basic_structure: Union[list, tuple, set], var_t
443449

444450
force_var_to_explain = True # False
445451
for i in range(len(basic_structure), int(self.metaparameters['terms_number']['value'])):
446-
check_test = 0
447-
while True:
448-
check_test += 1
449-
mf = var_to_explain if force_var_to_explain else None
450-
new_term = Term(self.pool, max_factors_in_term=self.metaparameters['max_factors_in_term']['value'],
451-
mandatory_family=mf, passed_term=None)
452+
new_term = Term(self.pool, max_factors_in_term=self.metaparameters['max_factors_in_term']['value'],
453+
mandatory_family=None, passed_term=None)
454+
while new_term.described_variables_full in self.described_variables_full:
455+
new_term.randomize()
456+
new_term.reset_saved_state()
457+
# check_test += 1
458+
#
459+
452460

453-
if new_term.described_variables_full not in self.described_variables_full:
454-
force_var_to_explain = False
455-
break
461+
# if new_term.described_variables_extra not in self.described_variables_full:
462+
# force_var_to_explain = False
463+
# break
456464

457465
self.structure.append(new_term)
458466

@@ -462,6 +470,7 @@ def __init__(self, pool: TFPool, basic_structure: Union[list, tuple, set], var_t
462470

463471
def randomize(self):
464472
self.__init__(self.pool, [], self.main_var_to_explain, metaparameters=self.metaparameters)
473+
self.reset_saved_state()
465474

466475
def manual_reconst(self, attribute:str, value, except_attrs:dict):
467476
from epde.loader import attrs_from_dict, get_typespec_attrs
@@ -562,7 +571,7 @@ def reconstruct_by_right_part(self, right_part_idx):
562571
return new_eq
563572

564573
def evaluate(self, normalize=True, return_val=False, grids=None):
565-
target = self.structure[self.target_idx].evaluate(normalize, grids=grids)
574+
target = self.structure[self.target_idx].evaluate(False, grids=grids)
566575

567576
# Place for improvent: introduce shifted_idx where necessary
568577
def shifted_idx(idx):
@@ -580,9 +589,9 @@ def shifted_idx(idx):
580589
feature_indexes = [idx for idx in range(len(self.structure))
581590
if self.weights_internal[shifted_idx(idx)] != 0 and idx != self.target_idx]
582591
if len(feature_indexes) > 0:
583-
features = self.structure[feature_indexes[0]].evaluate(normalize, grids=grids)
592+
features = self.structure[feature_indexes[0]].evaluate(False, grids=grids)
584593
for feat_idx in range(1, len(feature_indexes)):
585-
temp = self.structure[feature_indexes[feat_idx]].evaluate(normalize, grids=grids)
594+
temp = self.structure[feature_indexes[feat_idx]].evaluate(False, grids=grids)
586595
features = np.vstack([features, temp])
587596
if features.ndim == 1:
588597
features = np.expand_dims(features, 1).T

0 commit comments

Comments
 (0)