diff --git a/docs/dust.rst b/docs/dust.rst index 7016e67..9d293d4 100644 --- a/docs/dust.rst +++ b/docs/dust.rst @@ -5,6 +5,17 @@ dust .. autofunction:: load +.. autofunction:: suggest_opacity_sampling + +.. autoclass:: IsotropicDust + :show-inheritance: + +.. autoclass:: HenyeyGreensteinDust + :show-inheritance: + +.. autoclass:: GeneralDust + :show-inheritance: + .. autoclass:: Dust :show-inheritance: @@ -17,7 +28,6 @@ dust ~Dust.test_model ~Dust.run_dust_simulation ~Dust.plot_opacity_model - ~Dust.plot_pmo_model ~Dust.plot_random_nu_model ~Dust.plot_ml_step ~Dust.save @@ -29,7 +39,6 @@ dust .. automethod:: test_model .. automethod:: run_dust_simulation .. automethod:: plot_opacity_model - .. automethod:: plot_pmo_model .. automethod:: plot_random_nu_model .. automethod:: plot_ml_step .. automethod:: save \ No newline at end of file diff --git a/docs/dustcreation.rst b/docs/dustcreation.rst index 48d5317..18ee0c1 100644 --- a/docs/dustcreation.rst +++ b/docs/dustcreation.rst @@ -2,16 +2,28 @@ Creating a dust model ===================== Before running a radiative transfer simulation, you need to create a dust model that defines the optical properties of -the dust grains in your simulation. Pinball-rt provides a Dust class that allows you to create and manipulate dust -models. To set up a dust model, the absorption and scattering opacities as a function of wavelength and grain size -distribution parameters (maximum dust grain size and size distribution power-law index) are needed. At present, these -must be obtained from external sources and provided to pinball-rt. Here we'll use simple power-law prescription, but in -practice you would typically use opacities derived from laboratory measurements or Mie theory calculations. Note that -the opacities should include astropy units to ensure that there is no ambiguity. +the dust grains in your simulation. Pinball-rt provides a :class:`~pinballrt.dust.Dust` class that allows you to create +and manipulate dust models. In practice, there are three more specific dust models available: +:class:`~pinballrt.dust.IsotropicDust`, :class:`~pinballrt.dust.HenyeyGreensteinDust`, and +:class:`~pinballrt.dust.GeneralDust` that inherit from :class:`~pinballrt.dust.Dust` and enable more specific control +over dust scattering properties. To set up a dust model, the absorption and scattering opacities as a function of wavelength +and grain size distribution parameters (maximum dust grain size, size distribution power-law index, and sub-species +relative abundances) are needed. At present, these must be obtained from external sources and provided to pinball-rt. +Here we'll use simple power-law prescription, but in practice you would typically use opacities derived from laboratory +measurements or Mie theory calculations. Note that the opacities should include astropy units to ensure that there is no +ambiguity. + +To enable maximum flexibility, opacities do not need to be provided on a regular grid. Instead, the opacities should be +provided at some number (nsamples) of points in the N-dimensional parameter space defined by relevant inputs for determining +the opacity (maximum grain size, size distribution power-law index, sub-species abundances), and for each sample they +should be provided at a specified set of wavelengths. The :class:`~pinballrt.dust.Dust` class will then use machine learning +to learn the opacities at any point in the parameter space during the simulation. A helper-function, +:func:`~pinballrt.dust.suggest_opacity_sampling` is provided to help provide efficient sampling of the parameter space, +but the user is free to provide any set of samples they choose. .. code-block:: python - from pinballrt.dust import Dust + from pinballrt.dust import IsotropicDust, suggest_opacity_sampling import numpy as np import astropy.units as u @@ -19,49 +31,52 @@ the opacities should include astropy units to ensure that there is no ambiguity. wavelengths = np.logspace(-1, 4, 100) * u.micron # Define the dust size distribution properties. - amax = np.logspace(-4., 1., 60.) * u.cm - p = np.logspace(2.5, 4.5, 11) + samples = suggest_opacity_sampling(100, amax_range=(1.*u.micron, 10*u.cm), p_range=(2.5, 4.5)) - p, amax, wavelengths = np.meshgrid(p, amax, wavelengths, indexing='ij') + # Expand the samples to have a wavelength dimension (nproperties, nsamples, nwavelengths). + samples = np.moveaxis(np.repeat(np.expand_dims(samples, 1), wavelengths.size, axis=1), -1, 0) + + amax = samples[1] * u.cm + p = samples[0] + + # Expand the wavelengths to have a sample dimension (nsamples, nwavelengths). + wavelengths = np.repeat(np.expand_dims(wavelengths, axis=0), max(samples.shape[1], 1), axis=0) # Define the absorption and scattering opacities (in cm^2/g). power_law_index = (-2. / (1 + np.exp(-p/3.5 * (-1.5 - np.log10(amax.to(u.cm)))))) kappa_abs = 1.0 * (wavelengths.to(u.micron)/100.0)**power_law_index * u.cm**2 / u.g kappa_scat = 0.5 * (wavelengths.to(u.micron)/100.0)**power_law_index * u.cm**2 / u.g - # Create the Dust object. - dust = Dust(lam=wavelengths[0,0,:], - amax=amax[0,:,0], - p=p[:,0,0], - kabs=kappa_abs, - ksca=kappa_scat) + # Create the IsotropicDust object. + dust = IsotropicDust(lam=wavelengths[0,:], + amax=amax[:,0], + p=p[:,0], + kabs=kappa_abs, + ksca=kappa_scat) -This creates a Dust object with the specified opacities, however a few additional steps are needed before the dust model can be used in a -radiative transfer simulation. The Dust object uses a machine learning model to produce opacity values during the simulation, as well as to +This creates an :class:`~pinballrt.dust.IsotropicDust` object with the specified opacities, however a few additional steps are needed before the dust model can be used in a +radiative transfer simulation. The :class:`~pinballrt.dust.IsotropicDust` object uses a machine learning model to produce opacity values during the simulation, as well as to randomnly sample photon frequencies emitted by dust grains during the simulation, but these models need to be trained first. To set up the -training, we use the `learn` method. For example, to set up the model to learn the absorption opacity: +training, we use the :meth:`~pinballrt.dust.Dust.learn` method. For example, to set up the model to learn the absorption opacity: .. code-block:: python # Set up the training parameters. - dust.learn( - model="kabs", - nsamples=100000, - test_fraction=0.1, - val_fraction=0.1, - hidden_units=(48, 48, 48), - ) + dust.learn(model="kabs", + test_fraction=0.1, + val_fraction=0.1, + hidden_units=(48, 48, 48)) This example sets up a simple neural network model with three hidden layers of 48 units each to learn the dust absorption opacity. The training -will use 100,000 samples, with 10% of the samples reserved for testing and another 10% for validation. Once the training parameters are set up, -we can train the model using the `fit` method: +will use the kabs samples provided above, which had 100 samples across dust properties at 100 wavelengths for 10,000 total samples, with 10% of +the samples reserved for testing and another 10% for validation. Once the training parameters are set up, we can train the model using the :meth:`~pinballrt.dust.Dust.fit` method: .. code-block:: python # Train the model. dust.fit(epochs=50) -Finally, we can evaluate the trained model using the `test_model` method: +Finally, we can evaluate the trained model using the :meth:`~pinballrt.dust.Dust.test_model` method: .. code-block:: python @@ -74,17 +89,17 @@ a simulation. In short: .. code-block:: python for model in ["ksca", "pmo", "random_nu"]: - if model in ["kabs", "ksca"]: - d.learn(model=model, nsamples=100000, hidden_units=(16,)*6, overwrite=True) - else: - d.learn(model=model, nsamples=10000, hidden_units=(16,)*6, overwrite=True) + if model in ["kabs", "ksca"]: + d.learn(model=model, hidden_units=(16,)*6, overwrite=True) + else: + d.learn(model=model, hidden_units=(48,)*3, overwrite=True) - d.fit(epochs=300, batch_size=10000) - d.test_model(plot=True) + d.fit(epochs=300, batch_size=1000) + d.test_model(plot=True) This will further create models to produce the scattering opacity, planck mean opacity, and random frequencies sampled from the dust emission spectrum. -Having to train the dust model before every simulation would be inefficient, so once the model is trained it can be saved to a file using the `save` method, -and later loaded using the `load` function: +Having to train the dust model before every simulation would be inefficient, so once the model is trained it can be saved to a file using the :meth:`~pinballrt.dust.Dust.save` method, +and later loaded using the :func:`~pinballrt.dust.load` function: .. code-block:: python @@ -95,7 +110,7 @@ and later loaded using the `load` function: from pinballrt.dust import load dust = load("dust_model.dst") -pinball-rt will search the default directory as well as the ~/.pinball-rt/data/dust/ directory for dust model files when loading. Additionally, +pinball-rt will search the default directory as well as the ``~/.pinball-rt/data/dust/`` directory for dust model files when loading. Additionally, pinball-rt provides a pre-trained dust model that can be used directly without needing to train a new model from scratch: .. code-block:: python @@ -105,13 +120,59 @@ pinball-rt provides a pre-trained dust model that can be used directly without n # Load the pre-trained dust model. dust = load("yso.dst") +Creating a Henyey-Greenstein dust model follows the same process as above, but with the addition of needing to train a model to produce the scattering asymmetry parameter (g) as a function of wavelength and dust properties: + +.. code-block:: python + + from pinballrt.dust import HenyeyGreensteinDust + + g = np.tanh(p - np.log10(wavelengths.to(u.micron).value)) + + # Create the Henyey-Greenstein dust model. + dust = HenyeyGreensteinDust(lam=wavelengths[0,:], + amax=amax[:,0], + p=p[:,0], + kabs=kappa_abs, + ksca=kappa_scat, + g=g) + + d.learn(model="g", hidden_units=(16,)*6, overwrite=True) + + d.fit(epochs=300, batch_size=1000) + d.test_model(plot=True) + +Similarly, the most general dust model, :class:`~pinballrt.dust.GeneralDust`, follows the same process but with the addition of needing to train a model to produce the scattering phase function as a function of wavelength, scattering angle and dust properties, and additionally to randomly sample scattering angles during the simulation: + +.. code-block:: python + + from pinballrt.dust import GeneralDust + + g = np.repeat(np.expand_dims(np.tanh(p - np.log10(wavelengths.to(u.micron).value)), axis=-1), 5, axis=-1) + theta = np.tile(np.expand_dims(np.linspace(0, 180., 5), axis=(0,1)), (10 if len(dims) > 0 else 1, 10, 1)) * u.deg + scattering_phase_function = (1 - g**2) / (4 * np.pi * (1 + g**2 - 2*g*np.cos(theta.to(u.rad).value))**(3/2)) + + # Create the General dust model. + dust = GeneralDust(lam=wavelengths[0,:], + amax=amax[:,0], + p=p[:,0], + kabs=kappa_abs, + ksca=kappa_scat, + scattering_phase_function=scattering_phase_function + theta=theta[0,0,:]) + + for model in ["scattering_phase_function", "random_direction"]: + d.learn(model=model, hidden_units=(16,)*6, overwrite=True) + + d.fit(epochs=300, batch_size=1000) + d.test_model(plot=True) + Learning to step through high optical depth regions --------------------------------------------------- Historically, radiative transfer simulations in regions of high optical depth have been challenging due to the large number of interactions photons undergo before escaping. Pinball-rt addresses this issue by implementing a machine learning approach that allows photons to "step through" high optical depth regions more efficiently. This is achieved by training a model to predict the output properties of photons traveling through regions of known input optical depths. -To set this up, we can again use the `learn` method of the Dust class: +To set this up, we can again use the :meth:`~pinballrt.dust.Dust.learn` method of the Dust class: .. code-block:: python diff --git a/examples/dust-demo-diana.ipynb b/examples/dust-demo-diana.ipynb new file mode 100644 index 0000000..6edf5bf --- /dev/null +++ b/examples/dust-demo-diana.ipynb @@ -0,0 +1,379 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 20, + "id": "461d2258", + "metadata": {}, + "outputs": [], + "source": [ + "from pinballrt.dust import IsotropicDust, HenyeyGreensteinDust, GeneralDust, load, suggest_opacity_sampling\n", + "from astropy.modeling import models\n", + "import astropy.units as u\n", + "import numpy as np\n", + "\n", + "import subprocess\n", + "\n", + "import astropy.io.fits as fits\n", + "\n", + "import tempfile\n", + "from multiprocess import Pool" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "1a91d214", + "metadata": {}, + "outputs": [], + "source": [ + "def worker(sample):\n", + " p = sample[0]\n", + " a = sample[1] * u.cm\n", + " Vcarbon = sample[2]\n", + " porosity = sample[3]\n", + "\n", + " with tempfile.TemporaryDirectory() as tmpdirname:\n", + " #print(f\"/Users/psheehan/pinball-rt/examples/optool/OpacityTool -amax {a.to(u.micron).value} -apow {p} -Vcarbon {Vcarbon} -porosity {porosity} -nlam 1000 -lmax 10000\")\n", + " subprocess.run(f\"/Users/psheehan/pinball-rt/examples/optool/OpacityTool -amax {a.to(u.micron).value} -apow {p} -Vcarbon {Vcarbon} -porosity {porosity} -nlam 1000 -lmax 10000\".split(), capture_output=True, cwd=tmpdirname)\n", + "\n", + " data = np.loadtxt(tmpdirname+\"/particle.dat\")\n", + "\n", + " lam = data[:,0] * u.micron\n", + " kabs = data[:,1]\n", + " ksca = data[:,2]\n", + " g = data[:,3]\n", + "\n", + " data = fits.open(tmpdirname+\"/particle.fits\")\n", + "\n", + " scattering_phase = data[1].data[:,0,:].T\n", + "\n", + " return lam, kabs, ksca, g, scattering_phase" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b63d1d82", + "metadata": {}, + "outputs": [], + "source": [ + "samples = suggest_opacity_sampling(600, p_range=(2.5, 4.5), amax_range=(1.*u.micron, 1.*u.cm), n_dust_subspecies=3)\n", + "\n", + "with Pool(6) as pool:\n", + " results = pool.map(worker, samples)\n", + "#results = [worker(sample) for sample in samples]\n", + "\n", + "p = samples[:,0]\n", + "amax = samples[:,1] * u.cm\n", + "Vcarbon = samples[:,2]\n", + "porosity = samples[:,3]\n", + "\n", + "lam = results[0][0] # all results should have the same lam, so we can just take it from the first one\n", + "kabs = np.array([r[1] for r in results]) * u.cm**2 / u.g\n", + "ksca = np.array([r[2] for r in results]) * u.cm**2 / u.g\n", + "g = np.array([r[3] for r in results])\n", + "scattering_phase = np.array([r[4] for r in results])\n", + "\n", + "theta = np.linspace(0, 180, scattering_phase.shape[-1]) * u.deg\n", + "\n", + "np.savez(\"dust_data.npz\", \n", + " kabs=kabs, \n", + " ksca=ksca, \n", + " g=g, \n", + " scattering_phase=scattering_phase, \n", + " theta=theta, \n", + " amax=amax, \n", + " p=p, \n", + " lam=lam, \n", + " Vcarbon=Vcarbon, \n", + " porosity=porosity)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96a02ab2", + "metadata": {}, + "outputs": [], + "source": [ + "data = np.load(\"dust_data.npz\")\n", + "\n", + "kabs = data[\"kabs\"] * u.cm**2 / u.g\n", + "ksca = data[\"ksca\"] * u.cm**2 / u.g\n", + "g = data[\"g\"]\n", + "scattering_phase = data[\"scattering_phase\"]\n", + "theta = data[\"theta\"] * u.deg\n", + "amax = data[\"amax\"] * u.cm\n", + "p = data[\"p\"]\n", + "lam = data[\"lam\"] * u.micron\n", + "Vcarbon = data[\"Vcarbon\"]\n", + "porosity = data[\"porosity\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "89f9421c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warp CUDA warning: Could not find or load the NVIDIA CUDA driver. GPU execution will not be available.\n" + ] + } + ], + "source": [ + "\"\"\"d = HenyeyGreensteinDust(lam=lam, \n", + " kabs=kabs, \n", + " ksca=ksca,\n", + " g=g,\n", + " amax=amax, \n", + " p=p)\"\"\"\n", + "\n", + "p, amax = np.meshgrid(p, amax, indexing='ij')\n", + "\n", + "p = p.flatten()\n", + "amax = amax.flatten()\n", + "\n", + "d = GeneralDust(lam=lam,\n", + " kabs=kabs.reshape(-1, lam.size),\n", + " ksca=ksca.reshape(-1, lam.size),\n", + " scattering_phase_function=scattering_phase.reshape(-1, lam.size, theta.size),\n", + " theta=theta.to(u.radian),\n", + " amax=amax,\n", + " p=p)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "adf95f57", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "*******************************\n", + "random_direction\n", + "*******************************\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: False, used: False\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "/usr/local/python/3.12.1/lib/python3.12/site-packages/pytorch_lightning/trainer/connectors/logger_connector/logger_connector.py:76: Starting from v1.9.0, `tensorboardX` has been removed as a dependency of the `pytorch_lightning` package, due to potential conflicts with other packages in the ML ecosystem. For this reason, `logger=True` will use `CSVLogger` as the default logger, unless the `tensorboard` or `tensorboardX` packages are found. Please `pip install lightning[extra]` or one of them to enable TensorBoard support by default\n", + "/usr/local/python/3.12.1/lib/python3.12/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:751: Checkpoint directory /workspaces/pinball-rt/examples/random_direction_lightning_logs exists and is not empty.\n", + "\n", + " | Name | Type | Params | Mode \n", + "-------------------------------------------------------\n", + "0 | model | MultiLayerPerceptron | 12.0 K | train\n", + "-------------------------------------------------------\n", + "12.0 K Trainable params\n", + "0 Non-trainable params\n", + "12.0 K Total params\n", + "0.048 Total estimated model params size (MB)\n", + "16 Modules in train mode\n", + "0 Modules in eval mode\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 4: 100%|██████████| 206/206 [00:34<00:00, 5.97it/s, v_num=18, train_loss=0.00748, valid_loss=0.00676]" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "`Trainer.fit` stopped: `max_epochs=5` reached.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 4: 100%|██████████| 206/206 [00:35<00:00, 5.88it/s, v_num=18, train_loss=0.00748, valid_loss=0.00676]\n", + "Testing DataLoader 0: 100%|██████████| 29/29 [00:03<00:00, 8.03it/s]\n", + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " Test metric DataLoader 0\n", + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " test_loss 0.00679434509947896\n", + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + "Predicting DataLoader 0: 100%|██████████| 29/29 [00:03<00:00, 7.88it/s]\n" + ] + }, + { + "data": { + "image/png": "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gRo5cqT27NlTbd9nn31WP//5z9WuXTu1a9dOCQkJNfYHAAAAABjDY6f1vvXWW86vt27dqtDQUOfrsrIypaenq0ePHvXa5oYNG5ScnKzVq1dr5MiRSktL07hx43TkyBF16tSpUv+MjAzdcccdGjVqlAIDA7VkyRJdd911+vjjj9WlS5cGHxsAAAAAwL08Fk4nTpwoSbJYLJo6darLey1btlSPHj309NNP12ubS5cu1YwZM5SYmChJWr16td555x09//zzmjdvXqX+r7zyisvr//u//9Nrr72m9PR057NXAQAAAADG81g4tdvtkqSePXtq7969CgsLa9T2SkpKlJWVpZSUFGebn5+fEhIStHPnzjpt49y5cyotLVX79u2r7WOz2WSz2ZyvCwsLG140AAAAAKBOPH7N6VdffeUMphcuXGjwdk6dOqWysjKFh4e7tIeHhys3N7dO25g7d646d+6shISEavukpqYqNDTUuURFRTW4ZgAAAABA3Xg8nNrtdj366KPq0qWL2rRpoy+//FKS9PDDD+u5557z9O6dFi9erPXr12vjxo0KDAystl9KSooKCgqcS05OjtdqBAAAAIDmyuPh9LHHHtOLL76oP/zhDwoICHC2Dxw4UP/3f/9X5+2EhYXJ399feXl5Lu15eXmKiIiocd2nnnpKixcv1nvvvaeYmJga+1qtVoWEhLgsAAAAAADP8ng4ffnll7V27VpNnjxZ/v7+zvbBgwfrs88+q/N2AgICNGzYMKWnpzvb7Ha70tPTFR8fX+16f/jDH/Too49qy5YtiouLa9hBAAAAAAA8ymM3RCp37NgxRUdHV2q32+0qLS2t17aSk5M1depUxcXFacSIEUpLS1NxcbHz7r1TpkxRly5dlJqaKklasmSJ5s+fr3Xr1qlHjx7Oa1PbtGmjNm3aNPLIAAAAAADu4vFwOmDAAP3jH/9Q9+7dXdr//ve/a+jQofXa1m233aaTJ09q/vz5ys3N1ZAhQ7RlyxbnTZKys7Pl5/fTZPCqVatUUlKiX/3qVy7bWbBggRYuXNiwAwIAAAAAuJ3Hw+n8+fM1depUHTt2THa7Xa+//rqOHDmil19+WZs2bar39mbNmqVZs2ZV+V5GRobL66+//roBFQMAAAAAvM3j15zecsstevvtt/X++++rdevWmj9/vj799FO9/fbbuvbaaz29ewAAAACA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DxUXF6eMjAw3lwgAMKO33npLcXFxmjRpkjp16qShQ4fq2WefrXEdm82mwsJClwUAADQPDQqnO3fu1KJFixQWFiY/Pz/5+fnpiiuuUGpqqu6991531wgAMKEvv/xSq1atUp8+fbR161bNnDlT9957r1566aVq10lNTVVoaKhziYqK8mLFAADASA0Kp2VlZQoODpYkhYWF6fjx45Kk7t2768iRI+6rroKbb75Z3bp1U2BgoCIjI/Wb3/zGud/qXLhwQUlJSerQoYPatGmjW2+9VXl5eR6pD6jN7bffLknq1KkTYxjNgt1uV2xsrJ544gkNHTpUd955p2bMmKHVq1dXu05KSooKCgqcS05OjhcrBgAARmpQOB04cKD+9a9/SZJGjhypP/zhD/rnP/+pRYsWqVevXm4tsNzVV1+tv/3tbzpy5Ihee+01ffHFF/rVr35V4zr33Xef3n77bb366qvKzMzU8ePH9ctf/tIj9QG1+fnPfy5J2rdvH2MYzUJkZKQGDBjg0ta/f39lZ2dXu47ValVISIjLAgAAmocG3RDpoYceUnFxsSRp0aJFuvHGG/Xzn/9cHTp00IYNG9xaYLn77rvP+XX37t01b948TZw4UaWlpWrZsmWl/gUFBXruuee0bt06XXPNNZKkF154Qf3799euXbt0+eWXe6ROoDpJSUn6/e9/r27duikkJIQxjCZv9OjRlc6m+c9//qPu3bsbVBEAAPBlDQqn48aNc34dHR2tzz77TN9//73atWvnvGOvJ33//fd65ZVXNGrUqCp/qZekrKwslZaWKiEhwdnWr18/devWTTt37qz2F3ubzSabzeZ8XePNOBaGSpLs9gYcBJosv/LzERYWVNvHU2O4PuP3/LxQWQMkW4nUanH1tfoSs9Vstnol99Z83333adSoUXriiSf0//7f/9OePXu0du1arV271k3VAgCApqRBp/VWpX379h4PpnPnzlXr1q3VoUMHZWdn680336y2b25urgICAtS2bVuX9vDwcOXm5la7XkNuxmGxsLD8tNQmMjLSY2O4PuPXGnCxXmtA7TX7CrPVbLZ6JffWPHz4cG3cuFF//etfNXDgQD366KNKS0vT5MmTG79xAADQ5DQonF64cEFPPvmkbrjhBsXFxSk2NtZlqat58+bJYrHUuHz22WfO/g888IAOHDig9957T/7+/poyZYrzGavu0pCbcTgcLM11mff+BfktKnRZLI/8uFQxhiXpH//4h8fGcH3Gr63k4jHYSty2e48zW81mq1dyf8033nijDh06pAsXLujTTz/VjBkz3LNhAADQ5DTotN7p06frvffe069+9SuNGDFCDZ0xvf/++zVt2rQa+1S8wVJYWJjCwsL0s5/9TP3791dUVJR27dql+Pj4SutFRESopKREZ86ccZl5ysvLU0RERLX7s1qtslqtdTuAH0/bdNv0M0znd/ecVOJ339XY59KbhEVHRys2NtYjY7g+47f8lM1WdertG8xWs9nqlcxZMwAAaBoaFE43bdqkd999V6NHj27Uzjt27KiOHTs2aF37jxd6Vry+rqJhw4apZcuWSk9P16233ipJOnLkiLKzs6sMAkBDMIYBAAAA92hQOO3SpYvzOafesHv3bu3du1dXXHGF2rVrpy+++EIPP/ywevfu7fwl/dixYxo7dqxefvlljRgxQqGhoZo+fbqSk5PVvn17hYSE6J577lF8fDx3OYXX7d69W//4xz8kSdnZ2crPz2cMAwAAABU06IzUp59+WnPnztU333zj7nqqFBQUpNdff11jx45V3759NX36dMXExCgzM9N5CmNpaamOHDmic+fOOdd75plndOONN+rWW2/VlVdeqYiICL3++uteqRmoKCgoSG+99ZYkKS4ujjEMAAAAXKJBM6dxcXG6cOGCevXqpaCgoEqPwvj+++/dUly5QYMG6YMPPqixT48ePSrdWCYwMFArV67UypUr3VoPUF+DBg3Spk2bFBoaqvz8fIWEhFTqwxgGAABAc9agcHrHHXfo2LFjeuKJJxQeHt7gGyIBAAAAACA1MJzu2LFDO3fu1ODBg91dDwAAAACgGWrQNaf9+vXT+fPn3V0LAAAAAKCZalA4Xbx4se6//35lZGTou+++U2FhocsCAAAAAEB9NOi03vHjx0uSxo4d69LucDhksVhUVlbW+MoAAAAAAM1Gg8Lp9u3b3V0HAAAAAKAZa1A4HTNmjLvrAAAAAAA0Yw0Kp+XOnTun7OxslZSUuLTHxMQ0qigAAAAAQPPSoHB68uRJJSYmavPmzVW+zzWnAAAAAID6aNDdeufMmaMzZ85o9+7datWqlbZs2aKXXnpJffr00VtvveXuGgEAAAAATVyDZk4/+OADvfnmm4qLi5Ofn5+6d++ua6+9ViEhIUpNTdWECRPcXScAAAAAoAlr0MxpcXGxOnXqJElq166dTp48KUkaNGiQ9u/f777qAAAAAADNQoPCad++fXXkyBFJ0uDBg7VmzRodO3ZMq1evVmRkpFsLBAAAAAA0fQ06rXf27Nk6ceKEJGnBggUaP368XnnlFQUEBOjFF190Z30AAAAAgGagQeH017/+tfPrYcOG6ZtvvtFnn32mbt26KSwszG3FAQAAAACahwad1nupoKAgxcbGVgqmISEh+vLLL92xCwAAAABAE+aWcFodh8Phyc0DAAAAAJoIj4ZTAADKLV68WBaLRXPmzDG6FAAA4IMIpwAAj9u7d6/WrFmjmJgYo0sBAAA+inAKAPCooqIiTZ48Wc8++6zatWtndDkAAMBHeTScWiwWT24eAGACSUlJmjBhghISEowuBQAA+LAGPUqmrrghEgA0b+vXr9f+/fu1d+/eOvW32Wyy2WzO14WFhZ4qDQAA+BiPzpxu3rxZXbp08eQuAAA+KicnR7Nnz9Yrr7yiwMDAOq2Tmpqq0NBQ5xIVFeXhKgEAgK+odzj95JNPdPfdd2vo0KGKjIxUZGSkhg4dqrvvvluffPKJS98rrrhCVqvVbcUCAMwjKytL+fn5io2NVYsWLdSiRQtlZmZq+fLlatGihcrKyiqtk5KSooKCAueSk5NjQOUAAMAI9Tqtd/PmzZo4caJiY2N1yy23KDw8XJKUl5enbdu2KTY2Vm+++abGjRvnkWIBAOYxduxYHTp0yKUtMTFR/fr109y5c+Xv719pHavVyh81AQBopuoVTufNm6e5c+dq0aJFld5buHChFi5cqAceeIBwCgBQcHCwBg4c6NLWunVrdejQoVI7AABAvU7r/c9//qPJkydX+/4dd9yhzz//vNFFAQAAAACal3rNnPbo0UPvvPOO+vbtW+X777zzjrp37+6WwgAATU9GRobRJQAAAB9Vr3C6aNEi/dd//ZcyMjKUkJDgcs1penq6tmzZonXr1nmkUAAAAABA01WvcDpp0iR16dJFy5cv19NPP63c3FxJUkREhOLj45WRkaH4+HiPFAoAAAAAaLrqFU4ladSoURo1apQnagEAAAAANFP1fs4pAAAAAADu5tZw+umnn6pXr17u3CQAAAAAoBlwazgtKSnRN998485NOt18883q1q2bAgMDFRkZqd/85jc6fvx4jetcddVVslgsLstdd93lkfqA2tx+++2SpE6dOjGGAQAAgEvU65rT5OTkGt8/efJko4qpydVXX63f//73ioyM1LFjx/S73/1Ov/rVr7Rjx44a15sxY4YWLVrkfB0UFOSxGoGa/PznP9fmzZu1b98+FRYWMoYBAACACuoVTpctW6YhQ4YoJCSkyveLiorcUlRV7rvvPufX3bt317x58zRx4kSVlpaqZcuW1a4XFBSkiIgIj9UF1FVSUpJ+//vfq1u3bgoJCWEMAwAAABXUK5xGR0frvvvu069//esq3z948KCGDRvmlsJq8v333+uVV17RqFGjavylXpJeeeUV/eUvf1FERIRuuukmPfzwwzXOPNlsNtlsNufrwsLC6je+MFSSZLfXr340bX7lJ8svLKi2j6fGcH3G7/l5obIGSLYSqdXi6mv1JWar2Wz1SuasGQAANA31CqdxcXHKysqqNpxaLBY5HA63FFaVuXPnasWKFTp37pwuv/xybdq0qcb+//Vf/6Xu3burc+fO+ve//625c+fqyJEjev3116tdJzU1VY888ki96rJY6tUdzVxkZKTHxnB9xq814OLYtQbU+xAMY7aazVavZM6aAQBA01CvcPr000+7zMpcavDgwbLXYxpx3rx5WrJkSY19Pv30U/Xr10+S9MADD2j69On65ptv9Mgjj2jKlCnatGmTLNWkwzvvvNP59aBBgxQZGamxY8fqiy++UO/evatcJyUlxeXa2sLCQkVFRdVYowfzOHxcSvoF/WFHSdVvPnJxXFYcw5L0j3/8Q999951HxnB9xq+tRD/NkNV6pL7BbDWbrV7JnDUDAICmoV7h1N3Xvd1///2aNm1ajX0qPpomLCxMYWFh+tnPfqb+/fsrKipKu3btUnx8fJ32N3LkSEnS0aNHqw2nVqtVVqu1bgfw42mbPCy2+frdPSeV+N13Nfa59PFK0dHRio2N9cgYrs/4LT9l00wBxGw1m61eyZw1AwCApqFe4dTdOnbsqI4dOzZo3fIZ2ppmci918OBBSRdPqwTcgTEMAAAAuEeDJv3atWun9u3bV1o6dOigLl26aMyYMXrhhRfcVuTu3bu1YsUKHTx4UN98840++OAD3XHHHerdu7dzxunYsWPq16+f9uzZI0n64osv9OijjyorK0tff/213nrrLU2ZMkVXXnmlYmJi3FYbUBe7d+/W2rVrJUnZ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AACA4QinAAAAAADDEU4baeXKlerRo4cCAwM1cuRI7dmzx+iSTCc1NVXDhw9XcHCwOnXqpIkTJ+rIkSNGlwUPWrVqlWJiYhQSEqKQkBDFx8dr8+bNRpflExYvXiyLxaI5c+YYXYop2Ww2DRkyRBaLRQcPHjS6nCbl5ptvVrdu3RQYGKjIyEj95je/0fHjx40uCwDQhBBOG2HDhg1KTk7WggULtH//fg0ePFjjxo1Tfn6+0aWZSmZmppKSkrRr1y5t27ZNpaWluu6661RcXGx0afCQrl27avHixcrKytK+fft0zTXX6JZbbtHHH39sdGmG2rt3r9asWaOYmBijSzGtBx98UJ07dza6jCbp6quv1t/+9jcdOXJEr732mr744gv96le/MrosAEATwqNkGmHkyJEaPny4VqxYIUmy2+2KiorSPffco3nz5hlcnXmdPHlSnTp1UmZmpq688kqjy4GXtG/fXk8++aSmT59udCmGKCoqUmxsrP70pz/pscce05AhQ5SWlmZ0WaayefNmJScn67XXXtNll12mAwcOaMiQIUaX1WS99dZbmjhxomw2m1q2bGl0OQCAJoCZ0wYqKSlRVlaWEhISnG1+fn5KSEjQzp07DazM/AoKCiRdDCto+srKyrR+/XoVFxcrPj7e6HIMk5SUpAkTJrj8TEHd5eXlacaMGfrzn/+soKAgo8tp8r7//nu98sorGjVqFMEUAOA2hNMGOnXqlMrKyhQeHu7SHh4ertzcXIOqMj+73a45c+Zo9OjRGjhwoNHlwIMOHTqkNm3ayGq16q677tLGjRs1YMAAo8syxPr167V//36lpqYaXYopORwOTZs2TXfddZfi4uKMLqdJmzt3rlq3bq0OHTooOztbb775ptElAQCaEMIpfEpSUpIOHz6s9evXG10KPKxv3746ePCgdu/erZkzZ2rq1Kn65JNPjC7L63JycjR79my98sorCgwMNLocnzJv3jxZLJYal88++0x//OMfdfbsWaWkpBhdsunU9TMu98ADD+jAgQN677335O/vrylTpoirgwAA7sI1pw1UUlKioKAg/f3vf9fEiROd7VOnTtWZM2f4a3IDzJo1S2+++aY+/PBD9ezZ0+hy4GUJCQnq3bu31qxZY3QpXvXGG2/oF7/4hfz9/Z1tZWVlslgs8vPzk81mc3mvOTl58qS+++67Gvv06tVL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1Pd7sBD1TYrTC2jZsiVHjx4lNDQUTdPK3Z+Tk0ObNm04evQoYWFhBkTYcDT051IpRW5uLi1btqy3Y14of43W0F/zmvD258KI/IXKc9jbn6+GwJee44yMDDp37szatWs9BkB64okn2LBhA19//XW95PDMmTM9WmN1XefMmTNERkbWynuwL70mVWkojwPq77EY9R4sRH2T4vQCTCYTrVu3vuB6YWFhPv8G6y0a8nNZ3792Vjd/jdaQX/Oa8ubnwohf6y+Uw978fDUUvvAcBwYGYjabycvL84j17NmztGrVyrXMPYdjY2PJzMz02E9mZiaxsbGu+53LWrRo4bFOYmJihXFYLBYsFovHsqZNm17046qML7wm1dFQHgfUz2ORFlPRGMiASEIIIYTwaQEBAfTp04d169a5lum6zrp160hKSqpwm6SkJI/1AdauXetav127dsTGxnqsk5OTw5YtWyrdpxBCiEsjLadCCCGE8HnTpk1j7Nix9O3bl379+rFgwQLy8/MZP348AGPGjKFVq1YkJycDMHXqVAYPHsz8+fMZMWIEy5cvZ/v27SxZsgQATdP4+9//zty5c+nYsSPt2rXjiSeeoGXLlowaNcqohymEEA2aFKeXyGKxMHv27HLdeETNyXPZ+Mhrfp48FzUjz1fd87Xn+I477uDkyZPMmjULq9VKYmIia9ascQ1odOTIEUym8x3GBgwYwLJly3j88cd59NFH6dixI6tWraJbt26udf7v//6P/Px8Jk2axNmzZxk0aBBr1qwhMDCw3h8f+N5rUpmG8jigYT0WIbyBpmRMaiGEEEIIIYQQBpNzToUQQgghhBBCGE6KUyGEEEIIIYQQhpPiVAghhBBCCCGE4aQ4FUIIIYQQQghhOClOL9Err7xCfHw8gYGB9O/fn61btxodks9JTk7miiuuIDQ0lOjoaEaNGsX+/fuNDkvUoUWLFtGjRw/XpOVJSUl8/vnnRoflFebNm+eawkLUnM1mIzExEU3TSE1NNTqcBuWWW24hLi6OwMBAWrRowd133016errRYTUKDfVz0pff744fP85dd91FZGQkQUFBdO/ene3btxsdlhA+T4rTS/Dee+8xbdo0Zs+ezc6dO+nZsyfDhg3jxIkTRofmU9avX8/kyZPZvHkza9eupbi4mN/97nfk5+cbHZqoI61bt2bevHns2LGD7du3c+21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V3icF198keHDh/PII4/QpUsXnn76aXr37s3ChQurFee7775L3759CQ0NJTY2lj//+c+cOHHCdb/z9I0vvviCXr16ERQUxLXXXsuJEyf4/PPP6dKlC2FhYfz5z3+moKDAtd2aNWsYNGgQTZs2JTIykptuuomDBw+67v/Pf/5DSEiIx3Ny//3307lzZ4/9CO/nK7keHx/PM888wz333ENoaChxcXEsWbLEdX9FpyqlpqZ6fN8RoqY+/fRTwsPDWbp0KSkpKfTr148mTZrQtGlTBg4cyOHDhwHp1nsxpDht5F588UWSkpKYOHEiGRkZZGRk0KZNGwAee+wx5s+fz/bt2/Hz8+Oee+5xbffdd98xZswYpk6dys8//8xrr73G22+/zT/+8Q8Atm3bBsBbb71FRkaG63ZeXh433ngj69atY9euXQwfPpybb76ZI0eO1PMjF8LhnXfewc/Pj61bt/Liiy/ywgsv8O9//9vosISXGjduHNu3b+ejjz5i06ZNKKW48cYbKS4uBmDDhg3ce++9TJ06ldTUVK6//nrX+2JNbNq0iaFDh3osGzZsGJs2barW9sXFxTz99NPs3r2bVatWcejQIcaNG1duvTlz5rBw4UI2btzI0aNH+eMf/8iCBQtYtmwZn376KV9++SUvv/yya/38/HymTZvG9u3bWbduHSaTiVtvvRVd1wEYM2YMN954I3feeSclJSV8+umn/Pvf/2bp0qUEBwfX+HkQxvGVXAeYP38+ffv2ZdeuXdx///3cd9995X5QF6K2LFu2jNGjR7N06VLuuOMORo0axeDBg/nhhx/YtGkTkyZNQtM0o8P0XUo0eoMHD1ZTp0513f7mm28UoL766ivXsk8//VQB6ty5c0oppa677jr1zDPPeOzn3XffVS1atHDdBtTKlSsvePzLL79cvfzyy5f2IIS4CIMHD1ZdunRRuq67lk2fPl116dLFwKiEt3G+R/7yyy8KUBs2bHDdd+rUKRUUFKTef/99pZRSd9xxhxoxYoTH9nfeeacKDw+vct9l+fv7q2XLlnkse+WVV1R0dPRFPYZt27YpQOXm5iqlKn6fT05OVoA6ePCga9lf//pXNWzYsEr3e/LkSQWoH3/80bXszJkzqnXr1uq+++5TMTEx6h//+MdFxSzqny/metu2bdVdd93luq3ruoqOjlaLFi1SSp3P9aysLNc6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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#for model in [\"kabs\", \"ksca\", \"pmo\", \"g\", \"random_nu\"]:\n", + "#for model in [\"kabs\", \"ksca\", \"pmo\", \"scattering_phase_function\", \"random_nu\", \"random_direction\"]:\n", + "#for model in [\"scattering_phase_function\"]:\n", + "for model in [\"random_direction\"]:\n", + " print(\"*******************************\")\n", + " print(model)\n", + " print(\"*******************************\")\n", + "\n", + " if model in [\"random_direction\"]:\n", + " hidden_units = (48,)*6\n", + " elif model in [\"random_nu\"]:\n", + " hidden_units = (48,)*3\n", + " else:\n", + " hidden_units = (16,)*6\n", + " \n", + " d.learn(model=model, nsamples=1000, hidden_units=hidden_units, overwrite=True)\n", + "\n", + " d.fit(epochs=5, batch_size=10000)\n", + " d.test_model(plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2c739068", + "metadata": {}, + "outputs": [], + "source": [ + "d.save(\"diana.general.dst\")\n", + "#d.save(\"diana.hg.dst\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46da9525", + "metadata": {}, + "outputs": [], + "source": [ + "from schwimmbad import MultiPool\n", + "from numpy.random import SeedSequence, seed, randint, set_state\n", + "import pandas as pd\n", + "from tqdm.auto import tqdm\n", + "\n", + "pool = MultiPool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))\n", + "\n", + "def run_dust_simulation(x):\n", + " s, position = x\n", + " seed(s.generate_state(1)[0])\n", + " df = d.run_dust_simulation(nphotons=1000000, tau_range=(3., 30.), nu_range=(d.nu.min()*10000, d.nu.max()), position=position)\n", + " return df\n", + "\n", + "result = pool.map(run_dust_simulation, list(zip(SeedSequence(12345).spawn(pool.size), range(pool.size))))\n", + "\n", + "df = pd.concat(result, axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1ee5dd93", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(\"sim_results.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9c70d62b", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'd' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43md\u001b[49m.learn(model=\u001b[33m'\u001b[39m\u001b[33mml_step\u001b[39m\u001b[33m'\u001b[39m, nsamples=\u001b[32m16000000\u001b[39m, hidden_units=((\u001b[32m128\u001b[39m, \u001b[32m128\u001b[39m),)*\u001b[32m6\u001b[39m)\n", + "\u001b[31mNameError\u001b[39m: name 'd' is not defined" + ] + } + ], + "source": [ + "d.learn(model='ml_step', nsamples=16000000, hidden_units=((128, 128),)*6)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4eefa65c", + "metadata": {}, + "outputs": [], + "source": [ + "d.fit(epochs=100, batch_size=10000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d30c954d", + "metadata": {}, + "outputs": [], + "source": [ + "d.test_model(plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51af9132", + "metadata": {}, + "outputs": [], + "source": [ + "import astropy.units as u\n", + "d.plot_specific_ml_step(tau=1.5, temperature=600*u.K, nu=3e5*u.GHz, nsamples=100000, plot_columns=np.array([\"log10_nu\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63f9bd1c", + "metadata": {}, + "outputs": [], + "source": [ + "d.save(\"amax.dst\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pinball", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/dust-demo-diana_wice.ipynb b/examples/dust-demo-diana_wice.ipynb new file mode 100644 index 0000000..c316a58 --- /dev/null +++ b/examples/dust-demo-diana_wice.ipynb @@ -0,0 +1,11469 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "461d2258", + "metadata": {}, + "outputs": [], + "source": [ + "from pinballrt.dust import Dust, load, suggest_opacity_sampling\n", + "import astropy.units as u\n", + "import numpy as np\n", + "\n", + "from scipy.interpolate import interp1d, interpn" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "89f9421c", + "metadata": {}, + "outputs": [], + "source": [ + "data = np.load(\"../pinballrt/tests/data/diana_wice.npz\")\n", + "\n", + "nsamples = 4000\n", + "\n", + "samples = suggest_opacity_sampling(nsamples, p_range=(2.5, 4.5), amax_range=(1.*u.micron, 10.*u.cm), n_dust_subspecies=1)\n", + "\n", + "p = samples[:,0].copy()\n", + "amax = samples[:,1].copy() * u.cm\n", + "\n", + "samples[:,1] = np.log10(samples[:,1])\n", + "\n", + "lam = np.logspace(np.log10(data[\"lam\"].min())+0.0001, np.log10(data[\"lam\"].max())-0.0001, 300)*u.cm\n", + "\n", + "samples = np.repeat(np.expand_dims(samples, axis=1), lam.size, axis=1)\n", + "\n", + "log10_lam = np.repeat(np.expand_dims(np.log10(lam.to(u.cm).value), axis=(0,-1)), samples.shape[0], axis=0)\n", + "\n", + "samples = np.concatenate((samples, log10_lam), axis=-1).reshape((-1, 3))\n", + "\n", + "kabs = 10.**interpn((data[\"p\"], np.log10(data[\"amax\"]), np.log10(data[\"lam\"])), np.log10(data[\"kabs\"]), samples, method=\"linear\")\n", + "ksca = 10.**interpn((data[\"p\"], np.log10(data[\"amax\"]), np.log10(data[\"lam\"])), np.log10(data[\"ksca\"]), samples, method=\"linear\")\n", + "\n", + "kabs = kabs.reshape((nsamples, -1))*u.cm**2/u.g\n", + "ksca = ksca.reshape((nsamples, -1))*u.cm**2/u.g\n", + "\n", + "\"\"\"kabs = 10.**interp1d(np.log10(data[\"lam\"]), np.log10(data[\"kabs\"]), kind=\"linear\", axis=-1)(np.log10(lam.value))*u.cm**2/u.g\n", + "ksca = 10.**interp1d(np.log10(data[\"lam\"]), np.log10(data[\"ksca\"]), kind=\"linear\", axis=-1)(np.log10(lam.value))*u.cm**2/u.g\n", + "\n", + "p, amax = np.meshgrid(data[\"p\"], data[\"amax\"], indexing=\"ij\")\n", + "amax *= u.cm\"\"\"\n", + "\n", + "# Create the Dust object.\n", + "d = Dust(lam=lam, \n", + " amax=amax, \n", + " p=p, \n", + " kabs=kabs,\n", + " ksca=ksca)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "adf95f57", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Trainer will use only 1 of 2 GPUs because it is running inside an interactive / notebook environment. You may try to set `Trainer(devices=2)` but please note that multi-GPU inside interactive / notebook environments is considered experimental and unstable. Your mileage may vary.\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n", + "\n", + " | Name | Type | Params | Mode \n", + "-------------------------------------------------------\n", + "0 | model | MultiLayerPerceptron | 5.0 K | train\n", + "-------------------------------------------------------\n", + "5.0 K Trainable params\n", + "0 Non-trainable params\n", + "5.0 K Total params\n", + "0.020 Total estimated model params size (MB)\n", + "10 Modules in train mode\n", + "0 Modules in eval mode\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3cce37f60b34efb9c8e709532d11232", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Sanity Checking: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b7456b993e764e31a8ee4db39d8f55c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Training: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8c99afb14ef248cb8196d49a762bc0e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1203fce14431491bb5df6c2e2d746248", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73528ababf1b4ad588020c20700c85de", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5c0e63a6b9b14c76ae963fcf91d9754e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b9ccff2030f74854abb34f9f993afb44", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f2ba164f4057413b9a8152100cb526d2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "817ad2522c6845838ec297810acb9775", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cadc298e1d2b48caa2479cef947da27c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6638ecf77bdf4e3ab08b08a70cb8d8eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "af01605d2f6d4fcebaf74307ef2adf5f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "370bd869c9dd4d9793e316f4edd8d131", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e3a4a2367d38421ab01da770715f007a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6ae33c026010403e943258006e58fd6c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "154dd6526cdd44dd9207a02677accbdd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1a8e4924f46e436e9ef770fcc4e0acdf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "32fdf0eb1dc640b5a304f1e59e4cd508", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f04bfebd94004262ac1ac3776c9767ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fbbaafcf27bb4e259d197a24debf118a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01150085ae5b4ba5b3e1be99e03842ce", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b0ecb0db734c48ee814a7e816134af59", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "70ef7bffd6cc4a789b9dfb6cbe4659b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e254e3ea1d48458f9f01858dd4bbd37d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d01fb62aa5b4f5bad90bf1ff768dc28", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1cd918727df94369ae98c5c80d9e3d10", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "434fd48331ab4910821c70236337f0bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e979547d32204747aff05eeae5595552", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8c18589c6c6b477c981af4538f47f39c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1615a97dca0642779c0be1f5114488c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7aa0754cd2ba407e87bceb20f331b97c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1d706accf4484600b3a6b5f75152ac25", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31e50e960fd44ab399459901080574ae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d876ce2068ed4bf2af027c329a06aa36", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8a056a2063b247db9933cb961c1a695a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "616e5d4d8cba438a9728aee26f2cf891", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f28ec496e485405fa2978c7cef39df13", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6c025e416ff14ff0a884f125b8d44aa4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "32a7e45e6769474fac971ad6ca3d07f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dc4a543c4ba34a7ea9ce47a81a163478", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50ebc01908bd43c3894a630618347e7a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50febd11fbd74253ab1e0a345c1a4bc4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1b35cd32499f46498b89995fd717d3da", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e0095d58d73542f1b41ada5e8099bb84", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5f272b2203d04cd1ba6101d11448f130", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a9d34c088e1349d6b17b56105320cd41", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f3b9645acabd451d9ee686e356e392b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "caac21eb125545368ef254082ba11012", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d1523d2d9da4c9a8b154eac699b195a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8b52ace80e0d4052a568d148d073b55a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8a8e6d4f410d4c979941f5eb7f30b533", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "99914e990d7a4fad840f9288514cbf3a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28ba27ccf9384963a99bd4d114d7b6f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cccebe9cc7ad4ec2baac179eaacee84e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0f467907bd24fddb3637b268f764088", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0c7a2df5f61942b8b22da7b2e05ddf5c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3392b6180d14a219c0627ea79aab6ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31018d97482b40d6a0bda0e7ab4397a6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "895b0bddb4d44b5f9a19fd5f9ff38b4d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6c0b1ef724c243b5b086baf50f4ac34d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bed73f48cbdb4c22852d0d559f880109", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e720e28124d4acfb60552f189f7c54c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3c825a47a024eebb40ad9144337c4f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "363ae5bb051943f1a02e576b1f762641", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c2c0301196014fdd872208510187684f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4a885f80ed01495ca8a2abb304519342", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e390510c30f34abca3e661db810879fa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "22524fbcf3974fcda12c4a8ef395816e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2022fa1845af4ecf9ba16f2f81817099", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3b94f7aa744413aafdfff59748fe22c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d0fff858c01b46c6b247ea4994beaae4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "59aa5b5f79f9460c8be30c176b3aa4bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5179af07e9854073bd8158bdc5bfeb97", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "09ebb9c8b9ad4e6fb606ec706f945d5a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "562d66bb32504efb864dbe92e1e1bad1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "595cd0bacce249b2a6d38f0963aee611", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "47abfc80a430484da0294a742f63096e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2af4d7cc311941b88377284578a5f963", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "56e56f9653ae4e1e9ed871a06e5c6042", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "22a45ce3d07d45ed90e7a9dc9f453b2a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a5367bb2cbe44cc1b9ea7ddcffb68200", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fdb9f8f8c0dc4a2d8f3377d3360959fa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "453f77c5a9484366a542c194a204d89f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e3601a49e0ba4460a8f33a11cdc2bb86", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b3d9c809f01e4ce1b9bec927b85d6ac6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e966e3f1a3ea4eaab45a4178792883f7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "581676eea3674793b0927b15121bdbb3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "da1676b973e4467fb3f2e563e69936e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "36f9608b0973488b8ad14d7894af6423", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a250421b616944c9afd6ae8207d828e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "194180b7190a46208188db818c105c44", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "784b190d8bff4573a4a8d965f98d54b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e8a0af2340e845e094727996b3a5c730", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "edf45b45299f481383b539e49c2405e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65e783b3947543ca9d2a7dab3de67727", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8d8417be49f24ecfb64a3513ac45027a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "19e6432297cf4084bd66a5b86027283f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "19208cde94ed4b0db7207d18787fb24d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "471f57d2760c45a1879c82df63b19e3f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "202228d0b2f74213bf5fcdc0f7b3cb54", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6bcdd22d8aed45dca001a8adf5679575", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c12747bec3194cc7b14ca68eedb3b290", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "436e5eb8f8d14c4f957e6932d1c2ddff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5123ff42cd99420d9cb720a95569876e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e24ea08bd1534f6e996f914d85a32e94", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4008aa244ca04378b76dffda57c5f44e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3301483e48a4ee2b7d4b407b9d15a10", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1707d52b852e4c2cad03af88dbee68f7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d717711512d84e0eae62194578f3b450", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ef39e7a8675c4f2985d706371159b515", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b195578d9f694376b3295380357b6931", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1baaab00c0cf4795a7dec144742f4d3e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b03672afc72b478ab76fe497fe094db1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45ab9ef7cb014e559a4ca4b0aa6e217c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6480e1e8b76d4fad9daa4349d2488e9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dfdb76de9a7246608fa976f0a8d517ae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6cadd6a979e04cedbcb1af7951753962", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed6b006d958647cf9558fbc0e0050e8f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4bbdb34bc04e473e9338f2e551c431c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc72a7fd35d2432cb647bc62b8cbfd4f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4525a9ebf0aa48a8a0617ccae4e330f1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d29382dc35814fe0abba3d9da4d53abb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0681cdc11acc4088bd46084e0dbc7934", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a2f5af8794da4cf282d2a617281c102b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b4eb6c54c1744828c9e583229fb39da", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f726ee41f4fa48048a25fe94b5ff6e8e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d49984350ba49abbcc2d2636e82cbfd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7e1cd501313447c39da2e8c07a8218cf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3b8223a71c7246d8a62477d4d99e489d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f986019dbd514b2bacbcf8d7f54b7b39", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b955edd0a28d460c851aeddb9fda347d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5bb33f356e88463e8170f5b6c21c770f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a6b3ce624fa84b5192b73b711c89c728", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2f5177b70d744ab5a1238262bf2dd961", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b9ecb176ef0c4e3fba05c3fe107eda2d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eb988dde53ba4801890a8384dbfd696a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be2bbb4b912342438ea77eb400e5437a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "238e47d819384aab892d3478ef406590", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "373d5760e23d49e5926f438646cfad1d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dcf1b93ca672490487665d0d11307173", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5d1976552c43448da3b86f035aad3d6e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3d4d730c9d24da6960e203fdc988593", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0ad5671c58c34f5c943e0012e12d1ae7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9b529d0fe6e3469184b69000b3a34349", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "828134460b924197b2f68821f0cd8605", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d793557536d94b20a4e8ab62aa0b76fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "512332d13623481ab293e98caef2d0c1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b2f558826b3f44e2a13c944190c383d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0757dfe610384c8285a189ad459f3e1f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b1b8bc7b24a447399820806a89d84b8b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3c4df08587f43e280a3a5a947d62329", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "82b9e38a3d6549d59e8d241d99d10062", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "664a4f8995474eb797492d6f720d9a49", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2da4a4d68691424e8bdf97232555e0ef", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "721fd3a997e245289255e433cc9d9447", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28f9728e3ea64712a29cdb9fc084419c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "81a38f2537d8492ca576eab45345ae4a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "37c7d18dcb5349f08269abcaa2c4f4f0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d1aac2f1842649e4bc00984fafaebd75", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "589cf21fa9a64fb2a5a3832d0cb1a749", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7d6ecb87e702498882068f414b1401a9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6139ff29a41a4fa2b8b6aa1e11d9b5ff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "07b027a7885f4442a6920bba51ce0289", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "48d2952f019347d083863dc612df8ad1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7294cfd66a034d31bca023ed06b6399f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7cbffc50dbc544c1800081345def4741", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b0f54d3feafc4c0395e0178e11ec3155", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f8070045957e4903b08c94ad2fc99e90", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7687a928ec1b404d9d527eacf053efb7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5872cf285769473bb4c7a4a4181bb41c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9b73134d73a243d6aa438ffac4f486ce", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5afa3bb643664dfd86614a34529914db", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e1c9c3642b404be8915cb93e77c14739", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1f98b0a77c7249fe83d1c3e9d83b18f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b7fd2ca81ae34b079b82b99eb6fc15cd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d9f401455c8c455a8c8049d33b02ed81", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "204aaefaf1c34662bbda0d12ff9bf1a2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "47383913bc084243a65c0cef93d8a88d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e28e6ae8de1b42b9a3f35fd9ed548010", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "38ea973429b1424dba342466cbcdc140", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "831642e5498844f6ac5daac09b01c160", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a21d456c97a34f78a5116a8589476d73", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b65a7812b8494908bdaad1ee6dbaaae0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91bc1581d4b64d698b92fb4ffda84c5b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40765399c3854e2e9965f2970c4effc6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50f465bd85a448e0a30c3f88c7a77c07", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b7867cf5740432995b6bee1c02c7dd2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b3a20919ed704b73a5df87b223c276d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "078c9a36bc56426d8b55f7b03c8c1905", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "716f62f2c53a475284de7851ea672013", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "35f46968ae584eb790f36ddd227a878d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d58cfd78610a4dfcbc48495db825fb08", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "26c3083f04664ac8adde3b2f2112d0ff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d5bf9331c06c468dad7f87b93afbc7d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b23223ea0b5c42ecaab7ea5e8fc8c7f4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cf5552a726d846ba866b0eb8db62d100", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40df2fdacec84d19b061221c878b9436", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "093d6365119840a88318227bf52b8dbb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e71b8255ed7041c28b81332318781c88", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3b684bb77b374dcc8ea6fdfe2bc50d8b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91862b5d4a664e0e9a2c0f9cef482fcc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "61498760f8a34b64a722884c7781b9db", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d3cbeb9d44554a47b8d293d1b4a6c2be", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50e1c0a3ccad4f13bee6e53f8a7ef8ec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fc8ba57d4b4044d391393598b0298c15", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a172f801b3df404fa2e3c8d800be4ce5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8667389040d24741b32ee6c8ebf407fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4db6be37f48841ada22af93c46349efa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c514e07691c041bd96448502c03cb7a0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "12371c92b7fd4d7595ed768a2853f0f0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74a8ab36452a4e95bf129361736916d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "93c95cee8ec94396b11255ac1a099822", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3625d223a6648f583d20fa60e317aa2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff7b70448bf346f18c3707ca652eefb3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc5d190c2d3642208d22ad66c03b5cd4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a33ea8f9bb87401e930573831d443a87", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b46d044ee57d4f5298fbc6f4052eee9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "841b729712554cd2a0e873b60faead67", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "738a219aca404f70aa8bbae40bbcca81", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e6c6efb282644762a7639e6fa2aff721", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c23cf457eab7481d9797811c0aa124e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9e4b18707e1441d1b9e6b8d0e6945e91", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2832e65b1790495dae7951bb79b0d284", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e1f7be75e2d04a2f86cc646ddc337e7d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cf52527cf06b4d229b8f233f167e6ff6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "42bd0c07e03145dfa50c8973bc6f53b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e2fd530afaa4ebc84fe4d7554910ded", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2d324c72c64049c1a985b6a21ebee392", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e44b0b656e6433b9b3288cc661369ed", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2d3e8c3752a9470eac546c8b8058250e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ffbd9b912754daea61592c42c776be0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "23049a43e77c46b4be197bfb44c1e963", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed1d63a33f5c490a923091aacd54ab5c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e35d683fda24009abeb525260250bd3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "15916a250461409baa4cdb6ba906baa4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b6ad99c70ba4bda8fd61d7e5cb679bb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8094d14e777249bd97f75ee74cfe949f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "610a8a6b4d924d82a88d0eda7f5d0793", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cb2545d6747b4328be7d24ed0bc99e0a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d67fb7b695b64730928c65fbb157dc4b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0e555d0caee438084daf51f677152fc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d328f0f1d51442c2852deefafa6d8238", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4458312185bb4f6392971f5f5f38b4aa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50cfa4f436b7407083e800dcc403aeae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aaf80eb634f64bfa96f2663f581e82fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0c24ddf6c06e42e4a20e5a4112f1b2d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "906b81d9f5af4f1b97f27058955a96da", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3287d5f419f449e38a8abf13cb2b2eff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f7e03442b7a840c7b25124c050455568", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e167eebad07d4f04a26a7016d9e4be1d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c507a81f33db456290daf35656dde9ba", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "80b425b05f9347bda414a2f01824c32a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bb4928678e274edd8f6c75642e30b764", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2df13e5adce24bada949229bae1c1b88", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fe215f5570c34d6e99ff63de0357a17c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f8e12f9906754ec5a6d6ae453ab19ade", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e69d1de20b7476fab1323dd23d4beb6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "456c415a528448bd8f04e0d1362168a0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "026141f4b4b24a14acbb942fc7a132e2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9766623b207641bda9d4db70e210d19f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ccdcea4029c242a2adaac7a4fc4fea88", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2cbce47015194ddba6798f0e3b3a5dd3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f0c876136b60405a8ed15e634482a4d7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a57a3bf8818447a29350b3bd4be77173", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0fcbc30f13104d8393b43993f03a759c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e7d68685161b49e186582811a17b4df3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "761803b548e343c5a842b2d2f4caa6b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3292b291a01c49c298bb3be20fb7720a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8cae35247aae48dca4f4a039ff721d0b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ec059326bbff4740be567ff3287d53c5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "62d7a89fcd9140d48b460e64f98a45f1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e4a2679289f34ecdba3dc0ee920dd0dc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "823a87ff7c824bf184559358e38448c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9085a91fae6043d58f99f1f9a88ec347", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "96e8afb6275b4e0f940211ce86c3bf70", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b9da8e49e4db422fb7b4d27eced3ab87", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98db2d3f6860428ea442be4de5e68e50", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "44b77033bc9948de831d0e790a1cd92c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c52f20c310314c6d9eb57f7ebf4acb52", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bdfdc329d75f4299b1a9befb97acc6d7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8742fe4b8b5c4edc95503bd71913b7c2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cf52afac98bc42ac8a79a7b5f801982d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "33f3e38f21d34feea51b95ef69aa9168", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f261dcdde1a4f0ca353d595d8086d2e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fadd7d94418c4d28bdd7a4f2280263e8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e367cf1d9a64e0f8a0070aca4acccb1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "940677d7e1da44f88631ab302f9b7320", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "762bc622b2114b9cbc09665ee7479620", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5394668cb4b64a1c834454dca39ba6c2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8cb35df49d654ff68ae6862cc5d70996", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ceb0c90942054e7aad48b88ffe598cb5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e7aa03b4ddb747b4ab8fc82ade9ce358", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "43ccefeca1be482b83b6d03dfa9cf7ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2044dbaec9c34066a770b39d48aa5968", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "881f828c1d364305bb7729a36b3cf36f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3bf592c005d142a8a7c7733732686980", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e83135b92154c988a0616776760f390", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3d832e2282ff43548881d4eb165a5463", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6efa3685424c46f5a4135812d6600931", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b706276d298490f9f1963672b75129f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bff277c22b8b44d39b627fc5cfbf793d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0a65695e650743738c7fd6848cecfc10", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "25abe5e01442417193b4b3537cc05004", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6d2b63804b4342bfa50a1ade941d0c85", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8747d4c299954790a75c3a3853749517", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d85820edc4bd44279433e6afff1bb456", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bdc7ba6d46cc453d90754d91514102dd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a344bc0d510d456e9e0b5864d11897e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "558903d3a0394127910858bf94545a22", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "37f244c411d64cb3a0dc1b1d48500cb1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7f3b672b619e4da1b818ee60cf2a3907", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6a1f71f3e14c45c4b61fe5c48e2e7c9f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c21d453b364945b79d1f344a6714fa14", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f72b4f6df3f04e30af2b8839e5a1ac93", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ec9ffb2313f49c1bff832373e837aa0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "307aa7d002cc4bbe8a4fb57d55aeee49", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3bd95b2fa8af4e3da8fefed7a604bc86", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c1bc6c9f8dc34ceca70ca925bfe3c46f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f563381c4e674b789214e5bf11228308", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "83157cf24e284b5aa38efebb45128652", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "888af13ebe1a414fbe09f7b952e568eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a18c88e0c26a464580c479d1f3eb4fa4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3083958b633c4ef39bbba06e2b36b888", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cc206e426ee34a44aab5c70afc193590", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0c319ab66bd4358af1a88499cb27cfe", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84adc85316af4615af71d91759440d3a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e31170501dd844e5a2f318996626d992", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f1206f273cf4e8f9b690d36e88850c2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d523e7679bc1456991194af9a9e06ccc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3d377497d0bf427aaad1911ba84d1bee", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d8bfcc2181bb4cb7a37f42f88e3eb86e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d5de59e678964a6eb99c0e61c32923ff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f4569792d6484a2ca4c12cffa351ed11", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2664878149be4b6e8d702bca015e72a2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "358ccda359b446e1bf9786a18432f659", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "633eb8a849654521bf0afc1c2ab95a88", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cad6cdee6040435aa51f7749a933ff77", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc7daa32be7f455cbcce1cd2393c736c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "30af4cde8a1d4067a3d0dc5ef9934893", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b26a2ea74cd4729ab6f3fad1f649b56", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8cc777e188fb440ca352184bb0d0b2dc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6027f0c720f45ccadc359a018af36e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e761e1f906e412e9758cffaf08bc440", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50db71f8847840a994244c140c69185a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fcce535b45724aaaa7f2a0d84e32bf4f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5587aaefab6d4969aa2cc146d527815d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "920c347ba928462aac667e44d0e6a9ad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7949b92bb35142878de7600c97c0b0ea", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "78f9bb1b61f5419d95cb07354fddacf0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eea08cb5163545caa13f8187cb5df361", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eb06256c3c9a4b1ab90f9dd57b26b651", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b968c94963e4ca0a1a1e005dfa4b845", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ab348c74d4e74a5699bef635107d7dfa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "62d2e98a5a2d4181a8d5a8f300150336", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c20528d749be47df88cdeb7152d2351d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d869d7290364eca82862cc422fa1a19", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "739348c966ea45f7825f992d824627d9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8953df6344ec43348ffa9bc2795bf244", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "05c7fadee22a47a98ebb336afe543754", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7e5e077aa6494727a0f98bf048d9487a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "feb32d7ef4a84b17a31220b3f74040db", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d15178934a3e438580b785577b655045", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d20e3ee1ac5049eb9bea98c1e4d59e30", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0548e544057f4e8cb0bce051283e6dae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "988ebc682e724fe98bbc513329296233", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cf5444cfd48b4a15a7723c185b3edf4e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "738fedbf49a548239547153c02841b17", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fada4ccdf77a478da0caee36c73802b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b523389df6b34816beabcf2af10f4e1e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "35e6c89d2f814b9486c8413f49382dfd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e35fb3b4d1ea4f5e92c8563ae7daad47", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45328b538ce34a899860a4d6ef174256", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3fa19b639c364e3d89e155232d708502", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9b1c08209f88493f933b845c97e0f6fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ffc484f4e42487eaae3e1baf4334166", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fc2cca1d533d408d87a28dbe57de93c8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bae3ddde97884ea082839bb85fb7ffaa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "00292c82adad42a9963aac430df45dfc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a75dfa8f6d7a451eaa25ae1ffefbebf5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "432e648780ac468fa78b6583ce93aa85", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "67901ab08e2e4d26beea05bb1eab519a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e202e3ac2ca4fc9858c3e93b351fda5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "936a8dc0914d4b92a6ad3c6a1fea7a72", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fbb4cea544f84135bf31552bfb4aa2f3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24ae684cd35243e1a9bf6ba9704eb174", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6bfec565a1454e3b8d4748f2492b6235", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "584b8b59b23e4d398cb4ccce7edd1952", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "87ac6b8a8b0f4ee693329bb73f26d767", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fa0063df749a423c8087896eeb066f00", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aea9630c1f374ef8af7941cdbc966f21", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7f90716d8749411b9cc79b3671b21350", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "62e6a778fe8d4d9e9637a49c9c811816", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2e1ff6ff065444a1b68ac383225a470b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a5cf0dd6171b4aae957b24f2983c970b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d345c225c8c74b8da6ad5ffc76b28e9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "901c67951d31420fa6b09ca7c21e0855", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "db63f38080574a39bf756a4ac1abfd06", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bf17ef4bacc643488c6c031eb7154442", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91a04a2e879646828157150349a9b770", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed1e8447fe46445981f85ee4e0b16002", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0c6678c5ddda442ea7e78982f778a694", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0e64d75c813344adb7e9ab2a74a6e9d9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "757c9dbac75d410aa9468bb190377c21", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0f58b7f3b9ae4a2b84b1b95d10cd3dec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e3188a5127f425a8dcd495ddf33cdd0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e119843ff51240f5989abb9dd6d316c3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b05d24b183d4573a53ec35e385e35d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0ce8fd20a3534445b1b9a73108b5f55d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dd64da34d5a04b6c83d71f8d0f8227a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "82e890f674734846916c6ebe54a03a55", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9909ae2f14e54532b3064bc2ef3c818e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f73ae3829a284bffa108882e5d80fb32", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6615ced8b09747ee923c34cdaf9f006d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74be5b3bb25640dea34441362b40e844", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "67e6868f97fa4337bca0e75755b522bd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "95c7b9ab57d648f8948adf056cd29ba2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6071c071477b497c934f1771f9f5bc9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c765b0d300b34fd7a4b1f6b97da03d00", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d1d9e7423d5547309a56bcfcbf0edf9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b8b4a171fea7419a9f7fc5475af55563", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "283a71c0d63d4f9182bab8e3794a4be8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c29ba5d7b88c47fead320091247181ca", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2a69e2c3d6d04f5ea35409b61cff5776", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e919532e02646d4bbb9a5168028bfd7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "21f464f9b7f148f6852d3cb33ab363fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "724518c480d646a1b945552822f03ebf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1d8ad1177a4c4097a948fb971f9b3822", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be62d5d46d454abf956cc4e94925d2b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3351f79119b34982bcdd493334043d99", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "64fe4ec872c94fffb9e2d35eb98d4140", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed6c5e8ce8684ae8978ffca8cb3b2e70", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "30faefe39e4440e08d1de4b71a251225", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1b3cebde36dc4ef89b06f6342f23c553", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fcdfb7db1b4542268441406f07dab7f2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "79f1f58f7f184d63ba5cf372b63b92f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d6048be3e4e7485c8590268414b6274b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d80fb79ee85440fa97f2a7c0f9e59f1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "439850779eb64feeac9d6c7c7e71d758", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7206c3bfae824c9dba644536583f4a43", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7f219691a254dad95c442f7bb751307", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "780e243770984518a91665a622efc322", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "68ab56355ee44ec284b0acc47f29b362", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6b4af68f940446882d11fb26ec43c1f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b4c30e538cc4d8988b4ddbc4516b384", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "584b0cea342949b2a6a59e27c82fd0d4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a7477f5922324e28b4ef7522ba711eaf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "db6a081634bb4195b46fba2184be73c6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45162834104a405997cc775404fa2b63", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c20aab3618d54706ac230e9ce70e801c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "54d40746fcbd4fa688e0ac878269f6da", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ff1bcd494934dc89d1f69b36bc4293d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d2229a2855704fca9f40c8fa8ce954a2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be03b9e09c944093b7e2c3d079eb73fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f7af1deff6924ce0b9d8996b4d92f470", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "46365ef2958b4f6ea2090a318d74b6f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1a9aa99b5f4e4a6cb378d136a88aeccc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff91264b7bb9488e915ab18b61b38a42", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "69881cdf6fe449a380245d347e65eec9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cbc60fee6e96405da5590fa2218a2406", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eb5d6ead17dd46d99161754255c6de91", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9e167b3f3683483596b0d1ff375fc98d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7cd34b4576cc45be808a2618affb05c1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f86f307d33534367a4339c61932320ad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "04fac01cccd14cb2a9da58870f1ab022", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "534b716426044030ab06e78759fa81d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d089d501a4004501835184fca6b9578f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "168f9bf1a1874f45a54baa9e2c04bd2c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "123da9c73dbf4f61b501a7562618bed7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c7fa5425378b49d087bf0779383c37be", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "214c01c79b5a47fe8751e01690a0147b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f5da8ba69a2a47a5a95c776cecf409f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "87e49abc5d224abeb4fd439806adb488", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e37a1513925348128cc9f92f53cd19e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9dcb3540cd9e4d748b06dff066b685d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ed9b523b6b8414991db710266b988bb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28565cd3ea1c449db5cb989f3feef968", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c8d606391604be38670b2b590209412", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cad0fa3bc3564b89a8fb27ac3c04974e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5270bf7f6f7449c398d45d531eb79a5e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3925e42419e6467c945cfa3b64962d20", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "29efa968f68e4844882de1911dd6009c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a88a451928324c50a08e9b1ae44fd046", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "305d5e70cd904602981448980eb1a3e6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2c5987e7aa3c4466a9cec61a64ff8709", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0910e960fd82496f8903138e415b4dd4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ef6370a85524279b9a164e43568a962", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8812a8e9b5d742ae9cf950d140aefa13", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "12aa45ed544f46b0a3a55e25b06636c5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a4477521c2914b94a8ef1515c209bea6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "803eae88f9a942e7b177e858e4b09cec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f5c3386eb1354d1b8e6d7acd2e842955", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ff1844baca64e1db1a5c3b427bf0515", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "490dfa50eaff48f9859208a2a07c25f1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "377dfc3c34f34929a0a7b5bbc61d5be5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2b549e94afed40e9bf6abb4bbf6de434", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bea0040f973440589c13a6353e4b4a81", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18addd3f17d545afbdc135226d272d1e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9bb4529119624805b3a6644e5d7f5686", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2e0be02057664488a35a64fda2473c21", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "97503c05b40843638abf50f7cb1cc0ad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e9f0044aef14c049a9f017205588601", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "735524af882f41f880e6b4af5f73142c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3917d16966534d7daad7130b1f8fa9c0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f30a2389c30495d83ea90fa566eb3fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f46bc65235ea48c6bf8500406f988338", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c47550570264ed3aa65d0f278bad52b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84de75484bf4436ab4711302540ffc51", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e986a90d98544216a9acd16cdc295cd2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "51ee3071ea1648839376d932a3ac0e35", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ab72900cc059450c90340da7190ff493", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "284baf7e2ae341d78324377e8b43d796", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8ab2dd19e7ee4582afe5fb286a407fc1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2be873ee32b944cea1007c16f45f41dd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "44761f607408463b84dde3ea8ebcfc5c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "80f70c46cf7a49dcbc0815a155c1184e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7212d1f605bc4b31b12bbf08e792b82b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a13f812a35024c81a65fdd47be0458a9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "36802261438446a68d13d9daaf56a044", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "371c93f69384466a8183fcd35e72a29c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ad61e3453f224e50997781d882e71215", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40364e77c84f493dbbc93681febf885b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24e07a2a43814ce0bd87467df97a354a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6028b486e1354948b2f53c770a250d16", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84f8494f444e427ebae167306b9d9f15", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ec7b1a36591446eb4d6d06efa4bb713", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "35d1c97227634b8bba25a9aede0ec827", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e2912b906d4545859172b7ba7fcaebd1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d58804a000ef43c3a6658f77a726ac7f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b0a583b26cb14f8daed8bff6dbb20bf0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e95320d536c842c7a37db8891fad0e45", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01d4e264b1c249e19e1c7f78ac35c424", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b008af759dcc4a74aaeee86277a1c4f2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3416b973caa40a0ae3bc6cca6fc362c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "de2f1d75be8a46f1830544b8c8ac51fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "86a6cd5d46f14ba385dd8c9f4306a74e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9359b160af4b48e5b9374d3878a033a0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "672c7ea3c5034dfb9334e183f29709bd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7b90e6729e864b54b380482b77c2e2c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "96488474206c4fa0863f2edbbc9f44b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0bd493d97079433b8c18b785315b16eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff7c72456592401196b16bee7fbded55", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0064894971a47ccb20a003b349ea421", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "801f6ec215224d0c8d24a4f69fe3dc40", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6d5072f2ca244a389f6f8b2b4ec70eb1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d1fee107cc0d42b8803a5c791d8e6fb2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4bd69da80fe14f14873462dc126694ad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3a6af4dd6d544bfb88f14e17aaef6b22", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "002e68c9711f4a48bc5bcd0d5d653451", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f2261081cbed4ebebed78bf7781e7f54", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "236ed1a28d7142c5ae9e48a81b959ad1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d632f348524149a69aa5e806d66b1691", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7305ab2e5a364032abc4cb8da4e435fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65149bae662d49eea50f20b02af8ac79", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ec5167f65e04160aa4bd0f47fd28503", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "367d641ecce84991b60ae1101fc28753", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be4a5bcf782c4d50aac8f9ffef871d8e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fe99253ce4c045639f2f56ed33d2f34c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed4666e66e9e4d36af2fba29dcb9642e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b7e8f4c48b0f4926b6ffdb523e9a6751", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d8fca4405c18494dbda6a2b3b841d3c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "739cbb0d4a79423988c82b7930a6c588", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c61fc85d7a84420f9d71f5efc4023474", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6657ea76f44f4d6c956d29a2491231e5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "196b73ac157d4950a1aecafd47fcfb56", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "632fc78046e649a0af2868f450a8f1fc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4603cfa1a247470b95d5f98a890c803b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "086b0f3751344026965750e9f8130865", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1a4a0c2512e2491582e7b1e073d8f1d6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "854d013532ca47f19c6a67d0f4e87501", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff665064193846ee9dab98c769343d70", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9664735b589a43869f93d4d85558cd32", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "92b8c8e28c694b1c9a95c621a66d665e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "67e00f94932c4f63a64d0cbe31bbd3ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31d69ab9bfb2430bb67729a66e730751", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0629ad3afc6f4a14b4356ef5767b2fb2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65664190da3e42eaac51e6b60599bdc8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "937fde54bcd9493e99c6a99d485784b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ac1997ce725460a90b2c89ba48148df", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2388053b64504cb98580224e65451741", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e9457baca2e8482a9d11bd2ae429d963", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "11193ff9ec914d45a94b9e8f5fd48d69", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "506a7d1eaefb4f1581d8b895c6c3ebfd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e0b2edf79f2d4dbcad509d2f598394de", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "949037a9def94684b9e8a5360336c505", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "599cc27d27934d6d83fefc0ea1fe3e66", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "12387cf9b68842859380fb92bfcb9930", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b085057639d54ee8bf873a0f0e142ede", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2d27bd95842b42f1b6185780d48d9596", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "898afea85f2740ca89edf5f8eabfaf5c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a0fd7d574a564cc9a7c89946d8e972f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e73edc2c9ad24b4797c44a34a4e675d8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ffeb84026e874389b61470e8d4487145", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e910b28f9928493da6c9143572b2c323", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e0880f8f60444bf5b485ea5253bc0af5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73b3ccba37114268bb5ac35d41b92334", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "976e65497e7447b086a2330400adf18c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "43649b0bbf5e45879227f756fbce1369", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91fe9a77caa74aecaa047bd57925a013", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "09b0c122177a4206a5d6725c03ea9f71", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "504a06cc4dd7478684213a8c40ec0240", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d8f007940144b308cf2e90d9197e4b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b0b394a6d9b0493ab65dbcfd32fb9cad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2841fbe26fe5409e90ce6b3e8b5ac705", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b1df4ae0e89846659672dfa985a78fc2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "44f2d3aa29ef4c199540dedf4661bf3c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "681526ba248d4c3eb6da67439e4a8051", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e9c55947e1fe42c983983d5b2165eb60", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e5f3e9c918bb436bbc865682b56d8e50", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c069a7812a974824b2014f4f4bab69f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7355d3768f64420c9acade92223d2fa5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "792b6d9a4306467c91d68c8ce9fdbc30", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "506838b19a4f471780bf004dffd3a231", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45422420b7c446fd913571eaea118e1b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aa9758d33925452aa4e004f5c68e516f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ee9fb02c6664c7287048a6ece1378c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "63d8b226a5394efb9a7a7b064fb1f807", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "654b06617f644e738387dcad06dc1900", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8ecefcfc6a8544d0a85c3e7527f14d22", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed0766d411fc4a62995aaae7f7968026", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "08faa8ecf32049db9d4bdb68555e0aee", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d9993df765d744bf9ec05a5b05a0f7b8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6f64e7dccf824cfeae8f7598849b50ba", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4ade224857b94ffba0894eb1d0fcec26", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c7916a83046a45ca85c65c37e4f9bf72", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9540fd1495fa4559aee21ad96d759e40", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "29cdcc071b7b4db48ca5ae7043267477", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d29a00e131a942c3b55d636e79261268", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01af0b658a86403daf247c5d791072dc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e9eb611009b449d8b516d69fd93719ec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c62b85042bf5471681cc1ae8ae845f98", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b790d25255784b009b6db6cecf222f56", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dc11ea0920bf499e9e00053dcfeb45db", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4321d64d4e5849a4a11f70995e7abbd2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ab08bd1817ff4877972bd114e00d2846", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "59e2a7c3974c4eccad9b094ccd27c376", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "72aa3701c7a7414796d0c085a444039f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c4b27edfeb634ea7a10e69f9affb8033", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84eb02e231044022a0133adb8eefee4a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6d5242018f7647caa57d290149bd3d6b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "134e0c1db688489cb3505b6941112668", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d02dd740fbdd40238bd2702ba7ad66b0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fc87b3144d5349c5bb3dd118d3ba0f3c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24c4f13fbd0442cfb162e13d779282a1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bfa54463a21c456fb7be013e18db32d2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a3ac21e8c68453aa5cbb68ae060d0d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "136e55c18eec4b2989f452b480e0ba2c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "42b9c86c683f4bc5bd3934ebbfca44b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b170b241d1e420cb7eda7103358f32e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "abe10ddb587346debc5225624f9da586", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ba36f43edcf43c7b1759d4697b8e0a2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b3c7584fa60c44d79f3384ef1aa85759", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0ba3019a954d445b8d1c1dd81b9fef18", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b646206c64f4b1dbd4a156c6ce94b01", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e1fe89baf3549528527b56147791abe", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73e465d51c5c4234a084b2a6f4d75954", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28485ff2cf9d4690938f266ed0cec9d1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f460bb34446f4f00b07fe49bd1c5e2a9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c321e4dd3e674f588d60cba676318af5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "58eb7295b2204fa4b62a6e390f5c3f85", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9befb6e8db264070b783537ee64e4f33", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a15b55bb59f4dd9a6f1cad2137c17bc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "79284573752f4346815fc276b99dc515", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e6bfe87e14647d6bfcff29d2a167e38", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6a761589bfa4fe9aaeefc3e5ad39cab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ae8dbb4f1a514caaa9cca4f2ba747878", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "03731d940a614302a357e916d802aafa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84b9d86a2a8f4835ad2a971ea8a501b3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "839bf093b0c84d9392b426aad7a9d598", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f39e7fa49f1455e81ee0d169236a2a6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "faec0ad453334dfd84064b2d1e6dc0a7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "247301a047474d819a347e60ef79c846", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e0a27102add0459ea9ce27c18e6d2a98", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0799eb1912ef49c8aea7aba356600c18", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2949c2250d5f446398b7403ea0abdd63", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "76cbace3ddf5426793be56f1d7336d3f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8afeca5a6a09430a8540fa554f368200", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5121fc585e2349d99af9d746b9b30798", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5859d6680f47461eb68b6e3a0aaf2e1e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b055abbdcb704b1fbcc9626c2dceb9d0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6bed3d1df6bd438583fd050c0a4f9ce4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ad0d5e38d524120bf1edd23acd6e93f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "62f121f8f31a45bfb3a1756e7371dada", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d58d35423414c0bb3d1339001752cb5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e1608760ea084206b0a24ab81c8d9fe8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e9f5192e0dd345b495362af9911f95e5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "04b9983246e14872a8671729860e8442", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "67e59f03fcbf4f4db07c36ba7b080a96", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "46b286ab50f34ac9ac76e93ed24413b7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be6a37205430478bbc1a9b9d5df0ec17", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2bebec18a21c4f81841ce2db6c444993", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "690023e680ab4bf390bb0cf77ef5e3bd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c6cdddb090f420983b19a91ef2d6ff2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "088cf7dfa6d54d9589f71b7156739aca", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2e516a4fcd824486a1165e24ae9d58f8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2cdb225fc27a468eab5db2ed57d3d296", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c85d8290d71a4ba49ea1738bbdd87c24", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c2d53a37838f4504be7a51ec4ca81c93", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2b01bbbdcd354fe49c927f5097a7190a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e580a60cb99459a82be351b7f1f9359", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ba01412ef99442158a150a3c8d8c156d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c7efa3fec844ea2bf663aa3a55f573f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "43e2e2c1de8c4ca5800caa5539f69892", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0a19e56e9682481a804078dbaf80bdae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a74f428879614461958d722c8396c714", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "63c823caa5f448de82e6b54abf3c51a4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cec4c42f1e0b4e7a9fe73ae56cc0d194", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "12d99e05cec94ebf94a2f8df640f84c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4ba550cb4f5449af907738cc3555ae81", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a8664d8af59a4701849c482f6a9d3685", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9914f72042174befb799b11a1a42f9c9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a4eee090007c4a55b1b06feeb14e4ece", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d0c94f3dc5574a4aaddf4200968b66ee", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eac82a8a11b94a5285f223c6463bc6be", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d6d991ade3014b559c1d64f682ae2fb0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2157ccfaa33d4762a723fe5eb189792f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f057a36c3ba04e4998f8dbf461cf2239", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "63bfaec3524f4746a84e9f179685a0ae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a8671e47ed24c1696627d2e5a28c439", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e175b60b8e714b78901027fd68b59a97", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e61d2fba38bc4cfa9e0cb98edfb9a9bb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ac8c9363247437f909f8961c5b03ac7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "56639638b96449f6938ce24aab93b5bc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "15b0f4695bcb4126b22e27e9f8a0fb15", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2c916d70a6cc4bf7b66ce3e1d919107e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "38eb8eb9551b4521a3424a74d7f6f4ec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73a6ca432d7d4f8ebe2a859c2195a547", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "54977d9e39444338a501347cfe543202", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d3cdadbe410644378288430a38728fdc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ecbd257c61f447cf8ea4f8a87814d5fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca292e1bc9574d1ab19a8ca5c3b68413", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01e32c12811044329ebd4c66f23b0a9b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "53317071b3944b48bdf9f542596f014a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a08e95b405ee46e986cb06636d9a0e07", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "680661810ccb4e0eb50dc4c6a0530625", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1729bda0c8e64e2d956106ffaaa058f6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "75b8dd725cbc4e34b2d9da8bad9c34e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "48f9fc26c273458b8d2337caef121b1e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "10d500bfdf584258a4cdc990ce235118", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "96a40aeb6ba44b94b63835744bb82530", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5f53e93ed20441abaf4544941ad89824", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1a2706d89f3a4c92b8932c93b8781321", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e256f4a0cfb047b6ba2b2b1bb1f22165", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "04035791e49248359b2254b08a1738d8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8bf870e0ce6445b5bcdd2aeed53f3879", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "32071dbe4f0c4d8fa0cc8318070e374e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "20ad07bb40a4486a915de372b4471436", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "79e22af3099b445caf1290e852af66d4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca7d67d795cb4b52982ac0eb97d958a2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d2182491e2a048babff0c316d7647280", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0ca883ac85fc486ebc07f45b42513624", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c7587d6bdae64944a531374740b65586", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "33045ed2d56a441fb7c2851e9bb642c1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "96d7a8dc3dcc4faea227370ffac23bd5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9fe183daa7da4bd1b93d8e6ec7f6146c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "50e538d546e1413a948db17e5bfa6b54", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b40c7afc537d47619e4b06bce4343de3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a89fc7f9065e45a98124ae93390ddecb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18c46d6feb944a0f94ed25f4d173986e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e3c46708436948c69b32f6873d40bd6a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cd223c0a4144422e9d1dfb49ce66fe5e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b82977a682884cafb1badae9ba805300", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b7b34fb3ba6e477cad44574bfe98c15b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4a3dfd2aa5a94f0ebd88eedb89b5e0b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8eca4da9956b48debe1e001881a128eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d8d05e493b934afd9159fe7ab11780d3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a658daf6cbe84ef39ec8cbc979424c0b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "79d9284244714765bce00911b49e9302", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dd290529045f46e0979ff289d0bb1a19", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9a609cc9e90b4f2f95a7645f64939cf4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "106abd1fc8ff4296a70365ed5f6625fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "57b0258baa9a491bad0e1b88664a1a45", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7046432ca7ae4cfd8d26fe47fb281ca2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18e6a1e5da48451ca9cb58c6b81e3144", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3d6dff3fd5ef424f9674f4b57d7ac314", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "62b7ce4698ce409abfa6fd42796229b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "75ca0391f48d450cac3281d5687510f3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f44dce8fcb945318c96b1f43e7278ad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "915f586045b9446cb8639cec483dd458", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dab43630ee734b5f9d3e844d6af1b544", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e25d74f389c646db94a8553a2dd9215a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "672a3abf55b6474d84a33877f64e5dec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06002d26879943a3942cc2ae3ba97d44", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c4d1139fb8224f3f8c2432bddfc78641", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5c7c5df5da734f2f9f55d3fff4f52431", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c63ca61c823e48a98e77250ca139858d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d3cd7c4ef1094e7e84243cce3d648c4d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8c2d762530d54296886e81e97cf6ea3a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "345c6fafe05c4fb0b6486a8c4d96edf8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f5464b31f7de4e1f8c8af75f4faaaddc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "05eb2be391ef4112b9f4232e8cf0271c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d4436341c714499b9c5eb2103b113155", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ae4ce42d2304577b5f6d1637a77fa9b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a77d0f4fb91a4989a86c7b4ebe368e95", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c12af00eb1134e6aa65e0146bc17a2c0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "910b7f7537cd44e4b25cc5f43b7ba894", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dc34d1f1a5fd490688c6c62e4ec603b0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f191f076cbe0456fb33646174819fafe", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "addbc33608d7494f8aa113c720e9bdb5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c453227ee21f4a32bf248753d2f6b79e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ea9c195c4004752a914babd7013091c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1fe1ba7ddd35430482879a8cc114ea47", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "afa066c5236945dbbb3f607d366eb252", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "`Trainer.fit` stopped: `max_epochs=800` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9293ab4abbfd4d6f9a0747ef2fea0ed3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Testing: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " Test metric DataLoader 0\n", + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " test_loss 1.5256998267432209e-05\n", + "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c18246c9b94244988a380e2e842d43c7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Predicting: | …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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4AOYL+HIU5twhqTOagpn+PT0vpw/c/ctUvz9HEI5NzSWnTq0N+hz2HsO3XnqbfO3l7Gz13S0T6c7955BegMBALEkqHCZkZGhjIwMx+O7775bd999t8e2a9as0fXXXx/M5QD4yXlrEPvjYPgSjpxXjLWveOockkId9jqrKdD5mv4OYfXletE8dzQa2Xvxhu5bEVQPnnvPobMmm1n1k99yBLj6vZ8q7clhPvUyeju//TXuYdbTPp2e0DMIAIhVQe9z6aslS5YQLoEwcg5D0neBq13PZRDX8KUnLbn8SIdzBUMdsDqrKdBeU291egqd3j579+sxzNU/zr14wfTgufcc2h3e86EGV89o6yX89txHDzUo28deRm/nt7+mxkNPKQAAXVnEwqXzarIAQs89DNm/N90f3PYggegoRIUzYIVyyxJvdXoKnc7H7J+3p+sxzNV/oezFc+85rJHarXjqrW0g5wcAoLuJWLiMcx6bByDkXLawUGABzp99JjsaNtpRiPJ1iGwgw2f97RUN5D14Cp30SAIAAEQwXAIIL09hyN+g488+k6EY3hrq+Yn+hrxAruHxcw5gNVsjV7kFAAAIB8IlAIeOVj+12b477umY3Nr7EppCPXzW32Gnkehx7Gi/y1Av7kNgRSBCsRovAAAScy4BOOlo9VObrf2+lc7H3Nv7Epp8HT4bLkbNgXT+/IIJtu5hktVou6dAw2GoVuMFAMAuYuFy0qRJkboUAB/50tPl7xxDX3oDu1MPW6efXwj3HfW0DQy6Lk/h0NNent6EajVefwWyjygAIDYEHC537NihyspKffHFF2pqalJKSory8vI0evRoXXDBBe3al5SUBFUogNBzDifewoi/cwx96Q0MpIctEoE0HNfw9/Pzh3tw7WwbGHQtnsKhffsTX4NbpPfU9LYnKACga/A7XFosFt18881av369TjvtNGVlZclsNstqtaqhoUHTp0/Xddddp6efflppaWnhqBlAiNjDSaTDiLfezY7CXSTqjLVhpZ5CKivXdi/u4dDemzm4eoak6Atv3vYEBQB0DX6HyzvuuENnnHGGduzYofPPP7/d8zt37tQjjzyiKVOm6Nlnnw1JkXYHDx7UH//4R1VWViohIUFHjhzRDTfcoHvuuUcJCaxNhOgXyXvYl1645PIjru38fH2gvPXcdRTu/AlNgdbeFYIZe2m258uc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lZaWavPmzSoqKjK6HJ8MGTJEFRUVGj9+vJKTk2UymbRx40alpqZKalvEx3mOZWftg9Xa2qqhQ4eqoaFBu3fvDsk5jXLw4EH98Y9/VGVlpRISEnTkyBHdcMMNuueee5SQEFv/++XfYgCAT2yIKomJibZXXnnFZrPZbKdOnbLdfPPNtu9973u248ePe2w/Z84c2+bNmyNYYeD8rfWdd96xpaam2j755BObzWazPf3007azzjrLZrFYwlQhfFFcXGx7+umnHY/XrVtni4uLs23fvt3AqoxXV1dny83NtUmKmf8mo9Ef//hHW0ZGhq1fv35GlxK0Z5991nb++efbDh8+bLPZbLZ9+/bZ+vTpY5szZ46xhfmJf4sBAL5iWGyUGTt2rIqLiyW1LYRx5513ateuXaqurja4ssgrLy/XmDFjVFBQIEmaOHGiTp48qYqKCmML6+bmzZunCRMmOB4XFRXJZrPp888/N7Aq45WWluree+81uoyYVldXpyeffFK/+MUvjC4lJHr16qXf/OY3jkVozjrrLN1www167rnnDK7MP/xbDADwFeEyyrzwwgsuj5OSkiS1X/q/O9i0aZMGDx7seGwymVRYWKjKykoDq0JhYaFjSN+JEyf00EMP6YILLujWC7qsX79eiYmJjl8MITB33nmnysvLlZycbHQpIXHttdfq1ltvdTmWlJQUc/+e828xAMBXhMsot2XLFvXt21fDhg3z2mbFihUqKirSsGHDVFJSos8++yyCFfrH11oPHDggi8WirKwsl+PZ2dn64osvIlEqOjFlyhT17t1blZWV2rhxo3r27Gl0SYY4duyYZs6cqUcffdToUmLa+vXrlZCQoGuuucboUsJqy5Yt+ulPf2p0GT7j32IAgD8Il1HMarVq4cKFWrJkiRITEz22yc3N1cUXX6zKykq9+eabOuecc1RYWKi6uroIV9s5f2ptamqSpHabrJvNZsdzMNZjjz2mb775xvHLgi+//NLokgwxa9Ys3X777TrzzDONLiVmHT16VPfee68WLVpkdClh9dprr2nfvn363e9+Z3QpPuPfYgCAPwiXUey2227TjTfeqHHjxnltc+utt2r69OlKSEiQyWTSrFmzlJSUpKVLl0awUt/4U2tKSoqk9sOBrVar4zkYLyEhQQ888IBaW1v1yCOPGF1OxFVXV+udd97R7bffbnQpUams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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#for model in [\"kabs\", \"ksca\", \"pmo\", \"random_nu\"]:\n", + "for model in [\"random_nu\"]:\n", + " if model in [\"kabs\", \"ksca\", \"pmo\"]:\n", + " d.learn(model=model, hidden_units=(16,)*6, overwrite=True)\n", + " batch_size = 1000\n", + " else:\n", + " d.learn(model=model, hidden_units=(48,)*6, overwrite=True)\n", + " batch_size = 100000\n", + "\n", + " d.fit(epochs=800, batch_size=batch_size, num_workers=50)\n", + " d.test_model(plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "711a4844", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p: 4.150285326078643, amax: 0.2240181408039542, T: 296.5305719128035, abundances: []\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Good test: p: 3.4991353911167407, amax: 1.312355072991905, T: 2008.9396240632707\n", + "# Good test: p: 4.081916099538354, amax: 0.00019792861359660814, T: 1434.7155605917776\n", + "# Good test: p: 2.807472093033742, amax: 0.00011679887614606475, T: 408.08140708872327\n", + "d.plot_random_nu_model()" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "63f9bd1c", + "metadata": {}, + "outputs": [], + "source": [ + "d.save(\"diana_wice.dst\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fc8c19b-b74c-4d89-bc27-581aa0e23946", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/dust-demo.ipynb b/examples/dust-demo.ipynb index 993a4e7..23a7c35 100644 --- a/examples/dust-demo.ipynb +++ b/examples/dust-demo.ipynb @@ -2,11597 +2,100 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "461d2258", - "metadata": {}, - "outputs": [], - "source": [ - "from pinballrt.dust import Dust, load\n", - "from astropy.modeling import models\n", - "import astropy.units as u\n", - "import numpy as np\n", - "import pinballrt\n", - "\n", - "from scipy.interpolate import interp1d\n", - "import matplotlib.pyplot as plt\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "89f9421c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Warp 1.8.0 initialized:\n", - " CUDA not enabled in this build\n", - " Devices:\n", - " \"cpu\" : \"i386\"\n", - " Kernel cache:\n", - " /Users/psheehan/Library/Caches/warp/1.8.0\n" - ] - } - ], - "source": [ - "data = np.load(os.path.join(os.path.dirname(pinballrt.dust.__file__), \"tests/data/diana_wice.npz\"))\n", - "\n", - "lam = np.logspace(np.log10(data[\"lam\"].min()), np.log10(data[\"lam\"].max()), 1000)*u.cm\n", - "kabs = 10.**interp1d(np.log10(data[\"lam\"]), np.log10(data[\"kabs\"]), kind=\"linear\", axis=-1)(np.log10(lam.value))*u.cm**2/u.g\n", - "ksca = 10.**interp1d(np.log10(data[\"lam\"]), np.log10(data[\"ksca\"]), kind=\"linear\", axis=-1)(np.log10(lam.value))*u.cm**2/u.g\n", - "\n", - "d = Dust(lam=lam, \n", - " kabs=kabs, \n", - " ksca=ksca, \n", - " amax=data[\"amax\"]*u.cm, \n", - " p=data[\"p\"], \n", - " interpolate=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "adf95f57", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "GPU available: False, used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "HPU available: False, using: 0 HPUs\n", - "/Users/psheehan/.pyenv/versions/anaconda3-2023.07-2/envs/pinball/lib/python3.13/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:751: Checkpoint directory /Users/psheehan/pinball-rt/examples/ksca_lightning_logs exists and is not empty.\n", - "\n", - " | Name | Type | Params | Mode \n", - "-------------------------------------------------------\n", - "0 | model | MultiLayerPerceptron | 1.4 K | train\n", - "-------------------------------------------------------\n", - "1.4 K Trainable params\n", - "0 Non-trainable params\n", - "1.4 K Total params\n", - "0.006 Total estimated model params size (MB)\n", - "16 Modules in train mode\n", - "0 Modules in eval mode\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8f039d5c6b4d42729513059eca35205e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sanity Checking: | | 0/? [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "for model in [\"kabs\", \"ksca\", \"pmo\"]:\n", - " if model in [\"kabs\", \"ksca\"]:\n", - " d.learn(model=model, nsamples=10000000, hidden_units=(16,)*6, overwrite=True)\n", - " else:\n", - " d.learn(model=model, nsamples=1000000, hidden_units=(16,)*6, overwrite=True)\n", - "\n", - " d.fit(epochs=300, batch_size=10000)\n", - " d.test_model(plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1b4bb9e4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "log10_amax: -1.6217233441241388, p: 4.262695318455325, log10_temperature: -1.0\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "d.plot_pmo_model()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "30125b57", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "GPU available: False, used: False\n", - "TPU available: False, using: 0 TPU cores\n", - "HPU available: False, using: 0 HPUs\n" - ] - } - ], - "source": [ - "d.learn(model=\"random_nu\", hidden_units=3*(48,), nsamples=10000000, overwrite=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cb2e3007", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/psheehan/.pyenv/versions/anaconda3-2023.07-2/envs/pinball/lib/python3.13/site-packages/pytorch_lightning/callbacks/model_checkpoint.py:751: Checkpoint directory /Users/psheehan/pinball-rt/examples/random_nu_lightning_logs exists and is not empty.\n", - "\n", - " | Name | Type | Params | Mode \n", - "-------------------------------------------------------\n", - "0 | model | MultiLayerPerceptron | 5.0 K | train\n", - "-------------------------------------------------------\n", - "5.0 K Trainable params\n", - "0 Non-trainable params\n", - "5.0 K Total params\n", - "0.020 Total estimated model params size (MB)\n", - "10 Modules in train mode\n", - "0 Modules in eval mode\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b5a297eaa66641489d035dbebf477354", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Sanity Checking: | | 0/? [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ - "d.test_model(plot=True)" + "# Define the wavelength grid (in microns).\n", + "wavelengths = np.logspace(-1, 4, 1000) * u.micron\n", + "\n", + "samples = suggest_opacity_sampling(100, p_range=(2.5, 4.5), amax_range=(1*u.micron, 10*u.cm), n_dust_subspecies=3)\n", + "samples = np.moveaxis(np.repeat(np.expand_dims(samples, 1), wavelengths.size, axis=1), -1, 0)\n", + "\n", + "print(samples.shape)\n", + "\n", + "p = samples[0]\n", + "amax = samples[1] * u.cm\n", + "silicate_fraction = samples[2]\n", + "water_fraction = samples[3]\n", + "\n", + "wavelengths = np.repeat(np.expand_dims(wavelengths, axis=0), max(samples.shape[1], 1), axis=0)\n", + "\n", + "# Define the absorption and scattering opacities (in cm^2/g).\n", + "silicate_feature = 100**silicate_fraction * np.exp(-0.5*(wavelengths - 10*u.micron)**2 / (10.*u.micron)**2) * u.cm**2 / u.g\n", + "water_feature = 100**water_fraction * np.exp(-0.5*(wavelengths - 3.*u.micron)**2 / (2.*u.micron)**2) * u.cm**2 / u.g\n", + "\n", + "power_law_index = (-2. / (1 + np.exp(-p/3.5 * (-1.5 - np.log10(amax.to(u.cm).value)))))\n", + "\n", + "kappa_abs = 1.0 * (wavelengths.to(u.micron).value/100.0)**power_law_index * u.cm**2 / u.g + silicate_feature + water_feature\n", + "kappa_scat = 0.5 * (wavelengths.to(u.micron).value/100.0)**power_law_index * u.cm**2 / u.g + silicate_feature + water_feature\n", + "\n", + "# Create the Dust object.\n", + "d = IsotropicDust(lam=wavelengths[0,:], \n", + " amax=amax[:,0], \n", + " p=p[:,0], \n", + " abundances=(silicate_fraction[:,0], water_fraction[:,0]),\n", + " kabs=kappa_abs, \n", + " ksca=kappa_scat)" ] }, { "cell_type": "code", - "execution_count": 30, - "id": "9da6a7d8", + "execution_count": null, + "id": "adf95f57", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "p: 4.27963641391967, amax: 0.0005084393300744386, T: 0.14284917153748797\n" - ] - }, - { - "data": { - "image/png": "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w0H//v3ZvHkzADk5wZvglZaWNmhXWloaPpaTk3Pc8f379zd4/4napKen06VLlxPmS0tLa/D4au+MHFXkKeJI/RGSnEkM6jLI7jjtxvdlsfLunnc1FCQiEiWaVawMH378v8D37dtHz549ARg6dCgZGRmsW7cufHzLli1UV1eHJ+GOHz+eqqoqCgsLw20KCgro3r07Q4cODbdZv359g71XCgoKwp8hpy+0v8q5GeeS4EywOU37MevOxPR1otZfq1VBIiJRolnFyubNm1myZEn4+UsvvcTWrVu57bbbAHA6ncycOZNnn32W2tpaAJ588kkmT57MkCFDgGBBM3nyZJ588kkAamtree6557j33ntxOIJx7rjjDgzD4NVXXwVg27ZtvP3229xzzz2neboSEi/7qxzPwF8xGIDlu7W6TEQkGria0/jpp59m1qxZzJ49G9M0MQyDxYsXM3bs2HCb6dOnU1VVxZgxY3C5XPTr14+FCxc2+JyFCxfygx/8gAsuuACv18t1113H9OnTw8dTU1NZunQpU6dODRc+L7zwArm5uad5uhIS6lkZ0T2y9lfZmXR0H5/supfb5Dv8lUNI7LqaFcUr8AV8cdWzJCISjQzrq/vcR6GKigrS09PxeDykpaXZHSfilVaXMuHvE3AYDlbfsJqUxODS8+yZS07xzrbXHsUKmGQPe5JDdYd4fsLzXHTmRW30PSIicjJN/fkd+5tryHFCq4AGdB4QLlTii4PLel8GBO/ELCIikU3FShzacDC4U/B5GefZnMQ+E3oHJ2sv372cgBmwOY2IiJxMs+asSGzYdHATAEO6DWmTzz92KAfacjin5Ub1GEVqYirldeV8UvZJzN8bSUQkmqlYiRNH56MESBmwEcPRdsVKNEhwJnBp1qUs3r6YZbuWqVgREYlgGgaKMw53GYbDhxVIJDst2+44thrfezwQHAqKgXnmIiIxS8VKnHEkFQMQqDsTp8Npcxp7XdTzIjq4OrCveh+bD222O46IiJyAhoHijLNDCQBmXVbELVVub0muJMaeOZZ/7/o3y3YvY3C3wbZlERGRE1OxEmecSXsACNT2arfvbOmE2/aYqHv5WZcHi5Vdy/jRsB9hGEarf4eIiJweDQPFE8OPI2kfAIG69itWItnFZ15MgiOBnRU7+eLIF3bHERGRRqhnJY443PswjACmPxnL19nuOLY6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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "d.plot_random_nu_model(100000)" + "for model in [\"kabs\", \"ksca\", \"pmo\", \"random_nu\"]:\n", + " if model in [\"kabs\", \"ksca\", \"pmo\"]:\n", + " d.learn(model=model, nsamples=wavelengths.size, hidden_units=(16,)*6, overwrite=True)\n", + " batch_size = 10\n", + " else:\n", + " d.learn(model=model, nsamples=wavelengths.size, hidden_units=(48,)*3, overwrite=True)\n", + " batch_size = 1000\n", + "\n", + " d.fit(epochs=50, batch_size=batch_size)\n", + " d.test_model(plot=True)" ] }, { "cell_type": "code", "execution_count": null, - "id": "1527a8bf", + "id": "711a4844", "metadata": {}, "outputs": [], "source": [ - "# Bad:\n", - "#p: 4.480264827710928, amax: 0.00010237462737553694, T: 1687.739293126636 # Missing narrow peak at 10 microns, and too much power at long wavelengths" + "d.plot_random_nu_model()" ] }, { @@ -11622,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "1ee5dd93", "metadata": {}, "outputs": [], @@ -11632,22 +135,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "9c70d62b", "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'd' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43md\u001b[49m.learn(model=\u001b[33m'\u001b[39m\u001b[33mml_step\u001b[39m\u001b[33m'\u001b[39m, nsamples=\u001b[32m16000000\u001b[39m, hidden_units=((\u001b[32m128\u001b[39m, \u001b[32m128\u001b[39m),)*\u001b[32m6\u001b[39m)\n", - "\u001b[31mNameError\u001b[39m: name 'd' is not defined" - ] - } - ], + "outputs": [], "source": [ "d.learn(model='ml_step', nsamples=16000000, hidden_units=((128, 128),)*6)" ] @@ -11690,13 +181,13 @@ "metadata": {}, "outputs": [], "source": [ - "d.save(\"amax.dst\")" + "d.save(\"dust.dst\")" ] } ], "metadata": { "kernelspec": { - "display_name": "pinball", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -11710,7 +201,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.5" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/pinballrt/camera.py b/pinballrt/camera.py index 37f16c6..b156f43 100644 --- a/pinballrt/camera.py +++ b/pinballrt/camera.py @@ -27,6 +27,9 @@ def set_orientation(self, incl, pa, dpc): self.i = np.array([self.r*np.sin(self.incl)*np.cos(phi), \ self.r*np.sin(self.incl)*np.sin(phi), \ self.r*np.cos(self.incl)]) + + with wp.ScopedDevice(self.grid.device): + self.i_wp = wp.vec3(self.i) self.ex = np.array([-np.sin(phi), np.cos(phi), 0.0]) self.ey = np.array([-np.cos(self.incl)*np.cos(phi), \ @@ -65,6 +68,9 @@ def emit_rays(self, x, y, nu, nx, ny, pixel_size): ray_list.temperature = wp.zeros(xflat.size, dtype=float) ray_list.amax = wp.zeros(xflat.size, dtype=float) ray_list.p = wp.zeros(xflat.size, dtype=float) + if self.grid.n_dust_abundances > 0: + ray_list.dust_abundances = wp.array2d(np.zeros((xflat.size, self.grid.n_dust_abundances)), dtype=float) + ray_list.opacities_out_of_date = wp.zeros(xflat.size, dtype=bool) ray_list.radius = wp.array(np.zeros(xflat.shape), dtype=float) if isinstance(self.grid, LogUniformSphericalGrid): diff --git a/pinballrt/dust.py b/pinballrt/dust.py index d46ec30..a9c598b 100644 --- a/pinballrt/dust.py +++ b/pinballrt/dust.py @@ -5,7 +5,6 @@ from torch.utils.data import DataLoader, TensorDataset, random_split from scipy.spatial.transform import Rotation import pandas as pd -import scipy.interpolate from astropy.modeling import models import astropy.units as u import astropy.constants as const @@ -19,27 +18,34 @@ import os import zuko +from .utils import GridStruct, random_direction +from .photons import PhotonList + from torch.distributions.multivariate_normal import MultivariateNormal wp.config.quiet = True class Dust(pl.LightningDataModule): - def __init__(self, lam=None, kabs=None, ksca=None, amax=None, p=None, device="cpu"): + def __init__(self, lam=None, kabs=None, ksca=None, amax=None, p=None, abundances=(), device="cpu", ntemperatures=300): """ Initialize the Dust module with wavelength, absorption, and scattering coefficients. Parameters ---------- lam : astropy.units.Quantity - Wavelengths at which the dust opacities are defined. + Wavelengths at which the dust opacities are defined. Should be in units that convert to cm, and with a shape of (nwavelengths,). kabs : astropy.units.Quantity - Absorption coefficients of the dust. + Absorption coefficients of the dust. Should be in units that convert to cm^2/g, and with a shape of (nsamples, nwavelengths), + where ndims is the number of dimensions in the parameter space (e.g., p, amax, abundances). ksca : astropy.units.Quantity - Scattering coefficients of the dust. + Scattering coefficients of the dust. Should be in units that convert to cm^2/g, and with a shape of (nsamples, nwavelengths), + where ndims is the number of dimensions in the parameter space (e.g., p, amax, abundances). amax : astropy.units.Quantity - Maximum grain size for the size distribution. + Maximum grain size for the size distribution. Should be in units that convert to cm, and with a shape of (nsamples,). p : float - Power-law index for the grain size distribution. + Power-law index for the grain size distribution. Should have a shape of (nsamples,) + abundances : tuple of np.arrays + Tuple of arrays containing the abundances of different dust species. Each array should have a shape of (nsamples,). device : str Device to run the computations on (e.g., "cpu" or "cuda"). """ @@ -47,24 +53,19 @@ def __init__(self, lam=None, kabs=None, ksca=None, amax=None, p=None, device="cp kunit = kabs.unit lam_unit = lam.unit - amax_unit = amax.unit lam = lam.value - amax = amax.value - p = p kabs = kabs.value ksca = ksca.value if lam[1] > lam[0]: - lam = lam[::-1] + lam = np.flip(lam, axis=-1) kabs = np.flip(kabs, axis=-1) ksca = np.flip(ksca, axis=-1) self.nu = (const.c / (lam * lam_unit)).decompose().to(u.GHz) self.kmean = np.mean(kabs) * kunit self.lam = lam * lam_unit - self.amax = amax * amax_unit - self.p = p self.kabs = kabs / self.kmean.value self.ksca = ksca / self.kmean.value self.kext = (kabs + ksca) / self.kmean.value @@ -73,23 +74,36 @@ def __init__(self, lam=None, kabs=None, ksca=None, amax=None, p=None, device="cp self.log10_nu_min = np.log10(self.nu.value.min()) self.log10_nu_max = np.log10(self.nu.value.max()) - with wp.ScopedDevice(device): - self.nu_wp = wp.array(self.nu.value, dtype=float) - self.amax_wp = wp.array(self.amax.value, dtype=float) - self.p_wp = wp.array(self.p, dtype=float) - self.kabs_wp = wp.array3d(self.kabs, dtype=float) - self.ksca_wp = wp.array3d(self.ksca, dtype=float) - self.kext_wp = wp.array3d(self.kext, dtype=float) - self.albedo_wp = wp.array3d(self.albedo, dtype=float) + self.amax = amax + if amax is not None: + self.log10_amax = np.log10(amax.to(u.cm).value) + self.p = p + self.abundances = abundances + + self.dims = () + self.samples = () + for dim in ["p", "log10_amax", "abundances"]: + if hasattr(self, dim) and getattr(self, dim) is not None and getattr(self, dim) is not (): + if dim in ["abundances"]: + self.samples += getattr(self, dim) + else: + self.samples += (getattr(self, dim),) + self.dims += (dim,) + + if len(self.dims) > 0: + self.samples = np.vstack(self.samples).T + else: + self.samples = np.zeros((1,0)) + self.ndims = len(self.dims) + (len(self.abundances) - 1 if len(abundances) > 0 else 0) - self.temperature = np.logspace(-1.,4.,999) + self.temperature = np.logspace(-1.,4.,ntemperatures) self.log_temperature = np.log10(self.temperature) def __getstate__(self): state = self.__dict__.copy() for entry in state: - if isinstance(getattr(self, entry), wp.types.array): + if wp.types.is_array(getattr(self, entry)): state[entry] = getattr(self, entry).numpy() else: state[entry] = getattr(self, entry) @@ -104,13 +118,6 @@ def __setstate__(self, state): self.__dict__.update(state) def to_device(self, device): - with wp.ScopedDevice(device): - self.nu_wp = wp.array(self.nu.value, dtype=float) - self.kabs_wp = wp.array(self.kabs, dtype=float) - self.ksca_wp = wp.array(self.ksca, dtype=float) - self.kext_wp = wp.array(self.kext, dtype=float) - self.albedo_wp = wp.array(self.albedo, dtype=float) - for model in ["random_nu", "ml_step", "kabs", "ksca"]: if hasattr(self, f"{model}_model"): getattr(self, f"{model}_model").to(device) @@ -119,17 +126,13 @@ def to_device(self, device): if hasattr(self, f"{model}_y_scaler"): getattr(self, f"{model}_y_scaler").to(device) - def interpolate_kabs(self, p, amax, nu): - samples = np.vstack((p.flatten(), np.log10(amax).flatten(), np.log10(nu).flatten())).T - - interpolated = scipy.interpolate.interpn((self.p, np.log10(self.amax.value), np.log10(self.nu.value)), np.log10(self.kabs), samples, method="cubic") - - return 10.**interpolated.reshape(p.shape) - - def ml_kabs(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): + def ml_kabs(self, p=None, amax=None, nu=None, abundances=None, photon_list=None, iphotons=None): if photon_list is not None: p = wp.to_torch(photon_list.p) amax = wp.to_torch(photon_list.amax) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + if nu is None: nu = wp.to_torch(photon_list.frequency) @@ -137,28 +140,40 @@ def ml_kabs(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): nu = nu[iphotons] p = p[iphotons] amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] else: if nu.size(0) != p.size(0): p = p[iphotons] amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] - samples = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(nu))), 0, 1) + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) - kabs = 10.**self.kabs_y_scaler.inverse_transform(self.kabs_model(self.kabs_x_scaler.transform(samples))).detach().flatten() + if amax is not None: + log10_amax = torch.log10(amax) - return kabs - - def interpolate_ksca(self, p, amax, nu): - samples = np.vstack((p.flatten(), np.log10(amax).flatten(), np.log10(nu).flatten())).T + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(nu),) + samples = torch.transpose(torch.vstack(samples), 0, 1) - interpolated = scipy.interpolate.interpn((self.p, np.log10(self.amax.value), np.log10(self.nu.value)), np.log10(self.ksca), samples, method="cubic") + kabs = 10.**self.kabs_y_scaler.inverse_transform(self.kabs_model(self.kabs_x_scaler.transform(samples))).detach().flatten() - return 10.**interpolated.reshape(p.shape) + return kabs - def ml_ksca(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): + def ml_ksca(self, p=None, amax=None, nu=None, abundances=None, photon_list=None, iphotons=None): if photon_list is not None: p = wp.to_torch(photon_list.p) amax = wp.to_torch(photon_list.amax) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + if nu is None: nu = wp.to_torch(photon_list.frequency) @@ -166,63 +181,65 @@ def ml_ksca(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): nu = nu[iphotons] p = p[iphotons] amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] else: if nu.size(0) != p.size(0): p = p[iphotons] amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] + + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) - samples = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(nu))), 0, 1) + if amax is not None: + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(nu),) + samples = torch.transpose(torch.vstack(samples), 0, 1) ksca = 10.**self.ksca_y_scaler.inverse_transform(self.ksca_model(self.ksca_x_scaler.transform(samples))).detach().flatten() return ksca - def interpolate_kext(self, p, amax, nu): - if nu.unit.is_equivalent(u.GHz): - nu = nu.to(u.GHz).value - elif nu.unit.is_equivalent(u.cm): - nu = (const.c / nu).decompose().to(u.GHz) - return self.interpolate_kabs(p, amax, nu.value) + self.interpolate_ksca(p, amax, nu.value) - - def ml_kext(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): + def ml_kext(self, p=None, amax=None, nu=None, abundances=None, photon_list=None, iphotons=None): if photon_list is not None: p = wp.to_torch(photon_list.p) amax = wp.to_torch(photon_list.amax) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + if nu is None: nu = wp.to_torch(photon_list.frequency) else: if nu.size(0) != p.size(0): p = p[iphotons] amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] - samples = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(nu))), 0, 1) - - return 10.**self.kabs_y_scaler.inverse_transform(self.kabs_model(self.kabs_x_scaler.transform(samples))).detach().flatten() + \ - 10.**self.ksca_y_scaler.inverse_transform(self.ksca_model(self.ksca_x_scaler.transform(samples))).detach().flatten() - - def interpolate_albedo(self, p, amax, nu): - kabs = self.interpolate_kabs(p, amax, nu) - ksca = self.interpolate_ksca(p, amax, nu) + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) - return ksca / (kabs + ksca) + if amax is not None: + log10_amax = torch.log10(amax) - def ml_albedo(self, p=None, amax=None, nu=None, photon_list=None, iphotons=None): - if photon_list is not None: - p = wp.to_torch(photon_list.p) - amax = wp.to_torch(photon_list.amax) - if nu is None: - nu = wp.to_torch(photon_list.frequency) + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances else: - if nu.size(0) != p.size(0): - p = p[iphotons] - amax = amax[iphotons] - - samples = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(nu))), 0, 1) - - kabs = 10.**self.kabs_y_scaler.inverse_transform(self.kabs_model(self.kabs_x_scaler.transform(samples))).detach().flatten() - ksca = 10.**self.ksca_y_scaler.inverse_transform(self.ksca_model(self.ksca_x_scaler.transform(samples))).detach().flatten() + samples += (eval(dim),) + samples += (torch.log10(nu),) + samples = torch.transpose(torch.vstack(samples), 0, 1) - return ksca / (kabs + ksca) + return 10.**self.kabs_y_scaler.inverse_transform(self.kabs_model(self.kabs_x_scaler.transform(samples))).detach().flatten() + \ + 10.**self.ksca_y_scaler.inverse_transform(self.ksca_model(self.ksca_x_scaler.transform(samples))).detach().flatten() def absorb(self, temperature): nphotons = frequency.numpy().size @@ -236,61 +253,89 @@ def absorb(self, temperature): frequency = self.random_nu(temperature) return direction, frequency + + def update_photon_opacities(self, photon_list, iphotons, grid=None, inu=None): + nphotons = iphotons.size(0) - def random_nu_manual(self, p, amax, temperature, ksi=None, batch_size=100000): - import interpn - - if ksi is None: - nphotons = temperature.size - ksi = np.random.rand(nphotons) - - if not hasattr(self, "random_nu_CPD"): - random_nu_PDF = np.array([self.kabs * models.BlackBody(temperature=T*u.K)(self.nu) for T in self.temperature]) - self.random_nu_CPD = scipy.integrate.cumulative_trapezoid(random_nu_PDF, self.nu, axis=-1, initial=0.) - self.random_nu_CPD /= self.random_nu_CPD[:,:,:,-1:] - self.drandom_nu_CPD_dT = np.gradient(self.random_nu_CPD, self.temperature, axis=0) - - count = 0 - - dims = (self.temperature.size, self.p.size, self.amax.size, self.nu.size) - starts = np.array([np.log10(self.temperature.min()), self.p.min(), np.log10(self.amax.min().value), np.log10(self.nu.min().value)]) - steps = np.array([(np.log10(self.temperature[1]) - np.log10(self.temperature[0])), self.p[1] - self.p[0], (np.log10(self.amax[1].value) - np.log10(self.amax[0].value)), (np.log10(self.nu[1].value) - np.log10(self.nu[0].value))]) - - interpolator = interpn.MulticubicRegular.new(dims, starts, steps, self.random_nu_CPD) - - frequency = [] - while count < temperature.size: - n = min(batch_size, temperature.size - count) - p_batch = p[count:count+n] - amax_batch = amax[count:count+n] - temperature_batch = temperature[count:count+n] - ksi_batch = ksi[count:count+n] - - samples = np.vstack([np.repeat(np.array([np.log10(temperature_batch), p_batch, np.log10(amax_batch.value)]), self.nu.size, axis=1), - np.tile(np.log10(self.nu.value), p_batch.size)]) + if grid is not None and inu is not None: + wp.launch(kernel=self.set_photon_opacities_grid, + dim=(nphotons,), + inputs=[photon_list, grid, inu, iphotons]) + else: + wp.launch(kernel=self.set_photon_opacities, + dim=(nphotons,), + inputs=[photon_list, + self.ml_kabs(photon_list=photon_list, iphotons=iphotons), + self.ml_ksca(photon_list=photon_list, iphotons=iphotons), + iphotons]) + + @wp.kernel + def set_photon_opacities(photon_list: PhotonList, + kabs: wp.array(dtype=float), + ksca: wp.array(dtype=float), + iphotons: wp.array(dtype=int)): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + photon_list.kabs[ip] = kabs[i] + photon_list.ksca[ip] = ksca[i] + photon_list.albedo[ip] = ksca[i] / (kabs[i] + ksca[i]) + + @wp.kernel + def set_photon_opacities_grid(photon_list: PhotonList, + grid: GridStruct, + inu: int, + iphotons: wp.array(dtype=int)): # pragma: no cover + ip = iphotons[wp.tid()] + + ix, iy, iz = photon_list.indices[ip][0], photon_list.indices[ip][1], photon_list.indices[ip][2] + + photon_list.kabs[ip] = grid.kabs[inu, ix, iy, iz] + photon_list.ksca[ip] = grid.ksca[inu, ix, iy, iz] + photon_list.albedo[ip] = photon_list.ksca[ip] / (photon_list.kabs[ip] + photon_list.ksca[ip]) + + def set_grid_opacities(self, grid, frequency): + p = wp.to_torch(grid.p) + shape = p.shape + p = p.flatten() + amax = wp.to_torch(grid.amax).flatten() + abundances = tuple([wp.to_torch(grid.dust_abundances)[i].flatten() for i in range(len(self.abundances))]) + + kabs = [self.ml_kabs(p=p, + amax=amax, + abundances=abundances, + nu=torch.ones(np.prod(shape), dtype=torch.float32, + device=wp.device_to_torch(wp.get_device())) * \ + f.to(u.GHz).value) for f in frequency] + + grid.kabs = wp.from_torch(torch.concatenate(kabs).reshape((len(frequency),) + shape)) + + ksca = [self.ml_ksca(p=p, + amax=amax, + abundances=abundances, + nu=torch.ones(np.prod(shape), dtype=torch.float32, + device=wp.device_to_torch(wp.get_device())) * + f.to(u.GHz).value) for f in frequency] + + grid.ksca = wp.from_torch(torch.concatenate(ksca).reshape((len(frequency),) + shape)) - random_nu_CPD = interpolator.eval(samples) - random_nu_CPD = random_nu_CPD.reshape((p_batch.size, self.nu.size)) + def random_nu_ml(self, p, amax, temperature, abundances=None): + nphotons = temperature.size + ksi = torch.rand(int(nphotons), dtype=torch.float32) + ksi = torch.clamp(torch.arctanh(2*ksi - 1.), min=-8.6643, max=8.6643) - i = np.argmax(ksi_batch[:,np.newaxis] < random_nu_CPD, axis=1) - - frequency_batch = (ksi_batch - random_nu_CPD[np.arange(random_nu_CPD.shape[0]),i-1]) * (self.nu[i] - self.nu[i-1]) / \ - (random_nu_CPD[np.arange(random_nu_CPD.shape[0]),i] - random_nu_CPD[np.arange(random_nu_CPD.shape[0]),i-1]) + \ - self.nu[i-1] - - frequency.append(frequency_batch) - - count += n + log10_amax = np.log10(amax) - frequency = np.concatenate(frequency).value + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += tuple([torch.tensor(a, dtype=torch.float32) for a in abundances]) + else: + samples += (torch.tensor(eval(dim), dtype=torch.float32),) + samples += (torch.log10(torch.tensor(temperature, dtype=torch.float32)), ksi) - return frequency - - def random_nu_ml(self, p, amax, temperature): - nphotons = temperature.size - ksi = torch.rand(int(nphotons), device=wp.device_to_torch(wp.get_device()), dtype=torch.float32) - test_x = torch.transpose(torch.vstack((torch.tensor(p, dtype=torch.float32), torch.log10(torch.tensor(amax, dtype=torch.float32)), torch.log10(torch.tensor(temperature, dtype=torch.float32)), ksi)), 0, 1) - test_x = self.random_nu_x_scaler.transform(test_x) + samples = torch.transpose(torch.vstack(samples), 0, 1) + test_x = self.random_nu_x_scaler.transform(samples) log10_nu = torch.clamp(self.random_nu_y_scaler.inverse_transform(self.random_nu_model(test_x).detach()), self.log10_nu_min, self.log10_nu_max) @@ -300,16 +345,35 @@ def random_nu(self, photon_list, subset=None): p = wp.to_torch(photon_list.p) amax = wp.to_torch(photon_list.amax) temperature = wp.to_torch(photon_list.temperature) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) if subset is not None: p = p[subset] amax = amax[subset] temperature = temperature[subset] + if photon_list.dust_abundances is not None: + abundances = abundances[subset] + + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) nphotons = temperature.size(0) ksi = torch.rand(int(nphotons), device=wp.device_to_torch(wp.get_device()), dtype=torch.float32) + ksi = torch.clamp(torch.arctanh(2*ksi - 1.), min=-8.6643, max=8.6643) + + if amax is not None: + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(temperature), ksi) - test_x = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(temperature), ksi)), 0, 1) - test_x = self.random_nu_x_scaler.transform(test_x) + samples = torch.transpose(torch.vstack(samples), 0, 1) + + test_x = self.random_nu_x_scaler.transform(samples) if nphotons > 250000: test_x = TensorDataset(test_x) @@ -323,15 +387,18 @@ def random_nu(self, photon_list, subset=None): return nu - def planck_mean_opacity(self, p, amax, temperature): - vectorized_bb = np.vectorize(lambda p, a, T: self.kmean.cgs.value * scipy.integrate.trapezoid(self.ml_kabs(torch.tensor(p, dtype=torch.float32).expand(self.nu.size), - torch.tensor(a, dtype=torch.float32).expand(self.nu.size), torch.tensor(self.nu.value, dtype=torch.float32)) * \ - models.BlackBody(temperature=T*u.K)(self.nu).cgs.value, self.nu.to(u.Hz).value) * np.pi / (const.sigma_sb.cgs.value * T**4)) - - return vectorized_bb(p, amax, temperature) + def ml_planck_mean_opacity(self, p, amax, temperature, abundances=()): + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(temperature),) - def ml_planck_mean_opacity(self, p, amax, temperature): - samples = torch.transpose(torch.vstack((p, torch.log10(amax), torch.log10(temperature))), 0, 1) + samples = torch.transpose(torch.vstack(samples), 0, 1) return 10.**self.pmo_y_scaler.inverse_transform(self.pmo_model(self.pmo_x_scaler.transform(samples))).detach().flatten() @@ -350,17 +417,11 @@ def ml_step(self, photon_list, s, iphotons): return 10.**torch.clamp(test_x[:,0], self.log10_nu0_min, self.log10_nu0_max), 10.**test_x[:,1], 10.**test_x[:,2], test_x[:,3], test_x[:,4], torch.zeros(test_x.size(0)), test_x[:,5], test_x[:,6], torch.zeros(test_x.size(0)) - def initialize_model(self, model="random_nu", input_size=2, output_size=1, hidden_units=(48, 48, 48)): - if model == 'ml_step': - self.ml_step_model = NeuralSplineFlow(input_size, output_size, transforms=len(hidden_units), hidden_features=hidden_units[0]) - elif model == 'random_nu': - self.random_nu_model = MultiLayerPerceptron(input_size, output_size, hidden_units=hidden_units) - elif model == "kabs": - self.kabs_model = MultiLayerPerceptron(input_size, output_size, hidden_units=hidden_units) - elif model == "ksca": - self.ksca_model = MultiLayerPerceptron(input_size, output_size, hidden_units=hidden_units) - elif model == "pmo": - self.pmo_model = MultiLayerPerceptron(input_size, output_size, hidden_units=hidden_units) + def initialize_model(self, model="random_nu", model_type="MLP", input_size=2, output_size=1, hidden_units=(48, 48, 48)): + if model_type == 'flow': + setattr(self, f"{model}_model", NeuralSplineFlow(input_size, output_size, transforms=len(hidden_units), hidden_features=hidden_units[0])) + else: + setattr(self, f"{model}_model", MultiLayerPerceptron(input_size, output_size, hidden_units=hidden_units)) def learn(self, model="random_nu", nsamples=200000, test_split=0.1, valid_split=0.2, hidden_units=(48, 48, 48), tau_range=(3.0, 1e4), temperature_range=(0.1*u.K, 1e4*u.K), amax_range=(1*u.micron, 10.0*u.cm), p_range=(2.5, 4.5), @@ -398,12 +459,18 @@ def learn(self, model="random_nu", nsamples=200000, test_split=0.1, valid_split= self.learning = model self.overwrite = overwrite + # Reset the batch_size + if hasattr(self, "batch_size"): + del self.batch_size + # Set up the NN if model == "random_nu": - input_size, output_size = 4, 1 + self.input_size, self.output_size = self.ndims + 2, 1 + self.model_type = "MLP" elif model == "ml_step": - input_size, output_size = 7, 5 + self.input_size, self.output_size = 7, self.ndims + 3 + self.model_type = "flow" if nu_range is None: nu_range = (self.nu.value.min(), self.nu.value.max()) @@ -418,10 +485,11 @@ def learn(self, model="random_nu", nsamples=200000, test_split=0.1, valid_split= self.p_max = p_range[1] self.log10_tau_cell_nu0_min = np.log10(tau_range[0]) self.log10_tau_cell_nu0_max = np.log10(tau_range[1]) - elif model in ["kabs", "ksca","pmo"]: - input_size, output_size = 3, 1 + elif model in ["kabs", "ksca", "g", "pmo"]: + self.input_size, self.output_size = self.ndims + 1, 1 + self.model_type = "MLP" - self.initialize_model(model=model, input_size=input_size, output_size=output_size, hidden_units=hidden_units) + self.initialize_model(model=model, model_type=self.model_type, input_size=self.input_size, output_size=self.output_size, hidden_units=hidden_units) # Wrap the model in lightning @@ -465,10 +533,10 @@ def test_model(self, plot=False): if self.current_model == "random_nu": self.plot_triangle_plots(model=self.current_model) - elif self.current_model in ["kabs", "ksca"]: + elif self.current_model in ["kabs", "ksca", "g", "pmo"]: self.plot_opacity_model(model=self.current_model) - elif self.current_model == "pmo": - self.plot_pmo_model() + elif self.current_model == "scattering_phase_function": + self.plot_scattering_phase_function_model() else: #self.plot_ml_step() self.plot_triangle_plots(model=self.current_model) @@ -478,21 +546,18 @@ def prepare_data(self): return if hasattr(self, f"prepare_data_{self.current_model}"): - getattr(self, f"prepare_data_{self.current_model}")() + if self.current_model in ["kabs", "ksca"]: + samples, targets = self.prepare_data_opacity(model=self.current_model) + else: + samples, targets = getattr(self, f"prepare_data_{self.current_model}")() else: raise NotImplementedError(f"Data preparation for model {self.current_model} not implemented.") - def prepare_data_random_nu(self): - sampler = scipy.stats.qmc.LatinHypercube(d=4) - samples = sampler.random(self.nsamples) - - samples[:,0] = samples[:,0] * (self.p.max() - self.p.min()) + self.p.min() - samples[:,1] = samples[:,1] * (np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value) - samples[:,2] = samples[:,2] * (np.log10(self.temperature.max()) - np.log10(self.temperature.min())) + np.log10(self.temperature.min()) + self.nsamples = samples.shape[0] X = torch.tensor(samples, dtype=torch.float32) - y = torch.tensor(np.log10(self.random_nu_manual(samples[:,0], 10.**samples[:,1]*self.amax.unit, 10.**samples[:,2], ksi=samples[:,3])), dtype=torch.float32) - + y = torch.tensor(targets, dtype=torch.float32) + X_scaler = StandardScaler() X_scaler.fit(X) X = X_scaler.transform(X) @@ -501,88 +566,90 @@ def prepare_data_random_nu(self): y_scaler.fit(y) y = y_scaler.transform(y) - self.random_nu_x_scaler = X_scaler - self.random_nu_y_scaler = y_scaler + setattr(self, f"{self.current_model}_x_scaler", X_scaler) + setattr(self, f"{self.current_model}_y_scaler", y_scaler) self.dataset = TensorDataset(X, y) - def prepare_data_kabs(self): - sampler = scipy.stats.qmc.LatinHypercube(d=3) - samples = sampler.random(self.nsamples) - - samples[:,0] = samples[:,0] * (self.p.max() - self.p.min()) + self.p.min() - samples[:,1] = samples[:,1] * (np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value) - samples[:,2] = samples[:,2] * (np.log10(self.nu.max().value) - np.log10(self.nu.min().value)) + np.log10(self.nu.min().value) - - log10_kabs = scipy.interpolate.interpn((self.p, np.log10(self.amax.value), np.log10(self.nu.value)), np.log10(self.kabs), samples, method="cubic") - - X = torch.tensor(samples, dtype=torch.float32) - y = torch.tensor(log10_kabs, dtype=torch.float32) - - X_scaler = StandardScaler() - X_scaler.fit(X) - X = X_scaler.transform(X) - - y_scaler = StandardScaler() - y_scaler.fit(y) - y = y_scaler.transform(y) + def prepare_data_random_nu(self): + count = 0 + batch_size = 100 - self.kabs_x_scaler = X_scaler - self.kabs_y_scaler = y_scaler + total_samples = [] + total_targets = [] + total_original_indices = [] - self.dataset = TensorDataset(X, y) + while count < self.samples.shape[0]: + n = min(batch_size, self.samples.shape[0] - count) + + samples = np.repeat(np.expand_dims(np.repeat(np.expand_dims(self.samples[count:count+n,:], 1), self.temperature.size, axis=1), 1), self.nu.size, 1) + original_indices = np.tile(np.expand_dims(np.arange(self.samples.shape[0])[count:count+n], axis=(-1, -2)), (1, self.temperature.size, self.nu.size)).flatten() + + temperature = np.repeat(np.expand_dims(np.repeat(np.expand_dims(self.temperature*u.K, (0, -1)), self.nu.size, axis=0), 0), max(samples.shape[0], 1), axis=0) + nu = np.repeat(np.repeat(np.expand_dims(self.nu, (0, -1, -2)), self.temperature.size, axis=2), max(samples.shape[0], 1), axis=0) + + ksi = scipy.integrate.cumulative_trapezoid(np.repeat(np.expand_dims(self.kabs[count:count+n,:], (-1, -2)), self.temperature.size, axis=-2) * models.BlackBody(temperature)(nu), np.log10(self.nu.to(u.GHz).value), axis=1, initial=0) + ksi /= ksi[:,-1:,:,:] + + samples = np.concat((samples, np.log10(temperature.to(u.K).value), ksi), axis=-1) + samples = samples.reshape((-1, samples.shape[-1])) + + targets = np.log10(nu.to(u.GHz).value.flatten()) + + samples = samples.astype(np.float32) + + good = np.logical_not(np.logical_or(samples[:,-1] < 2e-8, samples[:,-1] == 1)) + + samples, targets = samples[good,:], targets[good] + original_indices = original_indices[good] + + samples[:,-1] = 2*samples[:,-1] - 1 + samples[:,-1] = np.arctanh(samples[:,-1]) - def prepare_data_ksca(self): - sampler = scipy.stats.qmc.LatinHypercube(d=3) - samples = sampler.random(self.nsamples) + total_samples.append(samples) + total_targets.append(targets) + total_original_indices.append(original_indices) - samples[:,0] = samples[:,0] * (self.p.max() - self.p.min()) + self.p.min() - samples[:,1] = samples[:,1] * (np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value) - samples[:,2] = samples[:,2] * (np.log10(self.nu.max().value) - np.log10(self.nu.min().value)) + np.log10(self.nu.min().value) + count += n - log10_ksca = scipy.interpolate.interpn((self.p, np.log10(self.amax.value), np.log10(self.nu.value)), np.log10(self.ksca), samples, method="cubic") + samples = np.concatenate(total_samples, axis=0) + targets = np.concatenate(total_targets, axis=0) + self.original_indices = np.concatenate(total_original_indices, axis=0) - X = torch.tensor(samples, dtype=torch.float32) - y = torch.tensor(log10_ksca, dtype=torch.float32) + return samples, targets - X_scaler = StandardScaler() - X_scaler.fit(X) - X = X_scaler.transform(X) + def prepare_data_opacity(self, model="kabs"): + samples = np.moveaxis(np.repeat(np.expand_dims(self.samples, 1), self.nu.size, axis=1), -1, 0) + self.original_indices = np.repeat(np.expand_dims(np.arange(self.samples.shape[0]), axis=-1), self.nu.size, axis=-1).flatten() - y_scaler = StandardScaler() - y_scaler.fit(y) - y = y_scaler.transform(y) + samples = np.concat((samples, np.expand_dims(np.repeat(np.expand_dims(np.log10(self.nu.to(u.GHz).value), axis=0), max(samples.shape[1], 1), axis=0), axis=0)), axis=0) + samples = samples.reshape((samples.shape[0], -1)).T - self.ksca_x_scaler = X_scaler - self.ksca_y_scaler = y_scaler + targets = np.log10(getattr(self, model).flatten()) - self.dataset = TensorDataset(X, y) + return samples, targets - def prepare_data_pmo(self, device='cpu'): - sampler = scipy.stats.qmc.LatinHypercube(d=3) - samples = sampler.random(self.nsamples) + def prepare_data_kabs(self): + return self.prepare_data_opacity(model="kabs") - samples[:,0] = samples[:,0] * (self.p.max() - self.p.min()) + self.p.min() - samples[:,1] = samples[:,1] * (np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value) - samples[:,2] = samples[:,2] * (np.log10(self.temperature.max()) - np.log10(self.temperature.min())) + np.log10(self.temperature.min()) + def prepare_data_ksca(self): + return self.prepare_data_opacity(model="ksca") - log10_pmo = np.log10(self.planck_mean_opacity(samples[:,0], 10.**samples[:,1], 10.**samples[:,2])) + def prepare_data_pmo(self): + temperature = np.repeat(np.expand_dims(self.temperature, (0, -1)), self.nu.size, axis=-1) + nu = np.repeat(np.expand_dims(self.nu, (0, 1)), self.temperature.size, axis=1) - X = torch.tensor(samples, dtype=torch.float32) - y = torch.tensor(log10_pmo, dtype=torch.float32) + self.pmo = self.kmean.cgs.value * scipy.integrate.trapezoid(models.BlackBody(temperature*u.K)(nu).cgs.value * np.expand_dims(self.kabs, 1), self.nu.to(u.Hz).value, axis=-1) * np.pi / (const.sigma_sb.cgs.value * self.temperature**4) - X_scaler = StandardScaler() - X_scaler.fit(X) - X = X_scaler.transform(X) + samples = np.moveaxis(np.repeat(np.expand_dims(self.samples, 1), self.temperature.size, axis=1), -1, 0) + self.original_indices = np.repeat(np.expand_dims(np.arange(self.samples.shape[0]), axis=-1), self.temperature.size, axis=-1).flatten() - y_scaler = StandardScaler() - y_scaler.fit(y) - y = y_scaler.transform(y) + samples = np.concat((samples, np.expand_dims(np.repeat(np.expand_dims(np.log10(self.temperature), axis=0), max(samples.shape[1], 1), axis=0), axis=0)), axis=0) + samples = samples.reshape((samples.shape[0], -1)).T - self.pmo_x_scaler = X_scaler - self.pmo_y_scaler = y_scaler + targets = np.log10(self.pmo).flatten() - self.dataset = TensorDataset(X, y) + return samples, targets def prepare_data_ml_step(self, device='cpu'): if os.path.exists("sim_results.csv"): @@ -608,15 +675,19 @@ def prepare_data_ml_step(self, device='cpu'): df.to_csv("sim_results.csv") features = ["log10_nu", "log10_Eabs", "log10_tau", "yaw", "pitch", "direction_yaw", "direction_pitch"] - targets = ["log10_nu0", "log10_T", "log10_amax", "p", "log10_tau_cell_nu0"] + targets = ["log10_nu0", "log10_T"] + \ + (["log10_amax"] if "log10_amax" in self.dims else []) + \ + (["p"] if "p" in self.dims else []) + \ + ([f"abundance{i}" for i in range(len(self.abundances))]) + \ + ["log10_tau_cell_nu0"] df.loc[:, "log10_tau"] = np.where(np.logical_or(df["log10_tau"] < -6.5, np.isnan(df["log10_tau"].values)), np.log10(-np.log(1. - np.random.rand(len(df)))), df["log10_tau"]) data = df.loc[:, targets+features].values - self.ml_step_x_scaler = StandardScaler() - self.ml_step_x_scaler.fit(torch.tensor(df.loc[:, features].values, dtype=torch.float32)) - self.ml_step_y_scaler = StandardScaler() - self.ml_step_y_scaler.fit(torch.tensor(df.loc[:, targets].values, dtype=torch.float32)) + + samples = df.loc[:, features].values + targets = df.loc[:, targets].values + self.ml_step_features = features self.ml_step_limits = {} for key in features: @@ -625,14 +696,11 @@ def prepare_data_ml_step(self, device='cpu'): self.df = df self.nsamples = len(df) - X = self.ml_step_x_scaler.transform(torch.tensor(df.loc[:, features].values, dtype=torch.float32)) - y = self.ml_step_y_scaler.transform(torch.tensor(df.loc[:, targets].values, dtype=torch.float32)) - - self.dataset = TensorDataset(X, y) + return samples, targets def run_dust_simulation(self, nphotons=1000, tau_range=(3.0, 1e4), temperature_range=(0.1*u.K, 1e4*u.K), amax_range=(1*u.micron, 10.0*u.cm), p_range=(2.5, 4.5), nu_range=None, use_ml_step=False, - position=0): + position=0, time_limit=np.inf, device="cpu"): """ Run a dust simulation that can be used to learn an ML-step model with the given parameters. @@ -660,7 +728,7 @@ def run_dust_simulation(self, nphotons=1000, tau_range=(3.0, 1e4), temperature_r # Set up the grid. - grid = UniformSphericalGrid(ncells=1, dr=1.0*u.au, mirror=False) + grid = UniformSphericalGrid(ncells=1, dr=1.0*u.au, mirror=False, device=device) density = np.ones(grid.shape) * 1e-16 * u.g / u.cm**3 @@ -671,22 +739,28 @@ def run_dust_simulation(self, nphotons=1000, tau_range=(3.0, 1e4), temperature_r photon_list = grid.emit(nphotons, wavelength="random", scattering=False) - initial_direction = np.zeros((nphotons, 3), dtype=np.float32) - initial_direction[:,0] = 1. - photon_list.direction = wp.array(initial_direction, dtype=wp.vec3) - - photon_list.frequency = wp.array(10.**np.random.uniform(np.log10(nu_range[0].value), np.log10(nu_range[1].value), nphotons), dtype=float) - original_frequency = photon_list.frequency.numpy().copy() - - photon_list.temperature = wp.array(10.**np.random.uniform(np.log10(temperature_range[0].to(u.K).value), np.log10(temperature_range[1].to(u.K).value), nphotons), dtype=float) - - photon_list.amax = wp.array(10.**np.random.uniform(np.log10(amax_range[0].to(u.cm).value), np.log10(amax_range[1].to(u.cm).value), nphotons), dtype=float) - photon_list.p = wp.array(np.random.uniform(p_range[0], p_range[1], nphotons), dtype=float) - - tau = 10.**np.random.uniform(np.log10(tau_range[0]), np.log10(tau_range[1]), nphotons) - photon_list.density = wp.array((tau / (self.kmean * self.interpolate_kabs(photon_list.p.numpy(), photon_list.amax.numpy(), photon_list.frequency.numpy()) * 1.*u.au) * self.kmean).to(1 / u.au), dtype=float) + with wp.ScopedDevice(grid.device): + initial_direction = np.zeros((nphotons, 3), dtype=np.float32) + initial_direction[:,0] = 1. + photon_list.direction = wp.array(initial_direction, dtype=wp.vec3) + + photon_list.frequency = wp.array(10.**np.random.uniform(np.log10(nu_range[0].value), np.log10(nu_range[1].value), nphotons), dtype=float) + original_frequency = photon_list.frequency.numpy().copy() + + photon_list.temperature = wp.array(10.**np.random.uniform(np.log10(temperature_range[0].to(u.K).value), np.log10(temperature_range[1].to(u.K).value), nphotons), dtype=float) + + samples = suggest_opacity_sampling(nphotons, p_range=p_range, amax_range=amax_range, n_dust_subspecies=len(self.abundances)+1, mode="random") + + photon_list.amax = wp.array(samples[:,1], dtype=float) + photon_list.p = wp.array(samples[:,0], dtype=float) + if len(self.abundances) > 0: + photon_list.dust_abundances = wp.array2d(samples[:,2:], dtype=float) + + tau = 10.**np.random.uniform(np.log10(tau_range[0]), np.log10(tau_range[1]), nphotons) + photon_list.density = wp.array((tau / (self.kmean * self.ml_kabs(photon_list=photon_list) * \ + 1.*u.au) * self.kmean).to(1 / u.au), dtype=float) - grid.propagate_photons(photon_list, learning=True, use_ml_step=use_ml_step) + grid.propagate_photons(photon_list, learning=True, use_ml_step=use_ml_step, time_limit=time_limit) # Calculate roll, pitch, and yaw for the position relative to where it started. # Also calculate roll, pitch, and yaw for the direction relative to the radial vector where it exits. @@ -718,6 +792,9 @@ def run_dust_simulation(self, nphotons=1000, tau_range=(3.0, 1e4), temperature_r "direction_yaw":direction_ypr[:,0], "direction_pitch":direction_ypr[:,1]}) + for i in range(len(self.abundances)): + df[f"abundance{i}"] = photon_list.dust_abundances.numpy()[:,i] + return df # DataModule functions @@ -772,7 +849,7 @@ def plot_ml_step(self, tau=30., temperature=100.0*u.K, amax=1.*u.micron, p=3.5, self.plot_triangle_plots(plot_columns=plot_columns) - def plot_opacity_model(self, model='kabs'): + def plot_opacity_model(self, model='kabs', show_scipy_interpolation=False): """ Plot the learned opacity model against the interpolated opacity. @@ -783,41 +860,70 @@ def plot_opacity_model(self, model='kabs'): """ import matplotlib.pyplot as plt - log10_nu = np.linspace(np.log10(self.nu.min().value), np.log10(self.nu.max().value), 10) - log10_lam = np.log10((const.c / (10.**log10_nu * u.GHz)).to(u.cm).value) - log10_amax = np.repeat(np.random.uniform(0, 1, 1)*(np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value), 10) - p = np.repeat(np.random.uniform(0, 1, 1)*(self.p.max() - self.p.min()) + self.p.min(), 10) - - print(f"log10_amax: {log10_amax[0]}, p: {p[0]}") - - samples = np.vstack((p, log10_amax, log10_nu)).T + if hasattr(self, "test_indices") and len(self.test_indices) > 0: + index = np.random.choice(self.test_indices, size=1)[0] + else: + index = np.random.randint(0, self.samples.shape[0], 1)[0] + + if model in ["kabs", "ksca", "g"]: + nx = self.nu.size + elif model in ["pmo"]: + nx = self.temperature.size + + if "log10_amax" in self.dims: + log10_amax = np.repeat(np.log10(self.amax[index].to(u.cm).value), nx) + if "p" in self.dims: + p = np.repeat(self.p[index], nx) + if "abundances" in self.dims: + abundances = tuple([np.repeat(a[index], nx) for a in self.abundances]) + + log10_lam = np.log10(self.lam.value) + log10_nu = np.log10(self.nu.to(u.GHz).value) + log10_temperature = np.log10(self.temperature) - interpolated = np.log10(getattr(self, f"interpolate_{model}")(p, 10.**log10_amax, 10.**log10_nu)) - nned = getattr(self, f'{model}_y_scaler').inverse_transform(getattr(self, f'{model}_model')(getattr(self, f'{model}_x_scaler').transform(torch.tensor(samples, dtype=torch.float32)))).detach().numpy() + if model == "g": + interpolated = getattr(self, model)[index,:] + else: + interpolated = np.log10(getattr(self, model)[index,:]) - plt.plot(log10_lam, interpolated) - plt.plot(log10_lam, nned) - plt.show() + print_str = "" + for dim in self.dims: + if dim == "abundances": + print_str += f"{dim}: {[abundances[i][0] for i in range(len(abundances))]}, " + else: + print_str += f"{dim}: {locals()[dim][0]}, " + print(print_str) - def plot_pmo_model(self): - """ - Plot the learned Planck mean opacity model against the interpolated Planck mean opacity. - """ - import matplotlib.pyplot as plt + samples = () + for dim in self.dims: + if dim == "abundances": + samples += abundances + else: + samples += (locals()[dim],) + + if model in ["kabs", "ksca", "g"]: + samples = np.vstack(samples + (log10_nu,)).T + plot_x = log10_lam + else: + samples = np.vstack(samples + (log10_temperature,)).T + plot_x = log10_temperature - p = np.repeat(np.random.uniform(0, 1, 1)*(self.p.max() - self.p.min()) + self.p.min(), 100) - log10_amax = np.repeat(np.random.uniform(0, 1, 1)*(np.log10(self.amax.max().value) - np.log10(self.amax.min().value)) + np.log10(self.amax.min().value), 100) - log10_temperature = np.linspace(np.log10(self.temperature.min()), np.log10(self.temperature.max()), 100) + nned = getattr(self, f'{model}_y_scaler').inverse_transform(getattr(self, f'{model}_model')(getattr(self, f'{model}_x_scaler').transform(torch.tensor(samples, dtype=torch.float32)))).detach().numpy() - print(f"log10_amax: {log10_amax[0]}, p: {p[0]}, log10_temperature: {log10_temperature[0]}") + plt.plot(plot_x, interpolated) + plt.plot(plot_x, nned) - samples = np.vstack((p, log10_amax, log10_temperature)).T + if show_scipy_interpolation: + X = getattr(self, f'{model}_x_scaler').inverse_transform(self.train.dataset.tensors[0][self.train.indices,:]).numpy() + y = getattr(self, f'{model}_y_scaler').inverse_transform(self.train.dataset.tensors[1][self.train.indices]).numpy() - interpolated = np.log10(self.planck_mean_opacity(p, 10.**log10_amax, 10.**log10_temperature)) - nned = self.pmo_y_scaler.inverse_transform(self.pmo_model(self.pmo_x_scaler.transform(torch.tensor(samples, dtype=torch.float32)))).detach().numpy() + distance = np.sqrt((X[:,0] - self.p[index])**2 + (X[:,1] - np.log10(self.amax[index].to(u.cm).value))**2) + good = distance <= np.unique(np.sort(distance))[50] + + scipy_interpolated = scipy.interpolate.griddata(X[good,:], y[good], samples) - plt.plot(log10_temperature, interpolated) - plt.plot(log10_temperature, nned) + plt.plot(plot_x, scipy_interpolated) + plt.show() def plot_random_nu_model(self, nsamples=100000): @@ -834,16 +940,18 @@ def plot_random_nu_model(self, nsamples=100000): T = np.repeat(10.**np.random.uniform(-1., 4., 1), nsamples) amax = np.repeat(10.**np.random.uniform(-4., 1., 1), nsamples) p = np.repeat(np.random.uniform(2.5, 4.5, 1), nsamples) - print(f"p: {p[0]}, amax: {amax[0]}, T: {T[0]}") + abundances = tuple([np.repeat(np.random.uniform(0, 1, 1), nsamples) for i in range(len(self.abundances))]) + print(f"p: {p[0]}, amax: {amax[0]}, T: {T[0]}, abundances: {[abundances[i][0] for i in range(len(self.abundances))]}") - nu = self.random_nu_manual(p, amax*self.amax.unit, T) - nu2 = self.random_nu_ml(p, amax, T) + nu2 = self.random_nu_ml(p, amax, T, abundances=abundances) - counts, bins, _ = plt.hist(nu, 100) - plt.hist(nu2, 100) + counts, bins, _ = plt.hist(np.log10(nu2), 300) bb = models.BlackBody(temperature=T[0] * u.K) - pdf = bb(bins[1:]*u.GHz).value * self.interpolate_kabs(np.repeat(p[0], bins[1:].size), np.repeat(amax[0], bins[1:].size), bins[1:]) + pdf = bb(10.**bins[1:]*u.GHz).value * self.ml_kabs(torch.tensor(p[0], dtype=torch.float32).repeat((bins[1:].size,)), + torch.tensor(amax[0], dtype=torch.float32).repeat((bins[1:].size,)), + torch.tensor(10.**bins[1:], dtype=torch.float32), + abundances=tuple([torch.tensor(a[0], dtype=torch.float32).repeat((bins[1:].size,)) for a in abundances])).numpy() pdf *= counts.max() / pdf.max() plt.plot(bins[1:], pdf, '-') @@ -869,11 +977,11 @@ def plot_triangle_plots(self, model="ml_step", nsamples=200000, batch_size=100, self.num_workers = num_workers if self.trainer is not None: - if model == "ml_step": + if model in ["ml_step"]: X_pred = self.trainer.predict(self.dustLM, datamodule=self) X_pred = torch.cat(X_pred) y_pred = torch.cat([batch[1] for batch in self.predict_dataloader()]) - elif model == "random_nu": + elif model in ["random_nu", "random_direction"]: y_pred = self.trainer.predict(self.dustLM, datamodule=self) y_pred = torch.cat(y_pred) X_pred = torch.cat([batch[0] for batch in self.predict_dataloader()]) @@ -885,11 +993,32 @@ def plot_triangle_plots(self, model="ml_step", nsamples=200000, batch_size=100, if model == "ml_step": features = np.array(["log10_nu", "log10_Eabs", "log10_tau", "yaw", "pitch", "direction_yaw", "direction_pitch"]) - targets = np.array(["log10_nu0", "log10_T", "log10_amax", "p", "log10_tau_cell_nu0"]) + targets = ["log10_nu0", "log10_T"] + \ + (["log10_amax"] if "log10_amax" in self.dims else []) + \ + (["p"] if "p" in self.dims else []) + \ + ([f"abundance{i}" for i in range(len(self.abundances))]) + \ + ["log10_tau_cell_nu0"] elif model == "random_nu": - features = np.array(["p", "log10_amax", "log10_temperature", "ksi"]) + features = () + for dim in self.dims: + if dim == "abundances": + features += tuple([f"abundance_{i}" for i in range(len(self.abundances))]) + else: + features += (dim,) + features = np.array(features + ("log10_temperature", "ksi")) targets = np.array(["log10_nu"]) + y_true = torch.unsqueeze(y_true, 1) + elif model == "random_direction": + features = () + for dim in self.dims: + if dim == "abundances": + features += tuple([f"abundance_{i}" for i in range(len(self.abundances))]) + else: + features += (dim,) + features = np.array(features + ("log10_nu", "ksi")) + targets = np.array(["theta"]) + y_true = torch.unsqueeze(y_true, 1) if isinstance(plot_columns, str) and plot_columns == 'all': @@ -910,7 +1039,7 @@ def plot_triangle_plots(self, model="ml_step", nsamples=200000, batch_size=100, if key1 == key2: ax[i,j].hist(df_true[key1], bins=50, histtype='step', density=True) if predict: - ax[i,j].hist(df_pred[key1], bins=250, histtype='step', density=True) + ax[i,j].hist(df_pred[key1], bins=50, histtype='step', density=True) elif i > j: ax[i,j].scatter(df_true[key2], df_true[key1], marker='.', s=1.0, alpha=1.0) @@ -929,11 +1058,33 @@ def plot_triangle_plots(self, model="ml_step", nsamples=200000, batch_size=100, def setup(self, stage=None): if hasattr(self, "train") and hasattr(self, "valid") and hasattr(self, "test") and not self.overwrite: return - test_size = int(self.test_split * self.nsamples) - valid_size = int((self.nsamples - test_size)*self.valid_split) - train_size = self.nsamples - test_size - valid_size - train_val_tmp, self.test = random_split(self.dataset, [train_size + valid_size, test_size], generator=torch.Generator().manual_seed(1)) - self.train, self.valid = random_split(train_val_tmp, [train_size, valid_size], generator=torch.Generator().manual_seed(2)) + + if self.learning == "ml_step" or self.ndims == 0: + test_size = int(self.test_split * self.nsamples) + valid_size = int((self.nsamples - test_size)*self.valid_split) + train_size = self.nsamples - test_size - valid_size + train_val_tmp, self.test = random_split(self.dataset, [train_size + valid_size, test_size], generator=torch.Generator().manual_seed(1)) + self.train, self.valid = random_split(train_val_tmp, [train_size, valid_size], generator=torch.Generator().manual_seed(2)) + else: + train_indices, valid_indices, test_indices = torch.utils.data.random_split(range(self.samples.shape[0]), + (1.-(self.test_split + self.valid_split), + self.valid_split, self.test_split), + generator=torch.Generator().manual_seed(2)) + self.test_indices = test_indices.indices + + splits = np.repeat(0, self.dataset.tensors[0].size(0)) + for ind in valid_indices.indices: + splits[self.original_indices == ind] = 1 + for ind in test_indices.indices: + splits[self.original_indices == ind] = 2 + + train_indices = np.where(splits.flatten() == 0)[0] + valid_indices = np.where(splits.flatten() == 1)[0] + test_indices = np.where(splits.flatten() == 2)[0] + + self.train = torch.utils.data.Subset(self.dataset, train_indices) + self.valid = torch.utils.data.Subset(self.dataset, valid_indices) + self.test = torch.utils.data.Subset(self.dataset, test_indices) if self.overwrite: self.overwrite = False @@ -956,6 +1107,7 @@ def state_dict(self): "lam": self.lam, "amax": self.amax, "p": self.p, + "abundances": self.abundances, "kabs": self.kabs*self.kmean, "ksca": self.ksca*self.kmean, }, @@ -999,6 +1151,574 @@ def save(self, filename): def copy(self, device="cpu"): return load(self.state_dict(), device=device) +class IsotropicDust(Dust): + def scatter(self, photon_list, iphotons): + nphotons = iphotons.size(0) + + wp.launch(kernel=random_direction, + dim=(nphotons,), + inputs=[photon_list.direction, iphotons, np.random.randint(0, 100000)]) + + def update_photon_scattering_phase_function(self, photon_list, direction, iphotons): + nphotons = iphotons.size(0) + + wp.launch(kernel=self.scattering_phase_function_wp, + dim=(nphotons,), + inputs=[photon_list, direction, iphotons]) + + @wp.kernel + def scattering_phase_function_wp(photon_list: PhotonList, + direction: wp.vec3, + iphotons: wp.array(dtype=int)): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + photon_list.scattering_phase_function[ip] = 1. + + +class HenyeyGreensteinDust(Dust): + def __init__(self, lam=None, kabs=None, ksca=None, g=None, amax=None, p=None, abundances=(), device="cpu", ntemperatures=1000): + """ + Initialize the Henyey-Greenstein dust model. + + Parameters + ---------- + lam : numpy.ndarray + The wavelengths to use for the dust properties. + kabs : numpy.ndarray + The absorption opacities to use for the dust properties. + ksca : numpy.ndarray + The scattering opacities to use for the dust properties. + g : numpy.ndarray + The Henyey-Greenstein asymmetry parameter to use for the dust properties. + amax : float + The maximum grain size to use for the dust properties. + p : float + The power-law index for the grain size distribution. + device : str + The device to place the dust properties on ("cpu" or "cuda"). + """ + super().__init__(lam=lam, kabs=kabs, ksca=ksca, amax=amax, p=p, abundances=abundances, device=device, + ntemperatures=ntemperatures) + + self.g = g + + def to_device(self, device): + super().to_device(device) + + for model in ["g"]: + if hasattr(self, f"{model}_model"): + getattr(self, f"{model}_model").to(device) + if hasattr(self, f"{model}_x_scaler"): + getattr(self, f"{model}_x_scaler").to(device) + if hasattr(self, f"{model}_y_scaler"): + getattr(self, f"{model}_y_scaler").to(device) + + def scatter(self, photon_list, iphotons): + nphotons = iphotons.size(0) + + wp.launch(kernel=self.random_direction, + dim=(nphotons,), + inputs=[photon_list.direction, photon_list.g, iphotons, np.random.randint(0, 100000)]) + + @wp.kernel + def random_direction(direction: wp.array(dtype=wp.vec3), + g: wp.array(dtype=float), + iphotons: wp.array(dtype=int), + seed: int): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + rng = wp.rand_init(seed, i) + + cost = (1. + g[ip]**2. - ((1. - g[ip]**2.)/(1. - g[ip] + 2.*g[ip]*wp.randf(rng)))**2.) / (2. * g[ip]) + theta = wp.acos(cost) + phi = 2.*np.pi*wp.randf(rng) + + rpy_quat1 = wp.quat_rpy(phi, 0., 0.) + rpy_quat2 = wp.quat_rpy(0., theta, 0.) + direction_quat = wp.quat_between_vectors(wp.vec3(1., 0., 0.), direction[ip]) + total_quat = direction_quat * rpy_quat1 * rpy_quat2 + + direction[ip] = wp.quat_rotate(total_quat, wp.vec3(1., 0., 0.)) + + def update_photon_scattering_phase_function(self, photon_list, direction, iphotons): + nphotons = iphotons.size(0) + + wp.launch(kernel=self.scattering_phase_function_heneygreenstein_wp, + dim=(nphotons,), + inputs=[photon_list, direction, iphotons]) + + @wp.kernel + def scattering_phase_function_heneygreenstein_wp(photon_list: PhotonList, + direction: wp.vec3, + iphotons: wp.array(dtype=int)): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + mu = wp.dot(photon_list.direction[ip], direction) + + photon_list.scattering_phase_function[ip] = (1. - photon_list.g[ip]**2.) / (1. + photon_list.g[ip]**2. - 2. * photon_list.g[ip] * mu) + + def ml_g(self, p=None, amax=None, nu=None, abundances=None, photon_list=None, iphotons=None): + if photon_list is not None: + p = wp.to_torch(photon_list.p) + amax = wp.to_torch(photon_list.amax) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + + if nu is None: + nu = wp.to_torch(photon_list.frequency) + + if iphotons is not None: + nu = nu[iphotons] + p = p[iphotons] + amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] + else: + if nu.size(0) != p.size(0): + p = p[iphotons] + amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] + + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) + + if amax is not None: + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(nu),) + samples = torch.transpose(torch.vstack(samples), 0, 1) + + g = self.g_y_scaler.inverse_transform(self.g_model(self.g_x_scaler.transform(samples))).detach().flatten() + + return g + + def prepare_data_g(self): + return self.prepare_data_opacity(model="g") + + def update_photon_opacities(self, photon_list, iphotons, grid=None, inu=None): + nphotons = iphotons.size(0) + + if grid is not None and inu is not None: + wp.launch(kernel=self.set_photon_opacities_grid, + dim=(nphotons,), + inputs=[photon_list, grid, inu, iphotons]) + else: + wp.launch(kernel=self.set_photon_opacities, + dim=(nphotons,), + inputs=[photon_list, + self.ml_kabs(photon_list=photon_list, iphotons=iphotons), + self.ml_ksca(photon_list=photon_list, iphotons=iphotons), + self.ml_g(photon_list=photon_list, iphotons=iphotons), + iphotons]) + + @wp.kernel + def set_photon_opacities(photon_list: PhotonList, + kabs: wp.array(dtype=float), + ksca: wp.array(dtype=float), + g: wp.array(dtype=float), + iphotons: wp.array(dtype=int)): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + photon_list.kabs[ip] = kabs[i] + photon_list.ksca[ip] = ksca[i] + photon_list.g[ip] = g[i] + photon_list.albedo[ip] = ksca[i] / (kabs[i] + ksca[i]) + + photon_list.opacities_out_of_date[ip] = False + + @wp.kernel + def set_photon_opacities_grid(photon_list: PhotonList, + grid: GridStruct, + inu: int, + iphotons: wp.array(dtype=int)): # pragma: no cover + ip = iphotons[wp.tid()] + + ix, iy, iz = photon_list.indices[ip][0], photon_list.indices[ip][1], photon_list.indices[ip][2] + + photon_list.kabs[ip] = grid.kabs[inu, ix, iy, iz] + photon_list.ksca[ip] = grid.ksca[inu, ix, iy, iz] + photon_list.g[ip] = grid.g[inu, ix, iy, iz] + photon_list.albedo[ip] = photon_list.ksca[ip] / (photon_list.kabs[ip] + photon_list.ksca[ip]) + + def set_grid_opacities(self, grid, frequency): + super().set_grid_opacities(grid, frequency) + + p = wp.to_torch(grid.p) + shape = p.shape + p = p.flatten() + amax = wp.to_torch(grid.amax).flatten() + abundances = tuple([wp.to_torch(grid.dust_abundances)[i].flatten() for i in range(len(self.abundances))]) + + g = [self.ml_g(p=p, + amax=amax, + abundances=abundances, + nu=torch.ones(np.prod(shape), dtype=torch.float32, + device=wp.device_to_torch(wp.get_device())) * \ + f.to(u.GHz).value) for f in frequency] + + grid.g = wp.from_torch(torch.concatenate(g).reshape((len(frequency),) + shape)) + + def state_dict(self): + state_dict = super().state_dict() + + state_dict["dust_properties"]["g"] = self.g + + if hasattr(self, "g_model"): + state_dict["g_state_dict"] = self.g_model.state_dict() + state_dict["g_x_scaler"] = self.g_x_scaler.state_dict() + state_dict["g_y_scaler"] = self.g_y_scaler.state_dict() + + return state_dict + +class GeneralDust(Dust): + def __init__(self, lam=None, kabs=None, ksca=None, scattering_phase_function=None, theta=None, amax=None, + p=None, abundances=(), device="cpu", ntemperatures=1000): + """ + Initialize the General dust model. + + Parameters + ---------- + lam : numpy.ndarray + The wavelengths to use for the dust properties. + kabs : numpy.ndarray + The absorption opacities to use for the dust properties. + ksca : numpy.ndarray + The scattering opacities to use for the dust properties. + scattering_phase_function : numpy.ndarray + The scattering phase function to use for the dust properties, as a function of theta. + theta : numpy.ndarray + The angles at which the scattering phase function is tabulated. + amax : float + The maximum grain size to use for the dust properties. + p : float + The power-law index for the grain size distribution. + device : str + The device to place the dust properties on ("cpu" or "cuda"). + """ + super().__init__(lam=lam, kabs=kabs, ksca=ksca, amax=amax, p=p, abundances=abundances, device=device, + ntemperatures=ntemperatures) + + # Ensure that the scattering phase function is normalized for each combination of p, amax, and nu. + + scattering_phase_function = -1. * scattering_phase_function / \ + np.expand_dims(scipy.integrate.trapezoid(scattering_phase_function, + np.cos(theta), axis=-1), axis=-1) + + self.scattering_phase_function = scattering_phase_function + self.theta = theta + + def to_device(self, device): + super().to_device(device) + + def scatter(self, photon_list, iphotons): + nphotons = iphotons.size(0) + + p = wp.to_torch(photon_list.p) + amax = wp.to_torch(photon_list.amax) + frequency = wp.to_torch(photon_list.frequency) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + if iphotons is not None: + p = p[iphotons] + amax = amax[iphotons] + frequency = frequency[iphotons] + if photon_list.dust_abundances is not None: + abundances = abundances[iphotons] + + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) + + nphotons = iphotons.size(0) + ksi = torch.rand(int(nphotons), device=wp.device_to_torch(wp.get_device()), dtype=torch.float32) + ksi = torch.clamp(torch.arctanh(2*ksi - 1.), min=-8.6643, max=8.6643) + + if amax is not None: + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(frequency), ksi) + + samples = torch.transpose(torch.vstack(samples), 0, 1) + + test_x = self.random_direction_x_scaler.transform(samples) + + theta = self.random_direction_y_scaler.inverse_transform(self.random_direction_model(test_x).detach()).flatten() + + wp.launch(kernel=self.random_direction, + dim=(nphotons,), + inputs=[photon_list.direction, + wp.from_torch(theta), + iphotons, + np.random.randint(0, 100000)]) + + @wp.kernel + def random_direction(direction: wp.array(dtype=wp.vec3), + theta: wp.array(dtype=float), + iphotons: wp.array(dtype=int), + seed: int): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + rng = wp.rand_init(seed, i) + + phi = 2.*np.pi*wp.randf(rng) + + rpy_quat1 = wp.quat_rpy(phi, 0., 0.) + rpy_quat2 = wp.quat_rpy(0., theta[i], 0.) + direction_quat = wp.quat_between_vectors(wp.vec3(1., 0., 0.), direction[ip]) + total_quat = direction_quat * rpy_quat1 * rpy_quat2 + + direction[ip] = wp.quat_rotate(total_quat, wp.vec3(1., 0., 0.)) + + def update_photon_scattering_phase_function(self, photon_list, direction, iphotons): + nphotons = iphotons.size(0) + + theta = torch.acos((wp.to_torch(photon_list.direction)[iphotons] * torch.tensor(wp.array(direction))).sum(axis=1)) + + scattering_phase_function = self.ml_scattering_phase_function(photon_list=photon_list, iphotons=iphotons, theta=theta) + + wp.launch(kernel=self.scattering_phase_function_general_dust_wp, + dim=(nphotons,), + inputs=[photon_list, + wp.from_torch(scattering_phase_function), + iphotons]) + + @wp.kernel + def scattering_phase_function_general_dust_wp(photon_list: PhotonList, + scattering_phase_function: wp.array(dtype=float), + iphotons: wp.array(dtype=int)): # pragma: no cover + + i = wp.tid() + ip = iphotons[i] + + photon_list.scattering_phase_function[ip] = 2. * scattering_phase_function[i] + + def ml_scattering_phase_function(self, p=None, amax=None, nu=None, theta=None, photon_list=None, iphotons=None): + if photon_list is not None: + p = wp.to_torch(photon_list.p) + amax = wp.to_torch(photon_list.amax) + if photon_list.dust_abundances is not None: + abundances = wp.to_torch(photon_list.dust_abundances) + + if nu is None: + nu = wp.to_torch(photon_list.frequency) + + if iphotons is not None: + nu = nu[iphotons] + p = p[iphotons] + amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] + else: + if nu.size(0) != p.size(0): + p = p[iphotons] + amax = amax[iphotons] + if abundances is not None: + abundances = abundances[iphotons] + + abundances = tuple([abundances[:,i] for i in range(len(self.abundances))]) + + if amax is not None: + log10_amax = torch.log10(amax) + + samples = () + for dim in self.dims: + if dim == "abundances" and abundances is not None: + samples += abundances + else: + samples += (eval(dim),) + samples += (torch.log10(nu), theta) + samples = torch.transpose(torch.vstack(samples), 0, 1) + + scattering_phase_function = 10.**self.scattering_phase_function_y_scaler.inverse_transform( + self.scattering_phase_function_model(self.scattering_phase_function_x_scaler.transform(samples))).\ + detach().flatten() + + return scattering_phase_function + + def learn(self, model="random_nu", **kwargs): + if model == "scattering_phase_function": + self.input_size, self.output_size = self.ndims + 2, 1 + self.model_type = "MLP" + elif model == "random_direction": + self.input_size, self.output_size = self.ndims + 2, 1 + self.model_type = "MLP" + + super().learn(model=model, **kwargs) + + def prepare_data_scattering_phase_function(self): + samples = np.repeat(np.repeat(np.expand_dims(np.moveaxis(self.samples, 0, 1), (-1, -2)), self.lam.size, axis=-2), self.theta.size, axis=-1) + self.original_indices = np.tile(np.expand_dims(np.arange(self.samples.shape[0]), axis=(-1, -2)), (1, self.nu.size, self.theta.size)).flatten() + + samples = np.concat((samples, + np.tile(np.expand_dims(np.log10(self.nu.to(u.GHz).value), + axis=(0,1,-1)), + (1, samples.shape[1], 1, self.theta.size)), + np.tile(np.expand_dims(self.theta.to(u.radian).value, + axis=(0,1,2)), + (1, samples.shape[1], self.lam.size, 1))), axis=0) + samples = samples.reshape((samples.shape[0], -1)).T + + targets = np.log10(self.scattering_phase_function.flatten()) + + return samples, targets + + def prepare_data_random_direction(self): + ksi = -1. * scipy.integrate.cumulative_trapezoid(self.scattering_phase_function, np.cos(self.theta), initial=0, axis=-1) + + samples = np.repeat(np.repeat(np.expand_dims(np.moveaxis(self.samples, 0, 1), (-1, -2)), self.lam.size, axis=-2), self.theta.size, axis=-1) + self.original_indices = np.tile(np.expand_dims(np.arange(self.samples.shape[0]), axis=(-1, -2)), (1, self.nu.size, self.theta.size)).flatten() + + samples = np.concat((samples, + np.tile(np.expand_dims(np.log10(self.nu.to(u.GHz).value), + axis=(0,1,-1)), + (1, samples.shape[1], 1, self.theta.size)), + np.expand_dims(ksi, axis=(0,))), axis=0) + + targets = np.tile(np.expand_dims(self.theta.to(u.radian).value, axis=(0,1,2)), (1, samples.shape[1], self.lam.size, 1)) + + samples = samples.reshape((samples.shape[0], -1)).T + targets = targets.flatten() + self.nsamples = samples.shape[0] + + samples = samples.astype(np.float32) + + good = np.logical_not(np.logical_or(samples[:,-1] < 2e-8, samples[:,-1] == 1)) + + samples, targets = samples[good,:], targets[good] + self.original_indices = self.original_indices[good] + + samples[:,-1] = 2*samples[:,-1] - 1 + samples[:,-1] = np.arctanh(samples[:,-1]) + + return samples, targets + + def plot_scattering_phase_function_model(self): + import matplotlib.pyplot as plt + + index_samples = np.random.randint(0, self.samples.shape[0], 1)[0] + + if "log10_amax" in self.dims: + log10_amax = np.repeat(np.log10(self.amax[index_samples].to(u.cm).value), self.theta.size) + if "p" in self.dims: + p = np.repeat(self.p[index_samples], self.theta.size) + if "abundances" in self.dims: + abundances = tuple([np.repeat(a[index_samples], self.theta.size) for a in self.abundances]) + + index_nu = np.random.randint(0, self.nu.size, 1)[0] + + log10_lam = np.repeat(np.log10(self.lam[index_nu].value), self.theta.size) + log10_nu = np.repeat(np.log10(self.nu[index_nu].to(u.GHz).value), self.theta.size) + + interpolated = np.log10(self.scattering_phase_function[index_samples, index_nu, :]) + + print_str = "" + for dim in self.dims: + if dim == "abundances": + print_str += f"{dim}: {[abundances[i][0] for i in range(len(abundances))]}, " + else: + print_str += f"{dim}: {locals()[dim][0]}, " + print(print_str) + + samples = () + for dim in self.dims: + if dim == "abundances": + samples += abundances + else: + samples += (locals()[dim],) + + samples = np.vstack(samples + (log10_nu, self.theta.to(u.radian).value)).T + plot_x = self.theta + + nned = self.scattering_phase_function_y_scaler.inverse_transform(self.scattering_phase_function_model(self.scattering_phase_function_x_scaler.transform(torch.tensor(samples, dtype=torch.float32)))).detach().numpy() + + plt.plot(plot_x, interpolated) + plt.plot(plot_x, nned) + plt.show() + + def state_dict(self): + state_dict = super().state_dict() + + state_dict["dust_properties"]["scattering_phase_function"] = self.scattering_phase_function + state_dict["dust_properties"]["theta"] = self.theta + + if hasattr(self, "scattering_phase_function_model"): + state_dict["scattering_phase_function_state_dict"] = self.scattering_phase_function_model.state_dict() + state_dict["scattering_phase_function_x_scaler"] = self.scattering_phase_function_x_scaler.state_dict() + state_dict["scattering_phase_function_y_scaler"] = self.scattering_phase_function_y_scaler.state_dict() + + if hasattr(self, "random_direction_model"): + state_dict["random_direction_state_dict"] = self.random_direction_model.state_dict() + state_dict["random_direction_x_scaler"] = self.random_direction_x_scaler.state_dict() + state_dict["random_direction_y_scaler"] = self.random_direction_y_scaler.state_dict() + + return state_dict + +def suggest_opacity_sampling(nsamples, p_range=None, amax_range=None, n_dust_subspecies=1, mode='lhs'): + """ + Suggest samples for learning the opacity as a function of the dust properties using Latin Hypercube sampling. + + Parameters + ---------- + nsamples : int + The number of samples to generate. + p_range : tuple + The range of power-law indices to sample from. If None, do not sample over power-law index. + amax_range : tuple + The range of maximum dust grain sizes to sample from. If None, do not sample over maximum + dust grain size. + n_dust_subspecies: int + The number of component dust species whose abundances may vary. Note that the returned samples will + have n_dust_subspecies - 1 abundance samples because the abundances must sum to 1, and the value of the + last species abundance is implicit. + + Returns + ------- + samples : numpy.ndarray + An array of shape (nsamples, ndims) where ndims is the number of dimensions sampled over (i.e. 1 for each of + p and amax if they are not None, plus n_dust_subspecies - 1 for the dust species abundances). + """ + ndims = 0 + if p_range is not None: + ndims += 1 + if amax_range is not None: + ndims += 1 + ndims += n_dust_subspecies - 1 + + if mode == 'lhs': + sampler = scipy.stats.qmc.LatinHypercube(d=ndims) + samples = sampler.random(nsamples) + elif mode == 'random': + samples = np.random.rand(nsamples, ndims) + else: + raise ValueError("Invalid mode. Must be either 'lhs' or 'random'.") + + index = 0 + if p_range is not None: + samples[:,index] = samples[:,index] * (p_range[1] - p_range[0]) + p_range[0] + index += 1 + if amax_range is not None: + samples[:,index] = 10.**(samples[:,index] * (np.log10(amax_range[1].to(u.cm).value) - np.log10(amax_range[0].to(u.cm).value)) + np.log10(amax_range[0].to(u.cm).value)) + index += 1 + + for i in range(1, n_dust_subspecies-1): + samples[:, index+i] = (1. - samples[:, index:index+i].sum(axis=1)) * samples[:, index+i] + + return samples def load(filename, device="cpu"): """ @@ -1034,16 +1754,22 @@ def load(filename, device="cpu"): elif isinstance(filename, Dust): state_dict = filename.state_dict() - d = Dust(**state_dict["dust_properties"], device=device) + if "g" in state_dict["dust_properties"]: + d = HenyeyGreensteinDust(**state_dict["dust_properties"], device=device) + elif "scattering_phase_function" in state_dict["dust_properties"]: + d = GeneralDust(**state_dict["dust_properties"], device=device) + else: + d = IsotropicDust(**state_dict["dust_properties"], device=device) - for attr in ["kabs", "ksca", "pmo", "random_nu"]: + for attr in ["kabs", "ksca", "pmo", "random_nu", "g", "scattering_phase_function"]: if f"{attr}_state_dict" in state_dict: - if attr == "random_nu": - input_size = 4 + if attr in ["random_nu", "scattering_phase_function"]: + input_size = d.ndims + 2 else: - input_size = 3 + input_size = d.ndims + 1 + hidden_units = [state_dict[f'{attr}_state_dict'][key].shape[0] for key in state_dict[f'{attr}_state_dict'] if 'bias' in key][0:-1] - d.initialize_model(model=attr, input_size=input_size, output_size=1, hidden_units=hidden_units) + d.initialize_model(model=attr, model_type="MLP", input_size=input_size, output_size=1, hidden_units=hidden_units) getattr(d, f'{attr}_model').load_state_dict(state_dict[f'{attr}_state_dict']) setattr(d, f'{attr}_x_scaler', StandardScaler()) @@ -1051,10 +1777,22 @@ def load(filename, device="cpu"): setattr(d, f'{attr}_y_scaler', StandardScaler()) getattr(d, f'{attr}_y_scaler').load_state_dict(state_dict[f"{attr}_y_scaler"]) + if "random_direction_state_dict" in state_dict: + hidden_units = (tuple([state_dict['random_direction_state_dict'][key].size(1) for key in state_dict['random_direction_state_dict'] if '0.hyper' in key and 'weight' in key and '0.weight' not in key]),) * len([state_dict['random_direction_state_dict'][key].size(0) for key in state_dict['random_direction_state_dict'] if '0.weight' in key]) + + d.initialize_model(model="random_direction", model_type="flow", input_size=1, output_size=3, hidden_units=hidden_units) + + d.random_direction_model.load_state_dict(state_dict['random_direction_state_dict']) + + d.random_direction_x_scaler = StandardScaler() + d.random_direction_x_scaler.load_state_dict(state_dict["random_direction_x_scaler"]) + d.random_direction_y_scaler = StandardScaler() + d.random_direction_y_scaler.load_state_dict(state_dict["random_direction_y_scaler"]) + if "ml_step_state_dict" in state_dict: hidden_units = (tuple([state_dict['ml_step_state_dict'][key].size(1) for key in state_dict['ml_step_state_dict'] if '0.hyper' in key and 'weight' in key and '0.weight' not in key]),) * len([state_dict['ml_step_state_dict'][key].size(0) for key in state_dict['ml_step_state_dict'] if '0.weight' in key]) - d.initialize_model(model="ml_step", input_size=7, output_size=5, hidden_units=hidden_units) + d.initialize_model(model="ml_step", model_type="flow", input_size=7, output_size=5, hidden_units=hidden_units) d.ml_step_model.load_state_dict(state_dict['ml_step_state_dict']) @@ -1183,4 +1921,4 @@ def predict_step(self, batch, batch_idx, dataloader_idx=0): if hasattr(self.model, "condition"): return self.condition(y).sample() else: - return self(x) \ No newline at end of file + return self(x) diff --git a/pinballrt/grids.py b/pinballrt/grids.py index 177f268..25f69b9 100644 --- a/pinballrt/grids.py +++ b/pinballrt/grids.py @@ -10,7 +10,7 @@ import time from tqdm.auto import tqdm -from .utils import GridStruct, EPSILON, equal, equal_zero, planck_function +from .utils import GridStruct, EPSILON, equal, equal_zero, planck_function, random_direction class Grid: def __init__(self, _w1, _w2, _w3, device='cpu'): @@ -33,11 +33,11 @@ def __getstate__(self): new_dict = {} for entry in state['grid'].__dict__: - if isinstance(getattr(self.grid, entry), wp.types.array): + if wp.types.is_array(getattr(self.grid, entry)): new_dict[entry] = getattr(self.grid, entry).numpy() elif isinstance(getattr(self.grid, entry), type(None)): new_dict[entry] = getattr(self.grid, entry) - elif isinstance(getattr(self.grid, entry), wp.types.bool): + elif isinstance(getattr(self.grid, entry), wp.bool): new_dict[entry] = bool(getattr(self.grid, entry)) elif isinstance(getattr(self.grid, entry), int): new_dict[entry] = getattr(self.grid, entry) @@ -61,7 +61,7 @@ def __setstate__(self, state): self.__dict__.update(state) - def set_physical_properties(self, density=None, dusttogasratio=0.01, dust=None, amax=None, p=None, gases=None, abundances=None, + def set_physical_properties(self, density=None, dusttogasratio=0.01, dust=None, amax=None, p=None, dust_abundances=(), gases=None, abundances=None, velocity=None, microturbulence=None): with wp.ScopedDevice(self.device): if density is not None: @@ -94,6 +94,17 @@ def set_physical_properties(self, density=None, dusttogasratio=0.01, dust=None, self.dust = dust self.dust.to_device(wp.device_to_torch(wp.get_device())) + if len(dust_abundances) > 0: + self.grid.dust_abundances = wp.array4d(dust_abundances, dtype=float) + self.n_dust_abundances = len(dust_abundances) + else: + if len(self.dust.abundances) > 0: + self.grid.dust_abundances = wp.array4d(np.ones((len(self.dust.abundances),)+self.shape) * + len(self.dust.abundances) / (len(self.dust.abundances) + 1.), dtype=float) + self.n_dust_abundances = len(self.dust.abundances) + else: + self.n_dust_abundances = 0 + if gases is not None: self.gases = [] for g in gases: @@ -290,7 +301,8 @@ def deposit_scattering(photon_list: PhotonList, @wp.kernel def photon_cell_properties(photon_list: PhotonList, grid: GridStruct, - iphotons: wp.array(dtype=int)): # pragma: no cover + iphotons: wp.array(dtype=int), + n_dust_abundances: int): # pragma: no cover itemp = wp.tid() ip = iphotons[itemp] @@ -298,40 +310,38 @@ def photon_cell_properties(photon_list: PhotonList, photon_list.temperature[ip] = grid.temperature[ix, iy, iz] photon_list.density[ip] = grid.dust_density[ix, iy, iz] - photon_list.amax[ip] = grid.amax[ix, iy, iz] - photon_list.p[ip] = grid.p[ix, iy, iz] + + new_amax = grid.amax[ix, iy, iz] + new_p = grid.p[ix, iy, iz] + + updated_dust_properties = False + if photon_list.amax[ip] != new_amax or photon_list.p[ip] != new_p: + updated_dust_properties = True + + photon_list.amax[ip] = new_amax + photon_list.p[ip] = new_p + + for i in range(n_dust_abundances): + new_abundance = grid.dust_abundances[i, ix, iy, iz] + + if photon_list.dust_abundances[ip][i] != new_abundance: + updated_dust_properties = True + + photon_list.dust_abundances[ip][i] = new_abundance + + if updated_dust_properties: + photon_list.opacities_out_of_date[ip] = True @wp.kernel def update_frequency(photon_list: PhotonList, frequency: wp.array(dtype=float), - kabs: wp.array(dtype=float), - ksca: wp.array(dtype=float), iphotons: wp.array(dtype=int)): # pragma: no cover i = wp.tid() ip = iphotons[i] photon_list.frequency[ip] = frequency[i] - photon_list.kabs[ip] = kabs[i] - photon_list.ksca[ip] = ksca[i] - photon_list.albedo[ip] = ksca[i] / (kabs[i] + ksca[i]) - - @wp.kernel - def random_direction(direction: wp.array(dtype=wp.vec3), - iphotons: wp.array(dtype=int), - seed: int): # pragma: no cover - i = wp.tid() - ip = iphotons[i] - - rng = wp.rand_init(seed, i) - - cost = -1. + 2.*wp.randf(rng) - sint = wp.sqrt(1.-cost**2.) - phi = 2.*np.pi*wp.randf(rng) - - direction[ip][0] = sint*np.cos(phi) - direction[ip][1] = sint*np.sin(phi) - direction[ip][2] = cost + photon_list.opacities_out_of_date[ip] = True @wp.kernel def random_tau(photon_list: PhotonList, @@ -355,13 +365,9 @@ def random_absorb(photon_list: PhotonList, photon_list.absorb[ip] = wp.randf(rng) > photon_list.albedo[ip] - def interact(self, photon_list: PhotonList, absorb, iabsorb, interact, iphotons, scattering=False, learning=False): + def interact(self, photon_list: PhotonList, absorb, iabsorb, interact, iphotons, iscatter, scattering=False, learning=False): nphotons = iphotons.size(0) - wp.launch(kernel=self.random_direction, - dim=(nphotons,), - inputs=[photon_list.direction, iphotons, np.random.randint(0, 100000)]) - t1 = time.time() nabsorb = iabsorb.size(0) #if not scattering and nabsorb > 0: @@ -372,6 +378,12 @@ def interact(self, photon_list: PhotonList, absorb, iabsorb, interact, iphotons, t2 = time.time() photon_temperature_time = t2 - t1 + wp.launch(kernel=random_direction, + dim=(nabsorb,), + inputs=[photon_list.direction, iabsorb, np.random.randint(0, 100000)]) + + self.dust.scatter(photon_list, iscatter) + t1 = time.time() if not scattering and nabsorb > 0: new_frequency = self.dust.random_nu(photon_list, subset=absorb) @@ -382,9 +394,9 @@ def interact(self, photon_list: PhotonList, absorb, iabsorb, interact, iphotons, if not scattering and nabsorb > 0: wp.launch(kernel=self.update_frequency, dim=(nabsorb,), - inputs=[photon_list, new_frequency, - self.dust.ml_kabs(photon_list=photon_list, nu=wp.to_torch(new_frequency), iphotons=iabsorb), - self.dust.ml_ksca(photon_list=photon_list, nu=wp.to_torch(new_frequency), iphotons=iabsorb), iabsorb]) + inputs=[photon_list, new_frequency, iabsorb]) + + #self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iabsorb) t2 = time.time() dust_interpolation_time = t2 - t1 @@ -420,7 +432,9 @@ def update_grid(self, timing={}): t1 = time.time() planck_mean_opacity = self.dust.ml_planck_mean_opacity(torch.tensor(self.grid.p.numpy().flatten()), torch.tensor(self.grid.amax.numpy().flatten()), - torch.tensor(old_temperature.flatten(), dtype=torch.float32)).numpy().reshape(self.shape) + torch.tensor(old_temperature.flatten(), dtype=torch.float32), + abundances=tuple([torch.tensor(self.grid.dust_abundances.numpy()[i].flatten(), dtype=torch.float32) for + i in range(self.n_dust_abundances)])).numpy().reshape(self.shape) t2 = time.time() pmo_time += t2 - t1 @@ -512,7 +526,9 @@ def ml_step(self, photon_list, s, iphotons): wp.launch(kernel=self.update_frequency, dim=(nphotons,), - inputs=[photon_list, wp.from_torch(frequency), self.dust.ml_kabs(photon_list=photon_list, nu=wp.from_torch(frequency, iphotons=iphotons)), self.dust.ml_ksca(photon_list=photon_list, nu=wp.from_torch(frequency, iphotons=iphotons)), iphotons]) + inputs=[photon_list, wp.from_torch(frequency), iphotons]) + + self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iphotons) wp.launch(kernel=self.ml_rotate_direction, dim=(nphotons,), @@ -524,19 +540,7 @@ def ml_step(self, photon_list, s, iphotons): return wp.from_torch(direction_yaw), wp.from_torch(direction_pitch), wp.from_torch(direction_roll) - @wp.kernel - def set_photon_opacities(photon_list: PhotonList, - kabs: wp.array(dtype=float), - ksca: wp.array(dtype=float), - iphotons: wp.array(dtype=int)): # pragma: no cover - i = wp.tid() - ip = iphotons[i] - - photon_list.kabs[ip] = kabs[i] - photon_list.ksca[ip] = ksca[i] - photon_list.albedo[ip] = ksca[i] / (kabs[i] + ksca[i]) - - def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning=False, debug=False, timing={}, position=0): + def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning=False, debug=False, timing={}, position=0, time_limit=np.inf): with wp.ScopedDevice(self.device): nphotons = photon_list.position.numpy().shape[0] iphotons_original = torch.arange(nphotons, dtype=torch.int32, device=wp.device_to_torch(wp.get_device())) @@ -567,8 +571,10 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning photon_list.kabs = wp.zeros(nphotons, dtype=float) photon_list.ksca = wp.zeros(nphotons, dtype=float) + photon_list.g = wp.zeros(nphotons, dtype=float) photon_list.albedo = wp.zeros(nphotons, dtype=float) photon_list.absorb = wp.zeros(nphotons, dtype=bool) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) progress_bar = tqdm(total=nphotons, position=position, leave=True) @@ -583,12 +589,7 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning nphotons = iphotons.size(0) t1 = time.time() - wp.launch(kernel=self.set_photon_opacities, - dim=(nphotons,), - inputs=[photon_list, - wp.from_torch(self.dust.ml_kabs(photon_list=photon_list, iphotons=iphotons)), - wp.from_torch(self.dust.ml_ksca(photon_list=photon_list, iphotons=iphotons)), - iphotons]) + self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iphotons) t2 = time.time() dust_interpolation_time += t2 - t1 @@ -598,7 +599,8 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning count = 0 nphotons_done = 0 - while nphotons > 0: + start_time = time.time() + while nphotons > 0 and time.time() - start_time < time_limit: #print(nphotons) count += 1 @@ -707,7 +709,9 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning interaction_indices = iphotons_original[interaction] absorb = torch.logical_and(interaction, wp.to_torch(photon_list.absorb)) absorb_indices = iphotons_original[absorb] - tmp_photon_temp_time, tmp_dust_interpolation_time, tmp_photon_loc_time, tmp_absorb_random_nu_time = self.interact(photon_list, absorb, absorb_indices, interaction, interaction_indices, learning=learning) + scatter = torch.logical_and(interaction, wp.to_torch(photon_list.absorb) == False) + scatter_indices = iphotons_original[scatter] + tmp_photon_temp_time, tmp_dust_interpolation_time, tmp_photon_loc_time, tmp_absorb_random_nu_time = self.interact(photon_list, absorb, absorb_indices, interaction, interaction_indices, scatter_indices, learning=learning) t2 = time.time() absorb_time += t2 - t1 - tmp_dust_interpolation_time - tmp_photon_loc_time absorb_random_nu_time += tmp_absorb_random_nu_time @@ -727,15 +731,12 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning if not learning: wp.launch(kernel=self.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid, iphotons]) + inputs=[photon_list, self.grid, iphotons, self.n_dust_abundances]) t1 = time.time() - wp.launch(kernel=self.set_photon_opacities, - dim=(nphotons,), - inputs=[photon_list, - wp.from_torch(self.dust.ml_kabs(photon_list=photon_list, iphotons=iphotons)), - wp.from_torch(self.dust.ml_ksca(photon_list=photon_list, iphotons=iphotons)), - iphotons]) + iphotons_opacities = iphotons_original[torch.logical_and(wp.to_torch(photon_list.in_grid), + wp.to_torch(photon_list.opacities_out_of_date))] + self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iphotons_opacities) t2 = time.time() dust_interpolation_time += t2 - t1 @@ -756,37 +757,9 @@ def propagate_photons(self, photon_list: PhotonList, use_ml_step=False, learning def set_grid_opacities(self, frequency): with wp.ScopedDevice(self.device): - p = wp.to_torch(self.grid.p).flatten() - amax = wp.to_torch(self.grid.amax).flatten() - - kabs = [self.dust.ml_kabs(p=p, amax=amax, nu=torch.ones(np.prod(self.shape), - dtype=torch.float32, - device=wp.device_to_torch(wp.get_device())) * \ - f.to(u.GHz).value) for f in frequency] - - self.grid.kabs = wp.from_torch(torch.concatenate(kabs).reshape((len(frequency),) + self.shape)) + self.dust.set_grid_opacities(self.grid, frequency) - ksca = [self.dust.ml_ksca(p=p, amax=amax, nu=torch.ones(np.prod(self.shape), - dtype=torch.float32, - device=wp.device_to_torch(wp.get_device())) * \ - f.to(u.GHz).value) for f in frequency] - - self.grid.ksca = wp.from_torch(torch.concatenate(ksca).reshape((len(frequency),) +self.shape)) - - @wp.kernel - def update_photon_opacities(photon_list: PhotonList, - grid: GridStruct, - inu: int, - iphotons: wp.array(dtype=int)): # pragma: no cover - ip = iphotons[wp.tid()] - - ix, iy, iz = photon_list.indices[ip][0], photon_list.indices[ip][1], photon_list.indices[ip][2] - - photon_list.kabs[ip] = grid.kabs[inu, ix, iy, iz] - photon_list.ksca[ip] = grid.ksca[inu, ix, iy, iz] - photon_list.albedo[ip] = photon_list.ksca[ip] / (photon_list.kabs[ip] + photon_list.ksca[ip]) - - def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug=False, timing={}, position=0): + def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, camera_direction: wp.vec3, debug=False, timing={}, position=0): with wp.ScopedDevice(self.device): nphotons = photon_list.position.numpy().shape[0] iphotons_original = torch.arange(nphotons, dtype=torch.int32, device=wp.device_to_torch(wp.get_device())) @@ -811,8 +784,11 @@ def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug= photon_list.kabs = wp.zeros(nphotons, dtype=float) photon_list.ksca = wp.zeros(nphotons, dtype=float) + photon_list.g = wp.zeros(nphotons, dtype=float) photon_list.albedo = wp.zeros(nphotons, dtype=float) photon_list.absorb = wp.zeros(nphotons, dtype=bool) + photon_list.scattering_phase_function = wp.zeros(nphotons, dtype=float) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) progress_bar = tqdm(total=nphotons, position=position, leave=True) @@ -827,9 +803,7 @@ def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug= nphotons = iphotons.size(0) t1 = time.time() - wp.launch(kernel=self.update_photon_opacities, - dim=(nphotons,), - inputs=[photon_list, self.grid, inu, iphotons]) + self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iphotons, grid=self.grid, inu=inu) t2 = time.time() dust_interpolation_time += t2 - t1 @@ -858,6 +832,10 @@ def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug= s = torch.minimum(wp.to_torch(s1), wp.to_torch(s2)) + self.dust.update_photon_scattering_phase_function(photon_list=photon_list, + direction=camera_direction, + iphotons=iphotons) + t1 = time.time() wp.launch(kernel=self.deposit_scattering, dim=(nphotons,), @@ -899,7 +877,9 @@ def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug= interaction_indices = iphotons_original[interaction] absorb = torch.logical_and(interaction, wp.to_torch(photon_list.absorb)) absorb_indices = iphotons_original[absorb] - tmp_photon_temp_time, tmp_dust_interpolation_time, tmp_photon_loc_time, tmp_absorb_random_nu_time = self.interact(photon_list, absorb, absorb_indices, interaction, interaction_indices, scattering=True) + scatter = torch.logical_and(interaction, wp.to_torch(photon_list.absorb) == False) + scatter_indices = iphotons_original[scatter] + tmp_photon_temp_time, tmp_dust_interpolation_time, tmp_photon_loc_time, tmp_absorb_random_nu_time = self.interact(photon_list, absorb, absorb_indices, interaction, interaction_indices, scatter_indices, scattering=True) t2 = time.time() absorb_time += t2 - t1 - tmp_photon_loc_time #absorb_time += tmp_time @@ -915,12 +895,12 @@ def propagate_photons_scattering(self, photon_list: PhotonList, inu: int, debug= if nphotons > 0: wp.launch(kernel=self.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid, iphotons]) + inputs=[photon_list, self.grid, iphotons, self.n_dust_abundances]) t1 = time.time() - wp.launch(kernel=self.update_photon_opacities, - dim=(nphotons,), - inputs=[photon_list, self.grid, inu, iphotons]) + iphotons_opacities = iphotons_original[torch.logical_and(wp.to_torch(photon_list.in_grid), + wp.to_torch(photon_list.opacities_out_of_date))] + self.dust.update_photon_opacities(photon_list=photon_list, iphotons=iphotons_opacities, grid=self.grid, inu=inu) t2 = time.time() dust_interpolation_time += t2 - t1 @@ -1087,18 +1067,6 @@ def reduce_source_intensity(ray_list: PhotonList, ray_list.intensity[ir, inu] = ray_list.intensity[ir, inu] * wp.exp(-s[ir] * ray_list.kext[ir, inu] * grid.dust_density[ix, iy, iz]) - @wp.kernel - def set_ray_opacities(ray_list: PhotonList, - kext: wp.array2d(dtype=float), - albedo: wp.array2d(dtype=float), - irays: wp.array(dtype=int)): # pragma: no cover - - iray, inu = wp.tid() - ir = irays[iray] - - ray_list.kext[ir, inu] = kext[iray, inu] - ray_list.ray_albedo[ir, inu] = albedo[iray, inu] - @wp.kernel def set_ray_opacities_grid(ray_list: PhotonList, grid: GridStruct, @@ -1133,7 +1101,7 @@ def propagate_rays(self, ray_list: PhotonList, frequency, pixel_size): wp.launch(kernel=self.photon_cell_properties, dim=(nrays,), - inputs=[ray_list, self.grid, iray]) + inputs=[ray_list, self.grid, iray, self.n_dust_abundances]) wp.launch(kernel=self.set_ray_opacities_grid, dim=(nrays, nnu), @@ -1179,7 +1147,7 @@ def propagate_rays(self, ray_list: PhotonList, frequency, pixel_size): if nrays > 0: wp.launch(kernel=self.photon_cell_properties, dim=(nrays,), - inputs=[ray_list, self.grid, iray]) + inputs=[ray_list, self.grid, iray, self.n_dust_abundances]) wp.launch(kernel=self.set_ray_opacities_grid, dim=(nrays, nnu), @@ -1194,10 +1162,14 @@ def propagate_rays_from_source(self, ray_list: PhotonList, frequency): ray_list.in_grid = wp.zeros(nrays, dtype=bool) ray_list.frequency = wp.array(frequency, dtype=float) + + if self.n_dust_abundances > 0: + ray_list.dust_abundances = wp.zeros((nrays, self.n_dust_abundances), dtype=float) + ray_list.opacities_out_of_date = wp.zeros(nrays, dtype=bool) wp.launch(kernel=self.photon_cell_properties, dim=(nrays,), - inputs=[ray_list, self.grid, iray]) + inputs=[ray_list, self.grid, iray, self.n_dust_abundances]) ray_list.kext = wp.zeros((nrays, frequency.size), dtype=float) ray_list.ray_albedo = wp.zeros((nrays, frequency.size), dtype=float) @@ -1234,7 +1206,7 @@ def propagate_rays_from_source(self, ray_list: PhotonList, frequency): if nrays > 0: wp.launch(kernel=self.photon_cell_properties, dim=(nrays,), - inputs=[ray_list, self.grid, iray]) + inputs=[ray_list, self.grid, iray, self.n_dust_abundances]) wp.launch(kernel=self.set_ray_opacities_grid, dim=(nrays, nnu), @@ -1300,11 +1272,14 @@ def emit(self, nphotons, wavelength="random", scattering=False, learning=False, photon_list.temperature = wp.zeros(nphotons, dtype=float) photon_list.amax = wp.zeros(nphotons, dtype=float) photon_list.p = wp.zeros(nphotons, dtype=float) + if self.n_dust_abundances > 0: + photon_list.dust_abundances = wp.zeros((nphotons, self.n_dust_abundances), dtype=float) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) if not learning: wp.launch(kernel=self.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid, iphotons]) + inputs=[photon_list, self.grid, iphotons, self.n_dust_abundances]) return photon_list @@ -1628,11 +1603,14 @@ def emit(self, nphotons, wavelength="random", scattering=False, learning=False, photon_list.temperature = wp.array(np.zeros(nphotons), dtype=float) photon_list.amax = wp.array(np.zeros(nphotons), dtype=float) photon_list.p = wp.array(np.zeros(nphotons), dtype=float) + if self.n_dust_abundances > 0: + photon_list.dust_abundances = wp.zeros((nphotons, self.n_dust_abundances), dtype=float) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) if not learning: wp.launch(kernel=self.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid, iphotons]) + inputs=[photon_list, self.grid, iphotons, self.n_dust_abundances]) return photon_list @@ -2108,11 +2086,14 @@ def emit(self, nphotons, wavelength="random", scattering=False, learning=False, photon_list.temperature = wp.array(np.zeros(nphotons), dtype=float) photon_list.amax = wp.array(np.zeros(nphotons), dtype=float) photon_list.p = wp.array(np.zeros(nphotons), dtype=float) + if self.n_dust_abundances > 0: + photon_list.dust_abundances = wp.zeros((nphotons, self.n_dust_abundances), dtype=float) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) if not learning: wp.launch(kernel=self.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid, iphotons]) + inputs=[photon_list, self.grid, iphotons, self.n_dust_abundances]) return photon_list diff --git a/pinballrt/model.py b/pinballrt/model.py index 4dd5df9..5f49f8c 100644 --- a/pinballrt/model.py +++ b/pinballrt/model.py @@ -3,7 +3,7 @@ from .sources import DiffuseSource, EnergySource from .grids import Grid -from .dust import load, Dust +from .dust import load from .gas import Gas from .camera import Camera from schwimmbad import SerialPool, MultiPool @@ -220,6 +220,8 @@ def scattering_mc(self, nphotons, wavelengths, device="cpu", return_timing=False for i, wavelength in enumerate(wavelengths): iter_timing = {} + frequency = const.c / wavelength + for source in self.grid_list[device].sources + [self.grid_list[device].grid_source]: if isinstance(source, DiffuseSource): source.initialize_luminosity_array(wavelength=wavelength) @@ -234,7 +236,8 @@ def scattering_mc(self, nphotons, wavelengths, device="cpu", return_timing=False [nphotons]*njobs, [njobs]*njobs, [wavelength]*njobs, - [i]*njobs,)) + [i]*njobs, + [self.camera_list[device].i_wp]*njobs)) total_scattering = [r[0] for r in result] time.sleep(0.1) t2 = time.time() @@ -247,11 +250,11 @@ def scattering_mc(self, nphotons, wavelengths, device="cpu", return_timing=False if isinstance(source, DiffuseSource) and not isinstance(source, EnergySource): total_scattering[i] += torch.tensor((source.luminosity * (self.grid.distance_unit**2 * u.Jy) * \ source.density / (4.*np.pi * u.steradian * \ - (self.grid.grid.dust_density.numpy() * \ - self.grid.dust.interpolate_kext( - self.grid.grid.p.numpy(), - self.grid.grid.amax.numpy(), - np.ones(self.grid.shape)*wavelength) * \ + (wp.to_torch(self.grid.grid.dust_density) * \ + self.grid.dust.ml_kext( + wp.to_torch(self.grid.grid.p).flatten(), + wp.to_torch(self.grid.grid.amax).flatten(), + torch.ones(self.grid.shape).flatten()*frequency.to(u.GHz).value).reshape(self.grid.shape) * \ self.grid.distance_unit**-1))).value, device=device) @@ -325,44 +328,20 @@ def make_image(self, npix=100, pixel_size=None, channels=None, rest_frequency=No # Check which lines from the gas should be included - if include_gas: - self.grid.select_lines(lam) - - self.grid.grid.include_dust = include_dust - self.grid.grid.include_gas = include_gas - - # Check whether spectral is wavelength or frequency - - if channels.unit.is_equivalent(u.micron): - lam = channels.to(u.micron) - nu = (const.c / channels).to(u.GHz) - elif channels.unit.is_equivalent(u.GHz): - nu = channels.to(u.GHz) - lam = (const.c / nu).to(u.micron) - elif channels.unit.is_equivalent(u.km / u.s): - if rest_frequency is None: - raise ValueError("rest_frequency must be provided when channels are in velocity units.") - nu = (rest_frequency * (1 - channels / const.c)).to(u.GHz) - lam = (const.c / nu).to(u.micron) - else: - raise ValueError("Either lam or nu must be provided.") - - # Check which lines from the gas should be included - if include_gas: self.grid.select_lines(lam) # First, run a scattering simulation to get the scattering phase function + for dev in self.camera_list: + self.camera_list[dev].set_orientation(incl, pa, distance) + + self.grid_list[device].set_grid_opacities(nu) if include_dust: - self.grid_list[device].set_grid_opacities(nu) self.scattering_mc(nphotons, lam, device=device, set_grid_opacities=False) # Now set up the image proper. - for dev in self.camera_list: - self.camera_list[dev].set_orientation(incl, pa, distance) - physical_pixel_size = (pixel_size*distance).to(self.grid.distance_unit, equivalencies=u.dimensionless_angles()).value image = xr.Dataset( @@ -402,7 +381,7 @@ def make_image(self, npix=100, pixel_size=None, channels=None, rest_frequency=No [njobs]*njobs,) ))).mean(axis=0) * u.Jy/u.steradian - intensity += source_intensity + intensity += source_intensity image = image.assign(intensity=(("x","y","lam"), intensity.to(u.Jy / u.steradian))) @@ -448,11 +427,11 @@ def thermal_mc_task(args): return grid.grid.energy.numpy(), iter_timing def scattering_mc_task(args): - grid, position, s, nphotons, njobs, wavelength, i = args + grid, position, s, nphotons, njobs, wavelength, i, camera_direction = args seed(s.generate_state(1)[0]) iter_timing = {} photon_list = grid.emit(int(nphotons / njobs), wavelength, scattering=True, timing=iter_timing) - grid.propagate_photons_scattering(photon_list, i, timing=iter_timing, position=position) + grid.propagate_photons_scattering(photon_list, i, camera_direction, timing=iter_timing, position=position) return grid.scattering, iter_timing diff --git a/pinballrt/photons.py b/pinballrt/photons.py index 37afd55..7dc5cc8 100644 --- a/pinballrt/photons.py +++ b/pinballrt/photons.py @@ -17,12 +17,17 @@ class PhotonList: alpha: wp.array(dtype=float) kabs: wp.array(dtype=float) ksca: wp.array(dtype=float) + g: wp.array(dtype=float) + scattering_phase_function: wp.array(dtype=float) albedo: wp.array(dtype=float) kext: wp.array2d(dtype=float) ray_albedo: wp.array2d(dtype=float) absorb: wp.array(dtype=bool) amax: wp.array(dtype=float) p: wp.array(dtype=float) + dust_abundances: wp.array2d(dtype=float) + + opacities_out_of_date: wp.array(dtype=bool) tau: wp.array(dtype=float) total_tau_abs: wp.array(dtype=float) diff --git a/pinballrt/sources.py b/pinballrt/sources.py index 7f3b44c..019646e 100644 --- a/pinballrt/sources.py +++ b/pinballrt/sources.py @@ -19,7 +19,7 @@ from pinballrt.utils import EPSILON from .photons import PhotonList -from .utils import GridStruct +from .utils import GridStruct, random_direction from astropy.modeling import models import astropy.units as u import astropy.constants as const @@ -409,7 +409,7 @@ def emit(self, nphotons, distance_unit, wavelength="random", simulation="thermal photon_list.direction = wp.array(np.zeros((nphotons, 3)), dtype=wp.vec3) photon_list.direction_frame = wp.array(np.zeros((nphotons, 3)), dtype=wp.vec3) - wp.launch(kernel=self.grid.random_direction, + wp.launch(kernel=random_direction, dim=(nphotons,), inputs=[photon_list.direction, torch.arange(nphotons, dtype=torch.int32, device=wp.device_to_torch(wp.get_device())), np.random.randint(0, 100000)]) @@ -453,7 +453,10 @@ def initialize_luminosity_array(self, wavelength): self.grid.volume.cpu().numpy()*\ self.grid.dust.ml_kabs(wp.to_torch(self.grid.grid.p).flatten(), wp.to_torch(self.grid.grid.amax).flatten(), - torch.tensor(nu.value, dtype=torch.float32, device=wp.device_to_torch(wp.get_device())).expand(np.prod(self.grid.shape))).cpu().numpy().reshape(self.grid.shape)*\ + torch.tensor(nu.value, dtype=torch.float32, device=wp.device_to_torch(wp.get_device()) + ).expand(np.prod(self.grid.shape)), + abundances=tuple([wp.to_torch(self.grid.grid.dust_abundances)[i].flatten() for i in + range(self.grid.n_dust_abundances)])).cpu().numpy().reshape(self.grid.shape)*\ self.grid.distance_unit**2*models.BlackBody(temperature=self.grid.grid.temperature.numpy()*u.K)(nu)).to(u.au**2 * u.Jy).value self.total_lum = self.luminosity.sum() @@ -467,9 +470,13 @@ def random_nu(self, nphotons, cell_coords): photon_list.temperature = wp.zeros(nphotons, dtype=float) photon_list.amax = wp.zeros(nphotons, dtype=float) photon_list.p = wp.zeros(nphotons, dtype=float) + if self.grid.n_dust_abundances > 0: + photon_list.dust_abundances = wp.zeros((nphotons, self.grid.n_dust_abundances), dtype=float) + photon_list.opacities_out_of_date = wp.zeros(nphotons, dtype=bool) + wp.launch(kernel=self.grid.photon_cell_properties, dim=(nphotons,), - inputs=[photon_list, self.grid.grid, wp.array(np.arange(nphotons), dtype=int)]) + inputs=[photon_list, self.grid.grid, wp.array(np.arange(nphotons), dtype=int), self.grid.n_dust_abundances]) return self.grid.dust.random_nu(photon_list) diff --git a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_image.nc b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_image.nc index 9868a99..10c07e7 100644 Binary files a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_image.nc and b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_image.nc differ diff --git a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_mom0.nc b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_mom0.nc index 11439ab..25aedb9 100644 Binary files a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_mom0.nc and b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_mom0.nc differ diff --git a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_scattering.npz b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_scattering.npz index 8086af1..ac70dad 100644 Binary files a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_scattering.npz and b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_scattering.npz differ diff --git a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_temperature.npz b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_temperature.npz index 3c69f4c..de2ed55 100644 Binary files a/pinballrt/tests/data/LogUniformSphericalGrid_E2E_temperature.npz and b/pinballrt/tests/data/LogUniformSphericalGrid_E2E_temperature.npz differ diff --git a/pinballrt/tests/data/UniformCartesianGrid_E2E_image.nc b/pinballrt/tests/data/UniformCartesianGrid_E2E_image.nc index 7c98971..fe0472c 100644 Binary files a/pinballrt/tests/data/UniformCartesianGrid_E2E_image.nc and b/pinballrt/tests/data/UniformCartesianGrid_E2E_image.nc differ diff --git a/pinballrt/tests/data/UniformCartesianGrid_E2E_mom0.nc b/pinballrt/tests/data/UniformCartesianGrid_E2E_mom0.nc index d976bae..9c6fa36 100644 Binary files a/pinballrt/tests/data/UniformCartesianGrid_E2E_mom0.nc and b/pinballrt/tests/data/UniformCartesianGrid_E2E_mom0.nc differ diff --git a/pinballrt/tests/data/UniformCartesianGrid_E2E_scattering.npz b/pinballrt/tests/data/UniformCartesianGrid_E2E_scattering.npz index 503e55f..2854a7d 100644 Binary files a/pinballrt/tests/data/UniformCartesianGrid_E2E_scattering.npz and b/pinballrt/tests/data/UniformCartesianGrid_E2E_scattering.npz differ diff --git a/pinballrt/tests/data/UniformCartesianGrid_E2E_temperature.npz b/pinballrt/tests/data/UniformCartesianGrid_E2E_temperature.npz index 7fa1900..7d729d6 100644 Binary files a/pinballrt/tests/data/UniformCartesianGrid_E2E_temperature.npz and b/pinballrt/tests/data/UniformCartesianGrid_E2E_temperature.npz differ diff --git a/pinballrt/tests/data/UniformSphericalGrid_E2E_image.nc b/pinballrt/tests/data/UniformSphericalGrid_E2E_image.nc index 6c8b54d..a2e4706 100644 Binary files a/pinballrt/tests/data/UniformSphericalGrid_E2E_image.nc and b/pinballrt/tests/data/UniformSphericalGrid_E2E_image.nc differ diff --git a/pinballrt/tests/data/UniformSphericalGrid_E2E_mom0.nc b/pinballrt/tests/data/UniformSphericalGrid_E2E_mom0.nc index 93a7356..3d0453f 100644 Binary files a/pinballrt/tests/data/UniformSphericalGrid_E2E_mom0.nc and b/pinballrt/tests/data/UniformSphericalGrid_E2E_mom0.nc differ diff --git a/pinballrt/tests/data/UniformSphericalGrid_E2E_scattering.npz b/pinballrt/tests/data/UniformSphericalGrid_E2E_scattering.npz index 3b34253..6a6e11b 100644 Binary files a/pinballrt/tests/data/UniformSphericalGrid_E2E_scattering.npz and b/pinballrt/tests/data/UniformSphericalGrid_E2E_scattering.npz differ diff --git a/pinballrt/tests/data/UniformSphericalGrid_E2E_temperature.npz b/pinballrt/tests/data/UniformSphericalGrid_E2E_temperature.npz index 61f613e..aae6817 100644 Binary files a/pinballrt/tests/data/UniformSphericalGrid_E2E_temperature.npz and b/pinballrt/tests/data/UniformSphericalGrid_E2E_temperature.npz differ diff --git a/pinballrt/tests/data/diana.npz b/pinballrt/tests/data/diana.npz new file mode 100644 index 0000000..c27a573 Binary files /dev/null and b/pinballrt/tests/data/diana.npz differ diff --git a/pinballrt/tests/data/diana_wice.dst b/pinballrt/tests/data/diana_wice.dst index 85d38d6..669e0c5 100644 Binary files a/pinballrt/tests/data/diana_wice.dst and b/pinballrt/tests/data/diana_wice.dst differ diff --git a/pinballrt/tests/test_E2E.py b/pinballrt/tests/test_E2E.py index dac1936..884bf80 100644 --- a/pinballrt/tests/test_E2E.py +++ b/pinballrt/tests/test_E2E.py @@ -64,7 +64,7 @@ def test_E2E(grid_class, grid_kwargs, percentile, return_vals=False): g.set_properties_from_lambda('co.dat') cube = model.make_image(npix=256, pixel_size=0.2*u.arcsec, channels=np.linspace(-20., 20., 300)*u.km/u.s, rest_frequency=g.nu[2], - incl=45.*u.degree, pa=45.*u.degree, distance=1.*u.pc, include_dust=False, device='cpu') + incl=45.*u.degree, pa=45.*u.degree, distance=1.*u.pc, include_dust=False, device='cpu', include_sources=False) mom0 = cube.sum(dim='lam') # Do the checks. diff --git a/pinballrt/tests/test_dust_creation.py b/pinballrt/tests/test_dust_creation.py index afe1774..e8d0f7a 100644 --- a/pinballrt/tests/test_dust_creation.py +++ b/pinballrt/tests/test_dust_creation.py @@ -1,6 +1,7 @@ -from pinballrt.dust import Dust, load +from pinballrt.dust import IsotropicDust, HenyeyGreensteinDust, GeneralDust, load, suggest_opacity_sampling import numpy as np import astropy.units as u +import pytest import dill import os @@ -9,62 +10,169 @@ def test_Dust(): Test the Dust class by creating a dust file from input opacity data. """ - data = np.load(os.path.join(os.path.dirname(__file__), "data/diana_wice.npz")) + data = np.load(os.path.join(os.path.dirname(__file__), "data/diana.npz")) - d = Dust(lam=data["lam"]*u.cm, kabs=data["kabs"]*u.cm**2/u.g, ksca=data["ksca"]*u.cm**2/u.g, amax=data["amax"]*u.cm, p=data["p"]) + p, amax = np.meshgrid(data["p"], data["amax"], indexing="ij") - assert d.kmean.value == 2206.6072 + d = IsotropicDust(lam=data["lam"]*u.cm, + kabs=data["kabs"]*u.cm**2/u.g, + ksca=data["ksca"]*u.cm**2/u.g, + amax=amax*u.cm, + p=p) + + assert d.kmean.value == 4574.907442551958 d.save("amax.dst") -def test_learning(): +@pytest.mark.parametrize( + "dust_type,dims", + [ + pytest.param(IsotropicDust, (), id="IsotropicDust/None"), + pytest.param(IsotropicDust, ("amax","abundances"), id="IsotropicDust/amax,abundances"), + pytest.param(IsotropicDust, ("p","amax","abundances"), id="IsotropicDust/p,amax,abundances"), + pytest.param(HenyeyGreensteinDust, (), id="HenyeyGreensteinDust/None"), + pytest.param(HenyeyGreensteinDust, ("p","abundances"), id="HenyeyGreensteinDust/p,abundances"), + pytest.param(HenyeyGreensteinDust, ("p","amax","abundances"), id="HenyeyGreensteinDust/p,amax,abundances"), + pytest.param(GeneralDust, (), id="GeneralDust/None"), + pytest.param(GeneralDust, ("p","abundances"), id="GeneralDust/p,abundances"), + pytest.param(GeneralDust, ("p","amax","abundances"), id="GeneralDust/p,amax,abundances"), + ] +) +def test_learning(dust_type, dims): """ Test the learn_random_nu method of the Dust class. """ - - data = np.load(os.path.join(os.path.dirname(__file__), "data/diana_wice.npz")) - - d = Dust(lam=data["lam"]*u.cm, kabs=data["kabs"]*u.cm**2/u.g, ksca=data["ksca"]*u.cm**2/u.g, amax=data["amax"]*u.cm, p=data["p"]) + import matplotlib + matplotlib.use("Agg") + + wavelengths = np.logspace(-1, 4, 10) * u.micron + + if "p" in dims: + p_range = (2.5, 4.5) + else: + p_range = None + + if "amax" in dims: + amax_range = (1*u.micron, 10*u.cm) + else: + amax_range = None + + if "abundances" in dims: + n_dust_subspecies = 3 + else: + n_dust_subspecies = 1 + + samples = suggest_opacity_sampling(10 if len(dims) > 0 else 0, p_range=p_range, amax_range=amax_range, n_dust_subspecies=n_dust_subspecies) + samples = np.moveaxis(np.repeat(np.expand_dims(samples, 1), wavelengths.size, axis=1), -1, 0) + + index = 0 + if "p" in dims: + p = samples[index] + index += 1 + else: + p = 3.5 + + if "amax" in dims: + amax = samples[index] * u.cm + index += 1 + else: + amax = 1.0*u.micron + + if "abundances" in dims: + silicate_fraction = samples[index] + index += 1 + water_fraction = samples[index] + else: + silicate_fraction = 0.6 + water_fraction = 0.3 + + wavelengths = np.repeat(np.expand_dims(wavelengths, axis=0), max(samples.shape[1], 1), axis=0) + + # Define the absorption and scattering opacities (in cm^2/g). + silicate_feature = 100**silicate_fraction * np.exp(-0.5*(wavelengths - 10*u.micron)**2 / (10.*u.micron)**2) * u.cm**2 / u.g + water_feature = 100**water_fraction * np.exp(-0.5*(wavelengths - 3.*u.micron)**2 / (2.*u.micron)**2) * u.cm**2 / u.g + + power_law_index = (-2. / (1 + np.exp(-p/3.5 * (-1.5 - np.log10(amax.to(u.cm).value))))) + + kappa_abs = 1.0 * (wavelengths.to(u.micron).value/100.0)**power_law_index * u.cm**2 / u.g + silicate_feature + water_feature + kappa_scat = 0.5 * (wavelengths.to(u.micron).value/100.0)**power_law_index * u.cm**2 / u.g + silicate_feature + water_feature + + # Create the Dust object. + dust_kwargs = {"lam":wavelengths[0,:], + "amax":amax[:,0] if "amax" in dims else None, + "p":p[:,0] if "p" in dims else None, + "abundances":(silicate_fraction[:,0], water_fraction[:,0]) if "abundances" in dims else (), + "kabs":kappa_abs, + "ksca":kappa_scat, + "ntemperatures":10} + + if dust_type == HenyeyGreensteinDust: + g = np.tanh(p - np.log10(wavelengths.to(u.micron).value)) + dust_kwargs["g"] = g + elif dust_type == GeneralDust: + g = np.repeat(np.expand_dims(np.tanh(p - np.log10(wavelengths.to(u.micron).value)), axis=-1), 5, axis=-1) + theta = np.tile(np.expand_dims(np.linspace(0, 180., 5), axis=(0,1)), (10 if len(dims) > 0 else 1, 10, 1)) * u.deg + scattering_phase_function = (1 - g**2) / (4 * np.pi * (1 + g**2 - 2*g*np.cos(theta.to(u.rad).value))**(3/2)) + + dust_kwargs["scattering_phase_function"] = scattering_phase_function + dust_kwargs["theta"] = theta[0,0,:] + + d = dust_type(**dust_kwargs) # Test the learn_random_nu method. - n_samples = 1000 + models = ["kabs","ksca","pmo","random_nu"] + if dust_type == HenyeyGreensteinDust: + models.append("g") + if dust_type == GeneralDust: + models.append("scattering_phase_function") + models.append("random_direction") - for model in ["kabs","ksca","pmo","random_nu"]: + for model in models: print('*****************************') print(f'{model}') print('*****************************') - d.learn(model=model, nsamples=n_samples, overwrite=True) - d.fit(epochs=10) + d.learn(model=model, overwrite=True) + if model == "random_nu": + size = d.kabs.size * d.temperature.size + elif model == "pmo": + size = d.kabs.shape[0] * d.temperature.size + else: + size = d.kabs.size + batch_size = int(10.**int(np.log10(size / 10))) + d.fit(epochs=10, batch_size=batch_size) d.test_model(plot=True) -def test_learn_ml_step(): - """ - Test the learn_ml_step method of the Dust class. - """ - - print('*****************************') - print('ml_step') - print('*****************************') - - # Load the dust file. - - d = load(os.path.join(os.path.dirname(__file__), "data/diana_wice.dst")) + if model == "random_nu": + d.plot_random_nu_model(100) # Test the learn_ml_step method. n_samples = 100 - d.learn(model="ml_step", hidden_units=((32, 32, 32),)*6, nsamples=n_samples, tau_range=(0.5, 1.0), nu_range=(d.nu.max()/10, d.nu.max())) + d.learn(model="ml_step", + hidden_units=((32, 32, 32),)*6, + nsamples=n_samples, + tau_range=(0.5, 1.0), + nu_range=(d.nu.max()/10, d.nu.max()), + overwrite=True) d.fit(epochs=10) d.test_model(plot=True) + os.system("rm -rf sim_results.csv *_logs") + def test_dust_pickle(): """ Test that Dust classes can be pickled and unpickled. """ - data = np.load(os.path.join(os.path.dirname(__file__), "data/diana_wice.npz")) + data = np.load(os.path.join(os.path.dirname(__file__), "data/diana.npz")) + + p, amax = np.meshgrid(data["p"], data["amax"], indexing="ij") - d = Dust(lam=data["lam"]*u.cm, kabs=data["kabs"]*u.cm**2/u.g, ksca=data["ksca"]*u.cm**2/u.g, amax=data["amax"]*u.cm, p=data["p"]) + d = IsotropicDust(lam=data["lam"]*u.cm, + kabs=data["kabs"]*u.cm**2/u.g, + ksca=data["ksca"]*u.cm**2/u.g, + amax=amax*u.cm, + p=p) result = dill.loads(dill.dumps(d)) diff --git a/pinballrt/tests/test_grids.py b/pinballrt/tests/test_grids.py index 612346d..0f4f8a1 100644 --- a/pinballrt/tests/test_grids.py +++ b/pinballrt/tests/test_grids.py @@ -50,18 +50,22 @@ def test_grid_physical_properties_shapes(): Test that the grid shapes are correct. """ + # Set up the dust. + + d = os.path.join(os.path.dirname(__file__), "data/diana_wice.dst") + # Set up the grid. model = Model(grid=UniformCartesianGrid, grid_kwargs={"ncells":9, "dx":2.0*u.au}) density = np.ones(model.grid.shape)*1.0e-16 * u.g / u.cm**3 - model.set_physical_properties(density=density, amax=100*u.micron, p=3.5, dust="diana_wice.dst") + model.set_physical_properties(density=density, amax=100*u.micron, p=3.5, dust=d) assert model.grid.grid.dust_density.numpy().shape == model.grid.shape assert model.grid.grid.amax.numpy().shape == model.grid.shape assert model.grid.grid.p.numpy().shape == model.grid.shape - model.set_physical_properties(density=density, amax=100, p=3.5, dust="diana_wice.dst") + model.set_physical_properties(density=density, amax=100, p=3.5, dust=d) assert model.grid.grid.dust_density.numpy().shape == model.grid.shape assert model.grid.grid.amax.numpy().shape == model.grid.shape diff --git a/pinballrt/utils.py b/pinballrt/utils.py index 57890dd..fb048f8 100644 --- a/pinballrt/utils.py +++ b/pinballrt/utils.py @@ -69,6 +69,23 @@ def calculate_Qvalue(array1, array2, percentile=99.0, clip=None): return Q +@wp.kernel +def random_direction(direction: wp.array(dtype=wp.vec3), + iphotons: wp.array(dtype=int), + seed: int): # pragma: no cover + i = wp.tid() + ip = iphotons[i] + + rng = wp.rand_init(seed, i) + + cost = -1. + 2.*wp.randf(rng) + sint = wp.sqrt(1.-cost**2.) + phi = 2.*np.pi*wp.randf(rng) + + direction[ip][0] = sint*np.cos(phi) + direction[ip][1] = sint*np.sin(phi) + direction[ip][2] = cost + @wp.struct class GridStruct: w1: wp.array(dtype=float) @@ -96,9 +113,11 @@ class GridStruct: energy: wp.array3d(dtype=float) amax: wp.array3d(dtype=float) p: wp.array3d(dtype=float) + dust_abundances: wp.array4d(dtype=float) kabs: wp.array4d(dtype=float) ksca: wp.array4d(dtype=float) + g: wp.array4d(dtype=float) velocity: wp.array4d(dtype=float) microturbulence: wp.array3d(dtype=float)