Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KAN implementation in the TEDEouS #41

Merged
merged 33 commits into from
Aug 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
9d666e5
Update models.py
dimerf99 Aug 5, 2024
3014faf
Update model.py
dimerf99 Aug 5, 2024
f3ab96d
Update models.py
dimerf99 Aug 6, 2024
6425c63
Create example_wave_physics_kan.py
dimerf99 Aug 6, 2024
412a327
Create example_burgers_inverse_kan.py
dimerf99 Aug 6, 2024
1b918e1
Update model.py
dimerf99 Aug 6, 2024
30b5734
typo fix
SuperSashka Aug 7, 2024
4f41289
Update requirements.txt
dimerf99 Aug 19, 2024
e30d774
Update example_wave_physics_kan.py
dimerf99 Aug 19, 2024
d87c761
Create example_wave_physics_efficient_kan.py
dimerf99 Aug 19, 2024
2ef802d
Update example_burgers_inverse_kan.py
dimerf99 Aug 19, 2024
8d7a28f
Create example_burgers_inverse_efficient_kan.py
dimerf99 Aug 19, 2024
4a5c3c2
Revert "Create example_burgers_inverse_efficient_kan.py"
dimerf99 Aug 19, 2024
004d55b
Create example_burgers_inverse_efficient_kan.py
dimerf99 Aug 19, 2024
9716329
Merge branch 'KAN' of https://github.com/ITMO-NSS-team/torch_DE_solve…
dimerf99 Aug 19, 2024
595e27f
Update requirements.txt
dimerf99 Aug 19, 2024
da78846
Update requirements.txt
dimerf99 Aug 19, 2024
db6aeb0
Update utils.py
dimerf99 Aug 19, 2024
725a010
Update plot.py
dimerf99 Aug 19, 2024
75f83a1
Update plot.py
dimerf99 Aug 19, 2024
f29d774
Update example_wave_physics_efficient_kan.py
dimerf99 Aug 20, 2024
d7b46a5
Update example_wave_physics_kan.py
dimerf99 Aug 20, 2024
543f1b0
Create example_wave_physics_fast_kan.py
dimerf99 Aug 20, 2024
db178d9
More robust cache
SuperSashka Aug 20, 2024
60708e4
Merge branch 'KAN' of https://github.com/ITMO-NSS-team/torch_DE_solve…
SuperSashka Aug 20, 2024
9884235
Separate file for optional requirements
SuperSashka Aug 20, 2024
02066d8
Version incrementation
SuperSashka Aug 20, 2024
04dd0bc
Update models.py
dimerf99 Aug 20, 2024
d223eb4
Update example_wave_physics_kan.py
dimerf99 Aug 20, 2024
593758a
Update example_wave_physics_efficient_kan.py
dimerf99 Aug 20, 2024
d2b0a2a
Update example_wave_physics_fast_kan.py
dimerf99 Aug 20, 2024
ff17715
Merge branch 'KAN' of https://github.com/ITMO-NSS-team/torch_DE_solve…
dimerf99 Aug 20, 2024
1bd8504
Update cache.py
SuperSashka Aug 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions examples/example_burgers_inverse_efficient_kan.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import torch
import numpy as np
import scipy
import os
import sys

