This commit is contained in:
Steven G. Johnson committed 2023-03-24 09:48:37 -04:00
1 parent 1245519751
commit 878e531fdd
1 file changed
+85 -73
+85 -73
View File
@@ -54,7 +54,7 @@
"$$\n",
"f(x) = \\frac{1}{m} \\sum_{i=1}^m f_i(x) \\longrightarrow_{m \\to \\infty} E[f_i(x)]\\, .\n",
"$$\n",
"where the different functions $f_i(x)$ correspond to **samples** from a **training set** of $m \\gg 1$ data points. In the limit $m \\to \\infty$, this corresponds to minimizing the **expected value**.\n",
"where the different functions $f_i(x)$ correspond to **samples** from a **training set** of $m \\gg 1$ data points. In the limit $m \\to \\infty$, this corresponds to minimizing the **expected value**. (For example, if training examples are drawn randomly from some distribution (for [unsupervised learning](https://en.wikipedia.org/wiki/Unsupervised_learning)), you effectively have an infinite training set.)\n",
"\n",
"The most familiar example is probably **least-square fitting**, $f_i(x)$ is the squared difference between a model and a training data point $(\\text{input}_i, \\text{output}_i)$:\n",
"$$\n",
@@ -64,7 +64,7 @@
"$$\n",
"f_i(x) = -\\log L(\\text{output}_i | \\text{model}(x, \\text{input}_i))\n",
"$$\n",
"and there are many other examples of this form.\n",
"(where $L$ is a likelihood function in some statistical model, e.g. corresponding to [cross-entropy loss](https://en.wikipedia.org/wiki/Cross_entropy) in [classification problems](https://towardsdatascience.com/cross-entropy-for-classification-d98e7f974451)). There are many other examples of this $f = \\sum_i f_i$ form.\n",
"\n",
"Gradient descent and related algorithms update the parameters $x$ using the gradient $\\nabla f$ evaluated at the current point (or possibly a linear combination of gradients at different points), but evaluating the gradient exactly might be very expensive if $m$ is large. However, by linearity, what we are computing is\n",
"$$\n",
@@ -105,8 +105,8 @@
"data": {
"text/plain": [
"2-element Vector{Float64}:\n",
" 0.9810159499575486\n",
" 2.0106501768678204"
" 1.041613576351668\n",
" 2.01074076723373"
]
},
"execution_count": 2,
@@ -130,7 +130,7 @@
"outputs": [
{
"data": {
"image/png": "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WVlZnraUlBSRmprqM0a7du1Un7eWixcvigsXLoi0tDRx3XXXqe4BEAkJCarPUQghOnfuLJKSkkRubq6qffDgwSIuLs6nv96arrrqKp92AGLcuHGev9977z2f9yQkEtA0Q0oV+fn5+Pbbb3HvvfeifPnynnaXy4W+ffsiJycHu3btUj1zzz33qP7etGkTzp0752ODb9OmDVJSUiyv5d///rfq72uuuQbnzp3DsWPHPG0//PAD/v3vf6NKlSpwuVwoU6YMHnzwQRQWFmL37t2q5ytXroyOHTv6zDNkyBBs374d33zzDQAgLy8Pb7/9NlJTU1V7YIVPPvkEDocDffr0wcWLFz1XzZo10bRpU5U549ixYxg4cCCSk5NxySWXoEyZMp792blzp6ffDTfcgAULFuDll1/G5s2bfcxOZhQWFqrW4Xa7AQAtWrQAANx3331YtmwZDh8+7PNsVlYWrrrqKjRt2lTV/sADD1ieX4/33nsPN954I8qXL+9573nz5qneWaZjx46oXLmy5+9z587h66+/xl133YWyZcuq3u3222/HuXPnsHnz5qDWR0i0QUGElCpOnToFIQRq1arlc6927doA4DEJyGj7yvdr1qzpM4ZemxFVqlRR/R0bGwtAcogFgEOHDuGmm27C4cOHMX36dKxfvx5bt271mFPkfkbrlOnevTvq1avneW7BggXIz8/HoEGDLK9V5s8//4QQAjVq1ECZMmVU1+bNmz3+H263G506dcIHH3yAkSNH4uuvv8aWLVs8h6hy7UuXLkVqaireeOMNtG7dGomJiXjwwQdx9OhRv+u55ZZbVGuQfUBuvvlmfPjhh7h48SIefPBBJCUloUmTJliyZInn2b/++ivoz1DLBx98gPvuuw916tTBokWLsGnTJmzduhX9+vXDuXPnfPrrfbcuXryI1157zWd/b7/9dgDw8bEhpLhDHxFSqqhcuTKcTieOHDnic++PP/4AAFStWlXVrnWMlAUIvYPy6NGjIQuF/PDDD5Gfn48PPvhApWnZvn27bn8jB06n04lBgwZhzJgxmDJlCmbOnIlbbrnFsi+LkqpVq8LhcGD9+vUewUmJ3PbLL7/gxx9/xIIFC5Camuq5v3fvXt0xX331Vbz66qs4dOgQPv74Y4waNQrHjh3DF198Ybqe2bNn4/Tp06qxZLp3747u3bujoKAAmzdvRnp6Oh544AHUq1cPrVu3RpUqVQw/Qy1xcXEoKCjwaT9x4oRqzkWLFqF+/fpYunSp6vPQexbw/cwqV67s0c4ZCYr169fXbSekuEJBhJQqypUrh5YtW+KDDz7A5MmTPaGSbrcbixYtQlJSEi699FLTMVq1aoW4uDi88847KrPNxo0bcfDgwZAJIvIhpTzwhRCYO3eu7bEeeeQRjB8/Hr1798auXbswadKkgNZ0xx13YOLEiTh8+DDuu+8+w356awckwcGMunXrYvDgwfj66689piR5HK0GCIAlYSo2Nhbt2rVDpUqVsHLlSvzwww9o3bo1OnTogIyMDPz4448q88zixYt9xqhXrx5++uknVdvu3buxa9culSDicDgQExOjEjCOHj2qGzWjR9myZdGhQwf88MMPuOaaaxATE2PpuUDQauAIiRQUREipIz09Hbfddhs6dOiA4cOHIyYmBjNnzsQvv/yCJUuW+A0NrVy5MoYPH46XX34ZjzzyCHr06IHs7GyMHz8+KLW+lttuuw0xMTG4//77MXLkSJw7dw6zZs3CqVOnbI9VqVIlPPjgg5g1axZSUlLQrVu3gNZ044034tFHH8XDDz+Mbdu24eabb0a5cuVw5MgRbNiwAVdffTUee+wxXH755WjYsCFGjRoFIQQSExOxYsUKrFq1SjVebm4uOnTogAceeACXX345KlSogK1bt+KLL77A3Xff7el39dVX44MPPsCsWbPQrFkzOJ1ONG/e3HCdzz//PHJycnDLLbcgKSkJf//9N6ZPn44yZcqgXbt2AIChQ4fizTffRNeuXfHyyy97omZ+++03n/H69u2LPn364PHHH8c999yDgwcPIiMjA9WqVVP1u+OOO/DBBx/g8ccf90RTvfTSS6hVqxb27NljaY+nT5+Otm3b4qabbsJjjz2GevXq4fTp09i7dy9WrFihivwJhiZNmgAA5syZgwoVKiAuLg7169f3MRkSEnYi6ytLSGRYv3696NixoyhXrpyIj48XrVq1EitWrFD1kaNmtm7d6vO82+0W6enpIjk5WcTExIhrrrlGrFixwieKwixq5vjx47rz7d+/39O2YsUK0bRpUxEXFyfq1KkjRowYIT7//HOfaAejSAkla9asEQDExIkT/W/Q/9BGzci8+eabomXLlp79a9iwoXjwwQfFtm3bPH127NghbrvtNlGhQgVRuXJl0aNHD3Ho0CFV9Ma5c+fEwIEDxTXXXCMqVqwo4uPjxWWXXSbGjRsn8vPzPWOdPHlS3HvvvaJSpUrC4XAIf//X9cknn4guXbqIOnXqiJiYGFG9enVx++23i/Xr16v6yWuMi4sTiYmJIi0tTXz00Uc+++t2u0VGRoZo0KCBiIuLE82bNxerV6/Line truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGxCAYAAABfrt1aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACJHUlEQVR4nO2deXjU1PrHv5mRtkChUKBsLYvCVRRxYUcU0KvoRcWFTRGqVnYURTbFK7ixFAS5CsiOPxWkLqi4IUpBvCwFETcQECltWWS1ZWsLnfP7IzfTTCbJJNOZzkz7/TxPnjrJyclJZuS8ec/7fl9JCCFACCGEEBICHKEeACGEEELKLzRECCGEEBIyaIgQQgghJGTQECGEEEJIyKAhQgghhJCQQUOEEEIIISGDhgghhBBCQgYNEUIIIYSEDBoihBBCCAkZNEQICSCdO3dG586d3Z8zMzMhSRKWLl0asjGVhIcffhiNGjUK9TCwbNkyvPbaa6EeRkRw8uRJ9OnTBwkJCZAkCffccw8AQJIkTJw40d1u586dmDhxIjIzM0MyTkIULgn1AAgpy9StWxebNm3CZZddFuqhRDTLli3Dr7/+iieffDLUQwl7XnrpJaxcuRKLFy/GZZddhvj4eADApk2bkJiY6G63c+dOvPDCC+jcuXNYGJuk/EJDhBAbnD9/HjExMZAkyVL76OhotGvXLsij0ufcuXOoVKlSSK5N7COEQH5+PipWrFiifn799Vdcdtll6Nu3r8f+UP0OCfEFl2ZIueT777/HLbfcgipVqqBSpUro0KEDPv/8c482S5cuhSRJ+Prrr/Hoo4+iVq1aqFSpEgoKCiCEQGpqKho2bIiYmBhcf/31+PLLL72uo7c0M3HiREiShN9++w0PPPAA4uLiULt2bTz66KPIzc31OH/27Nm46aabkJCQgMqVK+Pqq69GamoqLly44NGuc+fOaN68Ob777jt06NABlSpVwqOPPoqUlBTEx8fj3LlzXmO7+eabcdVVV9l+dkIIzJkzB9deey0qVqyI6tWro0ePHvjzzz892q1Zswbdu3dHYmIiYmJi0KRJEwwaNAjHjx/3aHfs2DEMHDgQSUlJiI6ORq1atXDDDTfgm2++cd/b559/jgMHDkCSJPfmi/fffx9t27ZFXFwcKlWqhEsvvRSPPvqoR5vff/8dt99+OypVqoSaNWti8ODBWLVqFSRJwrp169ztGjVqhIcfftjrGtqluPz8fDz99NO49tprERcXh/j4eLRv3x6ffPKJ17mSJGH48OF488030axZM0RHR+Ott94CAOzduxcPPvggEhISEB0djWbNmmH27Nmm96v81r755hvs2rXL/ZyU+1AvzSxduhQ9e/YEAHTp0sXdNlKXEElkQ48IKXesX78et956K1q0aIFFixYhOjoac+bMwV133YXly5ejd+/eHu0fffRRdOvWDW+//TbOnj2LChUq4IUXXsALL7yAlJQU9OjRA9nZ2RgwYACKiopw+eWXWxrH/fffj969eyMlJQW//PILnnnmGQDA4sWL3W327duHBx98EI0bN0ZUVBR++uknvPLKK/j999892gHA4cOH8dBDD2HMmDGYNGkSHA4HqlWrhsWLF2PZsmV47LHH3G137tyJ9PR0n5ObHoMGDcLSpUvxxBNPYOrUqTh58iRefPFFdOjQAT/99BNq167tHnv79u3x2GOPIS4uDpmZmZgxYwY6duyIX375BRUqVAAA9OvXD9u3b8crr7yCf/zjH/j777+xfft2nDhxAgAwZ84cDBw4EPv27cPKlSstjXHTpk3o3bs3evfujYkTJyImJgYHDhzA2rVr3W3++usvdOrUCRUqVMCcOXNQu3ZtvPvuuxg+fLjtZ6JQUFCAkydPYtSoUahfvz4KCwvxzTff4L777sOSJUvQv39/j/Yff/wxNmzYgOeffx516tRBQkICdu7ciQ4dOqBBgwZ49dVXUadOHaxevRpPPPEEjh8/jgkTJuheW1kGHDp0KHJzc/Huu+8CAK688kqvtt26dcOkSZPw7LPPYvbs2bj++usBgEuIJDQIQsoZ7dq1EwkJCeL06dPufRcvXhTNmzcXiYmJwuVyCSGEWLJkiQAg+vfv73H+qVOnRExMjLj33ns99v/3v/8VAESnTp3c+/bv3y8AiCVLlrj3TZgwQQAQqampHucPHTpUxMTEuK+vpaioSFy4cEH83//9n3A6neLkyZPuY506dRIAxLfffut1XqdOncS1117rsW/IkCGiatWqHs9Aj+TkZNGwYUP3502bNgkA4tVXX/Vol52dLSpWrCjGjBmj24/L5RIXLlwQBw4cEADEJ5984j4WGxsrnnzySdNxdOvWzWMcvpg+fboAIP7++2/DNmPHjhWSJIkdO3Z47L/11lsFAJGenu7e17BhQ5GcnOzVR6dOnTy+by0XL14UFy5cECkpKeK6667zOAZAxMXFeXyPQgjRtWtXkZiYKHJzcz32Dx8+XMTExHi11xvTVVdd5bUfgJgwYYL78/vvv+91n4SEAi7NkHLF2bNnsWXLFvTo0QOxsbHu/U6nE/369UNOTg52797tcc7999/v8XnTpk3Iz8/3WoPv0KEDGjZsaHksd999t8fnFi1aID8/H0ePHnXv+/HHH3H33XejRo0acDqdqFChAvr374+ioiLs2bPH4/zq1avj5ptv9rrOiBEjsGPHDvz3v/8FAOTl5eHtt99GcnKyxzOwwmeffQZJkvDQQw/h4sWL7q1OnTq45pprPJYzjh49isGDByMpKQmXXHIJKlSo4H4+u3btcrdr06YNli5dipdffhmbN2/2WnYyo6ioyGMcLpcLANC6dWsAQK9evZCWloaDBw96nZueno6rrroK11xzjcf+Bx980PL19Xj//fdxww03IDY21n3fixYt8rhnhZtvvhnVq1d3f87Pz8e3336Le++9F5UqVfK4t3/961/Iz8/H5s2bSzQ+QsINGiKkXHHq1CkIIVC3bl2vY/Xq1QMA95KAgratcrxOnTpefejtM6JGjRoen6OjowHIAbEAkJWVhRtvvBEHDx7ErFmzsGHDBmzdutW9nKK0MxqnQvfu3dGoUSP3eUuXLsXZs2cxbNgwy2NV+OuvvyCEQO3atVGhQgWPbfPmze74D5fLhdtuuw0fffQRxowZg2+//RYZGRnuSVQ99hUrViA5ORkLFy5E+/btER8fj/79++PIkSM+x3PLLbd4jEGJAbnpppvw8ccf4+LFi+jfvz8SExPRvHlzLF++3H3uiRMnSvwdavnoo4/Qq1cv1K9fH++88w42bdqErVu34tFHH0V+fr5Xe73f1sWLF/H66697Pd9//etfAOAVY0NIpMMYEVKuqF69OhwOBw4fPux17NChQwCAmjVreuzXBkYqBoTeRHnkyJGApUJ+/PHHOHv2LD766CMPT8uOHTt02xsFcDocDgwbNgzPPvssXn31VcyZMwe33HKL5VgWNTVr1oQkSdiwYYPbcFKj7Pv111/x008/YenSpUhOTnYf/+OPP3T7fO211/Daa68hKysLn376KcaNG4ejR4/iq6++Mh3PvHnzcPr0aY++FLp3747u3bujoKAAmzdvxuTJk/Hggw+iUaNGaN++PWrUqGH4HWqJiYlBQUGB1/7jx497XPOdd95B48aNsWLFCo/vQ+9cwPs7q169uts7Z2QoNm7cWHc/IZEKDRFSrqhcuTLatm2Ljz76CNOnT3enSrpcLrzzzjtITEzEP/7xD9M+2rVrh5iYGLz77rseyzYbN27EgQMHAmaIKJOUesIXQmDBggW2+3rssccwceJE9O3bF7t378bUqVP9GtOdd96JKVOm4ODBg+jVq5dhO72xA7LhYEaDBg0wfPhwfPvtt+6lJKUfrQcIgCVjKjo6Gp06dUK1atWwevVq/Pjjj2jfvj26dOmC1NRU/PTTTx7LM8uWLfPqo1GjRvj555899u3Zswe7d+/2MEQkSUJUVJSHgXHkyBHdrBk9KlWqhC5duuDHH39EixYtEBUVZek8f9B64AgJFTRESLlj8uTJuPXWW9GlSxeMGjUKUVFRmDNnDn799VcsX77cZ2po9erVMWrUKLz88st47LHH0LNnT2RnZ2PixIklcutrufXWWxEVFYUHHngAY8aMQX5+PubOnYtTp07Z7qtatWro378/5s6di4YNG+Kuu+7ya0w33HADBg4ciEceeQTbtm3DTTfdhMqVK+Pw4cP4/vvvcfXVV2PIkCG44oorcNlll2HcuHEQQiA+Ph6rVq3CmjVrPPrLzc1Fly5d8OCDD+KKK65AlSpVsHXrVnz11Ve477773O2uvvpqfPTRR5g7dy5atmwJh8OBVq1aGY7z+eefR05ODm655RYkJibi77//xqxZs1ChQgV06tQJAPDkk09i8eLF6NatG15++WV31szvv//u1V+/fv3w0EMPYejQobj//vtx4MABpKamolatWh7t7rzzTnz00UcYOnSoO5vqpZdeQt26dbF3715Lz3jWrFno2LEjbrzxRgwZMgSNGjXC6dOn8ccff2DVqlUemT8loXnz5gCA+fPno0qVKoiJiUHjxo29lgwJCTqhjZUlJDRs2LBB3HzzzaJy5cqiYsWKol27dmLVqlUebZSsma1bt3qd73K5xOTJk0VSUpKIiooSLVq0EKtWrfLKojDLmjl27Jju9fbv3+/et2rVKnHNNdeImJgYUb9+fTF69Gjx5ZdfemU7GGVKqFm3bp0AIKZMmeL7Af0PbdaMwuLFi0Xbtm3dz++yyy4T/fv3F9u2bXO32blzp7j11ltFlSpVRPXq1UXPnj1FVlaWR/ZGfn6+GDx4sGjRooWoWrWqqFixorj88svFhAkTxNmzZ919nTx5UvTo0UNUq1ZNSJIkfP3T9dlnn4k77rhD1K9fX0RFRYmEhATxr3/9S2zYsMGjnTLGmJgYER8fL1JSUsQnn3zi9XxdLpdITU0Vl156qYiJiRGLine truncated
"text/plain": [
"Figure(PyObject <Figure size 640x480 with 1 Axes>)"
]
@@ -141,7 +141,7 @@
{
"data": {
"text/plain": [
"PyObject <matplotlib.legend.Legend object at 0x16e5a6370>"
"PyObject <matplotlib.legend.Legend object at 0x292f55370>"
]
},
"execution_count": 3,
@@ -186,7 +186,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"L = (2 / m) * maximum(eigvals(A' * A)) = 2.123906669309509\n"
"L = (2 / m) * maximum(eigvals(A' * A)) = 2.0438346691301557\n"
]
},
{
@@ -311,7 +311,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "8132048262554526504",
"id": "8040872608220666544",
"imports": {
"data": [
{
@@ -343,16 +343,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.05\",\"0.1\",\"0.15\",\"0.2\",\"0.25\",\"0.3\",\"0.35\",\"0.4\",\"0.45\",\"0.5\",\"0.55\",\"0.6\",\"0.65\",\"0.7\",\"0.75\",\"0.8\",\"0.85\",\"0.9\",\"0.95\",\"1.0\",\"1.05\",\"1.1\",\"1.15\",\"1.2\",\"1.25\",\"1.3\",\"1.35\",\"1.4\",\"1.45\",\"1.5\",\"1.55\",\"1.6\",\"1.65\",\"1.7\",\"1.75\",\"1.8\",\"1.85\",\"1.9\",\"1.95\",\"2.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"8132048262554526504\",\"id\":\"9148820159079828842\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"8132048262554526504\",\"id\":\"1804693577850608861\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"8132048262554526504\",\"id\":\"9148820159079828842\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"8132048262554526504\",\"id\":\"1804693577850608861\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.05\",\"0.1\",\"0.15\",\"0.2\",\"0.25\",\"0.3\",\"0.35\",\"0.4\",\"0.45\",\"0.5\",\"0.55\",\"0.6\",\"0.65\",\"0.7\",\"0.75\",\"0.8\",\"0.85\",\"0.9\",\"0.95\",\"1.0\",\"1.05\",\"1.1\",\"1.15\",\"1.2\",\"1.25\",\"1.3\",\"1.35\",\"1.4\",\"1.45\",\"1.5\",\"1.55\",\"1.6\",\"1.65\",\"1.7\",\"1.75\",\"1.8\",\"1.85\",\"1.9\",\"1.95\",\"2.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"8040872608220666544\",\"id\":\"2133732476027264091\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"8040872608220666544\",\"id\":\"5037898709452317128\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"8040872608220666544\",\"id\":\"2133732476027264091\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"8040872608220666544\",\"id\":\"5037898709452317128\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "9148820159079828842",
"id": "2133732476027264091",
"sync": false,
"value": 0
},
"index": {
"id": "1804693577850608861",
"id": "5037898709452317128",
"sync": true,
"value": 6
}
@@ -492,7 +492,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "6683673753748397190",
"id": "16982613614943101290",
"imports": {
"data": [
{
@@ -524,16 +524,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"6683673753748397190\",\"id\":\"5906031181686172777\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"6683673753748397190\",\"id\":\"14579589570514796680\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"6683673753748397190\",\"id\":\"5906031181686172777\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"6683673753748397190\",\"id\":\"14579589570514796680\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"16982613614943101290\",\"id\":\"10555529040878136903\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"16982613614943101290\",\"id\":\"15148483394806438155\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"16982613614943101290\",\"id\":\"10555529040878136903\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"16982613614943101290\",\"id\":\"15148483394806438155\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "5906031181686172777",
"id": "10555529040878136903",
"sync": false,
"value": 0
},
"index": {
"id": "14579589570514796680",
"id": "15148483394806438155",
"sync": true,
"value": 20
}
@@ -560,7 +560,7 @@
{
"children": [],
"instanceArgs": {
"id": "14593175664440022714",
"id": "1410698570604898872",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -570,7 +570,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "11014204293637877523",
"id": "17351532953436435464",
"imports": {
"data": [],
"type": "async_block"
@@ -578,7 +578,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "14593175664440022714",
"id": "1410698570604898872",
"sync": false,
"value": {
"children": [
@@ -590,7 +590,7 @@
},
"nodeType": "DOM",
"props": {
"setInnerHtml": "<img src='data:image/png;base64,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 truncated
"setInnerHtml": "<img src='data:image/png;base64,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 truncated
},
"type": "node"
}
@@ -625,7 +625,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"14542225289874038678\"\n",
" data-webio-mountpoint=\"9683197827310050155\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -635,7 +635,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"14542225289874038678\"]')\n",
" .querySelector('[data-webio-mountpoint=\"9683197827310050155\"]')\n",
" .innerHTML = (\n",
" '<div style=\"padding: 1em; background-color: #f8d6da; border: 1px solid #f5c6cb; font-weight: bold;\">' +\n",
" '<p><strong>WebIO not detected.</strong></p>' +\n",
@@ -648,8 +648,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" document.querySelector('[data-webio-mountpoint=\"14542225289874038678\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"8132048262554526504\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.05\\\",\\\"0.1\\\",\\\"0.15\\\",\\\"0.2\\\",\\\"0.25\\\",\\\"0.3\\\",\\\"0.35\\\",\\\"0.4\\\",\\\"0.45\\\",\\\"0.5\\\",\\\"0.55\\\",\\\"0.6\\\",\\\"0.65\\\",\\\"0.7\\\",\\\"0.75\\\",\\\"0.8\\\",\\\"0.85\\\",\\\"0.9\\\",\\\"0.95\\\",\\\"1.0\\\",\\\"1.05\\\",\\\"1.1\\\",\\\"1.15\\\",\\\"1.2\\\",\\\"1.25\\\",\\\"1.3\\\",\\\"1.35\\\",\\\"1.4\\\",\\\"1.45\\\",\\\"1.5\\\",\\\"1.55\\\",\\\"1.6\\\",\\\"1.65\\\",\\\"1.7\\\",\\\"1.75\\\",\\\"1.8\\\",\\\"1.85\\\",\\\"1.9\\\",\\\"1.95\\\",\\\"2.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"9148820159079828842\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"1804693577850608861\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"9148820159079828842\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"1804693577850608861\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knoLine truncated
" document.querySelector('[data-webio-mountpoint=\"9683197827310050155\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"8040872608220666544\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.05\\\",\\\"0.1\\\",\\\"0.15\\\",\\\"0.2\\\",\\\"0.25\\\",\\\"0.3\\\",\\\"0.35\\\",\\\"0.4\\\",\\\"0.45\\\",\\\"0.5\\\",\\\"0.55\\\",\\\"0.6\\\",\\\"0.65\\\",\\\"0.7\\\",\\\"0.75\\\",\\\"0.8\\\",\\\"0.85\\\",\\\"0.9\\\",\\\"0.95\\\",\\\"1.0\\\",\\\"1.05\\\",\\\"1.1\\\",\\\"1.15\\\",\\\"1.2\\\",\\\"1.25\\\",\\\"1.3\\\",\\\"1.35\\\",\\\"1.4\\\",\\\"1.45\\\",\\\"1.5\\\",\\\"1.55\\\",\\\"1.6\\\",\\\"1.65\\\",\\\"1.7\\\",\\\"1.75\\\",\\\"1.8\\\",\\\"1.85\\\",\\\"1.9\\\",\\\"1.95\\\",\\\"2.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"2133732476027264091\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"5037898709452317128\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"2133732476027264091\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"5037898709452317128\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knoLine truncated
" window,\n",
" );\n",
" })()\n",
@@ -657,7 +657,7 @@
"</div>\n"
],
"text/plain": [
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"s × L\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 40, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(6), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000010dfb9880, Task (runnable) @0x000000010dfb9880), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.05\\\",\\\"0.1\\\",\\\"0.15\\\",\\\"0.2\\\",\\\"0.25\\\",\\\"0.3\\\",\\\"0.35\\\",\\\"0.4\\\",\\\"0.45\\\",\\\"0.5\\\",\\\"0.55\\\",\\\"0.6\\\",\\\"0.65\\\",\\\"0.7\\\",\\\"0.75\\\",\\\"0.8\\\",\\\"0.85\\\",\\\"0.9\\\",\\\"0.95\\\",\\\"1.0\\\",\\\"1.05\\\",\\\"1.1\\\",\\\"1.15\\\",\\\"1.2\\\",\\\"1.25\\\",\\\"1.3\\\",\\\"1.35\\\",\\\"1.4\\\",\\\"1.45\\\",\\\"1.5\\\",\\\"1.55\\\",\\\"1.6\\\",\\\"1.65\\\",\\\"1.7\\\",\\\"1.75\\\",\\\"1.8\\\",\\\"1.85\\\",\\\"1.9\\\",\\\"1.95\\\",\\\"2.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"9148820159079828842\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8132048262554526504\\\",\\\"id\\\":\\\"1804693577850608861\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n returnLine truncated
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"s × L\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 40, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(6), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000011b2a9fb0, Task (runnable) @0x000000011b2a9fb0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.05\\\",\\\"0.1\\\",\\\"0.15\\\",\\\"0.2\\\",\\\"0.25\\\",\\\"0.3\\\",\\\"0.35\\\",\\\"0.4\\\",\\\"0.45\\\",\\\"0.5\\\",\\\"0.55\\\",\\\"0.6\\\",\\\"0.65\\\",\\\"0.7\\\",\\\"0.75\\\",\\\"0.8\\\",\\\"0.85\\\",\\\"0.9\\\",\\\"0.95\\\",\\\"1.0\\\",\\\"1.05\\\",\\\"1.1\\\",\\\"1.15\\\",\\\"1.2\\\",\\\"1.25\\\",\\\"1.3\\\",\\\"1.35\\\",\\\"1.4\\\",\\\"1.45\\\",\\\"1.5\\\",\\\"1.55\\\",\\\"1.6\\\",\\\"1.65\\\",\\\"1.7\\\",\\\"1.75\\\",\\\"1.8\\\",\\\"1.85\\\",\\\"1.9\\\",\\\"1.95\\\",\\\"2.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"2133732476027264091\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"8040872608220666544\\\",\\\"id\\\":\\\"5037898709452317128\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n returnLine truncated
]
},
"execution_count": 4,
@@ -858,7 +858,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "6906506743862292087",
"id": "2381704392959859621",
"imports": {
"data": [
{
@@ -890,16 +890,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.01\",\"0.02\",\"0.03\",\"0.04\",\"0.05\",\"0.06\",\"0.07\",\"0.08\",\"0.09\",\"0.1\",\"0.11\",\"0.12\",\"0.13\",\"0.14\",\"0.15\",\"0.16\",\"0.17\",\"0.18\",\"0.19\",\"0.2\",\"0.21\",\"0.22\",\"0.23\",\"0.24\",\"0.25\",\"0.26\",\"0.27\",\"0.28\",\"0.29\",\"0.3\",\"0.31\",\"0.32\",\"0.33\",\"0.34\",\"0.35\",\"0.36\",\"0.37\",\"0.38\",\"0.39\",\"0.4\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"6906506743862292087\",\"id\":\"6228103310409081339\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"6906506743862292087\",\"id\":\"7099087240667531253\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"6906506743862292087\",\"id\":\"6228103310409081339\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"6906506743862292087\",\"id\":\"7099087240667531253\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.01\",\"0.02\",\"0.03\",\"0.04\",\"0.05\",\"0.06\",\"0.07\",\"0.08\",\"0.09\",\"0.1\",\"0.11\",\"0.12\",\"0.13\",\"0.14\",\"0.15\",\"0.16\",\"0.17\",\"0.18\",\"0.19\",\"0.2\",\"0.21\",\"0.22\",\"0.23\",\"0.24\",\"0.25\",\"0.26\",\"0.27\",\"0.28\",\"0.29\",\"0.3\",\"0.31\",\"0.32\",\"0.33\",\"0.34\",\"0.35\",\"0.36\",\"0.37\",\"0.38\",\"0.39\",\"0.4\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"2381704392959859621\",\"id\":\"13550479041357982695\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"2381704392959859621\",\"id\":\"2067873745985328970\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"2381704392959859621\",\"id\":\"13550479041357982695\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"2381704392959859621\",\"id\":\"2067873745985328970\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "6228103310409081339",
"id": "13550479041357982695",
"sync": false,
"value": 0
},
"index": {
"id": "7099087240667531253",
"id": "2067873745985328970",
"sync": true,
"value": 20
}
@@ -1039,7 +1039,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "6875772947855299800",
"id": "8636771319818047337",
"imports": {
"data": [
{
@@ -1071,16 +1071,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"6875772947855299800\",\"id\":\"11519246493885411976\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"6875772947855299800\",\"id\":\"16981673555174426152\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"6875772947855299800\",\"id\":\"11519246493885411976\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"6875772947855299800\",\"id\":\"16981673555174426152\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"8636771319818047337\",\"id\":\"3678303983132323971\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"8636771319818047337\",\"id\":\"7584779471709723007\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"8636771319818047337\",\"id\":\"3678303983132323971\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"8636771319818047337\",\"id\":\"7584779471709723007\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "11519246493885411976",
"id": "3678303983132323971",
"sync": false,
"value": 0
},
"index": {
"id": "16981673555174426152",
"id": "7584779471709723007",
"sync": true,
"value": 1
}
@@ -1220,7 +1220,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "17876961094725245024",
"id": "5357783408800328542",
"imports": {
"data": [
{
@@ -1252,16 +1252,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"17876961094725245024\",\"id\":\"7883436309669732702\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"17876961094725245024\",\"id\":\"6801211639140861993\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"17876961094725245024\",\"id\":\"7883436309669732702\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"17876961094725245024\",\"id\":\"6801211639140861993\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"5357783408800328542\",\"id\":\"5657077803383894787\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"5357783408800328542\",\"id\":\"6046405484309645684\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"5357783408800328542\",\"id\":\"5657077803383894787\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"5357783408800328542\",\"id\":\"6046405484309645684\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "7883436309669732702",
"id": "5657077803383894787",
"sync": false,
"value": 0
},
"index": {
"id": "6801211639140861993",
"id": "6046405484309645684",
"sync": true,
"value": 50
}
@@ -1288,7 +1288,7 @@
{
"children": [],
"instanceArgs": {
"id": "14937051874603080956",
"id": "16475915816684093584",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -1298,7 +1298,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "11637156787135123699",
"id": "10287540175234632775",
"imports": {
"data": [],
"type": "async_block"
@@ -1306,7 +1306,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "14937051874603080956",
"id": "16475915816684093584",
"sync": false,
"value": {
"children": [
@@ -1318,7 +1318,7 @@
},
"nodeType": "DOM",
"props": {
"setInnerHtml": "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA04AAAGICAYAAAB2jrABAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3QUZReHn03vvUJCQu8IoZfQe2/SpIkNBWkiiqKIolhQQQWxgJUOAaTXhI70JqEnJIQ0CCmkZ3e+P5bdj/RNsi3J+5yTc2AyM+9Nm5nf3Ht/VyZJkoRAIBAIBAKBQCAQCArFxNABCAQCgUAgEAgEAoGxI4STQCAQCAQCgUAgEBSDEE4CgUAgEAgEAoFAUAxCOAkEAoFAIBAIBAJBMQjhJBAIBAKBQCAQCATFIISTQCAQCAQCgUAgEBSDEE4CgUAgEAgEAoFAUAxCOAkEAoFAIBAIBAJBMQjhJBAIBAKBQCAQCATFIISToMz4+/szceJE9f9DQkKQyWSEhITodN3ly5fz+++/l/k84eHhyGQyrZzLmFizZg1LlizReP/OnTvTuXNn9f/T0tL46KOPdP5zLA5jiUMgEAjKI/7+/nz00UeGDqPEaBr3Rx99hEwm031AAgFgZugABBWPgIAATp48SYMGDXS6zvLly3Fzc8sl2gT/Z82aNVy9epUZM2ZotP/y5ctz/T8tLY0FCxYA5BJU+sZY4hAIBAKB8fHyyy/Tu3dvQ4chqCQI4VRJkSSJjIwMrK2ttX5uBwcH2rRpo/XzCnSLroWuiuzsbGQyGWZm4vIjEAgE5Y20tDRsbGzybdfGc0V6ejpWVlYlyiD5+Pjg4+NT6jUFgpIgSvXKOdu2baNJkyZYWlpSo0YNli5dWmDaWiaTMXXqVFasWEH9+vWxtLTkjz/+AGDBggW0bt0aFxcXHBwcCAgIYOXKlUiSlOsc2dnZzJkzBy8vL2xsbOjQoQOnT5/OF1NhpXpnz55l4MCBuLi4YGVlRbNmzdiwYUOufX7//XdkMhnBwcG8/vrruLm54erqytChQ3nw4IF6P39/f/777z8OHz6MTCZDJpPh7+9f7PfrwYMHjBgxAnt7exwdHRk5ciQxMTEF7qtJvGlpacyePZvq1atjZWWFi4sLLVq0YO3atbn2+/fffxkwYACurq5YWVlRs2bNfJmgW7duMWbMGDw8PLC0tKR+/fosW7aswO/t2rVref/996lSpQoODg50796dGzduqPfr3LkzO3fu5N69e+rvT3E3omdL9cLDw3F3dweUvx+q45/N7pUk3r/++ou33nqLqlWrYmlpye3bt4mPj+eNN96gQYMG2NnZ4eHhQdeuXTl69Kj6eG3FoVAoWLhwIXXr1sXa2honJyeaNGnC0qVLi/yeTJ48GSsrK86dO5frXN26dcPT05Po6OgijxcIBAJjZf369bRt2xZbW1vs7Ozo1asXFy5cyLXPxIkTsbOz48qVK/Ts2RN7e3u6desGFP1ccezYMbp164a9vT02Nja0a9eOnTt35jq36n6/b98+Jk2ahLu7OzY2NmRmZpbo6yjomcff35/+/fuzZ88eAgICsLa2pl69eqxatarY833++eeYmJiwffv2fN8LGxsbrly5UqL4BBUL8cq3HLNnzx6GDh1Kx44dWb9+PTk5OSxevJjY2NgC99+6dStHjx7lww8/xMvLCw8PD0D5cPraa69RrVo1AE6dOsWbb75JVFQUH374ofr4V155hT///JPZs2fTo0cPrl69ytChQ0lJSSk21uDgYHr37k3r1q1ZsWIFjo6OrFu3jpEjR5KWlpav3O7ll1+mX79+rFmzhsjISN5++23Gjh3LoUOHANiyZQvDhw/H0dFRXWJmaWlZZAzp6el0796dBw8esGjRIurUqcPOnTsZOXJkqeOdNWsWf/31FwsXLqRZs2akpqZy9epVHj16pD7X3r17GTBgAPXr1+ebb76hWrVqhIeHs2/fPvU+165do127dlSrVo2vv/4aLy8v9u7dy7Rp03j48CHz58/PFd97771H+/bt+fXXX0lOTuadd95hwIABhIaGYmpqyvLly3n11Ve5c+cOW7ZsKfbnkxdvb2/27NlD7969eemll3j55ZcB1CKmpPHOnTuXtm3bsmLFCkxMTPDw8CA+Ph6A+fPn4+XlxZMnT9iyZQudO3fm4MGDdO7cWWtxfPnll3z00UfMmzePjh07kp2dzfXr10lMTCzy+7BkyRL+/fdfRowYwblz53BycmLBggWEhISwZ88evL29S/y9FQgEAkPz2WefMW/ePF588UXmzZtHVlYWX331FYGBgZw+fTpXBUJWVhYDBw7ktdde49133yUnJ0f9uYKeKw4fPkyPHj1o0qQJK1euxNLSkuXLlzNgwADWrl2b7547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 truncated
"setInnerHtml": "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA04AAAGICAYAAAB2jrABAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3yT1ffH3+mme9BFW9qy90Zm2XtTQAUUUEQUROYXRXAAKqIoQ0FUBBVlU/YeLVT23puWlg66oHslfX5/xOTXlo60TZoU7vv1yutFnjzPvSdpeHLPPed8jkySJAmBQCAQCAQCgUAgEBSKkb4NEAgEAoFAIBAIBAJDRzhOAoFAIBAIBAKBQFAMwnESCAQCgUAgEAgEgmIQjpNAIBAIBAKBQCAQFINwnAQCgUAgEAgEAoGgGITjJBAIBAKBQCAQCATFIBwngUAgEAgEAoFAICgG4TgJBAKBQCAQCAQCQTEIx0kgEAgEAoFAIBAIikE4ToIy4+Pjw5gxY9TPg4KCkMlkBAUF6XTeFStW8Mcff5R5nNDQUGQymVbGMiTWrVvHkiVLND6/U6dOdOrUSf08LS2NL774Qud/x+IwFDsEAoGgIuLj48MXX3yhbzNKjKZ2f/HFF8hkMt0bJBAAJvo2QPDi0axZM06dOkW9evV0Os+KFSuoXLlyHqdN8P+sW7eO69evM2XKFI3OX7FiRZ7naWlpzJ07FyCPQ1XeGIodAoFAIDA83nnnHXr16qVvMwQvCcJxekmRJImMjAwqVaqk9bFtbW1p3bq11scV6BZdO7oqsrOzkclkmJiI249AIBBUNNLS0rC0tHzuuDbWFenp6VhYWJQoguTp6Ymnp2ep5xQISoJI1avg7Nixg0aNGmFubk61atVYunRpgWFrmUzGBx98wMqVK6lbty7m5ub8+eefAMydO5dWrVrh6OiIra0tzZo14/fff0eSpDxjZGdnM3PmTNzc3LC0tKR9+/acPXv2OZsKS9U7f/48AwYMwNHREQsLC5o2bcqmTZvynPPHH38gk8kIDAzk/fffp3Llyjg5OeHv709kZKT6PB8fH27cuMGxY8eQyWTIZDJ8fHyK/bwiIyN59dVXsbGxwc7Ojtdee43o6OgCz9XE3rS0NGbMmIGvry8WFhY4OjrSokUL1q9fn+e8M2fO0L9/f5ycnLCwsKB69erPRYLu3bvHiBEjcHFxwdzcnLp167J8+fICP9v169cze/ZsqlSpgq2tLd26dePOnTvq8zp16sSePXt49OiR+vMp7ocod6peaGgozs7OgPL7obo+d3SvJPauXbuW6dOn4+Hhgbm5Offv3yc2NpYJEyZQr149rK2tcXFxoUuXLgQHB6uv15YdOTk5fPnll9SuXZtKlSphb29Po0aNWLp0aZGfyXvvvYeFhQUXLlzIM1bXrl1xdXUlKiqqyOsFAoHAUNm4cSNt2rTBysoKa2trevbsyaVLl/KcM2bMGKytrbl27Ro9evTAxsaGrl27AkWvK/7991+6du2KjY0NlpaWtG3blj179uQZW/V7f/DgQd5++22cnZ2xtLQkMzOzRO+joDWPj48P/fr1Y//+/TRr1oxKlSpRp04dVq9eXex433zzDUZGRuzateu5z8LS0pJr166VyD7Bi4XY8q3A7N+/H39/fzp06MDGjRuRy+UsWrSIJ0+eFHj+9u3bCQ4O5rPPPsPNzQ0XFxdAuTgdP348VatWBeD06dNMmjSJiIgIPvvsM/X148aN46+//mLGjBl0796d69ev4+/vT3JycrG2BgYG0qtXL1q1asXKlSuxs7Njw4YNvPbaa6SlpT2XbvfOO+/Qt29f1q1bR3h4OP/73/944403OHr0KADbtm1j6NCh2NnZqVPMzM3Ni7QhPT2dbt26ERkZyYIFC6hVqxZ79uzhtddeK7W906ZNY+3atXz55Zc0bdqU1NRUrl+/Tnx8vHqsAwcO0L9/f+rWrcsPP/xA1apVCQ0N5eDBg+pzbt68Sdu2balatSrff/89bm5uHDhwgA8//JC4uDg+//zzPPZ98skntGvXjlWrVpGUlMRHH31E//79uXXrFsbGxqxYsYJ3332XBw8esG3btmL/Pvlxd3dn//799OrVi7Fjx/LOO+8AqJ2Ykto7a9Ys2rRpw8qVKzEyMsLFxYXY2FgAPv/8c9zc3EhJSWHbtm106tSJI0eO0KlTJ63Z8e233/LFF18wZ84cOnToQHZ2Nrdv3+bZs2dFfg5LlizhzJkzvPrqq1y4cAF7e3vmzp1LUFAQ+/fvx93dvcSfrUAgEOibr7/+mjlz5vDWW28xZ84csrKy+O677/Dz8+Ps2bN5MhCysrIYMGAA48eP5+OPP0Yul6tfK2hdcezYMbp3706jRo34/fffMTc3Z8WKFfTv35/169c/95v79ttv07dvX9auXUtqaiqmpqZaeY9Xrlxh+vTpfPzxx7i6urJq1SrGjh1LjRo16NChQ6HXffTRRwQHBzN69GguXbqEt7c3a9as4c8//2TVqlU0bNhQK/YJKiiSoMLSsmVLycvLS8rMzFQfS05OlpycnKT8f1pAsrOzkxISEoocU6FQSNnZ2dK8efMkJycnKScnR5IkSbp165YESFOnTs1z/j///CMB0ujRo9XHAgMDJUAKDAxUH6tTp47UtGlTKTs7O8/1/fr1k9zd3SWFQiFJkiStWbNGAqQJEybkOe/bb7+VACkqKkp9rH79+lLHjh2LfD+5+fnnnyVA2rFjR57j48aNkwBpzZo1Jba3QYMG0qBBg4qct3r16lL16tWl9PT0Qs/p2bOn5OnpKSUmJuY5/sEHH0gWFhbqv5vqs+3Tp0+e8zZt2iQB0qlTp9TH+vbtK3l7exdpW246duyY5/OMjY2VAOnzzz8vs70dOnQodn65XC5lZ2dLXbt2lQYPHqxVO/r16yc1adKkWBsK4t69e5Ktra00aNAg6fDhw5KRkZE0Z86cUo0lEAgE5Y23t3ee+2dYWJhkYmIiTZo0Kc95ycnJkpubm/Tqq6+qj40ePVoCpNWrVz83bmHritatW0suLi5ScnKy+phcLpcaNGggeXp6qtcVqt/7UaNGaWR3YXz++efPrXm8vb0lCwsL6dGjR+pj6enpkqOjozR+/Phix4yLi5M8PT2lV155Rbp48aJkaWkpvfHGG8VeJ3jxEal6FZTU1FTOnz/PoEGDMDMzUx+3tramf//+BV7TpUsXHBwcnjt+9OhRunXrhp2dHcbGxpiamvLZZ58RHx9PTEwMoIzAAIwcOTLPta+++mqxtSr379/n9u3b6mvlcrn60adPH6KiovKkmQEMGDAgz/NGjRoB8OjRoyLnAlAoFHnmyMnJUb8HGxub58YeMWJEqe195ZVX2LdvHx9//DFBQUGkp6fnGevu3bs8ePCAsWPHYmFhUaC9GRkZHDlyhMGDB2NpafncfBkZGZw+fVprn09ZKY29Q4YMKXCslStX0qxZMywsLDAxMcHU1JQjR45w69YtrdrxyiuvcOXKFSZMmMCBAwdISkrS+P3WqFGD3377je3bt9OvXz/8/PwqpEKVQCAQgDILQi6XM2rUqDz3TQsLCzp27Figgmlh9/D864rU1FTOnDnD0KFDsba2Vh83NjbmzTff5PHjx8/93hc2dllp0qSJOpMGwMLCglq1amn0O+nk5MTGjRu5ePGiOqth5cqVOrFTULEQjlMF5enTp0iShKur63OvFXQMKDCt6OzZs/To0QOA3377jRMnTnDu3Dlmz54NoHYEVKlnbm5uea43MTHBycmpSFtVqYMzZszA1NQ0z2PChAkAxMXF5bkm/5iqNLz8jklBVK9ePc8c8+bNU7+Hgj6b/O+pJPYuW7aMjz76iO3bt9O5c2ccHR0ZNGgQ9+7dA1CnoxVVuBofH49cLufHH398br4+ffpo/fMpK6Wxt6Dv3g8//MD7779Pq1at2Lp1K6dPn+bcuXP06tVLo/dREjtmzZrFokWLOH36NL1798bJyYmuXbty/vx5jd5z3759cXV1JSMjg2nTpmFsbKzRdQKBQGBoqH7jWrZs+dy9c+PGjc/dvy0tLbG1tS1wrPz3dtXapKB7fpUqVQDypLIXNIa2KGhtYm5urvHvZKtWrahfvz4ZGRm8//77WFlZadtEQQVE1DhVUBwcHJDJZAXWMxUmdlCQOMCGDRswNTVl9+7deSIi27dvz3Oe6gYUHR2Nh4eH+rhcLn/uJpifypUrA8rFq7+/f4Hn1K5du8gxSsKuXbvyFJeqbtZOTk4Filnk/7xKYq+VlRVz585l7ty5PHnyRB196t+/P7dv31bX4jx+/LhQex0cHNS7cRMnTizwHF9f30KvL29KY29B372///6bTp068fPPP+c5rknNXEntMDExYdq0aUybNo1nz55x+PBhPvnkE3r27El4eHiBClG5ee+990hOTqZ+/fp8+OGH+Pn5FRi9FQgEAkNH9Ru3ZcsWvL29iz2/KGGh/K85ODhgZGRUoHCOSuBJNb8m4+uTzz//nGvXrtG8eXM+++wz+vXrR7Vq1fRtlkDPCMepgmJlZUWLFi3Yvn07ixYtUqfrpaSksHv3bo3HUclC595BT09PZ+3atXnOU6mt/fPPPzRv3lx9fNOmTXkKRQuidu3a1KxZkytXrvD1119rbFtxFLZzVFjhZufOndm0aRM7d+7Mk+q2bt06rdjr6urKmDFjuHLlCkuWLCEtLY1atWpRvXp1Vq9ezbRp0woUsLC0tKRz585cunSJRo0a5Um9LAsl2Vkr7Hp4PoqlLXtlMtlzn8fVq1c5deoUXl5eOrPD3t6eoUOHEhERwZQpUwgNDS1Sin3VqlX8/fffrF69mo4dO9KsWTPeeuut5zYXBAKBoCLQs2dPTExMePDggdbT5KysrGjVqhUBAQEsWrRILU2ek5PD33//jaenJ7Vq1dLqnLrg0KLine truncated
},
"type": "node"
}
@@ -1353,7 +1353,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"18360380029162565945\"\n",
" data-webio-mountpoint=\"3101149127362512616\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -1363,7 +1363,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"18360380029162565945\"]')\n",
" .querySelector('[data-webio-mountpoint=\"3101149127362512616\"]')\n",
" .innerHTML = (\n",
" '<div style=\"padding: 1em; background-color: #f8d6da; border: 1px solid #f5c6cb; font-weight: bold;\">' +\n",
" '<p><strong>WebIO not detected.</strong></p>' +\n",
@@ -1376,8 +1376,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" document.querySelector('[data-webio-mountpoint=\"18360380029162565945\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"6906506743862292087\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\",\\\"0.11\\\",\\\"0.12\\\",\\\"0.13\\\",\\\"0.14\\\",\\\"0.15\\\",\\\"0.16\\\",\\\"0.17\\\",\\\"0.18\\\",\\\"0.19\\\",\\\"0.2\\\",\\\"0.21\\\",\\\"0.22\\\",\\\"0.23\\\",\\\"0.24\\\",\\\"0.25\\\",\\\"0.26\\\",\\\"0.27\\\",\\\"0.28\\\",\\\"0.29\\\",\\\"0.3\\\",\\\"0.31\\\",\\\"0.32\\\",\\\"0.33\\\",\\\"0.34\\\",\\\"0.35\\\",\\\"0.36\\\",\\\"0.37\\\",\\\"0.38\\\",\\\"0.39\\\",\\\"0.4\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"6228103310409081339\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"7099087240667531253\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"6228103310409081339\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"7099087240667531253\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bba89Line truncated
" document.querySelector('[data-webio-mountpoint=\"3101149127362512616\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"2381704392959859621\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\",\\\"0.11\\\",\\\"0.12\\\",\\\"0.13\\\",\\\"0.14\\\",\\\"0.15\\\",\\\"0.16\\\",\\\"0.17\\\",\\\"0.18\\\",\\\"0.19\\\",\\\"0.2\\\",\\\"0.21\\\",\\\"0.22\\\",\\\"0.23\\\",\\\"0.24\\\",\\\"0.25\\\",\\\"0.26\\\",\\\"0.27\\\",\\\"0.28\\\",\\\"0.29\\\",\\\"0.3\\\",\\\"0.31\\\",\\\"0.32\\\",\\\"0.33\\\",\\\"0.34\\\",\\\"0.35\\\",\\\"0.36\\\",\\\"0.37\\\",\\\"0.38\\\",\\\"0.39\\\",\\\"0.4\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"13550479041357982695\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"2067873745985328970\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"13550479041357982695\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"2067873745985328970\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bbaLine truncated
" window,\n",
" );\n",
" })()\n",
@@ -1385,7 +1385,7 @@
"</div>\n"
],
"text/plain": [
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"s × L\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 40, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(20), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000010dfb8fe0, Task (runnable) @0x000000010dfb8fe0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\",\\\"0.11\\\",\\\"0.12\\\",\\\"0.13\\\",\\\"0.14\\\",\\\"0.15\\\",\\\"0.16\\\",\\\"0.17\\\",\\\"0.18\\\",\\\"0.19\\\",\\\"0.2\\\",\\\"0.21\\\",\\\"0.22\\\",\\\"0.23\\\",\\\"0.24\\\",\\\"0.25\\\",\\\"0.26\\\",\\\"0.27\\\",\\\"0.28\\\",\\\"0.29\\\",\\\"0.3\\\",\\\"0.31\\\",\\\"0.32\\\",\\\"0.33\\\",\\\"0.34\\\",\\\"0.35\\\",\\\"0.36\\\",\\\"0.37\\\",\\\"0.38\\\",\\\"0.39\\\",\\\"0.4\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"6228103310409081339\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6906506743862292087\\\",\\\"id\\\":\\\"7099087240667531253\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){Line truncated
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"s × L\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 40, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(20), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000011b2aab30, Task (runnable) @0x000000011b2aab30), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\",\\\"0.11\\\",\\\"0.12\\\",\\\"0.13\\\",\\\"0.14\\\",\\\"0.15\\\",\\\"0.16\\\",\\\"0.17\\\",\\\"0.18\\\",\\\"0.19\\\",\\\"0.2\\\",\\\"0.21\\\",\\\"0.22\\\",\\\"0.23\\\",\\\"0.24\\\",\\\"0.25\\\",\\\"0.26\\\",\\\"0.27\\\",\\\"0.28\\\",\\\"0.29\\\",\\\"0.3\\\",\\\"0.31\\\",\\\"0.32\\\",\\\"0.33\\\",\\\"0.34\\\",\\\"0.35\\\",\\\"0.36\\\",\\\"0.37\\\",\\\"0.38\\\",\\\"0.39\\\",\\\"0.4\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"13550479041357982695\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"2381704392959859621\\\",\\\"id\\\":\\\"2067873745985328970\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function()Line truncated
]
},
"execution_count": 5,
@@ -1459,7 +1459,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"Figure(PyObject <Figure size 1000x400 with 2 Axes>)"
]
@@ -1557,6 +1557,8 @@
"\n",
"At first glance, it may seem that we would want to increase $M$ as much as possible, within the limits of our compute power, since the \"ideal\" is surely to optimize over the whole training set at once, right? Actually, no! The danger of increasing $M$ by too much (or equivalently, making $s$ too small), is that it can easily lead to **over-fitting**. The fact that stochastic optimization with small batches tends to \"bounce around\" the nominal optimum can be a benefit rather than a problem in machine-learning problems, because it tends to prevent you from over-fitting to the training data and failing to **generalize** well to other test data.\n",
"\n",
"* *In this simple linear-regression example, there are only 2 parameters x, so we are not in much danger of overfitting. This is more of a concern with huge models like neural networks that have an enormous number of parameters.*\n",
"\n",
"There are many variations and refinements of mini-batching for stochastic gradient descent that are being explored in the machine-learning literature, and many open problems. For example:\n",
"\n",
"* If you have a set of $m$ training data points, the statistical theory of mini-batching is clearest if you draw samples from this set *independently*, which means that you might occasionally draw the same sample more than once (i.e. you are \"sampling with replacement\"). However, for performance reasons nearly all machine learning is done by randomly shuffling the test data once and then streaming through it *in order* (*sequential* access = fast!), corresponding to \"sampling without replacement\". Unfortunately, it's *much* harder to prove theoretical guarantees for without-replacement sampling; for recent progress, see e.g. [Shamir (2016)](https://arxiv.org/abs/1603.00570).\n",
@@ -1582,7 +1584,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 7,
"id": "77481ff3",
"metadata": {},
"outputs": [
@@ -1708,7 +1710,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "14967416960772988177",
"id": "11069568751189395699",
"imports": {
"data": [
{
@@ -1740,16 +1742,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"-4.0\",\"-3.8\",\"-3.6\",\"-3.4\",\"-3.2\",\"-3.0\",\"-2.8\",\"-2.6\",\"-2.4\",\"-2.2\",\"-2.0\",\"-1.8\",\"-1.6\",\"-1.4\",\"-1.2\",\"-1.0\",\"-0.8\",\"-0.6\",\"-0.4\",\"-0.2\",\"0.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"14967416960772988177\",\"id\":\"8687843440075232265\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"14967416960772988177\",\"id\":\"13534586711562492127\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"14967416960772988177\",\"id\":\"8687843440075232265\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"14967416960772988177\",\"id\":\"13534586711562492127\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"-4.0\",\"-3.8\",\"-3.6\",\"-3.4\",\"-3.2\",\"-3.0\",\"-2.8\",\"-2.6\",\"-2.4\",\"-2.2\",\"-2.0\",\"-1.8\",\"-1.6\",\"-1.4\",\"-1.2\",\"-1.0\",\"-0.8\",\"-0.6\",\"-0.4\",\"-0.2\",\"0.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"11069568751189395699\",\"id\":\"9518166551142544059\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"11069568751189395699\",\"id\":\"4597076079323710000\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"11069568751189395699\",\"id\":\"9518166551142544059\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"11069568751189395699\",\"id\":\"4597076079323710000\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "8687843440075232265",
"id": "9518166551142544059",
"sync": false,
"value": 0
},
"index": {
"id": "13534586711562492127",
"id": "4597076079323710000",
"sync": true,
"value": 16
}
@@ -1889,7 +1891,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "16366717349411083065",
"id": "4126395763376122617",
"imports": {
"data": [
{
@@ -1921,16 +1923,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"16366717349411083065\",\"id\":\"16625608181244927427\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"16366717349411083065\",\"id\":\"17764008571605328498\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"16366717349411083065\",\"id\":\"16625608181244927427\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"16366717349411083065\",\"id\":\"17764008571605328498\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"4126395763376122617\",\"id\":\"10369096649874648088\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"4126395763376122617\",\"id\":\"5221676401620031846\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"4126395763376122617\",\"id\":\"10369096649874648088\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"4126395763376122617\",\"id\":\"5221676401620031846\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "16625608181244927427",
"id": "10369096649874648088",
"sync": false,
"value": 0
},
"index": {
"id": "17764008571605328498",
"id": "5221676401620031846",
"sync": true,
"value": 1
}
@@ -2070,7 +2072,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "5437058644484422773",
"id": "17123112634148865443",
"imports": {
"data": [
{
@@ -2102,16 +2104,16 @@
"type": "async_block"
},
"mount_callbacks": [
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"5437058644484422773\",\"id\":\"17567114780900454286\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"5437058644484422773\",\"id\":\"17281545559909914123\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"5437058644484422773\",\"id\":\"17567114780900454286\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"5437058644484422773\",\"id\":\"17281545559909914123\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
"function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"100\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"17123112634148865443\",\"id\":\"1993935220063607529\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"17123112634148865443\",\"id\":\"7203213983935778271\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(10)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"17123112634148865443\",\"id\":\"1993935220063607529\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"17123112634148865443\",\"id\":\"7203213983935778271\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n"
],
"observables": {
"changes": {
"id": "17567114780900454286",
"id": "1993935220063607529",
"sync": false,
"value": 0
},
"index": {
"id": "17281545559909914123",
"id": "7203213983935778271",
"sync": true,
"value": 100
}
@@ -2138,7 +2140,7 @@
{
"children": [],
"instanceArgs": {
"id": "2951878298160918351",
"id": "16954137743051292131",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -2148,7 +2150,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "14469198925155755998",
"id": "892835830615702826",
"imports": {
"data": [],
"type": "async_block"
@@ -2156,7 +2158,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "2951878298160918351",
"id": "16954137743051292131",
"sync": false,
"value": {
"children": [
@@ -2168,7 +2170,7 @@
},
"nodeType": "DOM",
"props": {
"setInnerHtml": "<img src='data:image/png;base64,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 truncated
"setInnerHtml": "<img src='data:image/png;base64,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 truncated
},
"type": "node"
}
@@ -2203,7 +2205,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"3751222088831724880\"\n",
" data-webio-mountpoint=\"856743641568635235\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -2213,7 +2215,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"3751222088831724880\"]')\n",
" .querySelector('[data-webio-mountpoint=\"856743641568635235\"]')\n",
" .innerHTML = (\n",
" '<div style=\"padding: 1em; background-color: #f8d6da; border: 1px solid #f5c6cb; font-weight: bold;\">' +\n",
" '<p><strong>WebIO not detected.</strong></p>' +\n",
@@ -2226,8 +2228,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" document.querySelector('[data-webio-mountpoint=\"3751222088831724880\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"14967416960772988177\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-4.0\\\",\\\"-3.8\\\",\\\"-3.6\\\",\\\"-3.4\\\",\\\"-3.2\\\",\\\"-3.0\\\",\\\"-2.8\\\",\\\"-2.6\\\",\\\"-2.4\\\",\\\"-2.2\\\",\\\"-2.0\\\",\\\"-1.8\\\",\\\"-1.6\\\",\\\"-1.4\\\",\\\"-1.2\\\",\\\"-1.0\\\",\\\"-0.8\\\",\\\"-0.6\\\",\\\"-0.4\\\",\\\"-0.2\\\",\\\"0.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"8687843440075232265\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"13534586711562492127\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"8687843440075232265\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"13534586711562492127\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imLine truncated
" document.querySelector('[data-webio-mountpoint=\"856743641568635235\"]'),\n",
" {\"props\":{},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{\"className\":\"field interact-widget\"},\"nodeType\":\"DOM\",\"type\":\"node\",\"instanceArgs\":{\"namespace\":\"html\",\"tag\":\"div\"},\"children\":[{\"props\":{},\"nodeType\":\"Scope\",\"type\":\"node\",\"instanceArgs\":{\"imports\":{\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\"},{\"name\":null,\"type\":\"js\",\"url\":\"\\/assetserver\\/dc651e248070c73d6a4eaa2766193d4a09a13f05-all.js\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/0318b018d0ff756043bf1ee25f56ab5c74ef7889-style.css\"},{\"name\":null,\"type\":\"css\",\"url\":\"\\/assetserver\\/f798281fed8908611ae453136bda5c1a2e6bffd7-bulma_confined.min.css\"}],\"type\":\"async_block\"},\"id\":\"11069568751189395699\",\"handlers\":{\"changes\":[\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\"],\"index\":[\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\"]},\"systemjs_options\":null,\"mount_callbacks\":[\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-4.0\\\",\\\"-3.8\\\",\\\"-3.6\\\",\\\"-3.4\\\",\\\"-3.2\\\",\\\"-3.0\\\",\\\"-2.8\\\",\\\"-2.6\\\",\\\"-2.4\\\",\\\"-2.2\\\",\\\"-2.0\\\",\\\"-1.8\\\",\\\"-1.6\\\",\\\"-1.4\\\",\\\"-1.2\\\",\\\"-1.0\\\",\\\"-0.8\\\",\\\"-0.6\\\",\\\"-0.4\\\",\\\"-0.2\\\",\\\"0.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"9518166551142544059\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"4597076079323710000\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"9518166551142544059\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"4597076079323710000\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/2df50fa7f121fedbb109a97bba894e56aef8c852-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"\\/assetserver\\/bb2c111220e03062c2973eb306d97c8fc96857d6-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((impoLine truncated
" window,\n",
" );\n",
" })()\n",
@@ -2235,10 +2237,10 @@
"</div>\n"
],
"text/plain": [
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"learning rate log₁₀α\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 21, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(16), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000028e4df260, Task (runnable) @0x000000028e4df260), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-4.0\\\",\\\"-3.8\\\",\\\"-3.6\\\",\\\"-3.4\\\",\\\"-3.2\\\",\\\"-3.0\\\",\\\"-2.8\\\",\\\"-2.6\\\",\\\"-2.4\\\",\\\"-2.2\\\",\\\"-2.0\\\",\\\"-1.8\\\",\\\"-1.6\\\",\\\"-1.4\\\",\\\"-1.2\\\",\\\"-1.0\\\",\\\"-0.8\\\",\\\"-0.6\\\",\\\"-0.4\\\",\\\"-0.2\\\",\\\"0.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"8687843440075232265\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14967416960772988177\\\",\\\"id\\\":\\\"13534586711562492127\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"chLine truncated
"Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Scope(Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"learning rate log₁₀α\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 21, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\")), Dict{String, Tuple{AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable(0), nothing), \"index\" => (Observable{Any}(16), nothing)), Set{String}(), nothing, Asset[Asset(\"js\", \"knockout\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout.js\"), Asset(\"js\", \"knockout_punches\", \"/Users/stevenj/.julia/packages/Knockout/HReiN/src/../assets/knockout_punches.js\"), Asset(\"js\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/all.js\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/InteractBase/Qhvxg/src/../assets/style.css\"), Asset(\"css\", nothing, \"/Users/stevenj/.julia/packages/Interact/PENUy/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000015da79880, Task (runnable) @0x000000015da79880), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-4.0\\\",\\\"-3.8\\\",\\\"-3.6\\\",\\\"-3.4\\\",\\\"-3.2\\\",\\\"-3.0\\\",\\\"-2.8\\\",\\\"-2.6\\\",\\\"-2.4\\\",\\\"-2.2\\\",\\\"-2.0\\\",\\\"-1.8\\\",\\\"-1.6\\\",\\\"-1.4\\\",\\\"-1.2\\\",\\\"-1.0\\\",\\\"-0.8\\\",\\\"-0.6\\\",\\\"-0.4\\\",\\\"-0.2\\\",\\\"0.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"9518166551142544059\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11069568751189395699\\\",\\\"id\\\":\\\"4597076079323710000\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"chaLine truncated
]
},
"execution_count": 10,
"execution_count": 7,
"metadata": {
"application/vnd.webio.node+json": {
"kernelId": "958a809a-e9d1-4ebb-af5d-5e8840746798"
@@ -2324,7 +2326,7 @@
{
"data": {
"text/plain": [
"1.0737660115875616"
"1.0352844707125362"
]
},
"execution_count": 8,
@@ -2349,15 +2351,25 @@
"id": "a3bfd367",
"metadata": {},
"source": [
"## Other stochastic optimization algorithms\n",
"## Other algorithms and generalizations\n",
"\n",
"There are *many, many* other stochastic optimization algorithms, some of which are linked in the Wikipedia article on [stochastic gradient descent](https://en.wikipedia.org/wiki/Stochastic_gradient_descent). This includes fancier quasi-Newton algorithms (see e.g. [Zhao et al. (2017)](https://arxiv.org/abs/1704.00116) and references therein), and algorithms for more complicated optimization problems: stochastic optimization with nonlinear constraints (see e.g. [Lan and Zhou (2016)](https://arxiv.org/abs/1604.03887) or stochastic \"minimax\" problems (e.g. [Yang et al. (2022)](https://arxiv.org/abs/2202.07868)) and robust stochastic optimization (e.g. [Chen et al (2020)](https://doi.org/10.1287/mnsc.2020.3603))."
"There are *many, many* other stochastic optimization algorithms, some of which are linked in the Wikipedia article on [stochastic gradient descent](https://en.wikipedia.org/wiki/Stochastic_gradient_descent), with many variants on ways to choose parameters like learning rates and momentum coefficients. This includes fancier quasi-Newton algorithms (see e.g. [Zhao et al. (2017)](https://arxiv.org/abs/1704.00116) and references therein), and algorithms for more complicated optimization problems: stochastic optimization with nonlinear constraints (see e.g. [Lan and Zhou (2016)](https://arxiv.org/abs/1604.03887) or stochastic \"minimax\" problems (e.g. [Yang et al. (2022)](https://arxiv.org/abs/2202.07868)) and robust stochastic optimization (e.g. [Chen et al (2020)](https://doi.org/10.1287/mnsc.2020.3603)).\n",
"\n",
"Note that all of these algorithms can be trivially modified to accommodate objective functions that have a non-stochastic part, e.g.:\n",
"$$\n",
"f(x) = f_0(x) + E[f_i(x)] \\, ,\n",
"$$\n",
"since then $\\nabla f = \\nabla f_0 + E[\\nabla f_i]$ and you can estimate $\\nabla f$ by computing $\\nabla f_0$ *exactly* and then estimating $E[\\nabla f_i]$ from a mini-batch sample. For example, this arises in [Tikhonov-regularized least-squares](https://en.wikipedia.org/wiki/Ridge_regression):\n",
"$$\n",
"f(x) = \\underbrace{\\lambda \\Vert x \\Vert_2^2}_{f_0(x)} + \\frac{1}{m} \\sum_i \\underbrace{\\left\\Vert \\text{model}(x, \\text{input}_i) - \\text{output}_i \\right\\Vert_2^2}_{f_i(x)}\\, ,\n",
"$$\n",
"where $\\nabla f_0 = 2\\lambda x$ is easy and cheap to compute since it is independent of $m$."
]
}
],
"metadata": {
"@webio": {
"lastCommId": "1ac88b83e483425592c8f46839a39daf",
"lastCommId": "107d6a3486cd4e2db476ae69e28b361e",
"lastKernelId": "958a809a-e9d1-4ebb-af5d-5e8840746798"
},
"kernelspec": {