Skip to content

Commit 45897eb

Browse files
Fix error in discovery with DeepXDE adapter
1 parent ddd66d7 commit 45897eb

6 files changed

Lines changed: 27 additions & 20 deletions

File tree

epde/integrate/deepxde_integration.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ def solve(self, eq_list: List[Equation], var_names: List[str],
1818
adapter: 'DeepXDEAdapter') -> Tuple[List[np.ndarray], float]:
1919
pass
2020

21-
2221
class Solver1D(SolverStrategy):
2322
def solve(self, eq_list, var_names, grids, data_list, adapter):
2423
t = grids[0]
@@ -68,9 +67,11 @@ def func(x):
6867
model = dde.Model(data_obj, net)
6968
model.compile(adapter.optimizer, lr=adapter.lr)
7069
try:
71-
losshistory, train_state = model.train(epochs=adapter.epochs) # <-- ИСПРАВЛЕНО
72-
final_loss = float(losshistory.loss_train[-1][0]) if losshistory.loss_train else np.nan
70+
losshistory, train_state = model.train(epochs=adapter.epochs)
71+
final_loss = float(
72+
losshistory.loss_train[-1][0]) if losshistory.loss_train else np.nan
7373
except Exception as e:
74+
print(f"Exception: {e}")
7475
y_pred = [np.full(data.shape, np.nan) for data in data_list]
7576
return y_pred, np.nan
7677

@@ -144,9 +145,10 @@ def func(x):
144145
model = dde.Model(data_obj, net)
145146
model.compile(adapter.optimizer, lr=adapter.lr)
146147
try:
147-
losshistory, train_state = model.train(epochs=adapter.epochs) # <- исправлено
148+
losshistory, train_state = model.train(epochs=adapter.epochs) # <-- ИСПРАВЛЕНО
148149
final_loss = float(losshistory.loss_train[-1][0]) if losshistory.loss_train else np.nan
149150
except Exception as e:
151+
print(f"Exception: {e}")
150152
y_pred = [np.full(data.shape, np.nan) for data in data_list]
151153
return y_pred, np.nan
152154

@@ -236,9 +238,10 @@ def func(x):
236238
model = dde.Model(data_obj, net)
237239
model.compile(adapter.optimizer, lr=adapter.lr)
238240
try:
239-
losshistory, train_state = model.train(epochs=adapter.epochs) # <- исправлено
241+
losshistory, train_state = model.train(epochs=adapter.epochs) # <-- ИСПРАВЛЕНО
240242
final_loss = float(losshistory.loss_train[-1][0]) if losshistory.loss_train else np.nan
241243
except Exception as e:
244+
print(f"Exception: {e}")
242245
y_pred = [np.full(data.shape, np.nan) for data in data_list]
243246
return y_pred, np.nan
244247

@@ -302,7 +305,10 @@ def pde(x, y):
302305
for term_idx, term in enumerate(all_terms):
303306
if term_idx == tgt:
304307
continue
305-
coeff = float(eq.weights_final[term_idx]) if use_weights else 1.0
308+
if use_weights and len(eq.weights_final) > term_idx:
309+
coeff = float(eq.weights_final[term_idx])
310+
else:
311+
coeff = 1.0
306312
term_val = 1.0
307313
for factor in term.structure:
308314
fv = self._factor_value_with_map(dde, factor, x, y, self.coord_map, var_idx_map)
@@ -311,11 +317,12 @@ def pde(x, y):
311317
if use_weights and len(eq.weights_final) > len(all_terms):
312318
residual += float(eq.weights_final[-1]) * (y[:, 0:1] * 0.0 + 1.0)
313319
target = eq.target
314-
target_val = 1.0
315-
for factor in target.structure:
316-
fv = self._factor_value_with_map(dde, factor, x, y, self.coord_map, var_idx_map)
317-
target_val *= fv
318-
residual -= target_val
320+
if target is not None:
321+
target_val = 1.0
322+
for factor in target.structure:
323+
fv = self._factor_value_with_map(dde, factor, x, y, self.coord_map, var_idx_map)
324+
target_val *= fv
325+
residual -= target_val
319326
residuals.append(residual)
320327
return residuals
321328

epde/operators/common/fitness.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def set_adapter(self, net=None, pretrained_net=None):
232232