os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
sys.path.append(os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..')))

from tedeous.data import Domain, Conditions, Equation
from tedeous.model import Model
from tedeous.callbacks import early_stopping, plot, inverse_task
from tedeous.optimizers.optimizer import Optimizer
from tedeous.device import solver_device
from tedeous.models import parameter_registr

import efficient_kan

solver_device('cuda')

domain = Domain()

domain.variable('x', [-1, 1], 60, dtype='float32')
domain.variable('t', [0, 1], 60, dtype='float32')

boundaries = Conditions()

data = scipy.io.loadmat(os.path.abspath(os.path.join(os.path.dirname( __file__ ), 'wolfram_sln/Burgers.mat')))

x = torch.tensor(data['x']).reshape(-1)
t = torch.tensor(data['t']).reshape(-1)

usol = data['usol']

bnd1 = torch.cartesian_prod(x, t).float()
bndval1 = torch.tensor(usol).reshape(-1, 1)

id_f = np.random.choice(len(bnd1), 2000, replace=False)

bnd1 = bnd1[id_f]
bndval1 = bndval1[id_f]

boundaries.data(bnd=bnd1, operator=None, value=bndval1)

net = efficient_kan.KAN(
[2, 100, 1],
grid_size=5,
spline_order=3,
scale_noise=0.1,
scale_base=1.0,
scale_spline=1.0,
base_activation=torch.nn.Tanh,
grid_eps=0.02,
grid_range=[-1, 1]
)

parameters = {'lam1': 2., 'lam2': 0.2} # true parameters: lam1 = 1, lam2 = -0.01*pi

parameter_registr(net, parameters)

equation = Equation()

burgers_eq = {
'du/dt**1':
{
'coeff': 1.,
'du/dt': [1],
'pow': 1,
'var': 0
},
'+u*du/dx':
{
'coeff': net.lam1,
'u*du/dx': [[None], [0]],
'pow': [1, 1],
'var': [0, 0]
},
'-mu*d2u/dx2':
{
'coeff': net.lam2,
'd2u/dx2': [0, 0],
'pow': 1,
'var': 0
}
}

equation.add(burgers_eq)

model = Model(net, domain, equation, boundaries)

model.compile('autograd', lambda_operator=1, lambda_bound=100)

img_dir = os.path.join(os.path.dirname( __file__ ), 'burgers_eq_img_efficient_kan')

cb_es = early_stopping.EarlyStopping(eps=1e-7,
loss_window=100,
no_improvement_patience=1000,
patience=3,
abs_loss=1e-5,
randomize_parameter=1e-5,
info_string_every=10)

cb_plots = plot.Plots(save_every=500, print_every=500, img_dir=img_dir)

cb_params = inverse_task.InverseTask(parameters=parameters, info_string_every=10)

optimizer = Optimizer('Adam', {'lr': 1e-4})

model.train(optimizer, 25e3, save_model=False, callbacks=[cb_es, cb_plots, cb_params])
102 changes: 102 additions & 0 deletions examples/example_burgers_inverse_kan.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import torch
import numpy as np
import scipy
import os
import sys

os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
sys.path.append(os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..')))

from tedeous.data import Domain, Conditions, Equation
from tedeous.model import Model
from tedeous.callbacks import early_stopping, plot, inverse_task
from tedeous.optimizers.optimizer import Optimizer
from tedeous.device import solver_device
from tedeous.models import parameter_registr

import kan

solver_device('cuda')

domain = Domain()

domain.variable('x', [-1, 1], 60, dtype='float32')
domain.variable('t', [0, 1], 60, dtype='float32')

boundaries = Conditions()

data = scipy.io.loadmat(os.path.abspath(os.path.join(os.path.dirname( __file__ ), 'wolfram_sln/Burgers.mat')))

x = torch.tensor(data['x']).reshape(-1)
t = torch.tensor(data['t']).reshape(-1)

usol = data['usol']

bnd1 = torch.cartesian_prod(x, t).float()
bndval1 = torch.tensor(usol).reshape(-1, 1)

id_f = np.random.choice(len(bnd1), 2000, replace=False)

bnd1 = bnd1[id_f]
bndval1 = bndval1[id_f]

boundaries.data(bnd=bnd1, operator=None, value=bndval1)

net = kan.KAN(
width=[2, 100, 1],
base_fun='silu'
)

parameters = {'lam1': 2., 'lam2': 0.2} # true parameters: lam1 = 1, lam2 = -0.01*pi

parameter_registr(net, parameters)

equation = Equation()

burgers_eq = {
'du/dt**1':
{
'coeff': 1.,
'du/dt': [1],
'pow': 1,
'var': 0
},
'+u*du/dx':
{
'coeff': net.lam1,
'u*du/dx': [[None], [0]],
'pow': [1, 1],
'var': [0, 0]
},
'-mu*d2u/dx2':
{
'coeff': net.lam2,
'd2u/dx2': [0, 0],
'pow': 1,
'var': 0
}
}

equation.add(burgers_eq)

model = Model(net, domain, equation, boundaries)

model.compile('autograd', lambda_operator=1, lambda_bound=100)

img_dir = os.path.join(os.path.dirname( __file__ ), 'burgers_eq_img_kan')

cb_es = early_stopping.EarlyStopping(eps=1e-7,
loss_window=100,
no_improvement_patience=1000,
patience=3,
abs_loss=1e-5,
randomize_parameter=1e-5,
info_string_every=10)

cb_plots = plot.Plots(save_every=500, print_every=500, img_dir=img_dir)

cb_params = inverse_task.InverseTask(parameters=parameters, info_string_every=10)

optimizer = Optimizer('Adam', {'lr': 1e-4})

model.train(optimizer, 25e3, save_model=False, callbacks=[cb_es, cb_plots, cb_params])
Loading