This commit is contained in:
Steven G. Johnson committed 2023-03-24 11:52:33 -04:00
1 parent 878e531fdd
commit ce08af1f78
1 file changed
+85 -78
+85 -78
View File
@@ -105,8 +105,8 @@
"data": {
"text/plain": [
"2-element Vector{Float64}:\n",
" 1.041613576351668\n",
" 2.01074076723373"
" 1.0153932906611167\n",
" 2.0330023666722448"
]
},
"execution_count": 2,
@@ -130,7 +130,7 @@
"outputs": [
{
"data": {
"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
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGxCAYAAABfrt1aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACLe0lEQVR4nO2dd3wVVfr/P3OvhJZQQpESmoIVwRUQgihNybqKukqxYZSIBEFFjNT9CipSQlF+KixNsAFGBRFdRVYCygICCoqiiEggERQQN4EgLff8/pide6ffmVtTPu/X677CPTNzzjNzQ85znyoJIQQIIYQQQuKAJ94CEEIIIaTiQkWEEEIIIXGDigghhBBC4gYVEUIIIYTEDSoihBBCCIkbVEQIIYQQEjeoiBBCCCEkblARIYQQQkjcoCJCCCGEkLhBRYSQCNKtWzd069bN/z4vLw+SJGHx4sVxkykc7r//fjRv3jzeYmDJkiV44YUX4i1GmeDYsWO48847Ub9+fUiShNtuuw0AIEkSJkyY4D9v165dmDBhAvLy8uIiJyEK58VbAELKMw0bNsSmTZtw4YUXxluUMs2SJUvw7bffYvjw4fEWpdTz7LPPYsWKFXjllVdw4YUXIjk5GQCwadMmpKSk+M/btWsXnn76aXTr1q1UKJuk4kJFhBAX/Pnnn6hSpQokSXJ0fuXKldGpU6coS2XOyZMnUa1atbisTdwjhMCpU6dQtWrVsOb59ttvceGFF+Kee+7RjMfr95CQYNA1QyokGzZsQM+ePZGUlIRq1aqhc+fO+PDDDzXnLF68GJIk4ZNPPsHAgQNRr149VKtWDadPn4YQAtnZ2WjWrBmqVKmCq666Ch999JFhHTPXzIQJEyBJEr777jvcddddqFmzJs4//3wMHDgQhYWFmutffvllXHfddahfvz6qV6+OK664AtnZ2Th79qzmvG7duqF169b47LPP0LlzZ1SrVg0DBw5ERkYGkpOTcfLkSYNsPXr0wOWXX+762QkhMHv2bFx55ZWoWrUqateujT59+uDnn3/WnLdmzRrceuutSElJQZUqVdCyZUsMHjwYR48e1Zx35MgRPPTQQ2jSpAkqV66MevXq4ZprrsG///1v/719+OGH2L9/PyRJ8r+C8fbbb6Njx46oWbMmqlWrhgsuuAADBw7UnPPDDz/gr3/9K6pVq4a6desiMzMTq1atgiRJWLdunf+85s2b4/777zesoXfFnTp1Ck888QSuvPJK1KxZE8nJyUhNTcXKlSsN10qShGHDhuGf//wnLr30UlSuXBmvvvoqAGDPnj24++67Ub9+fVSuXBmXXnopXn75Zdv7VX7X/v3vf+P777/3PyflPtSumcWLF6Nv374AgO7du/vPLasuRFK2oUWEVDjWr1+PG264AW3atMHChQtRuXJlzJ49G71798bSpUvRv39/zfkDBw7ETTfdhNdffx3FxcWoVKkSnn76aTz99NPIyMhAnz59kJ+fj0GDBqGkpAQXX3yxIznuuOMO9O/fHxkZGdi5cyfGjBkDAHjllVf85+zduxd33303WrRogYSEBHz99dd47rnn8MMPP2jOA4BDhw7h3nvvxciRIzFp0iR4PB7UqlULr7zyCpYsWYIHH3zQf+6uXbuQm5sbdHMzY/DgwVi8eDEeffRRTJ06FceOHcMzzzyDzp074+uvv8b555/vlz01NRUPPvggatasiby8PMycORNdunTBzp07UalSJQDAgAED8NVXX+G5557DRRddhP/+97/46quv8PvvvwMAZs+ejYceegh79+7FihUrHMm4adMm9O/fH/3798eECRNQpUoV7N+/H2vXrvWf89tvv6Fr166oVKkSZs+ejfPPPx9vvvkmhg0b5vqZKJw+fRrHjh1DVlYWGjdujDNnzuDf//43br/9dixatAj33Xef5vz33nsPn3/+OZ566ik0aNAA9evXx65du9C5c2c0bdoUM2bMQIMGDbB69Wo8+uijOHr0KMaPH2+6tuIGfPjhh1FYWIg333wTAHDZZZcZzr3pppswadIkjB07Fi+//DKuuuoqAKALkcQHQUgFo1OnTqJ+/fri+PHj/rFz586J1q1bi5SUFOHz+YQQQixatEgAEPfdd5/m+j/++ENUqVJF/P3vf9eM/+c//xEARNeuXf1j+/btEwDEokWL/GPjx48XAER2drbm+ocfflhUqVLFv76ekpIScfbsWfHaa68Jr9crjh075j/WtWtXAUB8+umnhuu6du0qrrzySs3YkCFDRI0aNTTPwIz09HTRrFkz//tNmzYJAGLGjBma8/Lz80XVqlXFyJEjTefx+Xzi7NmzYv/+/QKAWLlypf9YYmKiGD58uK0cN910k0aOYEyfPl0AEP/9738tzxk1apSQJEns2LFDM37DDTcIACI3N9c/1qxZM5Genm6Yo2vXrprPW8+5c+fE2bNnRUZGhvjLX/6iOQZA1KxZU/M5CiFEWlqaSElJEYWFhZrxYcOGiSpVqhjON5Pp8ssvN4wDEOPHj/e/f/vttw33SUg8oGuGVCiKi4vxxRdfoE+fPkhMTPSPe71eDBgwAAUFBdi9e7fmmjvuuEPzftOmTTh16pTBB9+5c2c0a9bMsSy33HKL5n2bNm1w6tQpHD582D+2fft23HLLLahTpw68Xi8qVaqE++67DyUlJfjxxx8119euXRs9evQwrPPYY49hx44d+M9//gMAKCoqwuuvv4709HTNM3DCBx98AEmScO+99+LcuXP+V4MGDdC2bVuNO+Pw4cPIzMxEkyZNcN5556FSpUr+5/P999/7z7v66quxePFiTJw4EZs3bza4newoKSnRyOHz+QAAHTp0AAD069cPOTk5+OWXXwzX5ubm4vLLL0fbtm0143fffbfj9c14++23cc011yAxMdF/3wsXLtTcs0KPHj1Qu3Zt//tTp07h008/xd///ndUq1ZNc29/+9vfcOrUKWzevDks+QgpbVARIRWKP/74A0IINGzY0HCsUaNGAOB3CSjoz1WON2jQwDCH2ZgVderU0byvXLkyADkgFgAOHDiAa6+9Fr/88gtmzZqFzz//HFu3bvW7U5TzrORUuPXWW9G8eXP/dYsXL0ZxcTGGDh3qWFaF3377DUIInH/++ahUqZLmtXnzZn/8h8/nQ69evbB8+XKMHDkSn376KbZs2eLfRNWyv/XWW0hPT8eCBQuQmpqK5ORk3Hffffj111+DytOzZ0+NDEoMyHXXXYf33nsP586dw3333YeUlBS0bt0aS5cu9V/7+++/h/0Z6lm+fDn69euHxo0b44033sCmTZuwdetWDBw4EKdOnTKcb/a7de7cObz44ouG5/u3v/0NAAwxNoSUdRgjQioUtWvXhsfjwaFDhwzHDh48CACoW7euZlwfGKkoEGYb5a+//hqxVMj33nsPxcXFWL58ucbSsmPHDtPzrQI4PR4Phg4dirFjx2LGjBmYPXs2evbs6TiWRU3dunUhSRI+//xzv+KkRhn79ttv8fXXX2Px4sVIT0/3H//pp59M53zhhRfwwgsv4MCBA3j//fcxevRoHD58GB9//LGtPHPnzsXx48c1cynceuutuPXWW3H69Gls3rwZkydPxt13343mzZsjNTUVderUsfwM9VSpUgWnT582jB89elSz5htvvIEWLVrgrbfe0nweZtcCxs+sdu3afuuclaLYokUL03FCyipUREiFonr16ujYsSOWL1+O6dOn+1MlfT4f3njjDaSkpOCiiy6ynaNTp06oUqUK3nzzTY3bZuPGjdi/f3/EFBFlk1Jv+EIIzJ8/3/VcDz74ICZMmIB77rkHu3fvxtSpU0OS6eabb8aUKVPwyy+/oF+/fpbnmckOyIqDHU2bNsWwYcPw6aef+l1Jyjx6CxAAR8pU5cqV0bVrV9SqVQurV6/G9u3bkZqaiu7duyM7Oxtff/21xj2zZMkSwxzNmzfHN998oxn78ccfsXv3bo0iIkkSEhISNArGr7/+apo1Y0a1atXQvXt3bN++HW3atEFCQoKj60JBb4EjJF5QESEVjsmTJ+OGG25A9+7dkZWVhYSEBMyePRvffvstli5dGjQ1tHbt2sjKysLEiRPx4IMPom/fvsjPz8eECRPCMuvrueGGG5CQkIC77roLI0eOxKlTpzBnzhz88ccfrueqVasW7rvvPsyZMwfNmjVD7969Q5LpmmuuwUMPPYQHHngA27Ztw3XXXYfq1avj0KFD2LBhA6644goMGTIEl1xyCS688EKMHj0aQggkJydj1apVWLNmjWa+wsJCdO/eHXfffTcuueQSJCUlYevWrfj4449x++23+8+74oorsHz5csyZMwft2rWDx+NB+/btLeV86qmnUFBQgJ49eyIlJQX//e9/MWvWLFSqVAldu3YFAAwfPhyvvPIKbrrpJkycONGfNfPDDz8Y5hswYADuvfdePPzww7jjjjuwf/9+ZGdno169eprzbr75ZixfvhwPP/ywP5vq2WefRcOGDbFnzx5Hz3jWrFno0qULrr32WgwZMgTNmzfH8ePH8dNPP2HVqlWazJ9waN26NQBg3rx5SEpKQpUqVdCiRQuDy5CQqBPfWFlC4sPnn38uevToIapXry6qVq0qOnXqJFatWqU5R8ma2bp1q+F6n88nJk+eLJo0aSISEhJEmzZtxKpVqwxZFHZZM0eOHDFdb9++ff6xVatWibZt24oqVaqIxo0biyeffFJ89NFHhmwHq0wJNevWrRMAxJQpU4I/oP+hz5pReOWVV0THjh39z+/CCy8U9913n9i2bZv/nF27dokbbrhBJCUlidq1a4u+ffuKAwcOaLI3Tp06JTIzM0WbNm1EjRo1RNWqVcXFF18sxo8fL4qLi/1zHTt2TPTp00fUqlVLSJIkgv3p+uCDD8SNN94oGjduLBISEkT9+vXF3/72N/H5559rzlNkrFKlikhOThYZGRli5cqVhufr8/lEdna2uOCCC0SLine truncated
"text/plain": [
"Figure(PyObject <Figure size 640x480 with 1 Axes>)"
]
@@ -141,7 +141,7 @@
{
"data": {
"text/plain": [
"PyObject <matplotlib.legend.Legend object at 0x292f55370>"
"PyObject <matplotlib.legend.Legend object at 0x15996a370>"
]
},
"execution_count": 3,
@@ -173,7 +173,9 @@
"\n",
"We'll use the [Interact.jl package](https://github.com/JuliaGizmos/Interact.jl) to visualize the progress of this algorithm as we vary the \"learning rate\" $s$.\n",
"\n",
"For goodd convergence, we should typically have $s < 1/L$ where $L \\approx 2$ is the Lipschitz constant of $f$, corresponding to the largest eigenvalue of the Hessian $2A^T A / m$. So, convenience we'll specify $sL$ instead of $s$ — for $sL > 1$ we'll see that it \"overshoots\" the optimum and oscillates."
"For goodd convergence, we should typically have $s < 1/L$ where $L \\approx 2$ is the Lipschitz constant of $f$, corresponding to the largest eigenvalue of the Hessian $2A^T A / m$. So, for convenience we'll specify $sL$ instead of $s$.\n",
"\n",
"For $s > 1/L$ it \"overshoots\" the optimum and starts to oscillate, but it still converges if it overshoots by less than a factor of 2 (so each step still ends up closer to the optimum). If $s > 2/L$ then it overshoots by more than a factor of 2 (each step ends up *farther* from the optimum) and iterations diverge."
]
},
{
@@ -186,7 +188,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"L = (2 / m) * maximum(eigvals(A' * A)) = 2.0438346691301557\n"
"L = (2 / m) * maximum(eigvals(A' * A)) = 2.0048257127550775\n"
]
},
{
@@ -245,7 +247,7 @@
"type": "range"
},
"className": "slider slider is-fullwidth",
"max": 40,
"max": 42,
"min": 1,
"step": 1,
"style": {}
@@ -311,7 +313,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "8040872608220666544",
"id": "18031299623369775666",
"imports": {
"data": [
{
@@ -343,16 +345,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\":\"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"
"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\",\"2.05\",\"2.1\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"18031299623369775666\",\"id\":\"17662074350083997730\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"18031299623369775666\",\"id\":\"2286945322875214052\",\"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\":\"18031299623369775666\",\"id\":\"17662074350083997730\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"18031299623369775666\",\"id\":\"2286945322875214052\",\"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": "2133732476027264091",
"id": "17662074350083997730",
"sync": false,
"value": 0
},
"index": {
"id": "5037898709452317128",
"id": "2286945322875214052",
"sync": true,
"value": 6
}
@@ -492,7 +494,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "16982613614943101290",
"id": "10910361379448850754",
"imports": {
"data": [
{
@@ -524,16 +526,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\":\"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"
"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\":\"10910361379448850754\",\"id\":\"3835219169138387310\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"10910361379448850754\",\"id\":\"14310154497073095821\",\"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\":\"10910361379448850754\",\"id\":\"3835219169138387310\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"10910361379448850754\",\"id\":\"14310154497073095821\",\"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": "10555529040878136903",
"id": "3835219169138387310",
"sync": false,
"value": 0
},
"index": {
"id": "15148483394806438155",
"id": "14310154497073095821",
"sync": true,
"value": 20
}
@@ -560,7 +562,7 @@
{
"children": [],
"instanceArgs": {
"id": "1410698570604898872",
"id": "18345046724687469037",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -570,7 +572,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "17351532953436435464",
"id": "18066739112308821168",
"imports": {
"data": [],
"type": "async_block"
@@ -578,7 +580,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "1410698570604898872",
"id": "18345046724687469037",
"sync": false,
"value": {
"children": [
@@ -590,7 +592,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 +627,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"9683197827310050155\"\n",
" data-webio-mountpoint=\"958987231615217406\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -635,7 +637,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"9683197827310050155\"]')\n",
" .querySelector('[data-webio-mountpoint=\"958987231615217406\"]')\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 +650,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" 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
" document.querySelector('[data-webio-mountpoint=\"958987231615217406\"]'),\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\":\"18031299623369775666\",\"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\\\",\\\"2.05\\\",\\\"2.1\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"17662074350083997730\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"2286945322875214052\\\",\\\"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\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"17662074350083997730\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"2286945322875214052\\\",\\\"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\\/2df50fa7f121Line truncated
" window,\n",
" );\n",
" })()\n",
@@ -657,7 +659,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) @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
"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 => 42, :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) @0x00000001107afb00, Task (runnable) @0x00000001107afb00), 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\\\",\\\"2.05\\\",\\\"2.1\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"17662074350083997730\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"18031299623369775666\\\",\\\"id\\\":\\\"2286945322875214052\\\",\\\"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( Line truncated
]
},
"execution_count": 4,
@@ -679,7 +681,7 @@
"@show L = (2/m) * maximum(eigvals(A'*A)) # Lipschitz constant\n",
"\n",
"f1 = figure(figsize=(10,4))\n",
"@manipulate for sL in slider(0.05:0.05:2, value=0.3, label=\"s × L\"),\n",
"@manipulate for sL in slider(0.05:0.05:2.1, value=0.3, label=\"s × L\"),\n",
" iterations in slider(10:100, value=20, label=\"# iterations\")\n",
" withfig(f1) do\n",
" s = sL / L\n",
@@ -704,7 +706,7 @@
" \n",
" subplot(1,2,2)\n",
" semilogy(ΔX, \"ko-\")\n",
" ylim(1e-10, 2)\n",
" ylim(1e-10, 100)\n",
" xlabel(\"iteration\")\n",
" ylabel(L\"\\Vert x - \\hat{x} \\Vert\")\n",
" title(\"|error| in x\")\n",
@@ -858,7 +860,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "2381704392959859621",
"id": "6974653851633155945",
"imports": {
"data": [
{
@@ -890,16 +892,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\":\"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"
"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\":\"6974653851633155945\",\"id\":\"6253394890875032989\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"6974653851633155945\",\"id\":\"3056708277095213230\",\"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\":\"6974653851633155945\",\"id\":\"6253394890875032989\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"6974653851633155945\",\"id\":\"3056708277095213230\",\"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": "13550479041357982695",
"id": "6253394890875032989",
"sync": false,
"value": 0
},
"index": {
"id": "2067873745985328970",
"id": "3056708277095213230",
"sync": true,
"value": 20
}
@@ -1039,7 +1041,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "8636771319818047337",
"id": "376243414287620172",
"imports": {
"data": [
{
@@ -1071,16 +1073,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\":\"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"
"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\":\"376243414287620172\",\"id\":\"11481310681789264849\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"376243414287620172\",\"id\":\"427753272806618935\",\"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\":\"376243414287620172\",\"id\":\"11481310681789264849\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"376243414287620172\",\"id\":\"427753272806618935\",\"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": "3678303983132323971",
"id": "11481310681789264849",
"sync": false,
"value": 0
},
"index": {
"id": "7584779471709723007",
"id": "427753272806618935",
"sync": true,
"value": 1
}
@@ -1220,7 +1222,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "5357783408800328542",
"id": "7311391687349149375",
"imports": {
"data": [
{
@@ -1252,16 +1254,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\":\"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"
"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\":\"7311391687349149375\",\"id\":\"4659658828690203703\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"7311391687349149375\",\"id\":\"8341817293508640869\",\"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\":\"7311391687349149375\",\"id\":\"4659658828690203703\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"7311391687349149375\",\"id\":\"8341817293508640869\",\"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": "5657077803383894787",
"id": "4659658828690203703",
"sync": false,
"value": 0
},
"index": {
"id": "6046405484309645684",
"id": "8341817293508640869",
"sync": true,
"value": 50
}
@@ -1288,7 +1290,7 @@
{
"children": [],
"instanceArgs": {
"id": "16475915816684093584",
"id": "9179752558711838773",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -1298,7 +1300,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "10287540175234632775",
"id": "2699811917672672192",
"imports": {
"data": [],
"type": "async_block"
@@ -1306,7 +1308,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "16475915816684093584",
"id": "9179752558711838773",
"sync": false,
"value": {
"children": [
@@ -1318,7 +1320,7 @@
},
"nodeType": "DOM",
"props": {
"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
"setInnerHtml": "<img src='data:image/png;base64,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 truncated
},
"type": "node"
}
@@ -1353,7 +1355,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"3101149127362512616\"\n",
" data-webio-mountpoint=\"10982528911474534190\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -1363,7 +1365,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"3101149127362512616\"]')\n",
" .querySelector('[data-webio-mountpoint=\"10982528911474534190\"]')\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 +1378,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" 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
" document.querySelector('[data-webio-mountpoint=\"10982528911474534190\"]'),\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\":\"6974653851633155945\",\"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\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"6253394890875032989\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"3056708277095213230\\\",\\\"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\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"6253394890875032989\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"3056708277095213230\\\",\\\"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
" window,\n",
" );\n",
" })()\n",
@@ -1385,7 +1387,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) @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
"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) @0x00000001107ae570, Task (runnable) @0x00000001107ae570), 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\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"6253394890875032989\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"6974653851633155945\\\",\\\"id\\\":\\\"3056708277095213230\\\",\\\"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,
@@ -1446,6 +1448,11 @@
"id": "d572f97e",
"metadata": {},
"source": [
"Some things to note:\n",
"\n",
"* Far from the solution, SGD converges quickly, but then starts to \"bounce around\" the minimum.\n",
"* The process **converges \"on average\"**: $E[x^{(k)}]$ (the average after repeating SGD many times) is equivalent to the k-th step of exact/full-batch gradient descent. The difference is that now we have **variance**. (But the variance is not necessarily a bad thing, as discussed below, because it can suppress over-fitting!)\n",
"\n",
"One thing to notice is that increasing the mini-batch size $M$ has a very similar qualitative effect to decreasing the learning rate $s$. The intuitive reason for this is that taking $M$ tiny steps with a single sample each (which hardly changes $x$, so the gradients of the different samples are *almost* at the same $x$) is effectively almost the same as taking a single larger step with $M$ samples (evaluated at the same $x$).\n",
"\n",
"Let's try this for 2000 iterations with $M=1$ and $s = 0.2/L$ vs. 100 iterations with $M=20$ and $s=0.2/20L = 0.01/L$. (Notice that the total number of samples is the same in both cases! In the former case we will only plot every 20th step so that the graphs are comparable.)"
@@ -1459,7 +1466,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAGbCAYAAADzzMA0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3iT1dvA8W/SkXTvRQctq2yBsoqUIXtP8aeyhyIgIvKquAAXDkRQEVSmoIAyRaYgZckoU2aZpZvu3bRN8rx/hFZKd0maFs7nunJd9Mkz7qQl57lzzrmPTJIkCUEQBEEQBEEQBKFEcmMHIAiCIAiCIAiCUN2JxEkQBEEQBEEQBKEMInESBEEQBEEQBEEog0icBEEQBEEQBEEQyiASJ0EQBEEQBEEQhDKIxEkQBEEQBEEQBKEMInESBEEQBEEQBEEog0icBEEQBEEQBEEQyiASJ0EQBEEQBEEQhDKIxEkQBL1YvXo1MpkMmUxGcHBwkeclSaJevXrIZDK6dOlSpbFdvnyZKVOmEBgYiJWVVYkx1kR5eXnMmzcPX19fFAoFDRs25Ntvvy338RkZGcyYMYNatWqhVCpp0aIFGzZsKLLf0aNHmThxIgEBASgUCmQyGWFhYaWee+jQoQwaNAiAuXPnIpPJSEhIqNDrMxZfX99S/1Z//vnnUv/eDeX69evMmjWLgIAA7O3tcXR05Omnn2bTpk3F7h8XF8fYsWNxdnbG0tKSwMBADhw4UGXxGtK3335Lw4YNUSgU+Pn5MW/ePPLy8so87syZM0ydOpVmzZphY2ODm5sb3bt35++//y7xmH///ReZTMa5c+cAkMlkTJs2TW+vRRCEmkEkToIg6JWNjQ0rVqwosv3QoUPcunULGxubKo/p9OnTbNu2DUdHR7p161bl1zekKVOmMH/+fKZOncrevXsZMmQIr732Gp9++mm5jh86dChr1qxhzpw57N69mzZt2vD888/z66+/FtrvwIED7N+/Hx8fHzp06FDmeTMzM9mzZw/Dhg2r1OuqDmxsbDh8+DC3bt0q8tzKlSuxtbWt8pj27dvHzp07GTZsGL///ju//PIL9evX59lnn+XDDz8stG9OTg7dunXjwIEDLF68mO3bt+Pm5kbv3r05dOhQlceuT5988gmvvfYaQ4cOZe/evUyZMoVPP/2UqVOnlnns+vXrOXXqFOPHj2f79u0sX74chUJBt27d+Pnnn4s9ZvPmzfj5+dGyZUt9vxRBEGoSSRAEQQ9WrVolAdLEiRMlCwsLKTU1tdDzI0eOlAIDA6UmTZpInTt3rtLYNBpNwb9///13CZAOHjxYpTEYwqVLlySZTCZ9+umnhbZPmjRJsrCwkBITE0s9fufOnRIg/frrr4W29+jRQ6pVq5akVqsLtj34Hn755ZcSIN25c6fEc//222+SmZmZlJSUJEmSJM2ZM0cCpPj4+PK+PKOqXbu21KdPH8nLy0t65513Cj138+ZNSSaTSZMmTaryv6X4+HhJq9UW2d6vXz/J0tJSUqlUBduWLFkiAdI///xTsC0vL09q3Lix1LZt2yqJ1xASEhIkpVIpvfTSS4W2f/LJJ5JMJpMuX75c6vH37t0rsk2tVkvNmzeX6tatW+wxjRs3lmbNmlXwMyBNnTq1EtELglCTiR4nQRD06vnnnwd03+rmS01NZfPmzYwfP94oMcnl+v+oi4+P56WXXsLb2xuFQoGLiwtPP/00+/fv1/u1SrJt2zYkSWLcuHGFto8bN47s7Gz27NlT6vFbt27F2tqaZ599tsjx0dHRnDx5smBbRd/DzZs388wzz+Dg4FCh4x6Ul5eHq6sro0aNKvJcSkoKFhYWzJw5EwCtVsvHH3+Mv78/FhYW2Nvb07x5cxYvXlzp68vlckaPHs2aNWvQarUF21euXIm3tzfdu3ev9Lkry9nZGZlMVmR727ZtycrKIikpqWDb1q1b8ff3JzAwsGCbqakpI0eO5NSpU0RFRVX4+llZWcyaNQs/Pz+USiWOjo60bt260P93Q9uzZw8qlarYv3tJkti2bVupx7u6uhbZZmJiQkBAABEREUWeu3btGleuXKnRvaeCIOiHSJwEQdArW1tbhg8fzsqVKwu2rV+/HrlcznPPPVfu82i1WtRqdZkPjUZjiJdRplGjRrFt2zY++OAD9u3bx/Lly+nevTuJiYmlHidJUrlel1qtLjOGS5cu4eLigru7e6HtzZs3L3i+rOMbNWqEqalppY4viUqlKhhO9ijMzMwYOXIkmzdvJi0trdBz69evL3Tz/MUXXzB37lyef/55du7cycaNG5kwYQIpKSmPFMP48eOJjo5m7969AGg0GtasWcPYsWMrlEyW93cuSVKl4jx48CAuLi6FkoJLly4V/C4flL/t8uXLFb7OzJkzWbp0KdOnT2fPnj2sXbuWZ599tsy/e9Dfe5D/d9msWbNC2z08PHB2dq7U361arebIkSM0adKkyHObN2/G09OTdu3aVfi8giA8XkzL3kUQBKFixo8fT9euXbl8+TJNmjRh5cqVPPvssxWa3zR+/HjWrFlT5n6dO3c2SqGHY8eOMXHiRCZNmlSwLb8QQmkOHTpE165dy3WNO3fu4OvrW+LziYmJODo6FtluZWWFubl5mTeziYmJ1KlTp8j2/HOW52a4OHv37iU7O5vBgwdX6vgHjRs3jq+//pqNGzcWeq9Xr15NQEBAwc3zsWPHaNasGXPnzi3Yp1evXo98/bp169KpUydWrlxJnz592Lt3L9HR0YwbN47Tp0+X6xxhYWH4+fmVa9+DBw9WuHjK8uXLCQ4OZvHixZiYmBRsL+nv41F+v8eOHaNnz568/vrrBdv69etX5nH6fA8SExNRKBRYWVkVec7R0bFSr2vu3LncvHmz2N6qTZs2MXTo0GJ7+gRBeLKIxEkQBL3r3LkzdevWZeXKlYwdO5aQkBC++uqrCp1j7ty55apaZYxiE6AbGrV69WqcnJzo3r07AQEBmJmZlXlcQEAAISEh5bpGrVq1ytyntJu58tzoPerxxdm8eTNBQUG4uLhU6vgHNWvWjICAAFatWlWQOF29epVTp06xZMmSgv3atm3Lzp07mTJlCoMGDSIwMFBvxRvGjx/PpEmTSExMZMWKFXTt2hVfX99yJ061atUq9+/c39+/QrHt3r2bqVOnMnz4cF599dUiz+v799u2bVt++eUX3n77bXr37k27du2wsLAo8zh9vwf6fF3Lly/nk08+4Y033ijy5cft27c5f/48ixYtqtA5BUF4PInESRAEvZPJZIwbN45vvvkGlUpFgwYNCAoKqtA5fHx88PLyKte1jGHjxo18/PHHLF++nPfffx9ra2uGDBnCF198UWTo3IOsra1p0aJFua7x8BC6hzk5OXH+/Pki2zMzM8nNzS22t+Hh44v7dj5/nkxZxxcnLy+PHTt28NFHH1X42JKMHz+eqVOncu3aNRo2bMiqVatQKBQF8+kAZs+ejZWVFevWrWPZsmWYmJjQqVMnPv/8c1q3bv1I189PSr7++mt27NjB6tWrK3S8ubl5uX/nD/YYlWXv3r0MHTqUHj168MsvvxT5v2CI3+8333yDl5cXGzdu5PPPP0epVNKrVy++/PJL6tevX+Jx+nwPnJycUKlUZGVlYWlpWei5pKQkAgICynUdgFWrVvHyyy/z0ksv8eWXXxZ5ftOmTbi6utKxY8dyn1MQhMeXmOMkCIJBjB07loSEBJYtW1ZkEnd5jB8/HjMzszIfxiov7uzszKJFiwgLC+Pu3bvMnz+fLVu2MHbs2FKPO3ToULlel5mZWZnrJDVr1oz4+HhiY2MLbb948SIATZs2LfP4q1evFplPVd7ji7N//35SU1MZMmRIhY8tyfPPP49CoWD16tVoNBrWrl3L4MGDCxWeMDU1ZebMmZw9e5akpCTWr19PREQEvXr1Iisr65Gub2lpyf/+9z/mz5+PlZUVQ4cOrdDxYWFh5f6dl7dM+N69exk8eDCdO3dm8+bNmJubF9mnWbNmBb/LBz3K79fKyop58+Zx7do1YmNjWbp0KSdOnGDAgAGlHqfP9yB/eObDry02NpaEhIRyv65Vq1YxceJExowZw7Jly4r9Embz5s0MHjy4QgmtIAiPL9HjJAiCQXh6evJ///d/XLt2jTFjxlT4+Oo+VO9BPj4+TJs2jQMHDnDs2LFS99XnUL1Bgwbx3nvvsWbNGt56662C7atXr8bCwoLevXuXevyQIUP46aef2Lx5c6HCHWvWrKFWrVqVmgy/efNm2rdvj6enZ4WPLYmDgwODBw/m559/JjAwkNjY2FIrNNrb2zN8+HCioqKYMWMGYWFhNG7c+JFieOWVV7h37x6dO3dGqVRW6Fh9D1Pbt28fgwcPpmPHjmzbtg2FQlHsfkOGDGHKlCmcPHmy4HepVqtZt24d7dq1K9dQ0NK4ubkxduxYLly4wKJFi4rtAcqnz/egd+/eKJVKVq9eXehvNH8R7vLMrVu9ejUTJ05k5MiRLF++vNikKSIigpCQEL32ngqCULOJxEkQBIP57LPPKn2sr69vqYURKiIrK4tdu3YBcOLECUDX85OQkICVlRV9+vQp2Hfs2LGsWbOm1MIMqampdO3alRdeeIGGDRtiY2NDSEgIe/bsKbM3wsbG5pGHjuVr0qQJEyZMYM6cOZiYmNCmTRv27dvHjz/+yMcff1xoKNaHH37Ihx9+yIEDB+jcuTMAffr0oUePHrzyyiukpaVRr1491q9fz549e1i3bl2hb9nj4+MLegLyv+nfvXs3Li4uuLi40LlzZzQaDdu3b+ftt98uMeYdO3YUm+wOHz681Nc6fvx4Nm7cyLRp0/Dy8ipSCnzAgAE0bdqU1q1b4+Liwt27d1m0aBG1a9cuGEJ26NAhunXrxgcffMAHH3xQ6vUe1qJFizLLXJfE3Nxcb7/zo0ePMnjwYNzd3XnnnXeKDNVs3Lhxwdyu8ePHs2TJEp599lk+++wLine truncated
"image/png": "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 truncated
"text/plain": [
"Figure(PyObject <Figure size 1000x400 with 2 Axes>)"
]
@@ -1577,9 +1584,9 @@
"A popular algorithm for stochastic optimization is [Adam (Kingma & Ba, 2015)](https://arxiv.org/pdf/1412.6980.pdf), which adds several features:\n",
"\n",
"* It has a \"momentum\" or \"memory\" term, where the gradient is estimated by a *weighted average* of the current mini-batch gradient and the previous gradient estimate.\n",
"* It also estimates the *variance* of the gradient components in the same way, and essentially uses this as an estimate of the Hessian diagonal, to take a \"crude Newton\"-like step where the gradient components are weighed inversely by the square roots of their variances.\n",
"* It also estimates the *variance* of the gradient components in the same way, and essentially uses this as rough diagonal estimate of the Hessian: it takes a \"crude Newton\"-like step where the gradient components are weighed inversely by the square roots of their variances.\n",
"\n",
"Fortunately, it's quite simple to implement directly from the description in the paper linked above. Let's try it!"
"It's quite simple to implement directly from the description in the paper linked above. Let's try it!"
]
},
{
@@ -1710,7 +1717,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "11069568751189395699",
"id": "3943181141435372841",
"imports": {
"data": [
{
@@ -1742,16 +1749,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\":\"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"
"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\":\"3943181141435372841\",\"id\":\"3223888397370739056\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"3943181141435372841\",\"id\":\"17794834267465189920\",\"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\":\"3943181141435372841\",\"id\":\"3223888397370739056\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"3943181141435372841\",\"id\":\"17794834267465189920\",\"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": "9518166551142544059",
"id": "3223888397370739056",
"sync": false,
"value": 0
},
"index": {
"id": "4597076079323710000",
"id": "17794834267465189920",
"sync": true,
"value": 16
}
@@ -1891,7 +1898,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "4126395763376122617",
"id": "5320822360029405092",
"imports": {
"data": [
{
@@ -1923,16 +1930,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\":\"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"
"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\":\"5320822360029405092\",\"id\":\"7675368901471957801\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"5320822360029405092\",\"id\":\"2315382735147627232\",\"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\":\"5320822360029405092\",\"id\":\"7675368901471957801\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"5320822360029405092\",\"id\":\"2315382735147627232\",\"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": "10369096649874648088",
"id": "7675368901471957801",
"sync": false,
"value": 0
},
"index": {
"id": "5221676401620031846",
"id": "2315382735147627232",
"sync": true,
"value": 1
}
@@ -2006,8 +2013,8 @@
"type": "range"
},
"className": "slider slider is-fullwidth",
"max": 100,
"min": 10,
"max": 30,
"min": 1,
"step": 1,
"style": {}
},
@@ -2072,7 +2079,7 @@
"(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})"
]
},
"id": "17123112634148865443",
"id": "11971724704261648570",
"imports": {
"data": [
{
@@ -2104,18 +2111,18 @@
"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\":\"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"
"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\",\"20\",\"30\",\"40\",\"50\",\"60\",\"70\",\"80\",\"90\",\"100\",\"110\",\"120\",\"130\",\"140\",\"150\",\"160\",\"170\",\"180\",\"190\",\"200\",\"210\",\"220\",\"230\",\"240\",\"250\",\"260\",\"270\",\"280\",\"290\",\"300\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"11971724704261648570\",\"id\":\"8441385173414384818\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"11971724704261648570\",\"id\":\"17815239296590402690\",\"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\":\"11971724704261648570\",\"id\":\"8441385173414384818\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"11971724704261648570\",\"id\":\"17815239296590402690\",\"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": "1993935220063607529",
"id": "8441385173414384818",
"sync": false,
"value": 0
},
"index": {
"id": "7203213983935778271",
"id": "17815239296590402690",
"sync": true,
"value": 100
"value": 30
}
},
"systemjs_options": null
@@ -2140,7 +2147,7 @@
{
"children": [],
"instanceArgs": {
"id": "16954137743051292131",
"id": "7002162743532434097",
"name": "obs-node"
},
"nodeType": "ObservableNode",
@@ -2150,7 +2157,7 @@
],
"instanceArgs": {
"handlers": {},
"id": "892835830615702826",
"id": "14907764959034710486",
"imports": {
"data": [],
"type": "async_block"
@@ -2158,7 +2165,7 @@
"mount_callbacks": [],
"observables": {
"obs-node": {
"id": "16954137743051292131",
"id": "7002162743532434097",
"sync": false,
"value": {
"children": [
@@ -2170,7 +2177,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"
}
@@ -2205,7 +2212,7 @@
"text/html": [
"<div\n",
" class=\"webio-mountpoint\"\n",
" data-webio-mountpoint=\"856743641568635235\"\n",
" data-webio-mountpoint=\"8331019796652198127\"\n",
">\n",
" <script>\n",
" (function(){\n",
@@ -2215,7 +2222,7 @@
" // correctly.\n",
" if (typeof window.WebIO === \"undefined\") {\n",
" document\n",
" .querySelector('[data-webio-mountpoint=\"856743641568635235\"]')\n",
" .querySelector('[data-webio-mountpoint=\"8331019796652198127\"]')\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",
@@ -2228,8 +2235,8 @@
" return;\n",
" }\n",
" WebIO.mount(\n",
" 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
" document.querySelector('[data-webio-mountpoint=\"8331019796652198127\"]'),\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\":\"3943181141435372841\",\"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\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"3223888397370739056\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"17794834267465189920\\\",\\\"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\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"3223888397370739056\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"17794834267465189920\\\",\\\"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((importsLine truncated
" window,\n",
" );\n",
" })()\n",
@@ -2237,7 +2244,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[\"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
"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) @0x000000013960e9c0, Task (runnable) @0x000000013960e9c0), 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\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"3223888397370739056\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"3943181141435372841\\\",\\\"id\\\":\\\"17794834267465189920\\\",\\\"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\\\":\\\"chanLine truncated
]
},
"execution_count": 7,
@@ -2260,7 +2267,7 @@
"f2 = figure(figsize=(10,4))\n",
"@manipulate for log₁₀α in slider(-4:0.2:0, value=-1, label=\"learning rate log₁₀α\"),\n",
" M in slider(1:100, value=1, label=\"mini-batch M\"),\n",
" iterations in slider(10:100, value=100, label=\"# iterations\")\n",
" iterations in slider(10:10:300, value=300, label=\"# iterations\")\n",
" withfig(f2) do\n",
" α = exp10(log₁₀α)\n",
" x = [0.0,0.0]\n",
@@ -2326,7 +2333,7 @@
{
"data": {
"text/plain": [
"1.0352844707125362"
"1.0272553557565167"
]
},
"execution_count": 8,
@@ -2353,7 +2360,7 @@
"source": [
"## 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), 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",
"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 many algorithms similar in spirit to Adam and accelerated gradient descent, such as the [YOGI algorithm (Zaheer et al., 2018)](https://papers.nips.cc/paper_files/paper/2018/hash/90365351ccc7437a1309dc64e4db32a3-Abstract.html) which has better convergence guarantees than Adam; fancier quasi-Newton algorithms (see e.g. [Zhao et al. (2017)](https://arxiv.org/abs/1704.00116) and references therein); and also algorithms for more complicated optimization problems than simply minimizing $f(x)$: stochastic optimization with nonlinear constraints (see e.g. [Lan and Zhou (2016)](https://arxiv.org/abs/1604.03887), 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",
@@ -2369,7 +2376,7 @@
],
"metadata": {
"@webio": {
"lastCommId": "107d6a3486cd4e2db476ae69e28b361e",
"lastCommId": "df357f62d4024dc4b70514b5f63e3376",
"lastKernelId": "958a809a-e9d1-4ebb-af5d-5e8840746798"
},
"kernelspec": {