fau-advanced-separations / CADET-Process

A Framework for Modelling and Optimizing Advanced Chromatographic Processes
GNU General Public License v3.0
28 stars 12 forks source link

Restructure `ReferenceBase`/`SolutionBase` #105

Open schmoelder opened 8 months ago

schmoelder commented 8 months ago
schmoelder commented 8 months ago

As mentioned, for this endeavor, we should also reconsider the resampling / interpolation methods of Solution objects. Currently, this is only possible for 1D solutions (i.e. SolutionIO). However, we might want to also do this with ND-objects.

Here is a prototype that works for multiple dimensions:

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import RegularGridInterpolator
from scipy import stats

time = np.linspace(0, 10, 11)
axial_positions = np.linspace(0, 1, 5)
components = np.arange(0, 2)

dimensions = {
    'time': np.linspace(0, 10, 11),
    'axial_positions': np.linspace(0, 10, 11),
    # 'radial_positions': np.linspace(0, 10, 11),
    'channels': [0, 1, 2],
    'components': ['A', 'B'],
}

continuous_dimensions = [key for key, value in dimensions.items() if isinstance(value, np.ndarray)]
discrete_dimensions = [key for key, value in dimensions.items() if not isinstance(value, np.ndarray)]

fig, ax = plt.subplots()

c = np.zeros((len(time), len(axial_positions), len(components)))

for i in range(len(axial_positions)):
    solution = stats.norm.pdf(time, i + 3, 1)
    c[:, i, 1] = solution
    ax.plot(time, solution)

interpolators = []
for comp in components:
    interp = RegularGridInterpolator((time, axial_positions), c[..., comp], method='linear')
    interpolators.append(interp)

time_new = np.linspace(0, 10, 101)
axial_directions_new = np.linspace(0, 1, 11)

arrs = np.meshgrid(time_new, axial_directions_new, indexing='ij')

test_points = np.array([dim.ravel() for dim in arrs]).T

foo = interpolators[1](test_points).reshape(len(time_new), len(axial_directions_new))
for i in range(len(axial_directions_new)):
    solution = foo[:, i]
    ax.plot(time_new, solution, 'k--')

A challenge here is that we have independent (i.e. discrete) dimensions (e.g. components, channels) and continuous dimensions (space-time). While for interpolation, we only want to interpolate between the continuous dimensions, we still want to provide a uniform interface...

Tagging @hannahlanzrath