Skip to content

Commit 1ea1b2c

Browse files
authored
Add files via upload
1 parent 88ec3c5 commit 1ea1b2c

File tree

1 file changed

+329
-0
lines changed

1 file changed

+329
-0
lines changed

code/Demo_version.ipynb

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {
6+
"id": "jUA8NsH6G4Td"
7+
},
8+
"source": [
9+
"# Implicit reparametrization trick: demonstration"
10+
]
11+
},
12+
{
13+
"cell_type": "markdown",
14+
"metadata": {
15+
"id": "a6KZPv2ZG4Te"
16+
},
17+
"source": [
18+
"Hear we demonstrate usage of library **torch.distributions.implicit** that we implemented within group of four students at MIPT."
19+
]
20+
},
21+
{
22+
"cell_type": "markdown",
23+
"metadata": {
24+
"id": "GKRLg4TVG4Tf"
25+
},
26+
"source": [
27+
"### Introduction"
28+
]
29+
},
30+
{
31+
"cell_type": "markdown",
32+
"metadata": {
33+
"id": "-fRLPlRTG4Tf"
34+
},
35+
"source": [
36+
"The vanilla ELBO estimation in generative models like VAE uses reparametrization trick: a method of sampling random variables with low variance of the gradient of parameter distribution. However, this method is available only for the limited number of distributions. For instance, it cannot be applied to some important continuous standard distributions such as Dirichlet, Beta, Gamma and mixture of distributions.\n",
37+
"\n",
38+
"The implicit reparameterization trick (IRT), being a modification of standart reparametrization trick, is much more expressive and applicable to a wider class of distributions. For a demonstration of its application in VAE, see [vae_experiment.ipynb](https://github.com/intsystems/implicit-reparameterization-trick/blob/main/code/vae_experiment.ipynb).\n",
39+
"\n",
40+
"For more mathematical details, please refer to the **[blog post]** for a comprehensive description of these two reparameterization trick methods.\n",
41+
"\n"
42+
]
43+
},
44+
{
45+
"cell_type": "markdown",
46+
"metadata": {
47+
"id": "jvTWFGoRG4Tf"
48+
},
49+
"source": [
50+
"### Installation"
51+
]
52+
},
53+
{
54+
"cell_type": "markdown",
55+
"metadata": {
56+
"id": "-uCIbKv_G4Tf"
57+
},
58+
"source": [
59+
"To install library use the following command:\n",
60+
"\n",
61+
"```\n",
62+
"pip install ..\n",
63+
"```"
64+
]
65+
},
66+
{
67+
"cell_type": "markdown",
68+
"metadata": {
69+
"id": "CxdX6MesG4Tf"
70+
},
71+
"source": [
72+
"### Scope"
73+
]
74+
},
75+
{
76+
"cell_type": "markdown",
77+
"metadata": {
78+
"id": "tn1U9QG0G4Tf"
79+
},
80+
"source": [
81+
"We implemented several distributions with reparametrized sampling ability using implicit reparametrisation trick:\n",
82+
"\n",
83+
"- Gaussian normal distribution\n",
84+
"\n",
85+
"- Dirichlet distribution (Beta distrbutioin)\n",
86+
"\n",
87+
"- Gamma distrbutioin\n",
88+
"\n",
89+
"- Mixture of distributions\n",
90+
"\n",
91+
"- Student-t distrbutioin\n"
92+
]
93+
},
94+
{
95+
"cell_type": "markdown",
96+
"metadata": {
97+
"id": "gpPxugOiG4Tf"
98+
},
99+
"source": [
100+
"### Usage example"
101+
]
102+
},
103+
{
104+
"cell_type": "markdown",
105+
"metadata": {
106+
"id": "LZNqMDGpG4Tf"
107+
},
108+
"source": [
109+
"Here is an example of sampling from the [Gamma](https://en.wikipedia.org/wiki/Gamma_distribution) distribution:"
110+
]
111+
},
112+
{
113+
"cell_type": "code",
114+
"source": [
115+
"# Import standard libraries\n",
116+
"import sys\n",
117+
"import os\n",
118+
"import torch\n",
119+
"from torch import nn"
120+
],
121+
"metadata": {
122+
"id": "irRTc6dHKSF3"
123+
},
124+
"execution_count": 32,
125+
"outputs": []
126+
},
127+
{
128+
"cell_type": "code",
129+
"source": [
130+
"# Import IRT library\n",
131+
"!git clone https://github.com/intsystems/implicit-reparameterization-trick.git /tmp/implicit-reparameterization-trick\n",
132+
"sys.path.append(os.path.abspath('/tmp/implicit-reparameterization-trick/src/irt'))\n",
133+
"import distributions as irt"
134+
],
135+
"metadata": {
136+
"collapsed": true,
137+
"colab": {
138+
"base_uri": "https://localhost:8080/"
139+
},
140+
"id": "N7qeViYtIF7A",
141+
"outputId": "b975645b-d35b-4fba-8463-b4e1447a3723"
142+
},
143+
"execution_count": 33,
144+
"outputs": [
145+
{
146+
"output_type": "stream",
147+
"name": "stdout",
148+
"text": [
149+
"fatal: destination path '/tmp/implicit-reparameterization-trick' already exists and is not an empty directory.\n"
150+
]
151+
}
152+
]
153+
},
154+
{
155+
"cell_type": "code",
156+
"execution_count": 34,
157+
"metadata": {
158+
"colab": {
159+
"base_uri": "https://localhost:8080/",
160+
"height": 692
161+
},
162+
"id": "XQBX7iMWG4Tg",
163+
"outputId": "6da1b970-6972-48aa-92dd-05729fcd2e33"
164+
},
165+
"outputs": [
166+
{
167+
"output_type": "stream",
168+
"name": "stdout",
169+
"text": [
170+
"tensor([0.2359, 0.8033]) tensor([-0.0937, -0.7642])\n"
171+
]
172+
},
173+
{
174+
"output_type": "execute_result",
175+
"data": {
176+
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Generated by graphviz version 2.43.0 (0)\n -->\n<!-- Title: %3 Pages: 1 -->\n<svg width=\"273pt\" height=\"490pt\"\n viewBox=\"0.00 0.00 273.00 490.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 486)\">\n<title>%3</title>\n<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-486 269,-486 269,4 -4,4\"/>\n<!-- 136127602221968 -->\n<g id=\"node1\" class=\"node\">\n<title>136127602221968</title>\n<polygon fill=\"#caff70\" stroke=\"black\" points=\"169.5,-31 115.5,-31 115.5,0 169.5,0 169.5,-31\"/>\n<text text-anchor=\"middle\" x=\"142.5\" y=\"-7\" font-family=\"monospace\" font-size=\"10.00\"> ()</text>\n</g>\n<!-- 136127602963744 -->\n<g id=\"node2\" class=\"node\">\n<title>136127602963744</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"190,-86 95,-86 95,-67 190,-67 190,-86\"/>\n<text text-anchor=\"middle\" x=\"142.5\" y=\"-74\" font-family=\"monospace\" font-size=\"10.00\">MeanBackward0</text>\n</g>\n<!-- 136127602963744&#45;&gt;136127602221968 -->\n<g id=\"edge13\" class=\"edge\">\n<title>136127602963744&#45;&gt;136127602221968</title>\n<path fill=\"none\" stroke=\"black\" d=\"M142.5,-66.79C142.5,-60.07 142.5,-50.4 142.5,-41.34\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"146,-41.19 142.5,-31.19 139,-41.19 146,-41.19\"/>\n</g>\n<!-- 136127602956064 -->\n<g id=\"node3\" class=\"node\">\n<title>136127602956064</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"187,-141 98,-141 98,-122 187,-122 187,-141\"/>\n<text text-anchor=\"middle\" x=\"142.5\" y=\"-129\" font-family=\"monospace\" font-size=\"10.00\">PowBackward0</text>\n</g>\n<!-- 136127602956064&#45;&gt;136127602963744 -->\n<g id=\"edge1\" class=\"edge\">\n<title>136127602956064&#45;&gt;136127602963744</title>\n<path fill=\"none\" stroke=\"black\" d=\"M142.5,-121.75C142.5,-114.8 142.5,-104.85 142.5,-96.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"146,-96.09 142.5,-86.09 139,-96.09 146,-96.09\"/>\n</g>\n<!-- 136127602956352 -->\n<g id=\"node4\" class=\"node\">\n<title>136127602956352</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"187,-196 98,-196 98,-177 187,-177 187,-196\"/>\n<text text-anchor=\"middle\" x=\"142.5\" y=\"-184\" font-family=\"monospace\" font-size=\"10.00\">AddBackward0</text>\n</g>\n<!-- 136127602956352&#45;&gt;136127602956064 -->\n<g id=\"edge2\" class=\"edge\">\n<title>136127602956352&#45;&gt;136127602956064</title>\n<path fill=\"none\" stroke=\"black\" d=\"M142.5,-176.75C142.5,-169.8 142.5,-159.85 142.5,-151.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"146,-151.09 142.5,-141.09 139,-151.09 146,-151.09\"/>\n</g>\n<!-- 136127602956304 -->\n<g id=\"node5\" class=\"node\">\n<title>136127602956304</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"134,-251 45,-251 45,-232 134,-232 134,-251\"/>\n<text text-anchor=\"middle\" x=\"89.5\" y=\"-239\" font-family=\"monospace\" font-size=\"10.00\">DivBackward0</text>\n</g>\n<!-- 136127602956304&#45;&gt;136127602956352 -->\n<g id=\"edge3\" class=\"edge\">\n<title>136127602956304&#45;&gt;136127602956352</title>\n<path fill=\"none\" stroke=\"black\" d=\"M98.25,-231.75C105.97,-224.03 117.4,-212.6 126.72,-203.28\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"129.31,-205.64 133.91,-196.09 124.36,-200.69 129.31,-205.64\"/>\n</g>\n<!-- 136127602950352 -->\n<g id=\"node6\" class=\"node\">\n<title>136127602950352</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"149,-306 0,-306 0,-287 149,-287 149,-306\"/>\n<text text-anchor=\"middle\" x=\"74.5\" y=\"-294\" font-family=\"monospace\" font-size=\"10.00\">StandardGammaBackward0</text>\n</g>\n<!-- 136127602950352&#45;&gt;136127602956304 -->\n<g id=\"edge4\" class=\"edge\">\n<title>136127602950352&#45;&gt;136127602956304</title>\n<path fill=\"none\" stroke=\"black\" d=\"M76.98,-286.75C78.96,-279.72 81.82,-269.62 84.31,-260.84\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"87.71,-261.66 87.07,-251.09 80.98,-259.76 87.71,-261.66\"/>\n</g>\n<!-- 136127602958368 -->\n<g id=\"node7\" class=\"node\">\n<title>136127602958368</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"128,-361 21,-361 21,-342 128,-342 128,-361\"/>\n<text text-anchor=\"middle\" x=\"74.5\" y=\"-349\" font-family=\"monospace\" font-size=\"10.00\">ExpandBackward0</text>\n</g>\n<!-- 136127602958368&#45;&gt;136127602950352 -->\n<g id=\"edge5\" class=\"edge\">\n<title>136127602958368&#45;&gt;136127602950352</title>\n<path fill=\"none\" stroke=\"black\" d=\"M74.5,-341.75C74.5,-334.8 74.5,-324.85 74.5,-316.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"78,-316.09 74.5,-306.09 71,-316.09 78,-316.09\"/>\n</g>\n<!-- 136127602958848 -->\n<g id=\"node8\" class=\"node\">\n<title>136127602958848</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"125,-416 24,-416 24,-397 125,-397 125,-416\"/>\n<text text-anchor=\"middle\" x=\"74.5\" y=\"-404\" font-family=\"monospace\" font-size=\"10.00\">AccumulateGrad</text>\n</g>\n<!-- 136127602958848&#45;&gt;136127602958368 -->\n<g id=\"edge6\" class=\"edge\">\n<title>136127602958848&#45;&gt;136127602958368</title>\n<path fill=\"none\" stroke=\"black\" d=\"M74.5,-396.75C74.5,-389.8 74.5,-379.85 74.5,-371.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"78,-371.09 74.5,-361.09 71,-371.09 78,-371.09\"/>\n</g>\n<!-- 136127602052208 -->\n<g id=\"node9\" class=\"node\">\n<title>136127602052208</title>\n<polygon fill=\"lightblue\" stroke=\"black\" points=\"101.5,-482 47.5,-482 47.5,-452 101.5,-452 101.5,-482\"/>\n<text text-anchor=\"middle\" x=\"74.5\" y=\"-470\" font-family=\"monospace\" font-size=\"10.00\">alpha</text>\n<text text-anchor=\"middle\" x=\"74.5\" y=\"-459\" font-family=\"monospace\" font-size=\"10.00\"> (2)</text>\n</g>\n<!-- 136127602052208&#45;&gt;136127602958848 -->\n<g id=\"edge7\" class=\"edge\">\n<title>136127602052208&#45;&gt;136127602958848</title>\n<path fill=\"none\" stroke=\"black\" d=\"M74.5,-451.84C74.5,-444.21 74.5,-434.7 74.5,-426.45\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"78,-426.27 74.5,-416.27 71,-426.27 78,-426.27\"/>\n</g>\n<!-- 136127602959616 -->\n<g id=\"node10\" class=\"node\">\n<title>136127602959616</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"248,-251 159,-251 159,-232 248,-232 248,-251\"/>\n<text text-anchor=\"middle\" x=\"203.5\" y=\"-239\" font-family=\"monospace\" font-size=\"10.00\">SubBackward0</text>\n</g>\n<!-- 136127602959616&#45;&gt;136127602956352 -->\n<g id=\"edge8\" class=\"edge\">\n<title>136127602959616&#45;&gt;136127602956352</title>\n<path fill=\"none\" stroke=\"black\" d=\"M193.7,-231.98C184.68,-224.15 171.09,-212.34 160.18,-202.86\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"162.32,-200.09 152.48,-196.17 157.73,-205.37 162.32,-200.09\"/>\n</g>\n<!-- 136127602957312 -->\n<g id=\"node11\" class=\"node\">\n<title>136127602957312</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"256,-306 167,-306 167,-287 256,-287 256,-306\"/>\n<text text-anchor=\"middle\" x=\"211.5\" y=\"-294\" font-family=\"monospace\" font-size=\"10.00\">DivBackward0</text>\n</g>\n<!-- 136127602957312&#45;&gt;136127602959616 -->\n<g id=\"edge9\" class=\"edge\">\n<title>136127602957312&#45;&gt;136127602959616</title>\n<path fill=\"none\" stroke=\"black\" d=\"M210.18,-286.75C209.13,-279.8 207.63,-269.85 206.31,-261.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"209.75,-260.45 204.8,-251.09 202.83,-261.5 209.75,-260.45\"/>\n</g>\n<!-- 136127602959376 -->\n<g id=\"node12\" class=\"node\">\n<title>136127602959376</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"265,-361 158,-361 158,-342 265,-342 265,-361\"/>\n<text text-anchor=\"middle\" x=\"211.5\" y=\"-349\" font-family=\"monospace\" font-size=\"10.00\">ExpandBackward0</text>\n</g>\n<!-- 136127602959376&#45;&gt;136127602957312 -->\n<g id=\"edge10\" class=\"edge\">\n<title>136127602959376&#45;&gt;136127602957312</title>\n<path fill=\"none\" stroke=\"black\" d=\"M211.5,-341.75C211.5,-334.8 211.5,-324.85 211.5,-316.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"215,-316.09 211.5,-306.09 208,-316.09 215,-316.09\"/>\n</g>\n<!-- 136127602953664 -->\n<g id=\"node13\" class=\"node\">\n<title>136127602953664</title>\n<polygon fill=\"lightgrey\" stroke=\"black\" points=\"262,-416 161,-416 161,-397 262,-397 262,-416\"/>\n<text text-anchor=\"middle\" x=\"211.5\" y=\"-404\" font-family=\"monospace\" font-size=\"10.00\">AccumulateGrad</text>\n</g>\n<!-- 136127602953664&#45;&gt;136127602959376 -->\n<g id=\"edge11\" class=\"edge\">\n<title>136127602953664&#45;&gt;136127602959376</title>\n<path fill=\"none\" stroke=\"black\" d=\"M211.5,-396.75C211.5,-389.8 211.5,-379.85 211.5,-371.13\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"215,-371.09 211.5,-361.09 208,-371.09 215,-371.09\"/>\n</g>\n<!-- 136127601312288 -->\n<g id=\"node14\" class=\"node\">\n<title>136127601312288</title>\n<polygon fill=\"lightblue\" stroke=\"black\" points=\"238.5,-482 184.5,-482 184.5,-452 238.5,-452 238.5,-482\"/>\n<text text-anchor=\"middle\" x=\"211.5\" y=\"-470\" font-family=\"monospace\" font-size=\"10.00\">beta</text>\n<text text-anchor=\"middle\" x=\"211.5\" y=\"-459\" font-family=\"monospace\" font-size=\"10.00\"> (2)</text>\n</g>\n<!-- 136127601312288&#45;&gt;136127602953664 -->\n<g id=\"edge12\" class=\"edge\">\n<title>136127601312288&#45;&gt;136127602953664</title>\n<path fill=\"none\" stroke=\"black\" d=\"M211.5,-451.84C211.5,-444.21 211.5,-434.7 211.5,-426.45\"/>\n<polygon fill=\"black\" stroke=\"black\" points=\"215,-426.27 211.5,-416.27 208,-426.27 215,-426.27\"/>\n</g>\n</g>\n</svg>\n",
177+
"text/plain": [
178+
"<graphviz.graphs.Digraph at 0x7bcead6b0040>"
179+
]
180+
},
181+
"metadata": {},
182+
"execution_count": 34
183+
}
184+
],
185+
"source": [
186+
"# Define parameters for distribution\n",
187+
"alpha, beta = torch.tensor([1.0, 2.0], requires_grad=True), torch.tensor([2.0, 3.0], requires_grad=True)\n",
188+
"# Define Gamma distribution from IRT library\n",
189+
"z = irt.Gamma(alpha, beta).rsample()\n",
190+
"# Calculate loss\n",
191+
"loss = torch.mean(z ** 2)\n",
192+
"# Backpropogate loss through distribution\n",
193+
"loss.backward()\n",
194+
"\n",
195+
"print(alpha.grad, beta.grad)\n",
196+
"torchviz.make_dot(loss, params = {'alpha': alpha, 'beta': beta})"
197+
]
198+
},
199+
{
200+
"cell_type": "markdown",
201+
"metadata": {
202+
"id": "cwlwbQegG4Tg"
203+
},
204+
"source": [
205+
"Below is a demonstration of using [Beta](https://en.wikipedia.org/wiki/Beta_distribution) distribution to train a simple stochastic model:"
206+
]
207+
},
208+
{
209+
"cell_type": "code",
210+
"execution_count": 35,
211+
"metadata": {
212+
"id": "rLb0DCYnG4Tg"
213+
},
214+
"outputs": [],
215+
"source": [
216+
"# Define simple encoder for model\n",
217+
"class SimpleEncoder(nn.Module):\n",
218+
" def __init__(self, input_dim, hidden_dim):\n",
219+
" super().__init__()\n",
220+
" super(SimpleEncoder, self).__init__()\n",
221+
" self.fc = nn.Linear(input_dim, hidden_dim)\n",
222+
"\n",
223+
" def forward(self, x):\n",
224+
" return self.fc(x)\n",
225+
"\n",
226+
"# Define simple decoder for model\n",
227+
"class SimpleDecoder(nn.Module):\n",
228+
" def __init__(self, hidden_dim, output_dim):\n",
229+
" super().__init__()\n",
230+
" super(SimpleDecoder, self).__init__()\n",
231+
" self.fc = nn.Linear(hidden_dim, output_dim)\n",
232+
"\n",
233+
" def forward(self, x):\n",
234+
" return self.fc(x)\n",
235+
"\n",
236+
"# Define simple model\n",
237+
"class SimpleModel(nn.Module):\n",
238+
" def __init__(self):\n",
239+
" super().__init__()\n",
240+
" self.encoder = SimpleEncoder(20, 10)\n",
241+
" self.decoder = SimpleEncoder(5, 20)\n",
242+
"\n",
243+
" def forward(self, x):\n",
244+
" x = nn.functional.softmax(self.encoder(x), dim=0)\n",
245+
" alpha, beta = x.chunk(2, dim=0)\n",
246+
" y = irt.Beta(alpha, beta).rsample()\n",
247+
" y = self.decoder(y)\n",
248+
" return y"
249+
]
250+
},
251+
{
252+
"cell_type": "code",
253+
"execution_count": 36,
254+
"metadata": {
255+
"id": "6L0djQVCG4Th"
256+
},
257+
"outputs": [],
258+
"source": [
259+
"model = SimpleModel()\n",
260+
"x = torch.randn(20)\n",
261+
"y = model(x)\n",
262+
"loss = y.mean()\n",
263+
"loss.backward()"
264+
]
265+
},
266+
{
267+
"cell_type": "markdown",
268+
"metadata": {
269+
"id": "WlD1oeQOG4Th"
270+
},
271+
"source": [
272+
"### Development"
273+
]
274+
},
275+
{
276+
"cell_type": "markdown",
277+
"metadata": {
278+
"id": "0KTd4OzEG4Th"
279+
},
280+
"source": [
281+
"If you want to use the code of the IRT library in your project, it is essential to ensure that your implementation successfully passes all the necessary [tests](https://github.com/intsystems/implicit-reparameterization-trick/blob/main/code/run_unittest.py). "
282+
]
283+
},
284+
{
285+
"cell_type": "markdown",
286+
"metadata": {
287+
"id": "bnTEpaGGG4Th"
288+
},
289+
"source": [
290+
"### Documentation"
291+
]
292+
},
293+
{
294+
"cell_type": "markdown",
295+
"metadata": {
296+
"id": "a4ROycAmG4Th"
297+
},
298+
"source": [
299+
"\n",
300+
"\n",
301+
"For comprehensive information and guidance regarding the features and functionalities of IRT library, you can find the full documentation by following this [link](https://intsystems.github.io/implicit-reparameterization-trick/)."
302+
]
303+
}
304+
],
305+
"metadata": {
306+
"kernelspec": {
307+
"display_name": "Python 3",
308+
"language": "python",
309+
"name": "python3"
310+
},
311+
"language_info": {
312+
"codemirror_mode": {
313+
"name": "ipython",
314+
"version": 3
315+
},
316+
"file_extension": ".py",
317+
"mimetype": "text/x-python",
318+
"name": "python",
319+
"nbconvert_exporter": "python",
320+
"pygments_lexer": "ipython3",
321+
"version": "3.10.15"
322+
},
323+
"colab": {
324+
"provenance": []
325+
}
326+
},
327+
"nbformat": 4,
328+
"nbformat_minor": 0
329+
}

0 commit comments

Comments
 (0)