|
|
|
@ -3,7 +3,7 @@
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 1,
|
|
|
|
"execution_count": 1,
|
|
|
|
"id": "sustained-board",
|
|
|
|
"id": "closed-glenn",
|
|
|
|
"metadata": {
|
|
|
|
"metadata": {
|
|
|
|
"tags": []
|
|
|
|
"tags": []
|
|
|
|
},
|
|
|
|
},
|
|
|
|
@ -16,7 +16,7 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"id": "numeric-victoria",
|
|
|
|
"id": "naval-ivory",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"# Setup Functions\n",
|
|
|
|
"# Setup Functions\n",
|
|
|
|
@ -26,7 +26,7 @@
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 2,
|
|
|
|
"execution_count": 2,
|
|
|
|
"id": "virtual-arlington",
|
|
|
|
"id": "italian-enforcement",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
@ -39,17 +39,22 @@
|
|
|
|
" return lambda *args: f(g(*args))\n",
|
|
|
|
" return lambda *args: f(g(*args))\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
"def compose_recursive_functions(fn,n):\n",
|
|
|
|
"def compose_recursive_functions(fn,n):\n",
|
|
|
|
|
|
|
|
" #takes a function fn and composes it with itself n times\n",
|
|
|
|
|
|
|
|
" #Returns each of the iterations of the functions.\n",
|
|
|
|
|
|
|
|
" \n",
|
|
|
|
" #Set base conditions\n",
|
|
|
|
" #Set base conditions\n",
|
|
|
|
" out_func = None\n",
|
|
|
|
" out_func = None\n",
|
|
|
|
" out_func_list =[]\n",
|
|
|
|
" out_func_list =[]\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
" #build the compositions of functions\n",
|
|
|
|
" #build the compositions of functions\n",
|
|
|
|
" for f in itertools.repeat(fn, n):\n",
|
|
|
|
" for f in itertools.repeat(fn, n):\n",
|
|
|
|
|
|
|
|
" #if first iteration\n",
|
|
|
|
" if out_func == None:\n",
|
|
|
|
" if out_func == None:\n",
|
|
|
|
" out_func = f\n",
|
|
|
|
" out_func = f\n",
|
|
|
|
" else:\n",
|
|
|
|
" else:\n",
|
|
|
|
" out_func = compose(f,out_func)\n",
|
|
|
|
" out_func = compose(f,out_func)\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" #append the ou\n",
|
|
|
|
" out_func_list.append(out_func)\n",
|
|
|
|
" out_func_list.append(out_func)\n",
|
|
|
|
" \n",
|
|
|
|
" \n",
|
|
|
|
" return out_func_list"
|
|
|
|
" return out_func_list"
|
|
|
|
@ -57,7 +62,7 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"id": "wrapped-message",
|
|
|
|
"id": "fancy-tucson",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"## Setup functions related to the problem"
|
|
|
|
"## Setup functions related to the problem"
|
|
|
|
@ -65,8 +70,8 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 3,
|
|
|
|
"execution_count": 15,
|
|
|
|
"id": "neutral-vietnamese",
|
|
|
|
"id": "outside-arrangement",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
@ -77,17 +82,18 @@
|
|
|
|
" #Gompertz distribution for simplicity\n",
|
|
|
|
" #Gompertz distribution for simplicity\n",
|
|
|
|
" #commonly used with saturation\n",
|
|
|
|
" #commonly used with saturation\n",
|
|
|
|
" #TODO: ACTUALLY DERIVE A SURVIVAL FUNCTION. THIS IS JUST A PLACEHOLDER. PROBABLY SHOULD BE AN EXPONENTIAL DISTRIBUTION\n",
|
|
|
|
" #TODO: ACTUALLY DERIVE A SURVIVAL FUNCTION. THIS IS JUST A PLACEHOLDER. PROBABLY SHOULD BE AN EXPONENTIAL DISTRIBUTION\n",
|
|
|
|
" eta = 1.0/(SCALING@stock)\n",
|
|
|
|
|
|
|
|
" b = 1/debris\n",
|
|
|
|
|
|
|
|
" \n",
|
|
|
|
" \n",
|
|
|
|
" return 1 - ( b*eta*torch.exp(eta+b*stock-eta*torch.exp(b*stock)))\n",
|
|
|
|
" #eta = 1.0/(SCALING@stock)\n",
|
|
|
|
|
|
|
|
" #b = 1/debris\n",
|
|
|
|
|
|
|
|
" #return 1 - ( b*eta*torch.exp(eta+b*stock-eta*torch.exp(b*stock)))\n",
|
|
|
|
|
|
|
|
" return 1 - torch.exp(-SCALING * stock-debris)\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
"def test_launch(stock, debris):\n",
|
|
|
|
"def test_launch(stock, debris):\n",
|
|
|
|
" return torch.ones(5, requires_grad=True)\n",
|
|
|
|
" return torch.ones(5, requires_grad=True)\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
"def laws_of_motion(stock, debris, launches):\n",
|
|
|
|
"def laws_of_motion(stock, debris, launches):\n",
|
|
|
|
" \n",
|
|
|
|
" \n",
|
|
|
|
" new_stock = stock*survival(stock,debris) + launches(stock,debris) #TODO: Launches will become a function (neural network)\n",
|
|
|
|
" new_stock = stock*survival(stock,debris) + launches#(stock,debris) #TODO: Launches will become a function (neural network)\n",
|
|
|
|
" \n",
|
|
|
|
" \n",
|
|
|
|
" #TODO: Currently Ignoring autocatalysis\n",
|
|
|
|
" #TODO: Currently Ignoring autocatalysis\n",
|
|
|
|
" new_debris = (1-DELTA)*debris + LAUNCH_DEBRIS_RATE * launches.sum() + COLLISION_DEBRIS_RATE*(1-survival(stock,debris)) @ stock\n",
|
|
|
|
" new_debris = (1-DELTA)*debris + LAUNCH_DEBRIS_RATE * launches.sum() + COLLISION_DEBRIS_RATE*(1-survival(stock,debris)) @ stock\n",
|
|
|
|
@ -101,8 +107,8 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 4,
|
|
|
|
"execution_count": 16,
|
|
|
|
"id": "considered-configuration",
|
|
|
|
"id": "romance-generation",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
@ -128,7 +134,10 @@
|
|
|
|
" #This gets the transition of the value function derivatives over time.\n",
|
|
|
|
" #This gets the transition of the value function derivatives over time.\n",
|
|
|
|
" transitioned = single_transition(\n",
|
|
|
|
" transitioned = single_transition(\n",
|
|
|
|
" item_to_transition, #item to iterate, i.e. the derivatives of the value function\n",
|
|
|
|
" item_to_transition, #item to iterate, i.e. the derivatives of the value function\n",
|
|
|
|
" laws_motion, profit, launch, #functions #TODO: reimplement with launch as a function\n",
|
|
|
|
" #functions\n",
|
|
|
|
|
|
|
|
" laws_motion, \n",
|
|
|
|
|
|
|
|
" profit, \n",
|
|
|
|
|
|
|
|
" launch, #TODO: reimplement with launch as a function\n",
|
|
|
|
" stocks, debris #states\n",
|
|
|
|
" stocks, debris #states\n",
|
|
|
|
" )\n",
|
|
|
|
" )\n",
|
|
|
|
" \n",
|
|
|
|
" \n",
|
|
|
|
@ -140,7 +149,7 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"id": "premium-lesbian",
|
|
|
|
"id": "fluid-parks",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"# Actual calculations"
|
|
|
|
"# Actual calculations"
|
|
|
|
@ -148,8 +157,8 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 5,
|
|
|
|
"execution_count": 17,
|
|
|
|
"id": "suffering-google",
|
|
|
|
"id": "changing-january",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
@ -180,32 +189,118 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": 10,
|
|
|
|
"execution_count": 19,
|
|
|
|
"id": "checked-medication",
|
|
|
|
"id": "dominant-boost",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"name": "stdout",
|
|
|
|
"name": "stdout",
|
|
|
|
"output_type": "stream",
|
|
|
|
"output_type": "stream",
|
|
|
|
"text": [
|
|
|
|
"text": [
|
|
|
|
"tensor([-0.1543, 1.3888, 1.1316, 1.1316, 1.1553], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([0.0000, 1.2632, 1.0526, 1.0526, 1.0892], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([-1.2150, 1.6724, 1.1912, 1.1912, 1.2161], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([-0.9519, 1.3928, 1.0020, 1.0020, 1.0575], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([-2.3316, 1.9710, 1.2539, 1.2539, 1.2801], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([-1.8565, 1.5150, 0.9530, 0.9530, 0.9882], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([nan, nan, nan, nan, nan], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([-2.8103, 1.6872, 0.9376, 0.9376, 0.9474], grad_fn=<MvBackward>)\n",
|
|
|
|
"tensor([nan, nan, nan, nan, nan], grad_fn=<MvBackward>)\n"
|
|
|
|
"tensor([-3.8626, 1.9131, 0.9505, 0.9505, 0.9408], grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-5.0235, 2.1830, 0.9819, 0.9819, 0.9598], grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-6.2860, 2.4869, 1.0247, 1.0247, 0.9951], grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-7.6403, 2.8175, 1.0746, 1.0746, 1.0403], grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-9.0802, 3.1712, 1.1293, 1.1293, 1.0918], grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-10.6035, 3.5462, 1.1879, 1.1879, 1.1477],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-12.2108, 3.9422, 1.2501, 1.2501, 1.2075],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-13.9045, 4.3597, 1.3157, 1.3157, 1.2708],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-15.6882, 4.7995, 1.3849, 1.3849, 1.3375],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-17.5662, 5.2625, 1.4577, 1.4577, 1.4079],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-19.5432, 5.7500, 1.5345, 1.5345, 1.4820],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-21.6244, 6.2631, 1.6152, 1.6152, 1.5600],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-23.8151, 6.8033, 1.7002, 1.7002, 1.6421],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-26.1212, 7.3719, 1.7897, 1.7897, 1.7285],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-28.5486, 7.9704, 1.8839, 1.8839, 1.8195],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-31.1038, 8.6004, 1.9831, 1.9831, 1.9152],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-33.7934, 9.2636, 2.0874, 2.0874, 2.0160],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-36.6247, 9.9617, 2.1973, 2.1973, 2.1221],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-39.6049, 10.6965, 2.3129, 2.3129, 2.2338],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-42.7420, 11.4700, 2.4347, 2.4347, 2.3514],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-46.0442, 12.2842, 2.5628, 2.5628, 2.4751],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-49.5202, 13.1413, 2.6977, 2.6977, 2.6054],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-53.1792, 14.0435, 2.8397, 2.8397, 2.7425],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-57.0307, 14.9931, 2.9891, 2.9891, 2.8869],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-61.0850, 15.9928, 3.1465, 3.1465, 3.0388],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-65.3526, 17.0450, 3.3121, 3.3121, 3.1988],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-69.8449, 18.1526, 3.4864, 3.4864, 3.3671],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-74.5736, 19.3186, 3.6699, 3.6699, 3.5443],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-79.5511, 20.5459, 3.8630, 3.8630, 3.7309],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-84.7907, 21.8378, 4.0664, 4.0664, 3.9272],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-90.3060, 23.1976, 4.2804, 4.2804, 4.1339],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-96.1115, 24.6291, 4.5057, 4.5057, 4.3515],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-102.2227, 26.1359, 4.7428, 4.7428, 4.5805],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-108.6555, 27.7220, 4.9924, 4.9924, 4.8216],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-115.4268, 29.3916, 5.2552, 5.2552, 5.0754],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-122.5545, 31.1490, 5.5318, 5.5318, 5.3425],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-130.0574, 32.9990, 5.8229, 5.8229, 5.6237],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-137.9552, 34.9463, 6.1294, 6.1294, 5.9197],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-146.2686, 36.9961, 6.4520, 6.4520, 6.2313],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-155.0196, 39.1538, 6.7916, 6.7916, 6.5592],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-164.2312, 41.4251, 7.1490, 7.1490, 6.9044],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-173.9275, 43.8158, 7.5253, 7.5253, 7.2678],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-184.1343, 46.3325, 7.9213, 7.9213, 7.6503],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-194.8782, 48.9815, 8.3382, 8.3382, 8.0530],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-206.1876, 51.7701, 8.7771, 8.7771, 8.4768],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n",
|
|
|
|
|
|
|
|
"tensor([-218.0922, 54.7053, 9.2391, 9.2391, 8.9230],\n",
|
|
|
|
|
|
|
|
" grad_fn=<MvBackward>)\n"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"#calculate results for first 5 iterations\n",
|
|
|
|
"#calculate results for first 5 iterations\n",
|
|
|
|
"for f in compose_recursive_functions(transition_wrapper,5):\n",
|
|
|
|
"for f in compose_recursive_functions(transition_wrapper,50):\n",
|
|
|
|
" result = f(base_data)\n",
|
|
|
|
" result = f(base_data)\n",
|
|
|
|
" print(result[5])"
|
|
|
|
" print(result[5])"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"id": "wanted-principal",
|
|
|
|
"id": "unnecessary-architect",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"Note how this fails on the last few iterations.\n",
|
|
|
|
"Note how this fails on the last few iterations.\n",
|
|
|
|
@ -220,7 +315,7 @@
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": null,
|
|
|
|
"execution_count": null,
|
|
|
|
"id": "solid-correlation",
|
|
|
|
"id": "varying-organization",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": []
|
|
|
|
"source": []
|
|
|
|
|