233233
def apply(self, objective: SoEq, arguments: dict, force_out_of_place: bool = False):
234234
self_args, subop_args = self.parse_suboperator_args(arguments=arguments)
235-
if force_out_of_place:
235+
if force_out_of_place or not getattr(objective, 'weights_internal_evald', False):
236236
self.suboperators['sparsity'].apply(objective, subop_args['sparsity'])
237237
self.suboperators['coeff_calc'].apply(objective, subop_args['coeff_calc'])
238238

@@ -340,7 +340,7 @@ def _apply_deepxde(self, objective, force_out_of_place):
340340
penalty_coeff=self.params.get('penalty_coeff', 0.2),
341341
for_rps=False)
342342
# Pack per-eq masked (solution, data) for DeepXDEError.
343-
masked_solutions = [solution_list[i][mask_flat] for i in range(len(eqs))]
343+
masked_solutions = [solution_list[i][mask_flat] for i in range(len(eqs))] # был solution_list
344344
masked_data = [data_list[i] for i in range(len(eqs))]
345345
sctx = SolverContext(solution=masked_solutions, loss_add=loss,
346346
g_fun_vals=masked_data,

epde/operators/utils/parameters/default_parameters_multi_objective.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424
"pinn_loss_mult" : 1e4,
2525
"error_metric": "rmse",
2626
"deepxde_config": {
27-
"net": [95, 100, 95],
27+
"net": [50, 50, 50],
2828
"activation": "tanh",
2929
"optimizer": "adam",
3030
"lr": 1e-3,
3131
"num_domain": 1000,
3232
"num_boundary": 200,
3333
"num_initial": 200,
34-
"epochs": 2000
34+
"epochs": 1000
3535
}
3636
},
3737
"_comment_legacy_aliases": "Param-registry aliases kept ONLY so the functional test harness (tests/functional) can fetch params by the historical operator names; the production search builds the new SolverFreeFitness / SolverBasedFitness hosts.",

projects/pic/data/lv/lv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def lv_discovery(noise_level):
4848
dimensionality=dimensionality)
4949
grid_tokens = GridTokens(['x_0', ], dimensionality=dimensionality, max_power=2)
5050

51-
epde_search_obj = EpdeSearch(use_solver=False, multiobjective_mode=True, use_pic=True, boundary=15,
51+
epde_search_obj = EpdeSearch(use_solver=True, multiobjective_mode=True, use_pic=True, boundary=15,
5252
coordinate_tensors=(t,), verbose_params={'show_iter_idx': True},
5353
device='cuda')
5454

projects/pic/data/ode/ode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ def ODE_discovery(foldername, noise_level):
3838
t = np.arange(start=0., stop=step * steps_num, step=step)
3939
data = np.load(os.path.join(foldername, 'ode_data.npy'))
4040
noised_data = noise_data(data, noise_level)
41-
data_nn = load_pretrained_PINN(os.path.join(foldername, 'ode_0_ann.pickle')).cpu()
41+
#data_nn = load_pretrained_PINN(os.path.join(foldername, 'ode_0_ann.pickle')).cpu()
4242

4343
dimensionality = 0
4444

4545
trig_tokens = TrigonometricTokens(freq=(2 - 1e-8, 2 + 1e-8),
4646
dimensionality=dimensionality)
4747
grid_tokens = GridTokens(['x_0', ], dimensionality=dimensionality, max_power=2)
4848

49-
epde_search_obj = EpdeSearch(use_solver=False, use_pic=True, boundary=20,
49+
epde_search_obj = EpdeSearch(use_solver=True, use_pic=True, boundary=20,
5050
coordinate_tensors=[t,], verbose_params={'show_iter_idx': True},
5151
device='cuda')
5252

projects/pic/data/wave/wave.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ def wave_data(filename):
4646
def wave_discovery(foldername, noise_level):
4747
grid, data = wave_data(os.path.join(foldername, 'wave_sln_80.csv'))
4848
noised_data = noise_data(data, noise_level)
49-
data_nn = load_pretrained_PINN(os.path.join(foldername, 'ann_pretrained.pickle'))
49+
#data_nn = load_pretrained_PINN(os.path.join(foldername, 'ann_pretrained.pickle'))
5050

5151
dimensionality = data.ndim - 1
5252

53-
epde_search_obj = EpdeSearch(use_solver=False, use_pic=True,
53+
epde_search_obj = EpdeSearch(use_solver=True, use_pic=True,
5454
boundary=20,
5555
coordinate_tensors=(grid[..., 0], grid[..., 1]), device='cuda')
5656

0 commit comments

Comments
 (0)