├── Parallel Computing with Python SSH.ipynb ├── Parallel Computing with Python public.ipynb ├── README.md ├── allrb.dat ├── array_proc1.gif ├── array_proc2.gif ├── notebook01.png └── notebook02.png /Parallel Computing with Python SSH.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Parallel Computing with Python using a cluster\n", 8 | "================================\n", 9 | "\n", 10 | "**[Rodrigo Nemmen](http://rodrigonemmen.com), IAG USP**\n", 11 | "\n", 12 | "This IPython notebook illustrates a few simple ways of doing parallel computing. It assumes you have a parallel IPython cluster running over SSH as described in this [tutorial](http://astropython.blogspot.com.br/2016/02/how-to-setup-ipython-parallel-cluster.html). Launch the cluster:\n", 13 | "\n", 14 | " ipcluster start --profile='ssh'\n", 15 | "\n", 16 | "Practical examples included in this notebook:\n", 17 | "\n", 18 | "1. Parallel function mapping to a list of arguments (multiprocessing module)\n", 19 | "2. Parallel execution of array function (scatter/gather) + parallel execution of scripts\n", 20 | "4. Easy parallel Monte Carlo (parallel magics)" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": { 27 | "collapsed": false 28 | }, 29 | "outputs": [ 30 | { 31 | "name": "stdout", 32 | "output_type": "stream", 33 | "text": [ 34 | "Populating the interactive namespace from numpy and matplotlib\n" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "%pylab inline" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": { 46 | "collapsed": false 47 | }, 48 | "outputs": [], 49 | "source": [ 50 | "import scipy\n", 51 | "import nemmen" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "# 1. Mapping a model to a grid of parameters \n", 59 | "\n", 60 | "\n", 63 | "\n", 64 | "Uses the *multiprocessing* module that comes by default with python, i.e. method independent of IPython.\n", 65 | "\n", 66 | "Idea: you have a function $f(\\mathbf{x},\\mathbf{y})$ of two parameters (e.g., $f$ may represent your model) stored in the arrays $(\\mathbf{x},\\mathbf{y})$. Given the arrays $\\mathbf{x}$ and $\\mathbf{y}$, you want to compute the values of $f(\\mathbf{x},\\mathbf{y})$. Let's assume for simplicity that there is no dependence on the neighbours. This is an embarassingly parallel problem.\n", 67 | "\n", 68 | "" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 2, 78 | "metadata": { 79 | "collapsed": false 80 | }, 81 | "outputs": [], 82 | "source": [ 83 | "import multiprocessing" 84 | ] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": {}, 89 | "source": [ 90 | "Time wasting function that depends on two parameters. Here, I generate a lot of random numbers based on the normal distribution. The two parameters are $\\mu$ and $\\sigma$." 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 3, 96 | "metadata": { 97 | "collapsed": false 98 | }, 99 | "outputs": [], 100 | "source": [ 101 | "def f(z):\n", 102 | " x=nemmen.random_normal(z[0], z[1], 100000)\n", 103 | " return x.sum()" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "Arrays of input parameters. You could easily modify this to take as input a matrix, not two arrays." 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 4, 116 | "metadata": { 117 | "collapsed": false 118 | }, 119 | "outputs": [], 120 | "source": [ 121 | "n=3000\n", 122 | "X=numpy.linspace(-1,1,n) # mean\n", 123 | "Y=numpy.linspace(0.1,1,n) # std. dev." 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 5, 129 | "metadata": { 130 | "collapsed": false 131 | }, 132 | "outputs": [], 133 | "source": [ 134 | "# creates list of arguments [Xi, Yi]\n", 135 | "pargs=[]\t# this is a list of lists!\n", 136 | "for i in range(X.size):\n", 137 | "\tpargs.append([X[i],Y[i]])" 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "metadata": {}, 143 | "source": [ 144 | "Parallel execution. Check out all the cores being used." 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 6, 150 | "metadata": { 151 | "collapsed": false 152 | }, 153 | "outputs": [], 154 | "source": [ 155 | "ncores=multiprocessing.cpu_count() # number of cores\n", 156 | "pool = multiprocessing.Pool(processes=ncores) # initializes parallel engine" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 10, 162 | "metadata": { 163 | "collapsed": false 164 | }, 165 | "outputs": [ 166 | { 167 | "name": "stdout", 168 | "output_type": "stream", 169 | "text": [ 170 | "CPU times: user 43.6 ms, sys: 1.88 ms, total: 45.5 ms\n", 171 | "Wall time: 3.94 s\n" 172 | ] 173 | } 174 | ], 175 | "source": [ 176 | "%%time \n", 177 | "t=pool.map(f, pargs)\t# parallel function map" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 11, 183 | "metadata": { 184 | "collapsed": false 185 | }, 186 | "outputs": [], 187 | "source": [ 188 | "pool.close()\t# close the parallel engine" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "Serial execution" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 12, 201 | "metadata": { 202 | "collapsed": false 203 | }, 204 | "outputs": [ 205 | { 206 | "name": "stdout", 207 | "output_type": "stream", 208 | "text": [ 209 | "CPU times: user 9.88 s, sys: 19 ms, total: 9.89 s\n", 210 | "Wall time: 9.94 s\n" 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "%time t=map(f, pargs)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": null, 221 | "metadata": { 222 | "collapsed": false 223 | }, 224 | "outputs": [], 225 | "source": [ 226 | "# if you want to convert list to matrix \n", 227 | "#y=array(t)" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "metadata": {}, 233 | "source": [ 234 | "Note that there is a similar map method for IPython parallel." 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "# 2. Parallel execution of array function\n", 242 | "\n", 243 | "Uses IPython parallel. Consider a function $f(x)$ which takes an array $x$ containing the grid of input parameters. We want to split the function calls (\"split the array\") to the different cores in our machine:\n", 244 | "\n", 245 | "![test](http://computing.llnl.gov/tutorials/parallel_comp/images/array_proc1.gif)\n", 246 | "![test](http://computing.llnl.gov/tutorials/parallel_comp/images/array_proc2.gif)" 247 | ] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": {}, 252 | "source": [ 253 | "Our time-waster function $f(x)$ that can be applied to an array of integers" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 3, 259 | "metadata": { 260 | "collapsed": false 261 | }, 262 | "outputs": [], 263 | "source": [ 264 | "# test if n is prime\n", 265 | "def isprime(n):\n", 266 | " for i in range(3, n):\n", 267 | " if n % i == 0:\n", 268 | " return False\n", 269 | " return True\n", 270 | "\n", 271 | "# tests each element of an array if it is prime\n", 272 | "def f(x):\n", 273 | " return map(isprime,x) " 274 | ] 275 | }, 276 | { 277 | "cell_type": "markdown", 278 | "metadata": {}, 279 | "source": [ 280 | "Generates big array of integers (in this case, 10k elements)" 281 | ] 282 | }, 283 | { 284 | "cell_type": "code", 285 | "execution_count": 4, 286 | "metadata": { 287 | "collapsed": false 288 | }, 289 | "outputs": [], 290 | "source": [ 291 | "x = scipy.random.randint(0,100000, (10000,)) " 292 | ] 293 | }, 294 | { 295 | "cell_type": "markdown", 296 | "metadata": {}, 297 | "source": [ 298 | "Serial execution" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 5, 304 | "metadata": { 305 | "collapsed": false 306 | }, 307 | "outputs": [ 308 | { 309 | "name": "stdout", 310 | "output_type": "stream", 311 | "text": [ 312 | "CPU times: user 19.8 s, sys: 236 ms, total: 20 s\n", 313 | "Wall time: 20.1 s\n" 314 | ] 315 | } 316 | ], 317 | "source": [ 318 | "%time y=f(x)" 319 | ] 320 | }, 321 | { 322 | "cell_type": "markdown", 323 | "metadata": {}, 324 | "source": [ 325 | "Now explain how IPython parallel works **(slides)**" 326 | ] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "execution_count": 6, 331 | "metadata": { 332 | "collapsed": false 333 | }, 334 | "outputs": [], 335 | "source": [ 336 | "import ipyparallel\n", 337 | "client = ipyparallel.Client(profile='ssh')" 338 | ] 339 | }, 340 | { 341 | "cell_type": "markdown", 342 | "metadata": {}, 343 | "source": [ 344 | "We are going to use the direct view, which means that commands always run on all nodes. This as opposed to a balanced view, which asynchronously executes code on nodes which are idle. In addition, we are going to turn blocking on. This means that jobs will block further execution until all nodes have finished." 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 8, 350 | "metadata": { 351 | "collapsed": false 352 | }, 353 | "outputs": [], 354 | "source": [ 355 | "direct = client[:]\n", 356 | "direct.block = True" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "Splits the input array $x$ between the cores" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 9, 369 | "metadata": { 370 | "collapsed": false 371 | }, 372 | "outputs": [], 373 | "source": [ 374 | "direct.scatter('x',x)" 375 | ] 376 | }, 377 | { 378 | "cell_type": "markdown", 379 | "metadata": {}, 380 | "source": [ 381 | "Verify that the array was indeed divided equally among the 24 engines" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 10, 387 | "metadata": { 388 | "collapsed": false 389 | }, 390 | "outputs": [ 391 | { 392 | "data": { 393 | "text/plain": [ 394 | "[417,\n", 395 | " 417,\n", 396 | " 417,\n", 397 | " 417,\n", 398 | " 417,\n", 399 | " 417,\n", 400 | " 417,\n", 401 | " 417,\n", 402 | " 417,\n", 403 | " 417,\n", 404 | " 417,\n", 405 | " 417,\n", 406 | " 417,\n", 407 | " 417,\n", 408 | " 417,\n", 409 | " 417,\n", 410 | " 416,\n", 411 | " 416,\n", 412 | " 416,\n", 413 | " 416,\n", 414 | " 416,\n", 415 | " 416,\n", 416 | " 416,\n", 417 | " 416]" 418 | ] 419 | }, 420 | "execution_count": 10, 421 | "metadata": {}, 422 | "output_type": "execute_result" 423 | } 424 | ], 425 | "source": [ 426 | "direct['x.size']" 427 | ] 428 | }, 429 | { 430 | "cell_type": "code", 431 | "execution_count": 11, 432 | "metadata": { 433 | "collapsed": false 434 | }, 435 | "outputs": [ 436 | { 437 | "data": { 438 | "text/plain": [ 439 | "[array([43609, 71158, 3753, 34684, 95499, 85862, 18642, 22492, 68964,\n", 440 | " 76654, 28322, 5383, 10417, 70534, 33174, 84461, 91996, 74484,\n", 441 | " 85981, 89913, 45067, 26499, 12274, 22477, 67491, 82092, 93669,\n", 442 | " 61269, 24715, 30040, 74499, 3159, 92823, 27064, 97127, 81057,\n", 443 | " 57558, 57227, 14720, 97548, 60105, 32947, 40596, 18095, 41710,\n", 444 | " 11929, 3393, 2379, 99779, 44112, 15009, 18991, 75538, 18589,\n", 445 | " 65596, 20400, 29623, 89350, 18159, 39343, 20068, 55423, 27784,\n", 446 | " 66954, 95358, 1854, 13241, 20355, 74891, 85421, 67552, 35079,\n", 447 | " 64141, 12869, 80213, 18247, 20648, 14626, 8468, 2453, 38690,\n", 448 | " 3688, 38945, 76869, 5997, 677, 61467, 77392, 38949, 54048,\n", 449 | " 56890, 30225, 34041, 70058, 88233, 71794, 62115, 2693, 80626,\n", 450 | " 86700, 66882, 72946, 96093, 17044, 16985, 96545, 8040, 4961,\n", 451 | " 80393, 75950, 41741, 37924, 72517, 58094, 66147, 54210, 46269,\n", 452 | " 26827, 42693, 79816, 89265, 21135, 6118, 4449, 48058, 45208,\n", 453 | " 15545, 93299, 93685, 88846, 62024, 58420, 54913, 53263, 3153,\n", 454 | " 31036, 32231, 2119, 2858, 91782, 68778, 93355, 46327, 66370,\n", 455 | " 90742, 67140, 70637, 13004, 25519, 69063, 76461, 62994, 30286,\n", 456 | " 59387, 79906, 7427, 97165, 80902, 95509, 58941, 7556, 23146,\n", 457 | " 29761, 40033, 5713, 5231, 91193, 81413, 46520, 71753, 24597,\n", 458 | " 99291, 44210, 42169, 49930, 94449, 15394, 34741, 29675, 71078,\n", 459 | " 84390, 3036, 9407, 77295, 33510, 65046, 83149, 41901, 52358,\n", 460 | " 49231, 24218, 672, 14874, 72785, 6482, 20169, 25577, 72906,\n", 461 | " 30291, 45071, 95689, 8439, 85658, 82057, 4593, 19393, 86583,\n", 462 | " 50237, 23390, 57196, 15384, 18386, 77791, 63436, 29019, 2315,\n", 463 | " 8527, 55238, 14166, 76091, 55104, 25974, 10441, 83726, 47481,\n", 464 | " 19614, 96051, 60813, 17393, 25080, 1780, 19429, 74447, 81749,\n", 465 | " 27080, 8451, 18234, 77676, 82840, 85333, 60083, 85709, 42624,\n", 466 | " 19485, 68360, 51836, 59436, 51013, 29709, 97612, 74297, 50748,\n", 467 | " 82475, 13881, 32478, 53265, 37821, 37496, 88350, 45, 25526,\n", 468 | " 4004, 43818, 36523, 83474, 9332, 48774, 34253, 77161, 82394,\n", 469 | " 79758, 45430, 22760, 12291, 9814, 24648, 71073, 34936, 99081,\n", 470 | " 89123, 45690, 34264, 84131, 60716, 42442, 55506, 64437, 18389,\n", 471 | " 4568, 27381, 59895, 33921, 64137, 28719, 62511, 77458, 40354,\n", 472 | " 32107, 83768, 33110, 58630, 41787, 33575, 31600, 52827, 907,\n", 473 | " 80230, 46621, 52626, 10047, 28540, 40646, 52202, 17295, 30074,\n", 474 | " 98017, 39786, 46721, 92124, 30266, 23786, 35673, 81503, 77101,\n", 475 | " 90216, 71118, 33741, 49996, 40107, 87850, 2751, 87217, 15134,\n", 476 | " 6494, 86513, 14719, 47637, 39558, 51156, 24412, 68576, 47978,\n", 477 | " 80783, 1496, 22099, 34533, 97428, 15104, 54076, 67888, 55240,\n", 478 | " 69721, 90228, 94883, 26340, 28721, 38006, 73553, 60175, 24729,\n", 479 | " 92574, 36224, 68138, 84305, 70539, 27812, 7062, 34312, 75741,\n", 480 | " 39817, 37518, 72651, 31456, 60895, 17591, 78759, 32784, 7215,\n", 481 | " 42571, 27201, 76923, 84440, 98948, 5013, 48543, 70275, 37772,\n", 482 | " 98925, 7023, 59838, 39935, 51098, 75732, 63455, 69149, 33159,\n", 483 | " 15913, 34894, 91772, 69208, 30525, 51371, 7484, 55527, 87164,\n", 484 | " 5553, 71625, 94080, 15632, 70143, 72272, 66516, 65057, 34455,\n", 485 | " 25135, 40497, 33605]),\n", 486 | " array([ 471, 7398, 57380, 87963, 29163, 91899, 72434, 96086, 34574,\n", 487 | " 40818, 90701, 42064, 12171, 48898, 52416, 42712, 33360, 19159,\n", 488 | " 36730, 724, 57027, 82319, 53427, 18882, 86320, 44172, 94965,\n", 489 | " 35680, 81061, 72076, 32558, 90632, 22330, 3231, 64991, 97930,\n", 490 | " 32407, 79512, 44455, 60163, 53344, 23734, 39417, 29250, 11204,\n", 491 | " 89842, 80160, 17763, 93993, 33297, 24595, 34442, 24120, 99444,\n", 492 | " 18252, 52278, 27372, 57590, 9352, 48140, 38770, 94293, 16174,\n", 493 | " 21059, 74853, 8991, 91270, 48908, 64662, 66205, 22800, 15790,\n", 494 | " 28186, 98150, 92483, 77333, 61108, 32553, 64152, 76093, 37799,\n", 495 | " 27170, 63784, 81026, 76581, 47102, 82429, 55610, 14599, 3107,\n", 496 | " 88118, 70273, 91985, 78234, 20550, 22615, 70176, 81855, 1854,\n", 497 | " 91243, 68893, 23973, 71973, 7969, 31014, 27065, 94978, 51982,\n", 498 | " 36657, 43897, 57233, 45924, 88860, 83177, 92400, 64012, 39384,\n", 499 | " 125, 49914, 43289, 63705, 82770, 29159, 71555, 44682, 81642,\n", 500 | " 91638, 81953, 95841, 67206, 58466, 99300, 13145, 33179, 38028,\n", 501 | " 9103, 93681, 2810, 36934, 85692, 20200, 47497, 92415, 43319,\n", 502 | " 23486, 96512, 86404, 24939, 80709, 91128, 5851, 69079, 92967,\n", 503 | " 7686, 59688, 86090, 46020, 19501, 25069, 31425, 63615, 58419,\n", 504 | " 35545, 68341, 54361, 68605, 26550, 80227, 76121, 15908, 54515,\n", 505 | " 17407, 34575, 88724, 96268, 80961, 46052, 49955, 44846, 60430,\n", 506 | " 50305, 33913, 86702, 47520, 92241, 29472, 69542, 7026, 4949,\n", 507 | " 70145, 41259, 13781, 42657, 43873, 52691, 32718, 21578, 62581,\n", 508 | " 29503, 5652, 73365, 53577, 8220, 14756, 33260, 25773, 54930,\n", 509 | " 75928, 75637, 67668, 5315, 63361, 74657, 48097, 60414, 95527,\n", 510 | " 41772, 12849, 71925, 631, 7646, 84068, 5255, 49723, 16855,\n", 511 | " 96899, 98937, 76219, 48892, 80788, 67814, 47605, 95161, 96101,\n", 512 | " 68643, 30844, 53120, 51545, 6157, 68439, 42689, 57579, 20034,\n", 513 | " 31880, 65763, 39401, 8411, 93127, 66645, 14206, 57348, 33962,\n", 514 | " 28228, 20246, 80755, 66519, 75552, 95742, 93481, 17044, 79291,\n", 515 | " 7011, 2309, 76116, 29573, 8954, 39702, 37634, 40807, 94214,\n", 516 | " 18469, 15164, 92798, 23702, 24802, 7650, 52906, 92419, 25781,\n", 517 | " 2519, 69829, 53304, 88312, 30576, 23451, 53579, 57688, 21132,\n", 518 | " 25786, 39839, 42788, 71174, 35378, 60971, 93455, 21520, 45198,\n", 519 | " 44561, 37418, 53567, 47008, 15347, 8459, 8755, 4106, 4683,\n", 520 | " 53036, 97355, 73525, 48323, 78513, 88176, 70213, 42212, 63457,\n", 521 | " 75327, 67895, 64418, 20236, 72528, 11061, 85755, 38357, 43756,\n", 522 | " 49999, 44185, 48710, 90365, 85636, 47044, 52734, 75372, 39904,\n", 523 | " 68309, 56522, 81861, 97176, 44612, 17772, 78770, 88080, 17794,\n", 524 | " 81129, 56952, 94092, 27278, 97254, 43947, 56893, 18155, 14838,\n", 525 | " 31381, 29092, 12187, 93942, 37357, 19346, 70428, 80019, 61355,\n", 526 | " 88336, 55600, 38802, 90113, 56149, 51795, 81633, 18497, 50570,\n", 527 | " 984, 93383, 88879, 99034, 96944, 30518, 44413, 29331, 85347,\n", 528 | " 35364, 8256, 69872, 32878, 42112, 78805, 39135, 88702, 51010,\n", 529 | " 58280, 38699, 7863, 24091, 45530, 66448, 34349, 78401, 98463,\n", 530 | " 92957, 12989, 12221, 47810, 18090, 50410, 74114, 76561, 82596,\n", 531 | " 25831, 72716, 94656, 74552, 45046, 48918, 50693, 37332, 16990,\n", 532 | " 5184, 52159, 90274]),\n", 533 | " array([43361, 36898, 4452, 31367, 5031, 70859, 24158, 15668, 41232,\n", 534 | " 60562, 27227, 81865, 24610, 25021, 79330, 81794, 44086, 15619,\n", 535 | " 60082, 70657, 87629, 42471, 76319, 17085, 96984, 49160, 72487,\n", 536 | " 86509, 65980, 92962, 58276, 82811, 71601, 5361, 62045, 80638,\n", 537 | " 60681, 80873, 3746, 10421, 37362, 8247, 26907, 22902, 12671,\n", 538 | " 40201, 16394, 97040, 1597, 89256, 21813, 67549, 21293, 33311,\n", 539 | " 45876, 1040, 27039, 71173, 3180, 53200, 52557, 13706, 80386,\n", 540 | " 20935, 75977, 78080, 66615, 30395, 73942, 97508, 16195, 4734,\n", 541 | " 25612, 70183, 32735, 35084, 74167, 16938, 10429, 47041, 94785,\n", 542 | " 15474, 47664, 4607, 16563, 32283, 94344, 95976, 45923, 43297,\n", 543 | " 30735, 66476, 38156, 16678, 83859, 10322, 25803, 68477, 91857,\n", 544 | " 4024, 36053, 25247, 97942, 63027, 11433, 52055, 23126, 96899,\n", 545 | " 99462, 24530, 71994, 82353, 89718, 38599, 42164, 52153, 79088,\n", 546 | " 17271, 99008, 32046, 71789, 37720, 79504, 94084, 56724, 12164,\n", 547 | " 39275, 16764, 4718, 20019, 73889, 56762, 16811, 36205, 51544,\n", 548 | " 4107, 44266, 30696, 45163, 44085, 83200, 21882, 53683, 47385,\n", 549 | " 72395, 93789, 87318, 945, 70893, 74722, 51415, 90126, 39602,\n", 550 | " 58512, 68035, 85815, 23224, 85875, 36192, 7215, 80933, 35095,\n", 551 | " 1695, 12828, 28271, 5275, 82185, 55071, 88854, 14814, 35202,\n", 552 | " 84365, 85361, 48532, 97507, 43526, 38669, 81996, 89855, 1483,\n", 553 | " 52790, 11785, 96408, 75751, 84511, 7621, 49029, 80483, 79332,\n", 554 | " 10895, 82197, 71232, 1086, 20668, 67705, 28667, 93329, 11430,\n", 555 | " 64770, 61354, 41449, 23493, 60306, 75633, 26663, 57794, 87212,\n", 556 | " 34775, 61697, 74176, 22076, 24136, 50504, 47742, 13462, 31583,\n", 557 | " 27084, 11568, 6259, 41361, 9438, 55368, 70874, 74120, 29222,\n", 558 | " 45444, 75561, 56979, 50068, 66488, 81005, 14737, 43887, 56425,\n", 559 | " 53931, 17516, 81944, 99544, 47542, 1167, 72530, 20767, 82284,\n", 560 | " 79104, 13849, 71920, 7619, 91330, 30525, 48759, 16593, 83123,\n", 561 | " 88915, 17950, 4929, 86258, 26765, 31225, 85472, 45471, 30827,\n", 562 | " 89774, 26886, 83798, 68838, 26626, 16584, 53991, 15571, 7569,\n", 563 | " 39182, 52834, 81432, 30715, 73621, 76099, 88035, 72906, 65534,\n", 564 | " 24258, 50605, 20958, 84656, 81591, 76731, 70452, 2475, 3550,\n", 565 | " 66020, 29092, 42771, 56215, 58129, 93219, 3832, 70634, 75648,\n", 566 | " 39123, 81547, 15472, 19206, 82034, 13850, 82948, 60829, 49282,\n", 567 | " 83044, 92399, 74513, 84701, 61674, 21378, 32306, 92383, 22161,\n", 568 | " 33111, 74849, 32124, 18208, 92565, 15454, 30163, 12852, 41060,\n", 569 | " 60378, 74069, 48410, 97662, 28770, 9240, 60302, 85919, 66308,\n", 570 | " 84746, 2519, 45694, 39024, 5314, 94743, 25236, 27728, 50782,\n", 571 | " 82193, 88715, 96275, 93308, 73825, 33561, 84667, 35667, 61101,\n", 572 | " 56402, 2397, 52968, 18126, 70894, 28240, 72661, 19817, 45316,\n", 573 | " 95650, 26123, 65693, 26943, 90406, 63483, 66367, 86754, 48489,\n", 574 | " 16534, 39784, 73973, 91953, 28860, 59100, 79220, 60104, 95368,\n", 575 | " 61311, 958, 24451, 89015, 7456, 4171, 58871, 78417, 7813,\n", 576 | " 959, 22746, 38182, 7274, 11410, 89856, 74933, 94030, 52558,\n", 577 | " 9898, 96335, 90594, 72564, 93442, 49752, 56296, 93271, 62138,\n", 578 | " 37589, 18946, 38389, 59972, 49677, 61386, 2915, 81477, 78217,\n", 579 | " 30247, 26235, 47617]),\n", 580 | " array([30305, 29514, 14839, 98275, 7855, 63525, 58813, 51271, 31045,\n", 581 | " 93693, 20965, 31478, 19035, 97871, 70745, 58274, 2612, 29461,\n", 582 | " 60376, 51915, 9579, 34191, 91020, 8031, 40797, 30852, 17052,\n", 583 | " 48265, 22666, 42818, 72508, 85007, 23574, 36418, 72434, 59610,\n", 584 | " 8880, 94362, 25401, 20728, 26034, 90812, 61593, 1611, 39125,\n", 585 | " 70278, 26485, 28319, 52910, 97571, 48558, 74939, 17170, 30988,\n", 586 | " 52030, 49722, 67254, 24349, 37506, 46760, 50205, 57361, 27118,\n", 587 | " 61237, 1434, 69370, 31457, 16249, 15703, 96804, 60063, 67559,\n", 588 | " 97797, 57589, 62905, 47653, 33484, 1596, 89952, 79482, 19040,\n", 589 | " 50617, 97060, 7105, 58943, 49348, 19892, 16127, 91153, 34576,\n", 590 | " 77595, 45824, 47805, 21552, 83796, 48272, 98467, 2851, 47311,\n", 591 | " 92284, 15614, 73005, 92858, 5684, 55272, 58710, 48821, 94610,\n", 592 | " 9219, 46431, 644, 16146, 12333, 24379, 95872, 27580, 94972,\n", 593 | " 43300, 95011, 11124, 91131, 50203, 57614, 23689, 18602, 55811,\n", 594 | " 47995, 68302, 77706, 55046, 66570, 44928, 61577, 69568, 20645,\n", 595 | " 14477, 75022, 88169, 26034, 42439, 45483, 44681, 74735, 33031,\n", 596 | " 25795, 66922, 62816, 80289, 26234, 50081, 30541, 30514, 68523,\n", 597 | " 14747, 87417, 38761, 68204, 45191, 4620, 4365, 78572, 27398,\n", 598 | " 34719, 75940, 690, 66384, 7349, 15560, 97873, 81258, 13434,\n", 599 | " 5379, 75449, 74401, 38453, 67770, 90130, 8250, 80511, 7184,\n", 600 | " 53803, 11889, 87504, 71280, 3688, 53484, 75481, 85704, 71452,\n", 601 | " 5587, 95241, 72911, 33505, 4937, 99078, 37025, 84535, 22022,\n", 602 | " 62312, 67505, 77566, 23864, 66804, 51580, 36055, 69170, 3031,\n", 603 | " 69081, 27870, 9655, 24716, 86309, 44064, 55733, 299, 32513,\n", 604 | " 19841, 23670, 44686, 75527, 63759, 87065, 30211, 25920, 72873,\n", 605 | " 34840, 19066, 81535, 45508, 51769, 33473, 15041, 38148, 79528,\n", 606 | " 62692, 26664, 91410, 68114, 97625, 30358, 7019, 39404, 5710,\n", 607 | " 88383, 17491, 46242, 4653, 2967, 2015, 70988, 14995, 19232,\n", 608 | " 20323, 14250, 3776, 29628, 44875, 85994, 11484, 84250, 36378,\n", 609 | " 36184, 23481, 29933, 82059, 65049, 30207, 43165, 63672, 85482,\n", 610 | " 63409, 11364, 84862, 9730, 96595, 4408, 32054, 25170, 48451,\n", 611 | " 88285, 15860, 1818, 30473, 93394, 12610, 38565, 85650, 20761,\n", 612 | " 75907, 59981, 83744, 8508, 84666, 18523, 68173, 63054, 61759,\n", 613 | " 11562, 22876, 74119, 93149, 49320, 32998, 63474, 20364, 64352,\n", 614 | " 12250, 88698, 17076, 65765, 52087, 69546, 91264, 90190, 9703,\n", 615 | " 97348, 65367, 75632, 43596, 86180, 24341, 59968, 50800, 31129,\n", 616 | " 49946, 19943, 24690, 82736, 82672, 57414, 16102, 99751, 69911,\n", 617 | " 25732, 99189, 31787, 8850, 50945, 95480, 53560, 84322, 5898,\n", 618 | " 87040, 50227, 34041, 45186, 6615, 33966, 91468, 87099, 83301,\n", 619 | " 83021, 19016, 20990, 39658, 68918, 17715, 83317, 6990, 29842,\n", 620 | " 83122, 28725, 59390, 90843, 64156, 37320, 25954, 77401, 72616,\n", 621 | " 83565, 8522, 40382, 99025, 30542, 70651, 23230, 73661, 33476,\n", 622 | " 20389, 82947, 65541, 85303, 31380, 62428, 70239, 6426, 55599,\n", 623 | " 39981, 55293, 13540, 47674, 37351, 99919, 90437, 37626, 68146,\n", 624 | " 27311, 41303, 24259, 59647, 81310, 74091, 98515, 46938, 45826,\n", 625 | " 15093, 69216, 44737, 75841, 80298, 15480, 81746, 47408, 54433,\n", 626 | " 18865, 16147, 58524]),\n", 627 | " array([76010, 3962, 57266, 29450, 58694, 39138, 6985, 82260, 39120,\n", 628 | " 35056, 19984, 7999, 61671, 48764, 51275, 37039, 93465, 11870,\n", 629 | " 64441, 15906, 25663, 93116, 14831, 83833, 82542, 31646, 98293,\n", 630 | " 22741, 5332, 97621, 73733, 18550, 84145, 73713, 18019, 48039,\n", 631 | " 95285, 80840, 50691, 57117, 9873, 43097, 60282, 81589, 82006,\n", 632 | " 12202, 98839, 73862, 26339, 32242, 25839, 9521, 72143, 57507,\n", 633 | " 32975, 90800, 40770, 86857, 46950, 47033, 33694, 99865, 41588,\n", 634 | " 50627, 53800, 58895, 78861, 16760, 77508, 41163, 49268, 19254,\n", 635 | " 45942, 98296, 60801, 58620, 3754, 30032, 56396, 38932, 15924,\n", 636 | " 33948, 51320, 96805, 28497, 26404, 73680, 19793, 94114, 20030,\n", 637 | " 86934, 59696, 74509, 10247, 44825, 26423, 63763, 62868, 19429,\n", 638 | " 45896, 64502, 74373, 31434, 72958, 93639, 20901, 8938, 18296,\n", 639 | " 14876, 58273, 72102, 16564, 74271, 8308, 50239, 72627, 88559,\n", 640 | " 28412, 33296, 6547, 35991, 13410, 76762, 93441, 72331, 44510,\n", 641 | " 73458, 25087, 12954, 25865, 6582, 36042, 3444, 27227, 25529,\n", 642 | " 67978, 6393, 77230, 43528, 36522, 4755, 54381, 81870, 60067,\n", 643 | " 73022, 58593, 75875, 731, 49432, 62970, 84534, 80457, 90031,\n", 644 | " 15661, 51479, 49461, 28926, 34979, 89990, 67709, 40638, 70450,\n", 645 | " 21806, 48168, 81285, 36747, 1449, 24814, 90761, 25879, 60052,\n", 646 | " 48920, 14297, 94653, 59837, 21498, 40165, 99070, 8066, 65458,\n", 647 | " 27707, 55506, 66896, 8311, 98219, 29750, 703, 99029, 30612,\n", 648 | " 48768, 2617, 74146, 48566, 10702, 34478, 46985, 41647, 25995,\n", 649 | " 10658, 74918, 92063, 11972, 31827, 16903, 235, 63419, 34992,\n", 650 | " 77303, 7806, 85385, 71643, 64423, 44502, 39084, 50227, 46802,\n", 651 | " 18341, 18940, 83286, 80848, 70880, 6111, 28609, 65949, 12322,\n", 652 | " 58719, 49789, 11054, 61354, 95301, 7563, 44414, 82627, 60785,\n", 653 | " 16802, 34059, 38999, 11943, 1977, 99237, 14683, 8716, 41667,\n", 654 | " 88878, 21542, 64377, 15943, 49386, 76988, 28212, 25096, 98251,\n", 655 | " 32650, 66450, 67548, 934, 93067, 75674, 80984, 64271, 6494,\n", 656 | " 65023, 7346, 60003, 62668, 12619, 4603, 67571, 65237, 83269,\n", 657 | " 21010, 57791, 74645, 57095, 74063, 51506, 82303, 78903, 44542,\n", 658 | " 16709, 59642, 93888, 94145, 57190, 90433, 69386, 91333, 66777,\n", 659 | " 26844, 51046, 59704, 55673, 73822, 55351, 90339, 12575, 9401,\n", 660 | " 98012, 52054, 81712, 56270, 45006, 31556, 29524, 38831, 15084,\n", 661 | " 49885, 83004, 95765, 90462, 96117, 24847, 31101, 76226, 52480,\n", 662 | " 16186, 52410, 68593, 1563, 14930, 70907, 49828, 75148, 64324,\n", 663 | " 19987, 49303, 24520, 64678, 57107, 33261, 18636, 64298, 12767,\n", 664 | " 11269, 1335, 75097, 59812, 17982, 76345, 24570, 35350, 81101,\n", 665 | " 75328, 10755, 37711, 41671, 36311, 55542, 94652, 34702, 45423,\n", 666 | " 59022, 72646, 45325, 16616, 55731, 24018, 53198, 59783, 42151,\n", 667 | " 22582, 27903, 1121, 2902, 61236, 84211, 67545, 41922, 11726,\n", 668 | " 93568, 68072, 93400, 34465, 47996, 54011, 44540, 62974, 51916,\n", 669 | " 16719, 37436, 89685, 25371, 56284, 84134, 4840, 85427, 97958,\n", 670 | " 82415, 15342, 96551, 38229, 23263, 79063, 97081, 6597, 10214,\n", 671 | " 66956, 70799, 71885, 86962, 68038, 40237, 98682, 8787, 88535,\n", 672 | " 96258, 40032, 66839, 49630, 68655, 80196, 67186, 10253, 52071,\n", 673 | " 21897, 61474, 83577]),\n", 674 | " array([62857, 82364, 49782, 18952, 21084, 66153, 7379, 99586, 49313,\n", 675 | " 46766, 11667, 41873, 87085, 43175, 70157, 69525, 88440, 32596,\n", 676 | " 12719, 86560, 36215, 99649, 68119, 85959, 57975, 5924, 61644,\n", 677 | " 51625, 79852, 25422, 61873, 67070, 4344, 53526, 84004, 46678,\n", 678 | " 56790, 83195, 10041, 29879, 81769, 54668, 38283, 51119, 48075,\n", 679 | " 21463, 57169, 42738, 84961, 33117, 52140, 79230, 92807, 68515,\n", 680 | " 44772, 48421, 60042, 29460, 56355, 17777, 92717, 1601, 31114,\n", 681 | " 12277, 6625, 69744, 51064, 20423, 23425, 6776, 56294, 53122,\n", 682 | " 57603, 39381, 20463, 51926, 89731, 31035, 1914, 16853, 84051,\n", 683 | " 29441, 98973, 64224, 88781, 92732, 31703, 20519, 30587, 44788,\n", 684 | " 22746, 45631, 10283, 46872, 89572, 86461, 51829, 51459, 97336,\n", 685 | " 3545, 94508, 76135, 58293, 85329, 13360, 72601, 48404, 43852,\n", 686 | " 28618, 64582, 9805, 38879, 87046, 10808, 56905, 55239, 44603,\n", 687 | " 35687, 21067, 2481, 1895, 23235, 51162, 84880, 870, 76371,\n", 688 | " 54332, 99517, 60492, 15942, 22090, 19480, 29774, 26597, 22234,\n", 689 | " 65430, 40836, 46889, 61677, 68756, 33819, 15198, 77517, 1977,\n", 690 | " 90526, 8548, 72762, 61067, 10311, 72067, 18171, 98926, 8642,\n", 691 | " 40639, 85205, 91447, 68599, 2395, 58963, 32624, 72554, 74144,\n", 692 | " 71314, 78629, 47400, 65366, 72995, 36337, 95812, 80948, 13083,\n", 693 | " 93644, 60042, 99889, 69463, 24965, 39943, 47158, 63866, 20696,\n", 694 | " 10944, 66866, 90391, 61612, 23489, 97230, 70423, 68438, 31394,\n", 695 | " 26147, 19393, 13931, 73113, 31746, 88157, 45457, 22493, 65489,\n", 696 | " 20961, 96352, 9293, 11640, 74873, 27979, 78997, 96825, 29492,\n", 697 | " 48103, 86522, 8909, 40119, 10221, 25030, 40642, 85299, 35159,\n", 698 | " 41352, 57015, 94624, 12094, 54993, 16013, 28982, 54064, 69448,\n", 699 | " 28465, 69669, 76242, 40070, 71044, 86354, 45685, 8033, 61141,\n", 700 | " 32518, 4242, 35617, 35515, 85189, 78030, 69171, 1191, 90991,\n", 701 | " 97781, 84405, 63267, 1897, 46625, 47311, 85372, 38709, 70421,\n", 702 | " 21195, 56493, 8816, 79536, 94258, 28680, 92712, 65100, 40699,\n", 703 | " 60485, 54543, 92520, 38256, 50213, 22287, 55159, 46929, 10779,\n", 704 | " 86755, 42511, 35870, 46138, 27073, 7389, 14325, 44152, 78282,\n", 705 | " 16121, 80934, 2527, 98529, 95211, 17306, 55909, 110, 60007,\n", 706 | " 65453, 58044, 58558, 86670, 91886, 6369, 36272, 85722, 81271,\n", 707 | " 76439, 54719, 83419, 27387, 6786, 17109, 82362, 65541, 51304,\n", 708 | " 65760, 2453, 21494, 35729, 20010, 960, 31722, 55764, 57357,\n", 709 | " 43308, 62551, 69334, 13082, 6403, 80360, 50046, 97214, 11787,\n", 710 | " 25288, 90711, 74014, 88998, 94973, 69588, 94001, 10413, 29992,\n", 711 | " 46137, 39504, 28394, 31401, 1574, 45173, 83105, 46351, 99129,\n", 712 | " 61392, 12113, 64629, 6914, 32189, 9777, 94026, 10033, 38601,\n", 713 | " 27120, 86990, 9734, 35722, 22860, 82496, 96158, 92398, 49585,\n", 714 | " 64439, 74490, 32612, 68634, 55896, 38083, 72568, 77150, 52674,\n", 715 | " 38992, 23238, 57118, 48032, 53825, 7544, 17008, 65361, 58526,\n", 716 | " 81648, 34092, 6935, 55584, 53222, 84729, 41398, 29516, 4368,\n", 717 | " 54888, 40967, 81690, 1001, 8272, 51485, 36015, 67405, 17131,\n", 718 | " 33982, 57968, 40245, 20268, 11788, 1502, 86506, 70761, 60145,\n", 719 | " 46760, 11538, 30544, 6180, 7949, 642, 85305, 41685, 40623,\n", 720 | " 44059, 51495, 8452]),\n", 721 | " array([81255, 653, 55991, 57766, 71210, 24048, 73268, 93112, 23883,\n", 722 | " 87968, 78747, 69310, 58867, 53708, 40020, 51856, 9604, 27010,\n", 723 | " 41207, 42246, 33472, 51081, 68965, 53505, 11267, 53801, 7957,\n", 724 | " 43910, 47240, 38857, 81340, 3450, 44303, 43305, 88354, 48168,\n", 725 | " 31800, 22343, 34576, 96899, 68233, 1754, 35731, 36382, 56348,\n", 726 | " 90296, 46135, 96400, 4589, 2026, 51573, 75202, 50182, 40970,\n", 727 | " 16836, 16431, 92220, 85368, 8388, 677, 2031, 54431, 7086,\n", 728 | " 78749, 4045, 5893, 53105, 78176, 70667, 94123, 40362, 47289,\n", 729 | " 88870, 57541, 48268, 79232, 96204, 94420, 20252, 13153, 18714,\n", 730 | " 28058, 58725, 32368, 93018, 43721, 86017, 90779, 56853, 52069,\n", 731 | " 80337, 58153, 52745, 96980, 15460, 293, 69047, 61436, 50174,\n", 732 | " 5433, 92478, 86277, 24279, 67954, 98146, 17748, 80547, 80171,\n", 733 | " 1583, 56878, 48854, 82547, 42724, 26154, 81669, 78382, 31223,\n", 734 | " 96048, 91281, 99389, 30853, 62017, 46697, 90968, 84198, 16803,\n", 735 | " 79752, 27440, 23198, 64858, 14211, 79865, 89715, 52302, 8933,\n", 736 | " 65987, 17978, 95268, 78101, 28978, 20334, 77060, 55120, 20724,\n", 737 | " 66115, 89662, 46451, 86026, 89116, 84701, 9029, 23892, 22685,\n", 738 | " 25549, 13755, 42702, 70954, 86522, 72562, 49426, 82675, 50195,\n", 739 | " 83289, 930, 84257, 24538, 67730, 47536, 18570, 75316, 21428,\n", 740 | " 11040, 26898, 32135, 63621, 93521, 16976, 16064, 24558, 56511,\n", 741 | " 19578, 20608, 73927, 46585, 33341, 17568, 27360, 28065, 78779,\n", 742 | " 55129, 76419, 51485, 56219, 1600, 29687, 73205, 56222, 80974,\n", 743 | " 88259, 23148, 11327, 94439, 52548, 25989, 20178, 6802, 94005,\n", 744 | " 57168, 78061, 83027, 99221, 3028, 35579, 7332, 97021, 38208,\n", 745 | " 10907, 5759, 15304, 34001, 74659, 12692, 48297, 56920, 83546,\n", 746 | " 82744, 13897, 886, 73034, 51662, 67243, 91055, 16567, 47378,\n", 747 | " 59599, 14990, 66114, 92358, 70646, 65308, 28820, 57982, 44248,\n", 748 | " 27471, 54108, 81517, 20666, 83701, 83923, 14423, 32200, 56036,\n", 749 | " 50827, 29821, 37360, 90741, 33408, 69241, 48978, 98750, 39209,\n", 750 | " 87890, 70132, 78077, 73751, 26649, 56190, 29660, 98584, 22134,\n", 751 | " 33950, 56492, 50347, 32851, 88212, 43827, 82461, 53251, 6066,\n", 752 | " 92408, 61986, 61289, 27890, 34577, 6984, 88496, 10399, 25321,\n", 753 | " 22096, 78141, 27375, 47723, 28484, 65606, 53239, 94435, 26139,\n", 754 | " 14401, 96889, 39140, 1039, 24235, 55313, 95077, 47560, 49556,\n", 755 | " 97061, 57409, 72669, 38621, 43081, 54041, 83406, 10724, 24916,\n", 756 | " 24437, 28583, 90791, 24616, 67673, 91520, 21130, 39589, 69546,\n", 757 | " 66219, 51795, 58386, 99526, 16243, 55573, 58060, 54075, 11433,\n", 758 | " 1229, 28499, 70499, 37178, 8994, 63986, 99254, 86619, 25422,\n", 759 | " 10477, 83550, 20942, 52265, 89314, 59268, 36860, 47005, 11734,\n", 760 | " 86179, 78526, 81586, 7464, 28540, 5373, 92314, 78850, 66948,\n", 761 | " 90951, 54460, 33892, 93558, 28591, 97769, 60391, 91357, 82148,\n", 762 | " 70123, 64257, 8287, 6434, 25726, 71100, 49692, 62314, 90811,\n", 763 | " 71705, 62867, 64567, 94610, 27200, 54041, 66802, 38364, 14782,\n", 764 | " 409, 91292, 65686, 23088, 50234, 97590, 86786, 55415, 52034,\n", 765 | " 46084, 97716, 59868, 54734, 68164, 57125, 29588, 81155, 66763,\n", 766 | " 46476, 66237, 83359, 64964, 96868, 40285, 56117, 34129, 24322,\n", 767 | " 97352, 23357, 89565]),\n", 768 | " array([87162, 32041, 26908, 78852, 20859, 18843, 27894, 60702, 46379,\n", 769 | " 71414, 59979, 54757, 84101, 29511, 75766, 27945, 23215, 31779,\n", 770 | " 96070, 35968, 3411, 49105, 62409, 45275, 25951, 43160, 20371,\n", 771 | " 4095, 70901, 83999, 48707, 84267, 27984, 58012, 51297, 27734,\n", 772 | " 52375, 80973, 58742, 84425, 41674, 57402, 4873, 4853, 34065,\n", 773 | " 33264, 85692, 62731, 15335, 41189, 40898, 35218, 51491, 25716,\n", 774 | " 36745, 90755, 58225, 13785, 19346, 55606, 92352, 63404, 61810,\n", 775 | " 5825, 62581, 70866, 68386, 32101, 42150, 47701, 18990, 85147,\n", 776 | " 42660, 69020, 63683, 14463, 13675, 81211, 3503, 30852, 57718,\n", 777 | " 79022, 32222, 50122, 45410, 67720, 13091, 86279, 21430, 79453,\n", 778 | " 50606, 70345, 47849, 6009, 88401, 22315, 74645, 63000, 3038,\n", 779 | " 82015, 3891, 47149, 38566, 95553, 42988, 81606, 25593, 95768,\n", 780 | " 29821, 4468, 43278, 69420, 66347, 87437, 61981, 68507, 90002,\n", 781 | " 20865, 78379, 17912, 8461, 64027, 12497, 52681, 14262, 95855,\n", 782 | " 52045, 79976, 6177, 17248, 6500, 25518, 69038, 22617, 75302,\n", 783 | " 27634, 5161, 71043, 34759, 86817, 49808, 81673, 46534, 45353,\n", 784 | " 74927, 57047, 27025, 57984, 44768, 61832, 39503, 22752, 36130,\n", 785 | " 3772, 42701, 34654, 60427, 56186, 40566, 31006, 11393, 32562,\n", 786 | " 92197, 66983, 29228, 59732, 94760, 48373, 78271, 16212, 21796,\n", 787 | " 91322, 38247, 8279, 91529, 98593, 71448, 38777, 65260, 43266,\n", 788 | " 90438, 97401, 53681, 86264, 35364, 26601, 4180, 29582, 9352,\n", 789 | " 38747, 91891, 98236, 23127, 78441, 58235, 16819, 93293, 88872,\n", 790 | " 94867, 79036, 44899, 41072, 91604, 24994, 45728, 86074, 2306,\n", 791 | " 45757, 81963, 70548, 16513, 9523, 58120, 52037, 3968, 68506,\n", 792 | " 46025, 28255, 20249, 26184, 54521, 12704, 71713, 68418, 73474,\n", 793 | " 17688, 54624, 78835, 54829, 78705, 7023, 65071, 45352, 16835,\n", 794 | " 58317, 95543, 8694, 22221, 17028, 38258, 23625, 70295, 94214,\n", 795 | " 12674, 63905, 36770, 66887, 54139, 51271, 65389, 54953, 43558,\n", 796 | " 42878, 71388, 82801, 41376, 88315, 43449, 46481, 70024, 22370,\n", 797 | " 70097, 89811, 86880, 78325, 69936, 49290, 10188, 56657, 71438,\n", 798 | " 62288, 44261, 57590, 38227, 65601, 38698, 211, 60227, 13841,\n", 799 | " 51208, 64585, 85356, 12797, 87300, 48443, 82426, 85063, 97687,\n", 800 | " 36410, 47324, 89715, 91598, 26988, 4284, 27955, 90136, 69167,\n", 801 | " 76286, 73639, 81024, 72464, 17590, 15302, 89432, 79767, 74067,\n", 802 | " 86874, 33798, 88422, 26279, 71856, 36670, 12465, 49582, 42626,\n", 803 | " 86777, 31329, 19305, 49196, 76372, 28529, 71708, 71503, 81982,\n", 804 | " 26906, 5085, 64482, 82663, 17204, 18623, 66522, 9105, 68754,\n", 805 | " 9544, 17800, 90180, 71604, 34473, 23941, 11319, 71111, 36410,\n", 806 | " 67864, 75092, 67255, 1382, 11740, 32883, 85500, 796, 47360,\n", 807 | " 38298, 77267, 41127, 51309, 25294, 32, 37188, 91343, 6417,\n", 808 | " 5578, 91250, 3290, 21118, 78448, 70170, 16013, 48941, 81028,\n", 809 | " 85729, 23514, 51648, 13104, 73425, 51634, 9905, 38646, 22927,\n", 810 | " 63213, 7314, 70425, 3215, 18404, 42932, 70938, 18053, 22072,\n", 811 | " 58433, 86247, 43090, 97662, 53374, 20936, 58592, 21944, 5271,\n", 812 | " 96175, 93353, 18656, 21745, 46608, 24045, 69558, 61490, 83838,\n", 813 | " 71081, 12103, 27749, 31281, 37919, 79546, 10264, 53490, 45181,\n", 814 | " 62874, 13570, 55983]),\n", 815 | " array([75955, 44853, 79770, 57813, 63421, 70202, 58859, 13704, 41173,\n", 816 | " 31085, 19346, 91833, 27969, 25266, 53841, 80051, 81514, 2481,\n", 817 | " 745, 51423, 29742, 68166, 7860, 57871, 37620, 52655, 3903,\n", 818 | " 71321, 78810, 45627, 70616, 54378, 63437, 54918, 88978, 25892,\n", 819 | " 17156, 12804, 544, 47985, 67487, 42472, 21504, 44701, 95115,\n", 820 | " 63893, 15492, 97411, 26697, 98095, 69507, 40953, 93871, 74404,\n", 821 | " 1970, 95325, 9788, 70545, 79845, 23583, 56984, 82183, 64806,\n", 822 | " 68432, 3366, 95626, 12110, 65779, 29582, 10238, 56640, 66135,\n", 823 | " 91769, 81998, 98955, 74263, 93463, 24821, 12390, 65078, 91128,\n", 824 | " 91104, 77806, 47431, 30924, 84386, 90186, 20398, 68515, 93022,\n", 825 | " 72099, 67645, 15861, 79973, 82280, 72081, 14484, 94591, 69592,\n", 826 | " 45486, 29473, 96072, 87033, 13871, 69900, 52977, 16086, 79162,\n", 827 | " 55339, 83056, 43213, 85198, 42156, 77878, 6706, 75479, 54437,\n", 828 | " 34898, 33621, 74660, 84259, 86558, 84049, 936, 15237, 73355,\n", 829 | " 22261, 25086, 72388, 47085, 26267, 77149, 64465, 56735, 15799,\n", 830 | " 90704, 3489, 62547, 45715, 43205, 74579, 18095, 17309, 40432,\n", 831 | " 46680, 92269, 28653, 91010, 77969, 46336, 85538, 6154, 68080,\n", 832 | " 30595, 49120, 85498, 61600, 13416, 82342, 14722, 90939, 13094,\n", 833 | " 91723, 50799, 58907, 2313, 50689, 64922, 5016, 50850, 49657,\n", 834 | " 70821, 4541, 67800, 42171, 12888, 45028, 20912, 94196, 100,\n", 835 | " 77469, 58368, 25150, 16854, 47221, 13889, 27173, 23667, 76902,\n", 836 | " 15584, 61750, 89589, 77578, 20231, 71309, 55242, 91723, 55252,\n", 837 | " 60665, 79471, 59622, 90587, 46810, 5039, 28382, 44465, 6790,\n", 838 | " 90288, 53269, 31032, 70005, 59898, 29333, 63730, 75417, 49733,\n", 839 | " 17105, 61022, 92388, 66861, 45238, 41430, 99049, 94797, 59975,\n", 840 | " 80082, 15327, 88324, 32583, 50453, 62968, 37987, 75155, 19962,\n", 841 | " 69433, 37697, 42974, 79036, 36658, 45862, 37298, 92362, 36113,\n", 842 | " 41712, 13910, 51766, 65057, 55872, 48070, 14099, 34071, 93921,\n", 843 | " 37523, 35841, 35372, 53041, 96553, 18318, 64199, 21291, 76679,\n", 844 | " 31006, 18326, 6522, 11831, 50255, 94213, 72165, 48980, 89331,\n", 845 | " 29480, 1393, 15881, 26264, 70400, 33134, 32651, 48601, 89004,\n", 846 | " 29178, 46057, 95701, 31751, 91872, 34239, 88787, 71525, 55937,\n", 847 | " 93737, 39412, 13553, 10090, 76989, 45785, 43910, 63377, 50172,\n", 848 | " 2925, 50464, 82263, 40486, 51168, 84626, 37181, 94599, 41823,\n", 849 | " 4873, 49330, 87038, 80615, 17457, 99469, 543, 74852, 47622,\n", 850 | " 21318, 25221, 94264, 51556, 26459, 7026, 76412, 87846, 30483,\n", 851 | " 30823, 9136, 99768, 27159, 46432, 30818, 4711, 99370, 17306,\n", 852 | " 72737, 40307, 1687, 46618, 97308, 10268, 25591, 95540, 911,\n", 853 | " 18604, 86222, 67800, 91641, 49773, 20258, 74750, 57993, 84511,\n", 854 | " 89412, 60205, 91423, 11836, 69861, 75104, 70299, 11354, 18921,\n", 855 | " 42102, 24161, 4004, 87, 87287, 13832, 55879, 68976, 35182,\n", 856 | " 16555, 83606, 43796, 85122, 63315, 92526, 82861, 20352, 84931,\n", 857 | " 59174, 98447, 51917, 88928, 91392, 62769, 83204, 97468, 80010,\n", 858 | " 38897, 92965, 23557, 5005, 15732, 1087, 35937, 34726, 82532,\n", 859 | " 27924, 32217, 61595, 16148, 81127, 63653, 63462, 42611, 11906,\n", 860 | " 12534, 4053, 91854, 71422, 41237, 39792, 85703, 43539, 77852,\n", 861 | " 43711, 78650, 56651]),\n", 862 | " array([83000, 88240, 5054, 39180, 94059, 4567, 34864, 8822, 41161,\n", 863 | " 76368, 45790, 10835, 25608, 40562, 45748, 68732, 76507, 28377,\n", 864 | " 96997, 40272, 51342, 14137, 68977, 30161, 21923, 23305, 32911,\n", 865 | " 42223, 63535, 32111, 66385, 20146, 78708, 33962, 49419, 89290,\n", 866 | " 86303, 59840, 2398, 97956, 69755, 43682, 71755, 57964, 97345,\n", 867 | " 46758, 41628, 18390, 58294, 39025, 25986, 27295, 33566, 11511,\n", 868 | " 213, 43474, 70558, 19364, 17661, 54172, 55881, 1952, 98730,\n", 869 | " 93432, 17383, 40874, 52338, 49542, 31513, 5449, 83357, 79429,\n", 870 | " 31774, 11272, 15336, 45875, 39523, 82141, 13626, 87252, 83391,\n", 871 | " 30626, 38881, 82286, 49620, 52898, 41482, 81209, 74182, 44438,\n", 872 | " 249, 80736, 91425, 44851, 73441, 32194, 53509, 60811, 93752,\n", 873 | " 12302, 86817, 86740, 78375, 28950, 80638, 7526, 62674, 12948,\n", 874 | " 57584, 14757, 44051, 82935, 21705, 62865, 18430, 27269, 88753,\n", 875 | " 71523, 21326, 18660, 44631, 55348, 58798, 48201, 59891, 81844,\n", 876 | " 63583, 44165, 83049, 1834, 85902, 98271, 30569, 75924, 62888,\n", 877 | " 9161, 60911, 10577, 40692, 29876, 69541, 50390, 1203, 21762,\n", 878 | " 85158, 62267, 20864, 44306, 46173, 92685, 80259, 78026, 16365,\n", 879 | " 5182, 94407, 44734, 79334, 47731, 75662, 59021, 63742, 81537,\n", 880 | " 73135, 2887, 83679, 34862, 65538, 66044, 54943, 97337, 61781,\n", 881 | " 23737, 55551, 93238, 57556, 95187, 95562, 93983, 52737, 5620,\n", 882 | " 94209, 59906, 92105, 39309, 76300, 88420, 13596, 23413, 53726,\n", 883 | " 15386, 88615, 92910, 28285, 15208, 75427, 81143, 46071, 72585,\n", 884 | " 80919, 93458, 62497, 12199, 25458, 68333, 70734, 28102, 37839,\n", 885 | " 28348, 97531, 64488, 80693, 29161, 60962, 89906, 88871, 96104,\n", 886 | " 24931, 46523, 50296, 11364, 92515, 2961, 49170, 49797, 27314,\n", 887 | " 98504, 70069, 31317, 85666, 65751, 94463, 66563, 50431, 3747,\n", 888 | " 77507, 89696, 14465, 61028, 73629, 85673, 45674, 59442, 29228,\n", 889 | " 56396, 3173, 77178, 63034, 46393, 77810, 22166, 63771, 23869,\n", 890 | " 31907, 9390, 35572, 47941, 97572, 41451, 23936, 40077, 21160,\n", 891 | " 46012, 40300, 21262, 56045, 25450, 92004, 56301, 96141, 32281,\n", 892 | " 96724, 19557, 54076, 71674, 59530, 6328, 31543, 53628, 86629,\n", 893 | " 44166, 47974, 72514, 57895, 14381, 225, 73022, 23871, 43821,\n", 894 | " 24111, 80545, 3925, 19303, 29003, 27548, 22004, 82883, 87566,\n", 895 | " 45414, 91530, 40738, 62572, 90718, 90563, 63722, 87032, 80690,\n", 896 | " 84699, 35724, 72914, 535, 30787, 42262, 35664, 31967, 67651,\n", 897 | " 36084, 15736, 55885, 83529, 98818, 71250, 91565, 34666, 57259,\n", 898 | " 29954, 9097, 43915, 81454, 77125, 10177, 83231, 55931, 43846,\n", 899 | " 10193, 6004, 9122, 95273, 71363, 51797, 71363, 48069, 19510,\n", 900 | " 84916, 81685, 39148, 23013, 84932, 36040, 96841, 51261, 16135,\n", 901 | " 38155, 3631, 84214, 14346, 6003, 66067, 2623, 62188, 26700,\n", 902 | " 3795, 92809, 17903, 25131, 78194, 41891, 33024, 84035, 5051,\n", 903 | " 4904, 67312, 21922, 54967, 50307, 28352, 85776, 36423, 29343,\n", 904 | " 53177, 18733, 77774, 63823, 95876, 9197, 89624, 42121, 18661,\n", 905 | " 72960, 81611, 86901, 60185, 27292, 929, 7446, 11512, 21221,\n", 906 | " 73920, 57029, 24419, 5835, 17203, 70755, 25861, 62307, 10777,\n", 907 | " 63192, 29042, 49844, 93016, 19661, 8367, 70824, 6397, 12646,\n", 908 | " 43453, 27864, 62349]),\n", 909 | " array([96170, 61940, 26406, 50869, 20094, 59707, 71138, 40298, 15568,\n", 910 | " 13044, 42090, 74881, 13337, 78290, 8314, 13279, 56075, 68561,\n", 911 | " 60772, 76804, 80411, 49687, 63305, 46551, 91847, 73284, 21209,\n", 912 | " 78287, 61209, 91256, 21998, 22196, 17085, 12951, 92193, 36379,\n", 913 | " 7997, 89301, 82457, 72897, 45, 49765, 24464, 32777, 39331,\n", 914 | " 2750, 30886, 94497, 74942, 94612, 84139, 9552, 50971, 76520,\n", 915 | " 53887, 69960, 98065, 38163, 75135, 99032, 29394, 416, 34369,\n", 916 | " 68728, 86580, 43773, 14584, 15809, 81616, 99423, 91616, 4838,\n", 917 | " 26474, 87053, 4769, 26261, 63925, 97048, 42140, 96340, 88831,\n", 918 | " 25243, 22741, 46909, 49366, 71871, 42025, 18971, 88500, 48656,\n", 919 | " 59986, 95275, 3585, 28674, 99309, 83286, 86341, 99111, 28662,\n", 920 | " 70938, 80324, 43209, 8593, 80990, 46150, 17479, 44142, 2013,\n", 921 | " 98223, 21699, 44061, 41140, 53678, 38843, 98350, 67633, 17065,\n", 922 | " 21393, 3189, 75662, 48612, 32843, 76756, 2511, 71611, 40923,\n", 923 | " 16425, 37663, 28240, 73759, 23668, 32333, 84261, 82357, 29225,\n", 924 | " 55295, 54880, 67685, 30803, 19963, 19711, 49212, 85139, 21224,\n", 925 | " 64688, 62670, 53619, 92288, 65825, 67226, 19517, 78055, 59141,\n", 926 | " 34008, 6693, 88747, 95244, 75612, 76635, 71129, 63378, 23808,\n", 927 | " 29169, 2266, 85683, 58923, 76619, 55288, 66041, 96229, 39395,\n", 928 | " 77487, 74027, 93392, 14082, 1337, 73264, 20565, 13509, 65022,\n", 929 | " 6746, 38441, 24857, 92749, 85819, 31520, 88864, 56802, 20426,\n", 930 | " 21389, 22536, 81432, 90283, 21809, 38879, 86162, 35070, 13774,\n", 931 | " 21360, 41928, 73129, 12110, 81922, 86034, 36062, 69415, 2848,\n", 932 | " 39465, 81249, 13478, 5673, 36954, 20910, 30932, 18605, 3215,\n", 933 | " 87593, 6539, 24398, 37400, 99884, 74750, 62423, 81236, 54252,\n", 934 | " 15262, 29942, 92804, 37368, 26715, 28092, 58144, 44844, 46386,\n", 935 | " 4266, 1326, 23702, 99277, 27722, 93748, 97955, 64050, 35208,\n", 936 | " 27059, 98344, 98460, 26636, 11242, 50886, 77539, 31058, 33912,\n", 937 | " 26302, 77479, 3915, 42747, 24731, 93794, 67834, 27527, 99656,\n", 938 | " 4289, 46717, 41495, 44348, 18967, 1833, 9415, 52834, 48563,\n", 939 | " 21302, 99740, 59911, 25234, 61170, 83681, 49662, 49406, 81831,\n", 940 | " 87469, 80986, 70500, 59740, 19624, 39211, 87713, 97940, 41245,\n", 941 | " 41288, 33625, 59089, 35484, 14294, 76373, 89186, 18720, 2310,\n", 942 | " 68130, 92034, 58746, 58992, 34696, 19387, 78621, 21088, 57996,\n", 943 | " 79680, 48607, 75994, 62888, 29042, 85891, 15877, 283, 30023,\n", 944 | " 56334, 23065, 53354, 77770, 29145, 79093, 40923, 43189, 39134,\n", 945 | " 14228, 85427, 66985, 59608, 81779, 70377, 10383, 52090, 93411,\n", 946 | " 33960, 55789, 12827, 5804, 78735, 61664, 7137, 36943, 18691,\n", 947 | " 61830, 48380, 70387, 25482, 71045, 53496, 20944, 13350, 97607,\n", 948 | " 80580, 29904, 16916, 7939, 48862, 78959, 37866, 54940, 45799,\n", 949 | " 28971, 81255, 26263, 52747, 88254, 35892, 10821, 95903, 66606,\n", 950 | " 45996, 51426, 74304, 2855, 68601, 32561, 17838, 1936, 75575,\n", 951 | " 45016, 46603, 33276, 95948, 47483, 9289, 28321, 15167, 25766,\n", 952 | " 69705, 94566, 91229, 33168, 42517, 13518, 78885, 21248, 99876,\n", 953 | " 40163, 807, 83350, 54649, 67108, 23091, 64179, 35091, 91696,\n", 954 | " 74908, 44914, 14823, 14175, 62397, 18934, 19451, 85350, 51714,\n", 955 | " 92929, 86023, 1118]),\n", 956 | " array([ 3890, 26945, 91921, 79693, 21686, 62383, 54679, 54462, 75670,\n", 957 | " 15897, 91422, 90455, 69738, 5857, 90421, 8527, 49470, 39608,\n", 958 | " 51684, 68337, 74644, 9257, 89760, 92811, 84175, 18346, 13263,\n", 959 | " 82318, 65596, 65534, 24503, 52924, 39835, 90913, 23896, 55706,\n", 960 | " 15173, 52119, 93882, 70957, 28311, 1671, 85820, 8930, 43300,\n", 961 | " 43476, 86083, 10338, 52099, 32190, 5119, 96790, 74524, 95359,\n", 962 | " 13596, 49841, 25382, 92184, 64353, 7048, 88464, 1050, 51512,\n", 963 | " 30909, 55902, 2086, 49196, 16006, 90376, 17453, 48427, 98358,\n", 964 | " 55608, 6998, 40261, 44853, 25490, 87535, 73382, 39939, 36609,\n", 965 | " 46691, 48238, 54535, 58550, 49504, 60630, 8461, 55570, 39184,\n", 966 | " 91709, 20464, 69871, 91952, 57076, 77956, 82462, 13891, 35986,\n", 967 | " 30668, 35834, 73921, 20407, 25683, 25241, 8421, 81697, 41691,\n", 968 | " 13639, 11494, 49498, 45566, 46890, 32609, 28635, 93360, 58052,\n", 969 | " 8234, 41373, 73000, 38597, 21441, 87209, 55912, 20398, 7209,\n", 970 | " 71035, 48441, 10804, 61099, 43249, 68549, 72044, 21675, 35709,\n", 971 | " 6063, 38987, 65045, 55220, 64648, 72513, 72508, 11029, 94326,\n", 972 | " 85990, 60940, 58982, 69298, 46922, 81939, 4896, 65748, 34927,\n", 973 | " 94404, 36085, 65416, 26295, 45385, 31442, 5622, 29280, 46146,\n", 974 | " 11775, 21376, 54086, 25949, 81923, 38680, 55923, 83608, 47609,\n", 975 | " 67334, 23507, 22104, 96410, 20976, 67233, 75462, 6203, 25264,\n", 976 | " 25561, 49549, 20521, 76895, 69750, 13603, 78172, 44599, 393,\n", 977 | " 14560, 48689, 38556, 49531, 19756, 22092, 84998, 23180, 4895,\n", 978 | " 30240, 83784, 89030, 84831, 65184, 13542, 7129, 64765, 98332,\n", 979 | " 18162, 58562, 66296, 28299, 18291, 54898, 93809, 59467, 20526,\n", 980 | " 43018, 18724, 44198, 59463, 61355, 68796, 67264, 67356, 4063,\n", 981 | " 38522, 92338, 3681, 1072, 66327, 27997, 65130, 76298, 28391,\n", 982 | " 92530, 72999, 74749, 25708, 82768, 38833, 41999, 97592, 90245,\n", 983 | " 73353, 18020, 46005, 58609, 72188, 20393, 34221, 9192, 14673,\n", 984 | " 3003, 4984, 92495, 28560, 76738, 97217, 76803, 87400, 63945,\n", 985 | " 96109, 56450, 23449, 9155, 37980, 95030, 78751, 31385, 79576,\n", 986 | " 16597, 45533, 63231, 23420, 94254, 60827, 7907, 98658, 95479,\n", 987 | " 70196, 581, 67097, 90120, 30603, 51406, 29957, 9132, 59676,\n", 988 | " 7432, 30816, 46304, 70341, 67769, 12485, 81101, 88834, 55755,\n", 989 | " 75431, 42435, 66541, 87626, 76943, 23041, 22416, 74454, 82099,\n", 990 | " 60177, 13157, 64817, 48396, 83220, 24382, 82011, 95579, 96537,\n", 991 | " 90138, 71554, 30163, 80710, 20104, 1543, 88771, 22980, 84732,\n", 992 | " 44346, 32042, 53594, 19536, 85971, 81203, 27003, 28684, 50878,\n", 993 | " 15497, 76927, 12919, 4376, 17917, 26409, 13988, 53063, 13881,\n", 994 | " 90779, 31740, 42129, 18712, 38019, 65247, 44431, 46330, 43849,\n", 995 | " 30749, 98460, 724, 5549, 47951, 14671, 60504, 41010, 37331,\n", 996 | " 52617, 3431, 23293, 91734, 95166, 46492, 58333, 57933, 46193,\n", 997 | " 62646, 98217, 45642, 28519, 45921, 6873, 52730, 37400, 23764,\n", 998 | " 19828, 97223, 20473, 39390, 46517, 72837, 53990, 63594, 77092,\n", 999 | " 59442, 20571, 49604, 34988, 62303, 27007, 79759, 93455, 52209,\n", 1000 | " 47287, 61007, 2689, 44448, 81192, 24406, 21368, 1780, 38316,\n", 1001 | " 45627, 53379, 8064, 9118, 52544, 13842, 922, 5864, 27646,\n", 1002 | " 12588, 22954, 21430]),\n", 1003 | " array([29587, 98409, 33432, 51619, 49234, 15729, 87069, 31063, 72340,\n", 1004 | " 97852, 38175, 43272, 11242, 19556, 82213, 41895, 27685, 75030,\n", 1005 | " 50912, 6617, 67714, 5593, 31292, 13440, 56813, 11241, 77122,\n", 1006 | " 30094, 79209, 35180, 94420, 71795, 43718, 70393, 68950, 47838,\n", 1007 | " 5005, 69007, 2466, 33835, 83875, 47684, 62835, 56031, 37803,\n", 1008 | " 63354, 61176, 60993, 44444, 81522, 50356, 37675, 28583, 33483,\n", 1009 | " 52045, 89157, 18245, 21209, 72520, 22081, 3160, 75489, 94143,\n", 1010 | " 90272, 10159, 61584, 68557, 11415, 56301, 33562, 63597, 50513,\n", 1011 | " 60328, 69781, 39359, 88608, 94299, 72661, 13761, 33834, 55666,\n", 1012 | " 66888, 31499, 45995, 38223, 24985, 92186, 17871, 29127, 18006,\n", 1013 | " 818, 87426, 94570, 49552, 46785, 6204, 70642, 15850, 6605,\n", 1014 | " 35878, 89829, 72303, 42556, 25610, 85375, 60368, 60084, 53110,\n", 1015 | " 54300, 32295, 57385, 90556, 52500, 76205, 50327, 50585, 98810,\n", 1016 | " 5933, 10585, 22320, 60446, 95023, 39610, 94859, 45235, 52290,\n", 1017 | " 16129, 16620, 62188, 89837, 86406, 14949, 6938, 53191, 41856,\n", 1018 | " 29953, 89445, 73704, 76210, 46652, 74781, 39420, 95656, 82702,\n", 1019 | " 19385, 31092, 14353, 84478, 12703, 21037, 28170, 92953, 85021,\n", 1020 | " 75706, 7784, 91290, 28146, 77703, 33809, 8213, 33821, 86827,\n", 1021 | " 4731, 51929, 26674, 98673, 74097, 7290, 32453, 40558, 39777,\n", 1022 | " 73939, 7948, 72853, 50767, 13306, 47431, 67854, 49633, 44869,\n", 1023 | " 50377, 60224, 63944, 48593, 87141, 20878, 49258, 18263, 14791,\n", 1024 | " 16738, 66223, 96558, 7334, 69048, 54110, 73763, 58894, 49942,\n", 1025 | " 10763, 20774, 10427, 63534, 58330, 81663, 31976, 80344, 42970,\n", 1026 | " 26212, 35867, 17059, 60041, 41359, 92344, 31416, 90444, 8036,\n", 1027 | " 30932, 23235, 53691, 20768, 41955, 81264, 64688, 51244, 22671,\n", 1028 | " 77078, 6804, 53514, 19145, 21910, 55552, 78095, 74658, 12657,\n", 1029 | " 98195, 76770, 35429, 79029, 9654, 89770, 24935, 50594, 53552,\n", 1030 | " 78694, 98122, 9528, 9147, 85170, 52759, 16286, 78797, 48692,\n", 1031 | " 55073, 68378, 70135, 60789, 64679, 916, 54524, 49872, 22826,\n", 1032 | " 74217, 53384, 66301, 46408, 51737, 65268, 14681, 82641, 97934,\n", 1033 | " 36009, 13775, 50415, 1775, 2076, 77831, 5772, 44219, 74834,\n", 1034 | " 57786, 54874, 40758, 42295, 70732, 36106, 5808, 27274, 28266,\n", 1035 | " 80908, 35503, 2764, 11151, 72591, 44063, 38906, 50336, 20688,\n", 1036 | " 78852, 32415, 32559, 23157, 24746, 13063, 80088, 8948, 35334,\n", 1037 | " 43113, 7445, 45907, 58432, 48696, 83431, 42338, 4822, 67776,\n", 1038 | " 70277, 27211, 53715, 49908, 59792, 29273, 98220, 7054, 28174,\n", 1039 | " 11820, 95532, 61822, 18910, 15764, 51191, 44429, 58187, 56297,\n", 1040 | " 36420, 44796, 84758, 38415, 71829, 42773, 82644, 7442, 58753,\n", 1041 | " 59087, 37800, 91887, 80273, 13864, 87063, 55268, 66779, 15383,\n", 1042 | " 61887, 52822, 87487, 86248, 41368, 84686, 41477, 72813, 80838,\n", 1043 | " 52355, 42310, 87159, 32601, 47615, 64526, 88720, 53210, 61102,\n", 1044 | " 74015, 69731, 97727, 21986, 55799, 38487, 94294, 14707, 75840,\n", 1045 | " 27965, 12900, 94375, 31248, 11278, 74509, 78735, 48348, 50949,\n", 1046 | " 48117, 11389, 32536, 72213, 40766, 95278, 99898, 85413, 12414,\n", 1047 | " 47311, 44110, 30456, 67356, 1061, 89182, 53403, 82748, 16598,\n", 1048 | " 95032, 63428, 78111, 91399, 53417, 88588, 51465, 98179, 41693,\n", 1049 | " 55983, 74568, 5023]),\n", 1050 | " array([96278, 27088, 89134, 8772, 57396, 60463, 60320, 92181, 88741,\n", 1051 | " 75918, 52503, 23649, 27809, 26579, 40598, 89310, 49825, 78485,\n", 1052 | " 94075, 69279, 97600, 5472, 21448, 68806, 91746, 53339, 51468,\n", 1053 | " 57114, 94548, 19068, 83933, 40290, 7937, 33308, 52788, 22767,\n", 1054 | " 6326, 81108, 41049, 91158, 20798, 64237, 76355, 75399, 98897,\n", 1055 | " 24396, 71443, 36416, 68685, 621, 34213, 68873, 12149, 54438,\n", 1056 | " 47644, 31747, 36472, 54728, 70691, 38565, 68102, 16896, 5825,\n", 1057 | " 58321, 42746, 64016, 80342, 79161, 47538, 73322, 9371, 80952,\n", 1058 | " 83769, 40599, 89868, 78144, 61668, 82809, 74000, 61957, 45493,\n", 1059 | " 84625, 3584, 76685, 24722, 90930, 86571, 84811, 52670, 32551,\n", 1060 | " 86382, 75729, 84689, 63508, 66825, 90945, 92475, 83372, 62505,\n", 1061 | " 73610, 61014, 1121, 35580, 98900, 99412, 96283, 5182, 52880,\n", 1062 | " 10720, 24403, 82054, 61586, 36286, 7645, 31440, 6983, 52850,\n", 1063 | " 72442, 50992, 60050, 6081, 8015, 68424, 25192, 32078, 96055,\n", 1064 | " 518, 7524, 98181, 56683, 28627, 6735, 54531, 64685, 67351,\n", 1065 | " 60466, 57969, 58138, 95539, 50809, 86551, 66593, 84998, 7276,\n", 1066 | " 57854, 33398, 59665, 25548, 85768, 98678, 8565, 26439, 26995,\n", 1067 | " 1936, 13953, 85412, 7144, 25356, 64013, 72127, 18524, 31814,\n", 1068 | " 5028, 59860, 25638, 84977, 69567, 37826, 50465, 48917, 37245,\n", 1069 | " 78345, 13951, 62210, 85171, 64299, 51407, 8003, 1137, 75586,\n", 1070 | " 60918, 87722, 97933, 44347, 31177, 61090, 28771, 57978, 77925,\n", 1071 | " 77248, 49556, 96502, 44632, 39217, 40736, 45771, 8749, 7174,\n", 1072 | " 52328, 22880, 42563, 73319, 574, 72064, 5710, 59626, 85305,\n", 1073 | " 56521, 58003, 77945, 6913, 5768, 88471, 38587, 96042, 3563,\n", 1074 | " 31014, 76647, 64157, 59903, 52653, 10519, 52446, 2948, 73419,\n", 1075 | " 24550, 24010, 42244, 67363, 79739, 66596, 49770, 21142, 59568,\n", 1076 | " 71668, 33223, 42534, 55689, 24046, 27766, 88901, 78684, 60893,\n", 1077 | " 32546, 67349, 51509, 38517, 5751, 31085, 90136, 756, 95702,\n", 1078 | " 45759, 74120, 8452, 37522, 69721, 93678, 29736, 77791, 76764,\n", 1079 | " 99954, 24840, 6800, 72877, 1283, 63763, 97287, 73656, 21810,\n", 1080 | " 10449, 23572, 9206, 36090, 49762, 25171, 90762, 41043, 67259,\n", 1081 | " 83309, 31949, 75204, 38119, 40911, 28289, 74594, 87658, 303,\n", 1082 | " 16293, 4645, 15139, 43387, 76533, 37365, 743, 96457, 29978,\n", 1083 | " 42363, 95419, 25927, 21618, 22057, 32695, 28373, 65920, 88834,\n", 1084 | " 68595, 79869, 83130, 76004, 63412, 30555, 52657, 90481, 96503,\n", 1085 | " 10042, 90889, 31919, 65669, 18057, 21865, 99395, 59742, 64080,\n", 1086 | " 57902, 88484, 26941, 32094, 43572, 77331, 81402, 50366, 47996,\n", 1087 | " 85033, 43375, 1284, 21075, 50905, 62588, 90239, 12071, 37019,\n", 1088 | " 14278, 65347, 36868, 91048, 77156, 23991, 38762, 79492, 31468,\n", 1089 | " 6272, 39508, 21066, 17380, 65998, 17203, 54934, 45631, 24895,\n", 1090 | " 41278, 96794, 88862, 15354, 25855, 83401, 21562, 56389, 93441,\n", 1091 | " 86738, 28266, 44333, 23415, 81578, 14367, 5873, 44760, 30004,\n", 1092 | " 13222, 76550, 65114, 23541, 41341, 8988, 20849, 3433, 60659,\n", 1093 | " 91377, 43393, 15184, 63783, 73357, 6684, 74319, 95726, 23910,\n", 1094 | " 93584, 64574, 39037, 31151, 94640, 16015, 10462, 8213, 20098,\n", 1095 | " 54995, 30766, 10949, 69577, 57165, 47222, 99273, 18934, 45068,\n", 1096 | " 94559, 25717, 24963]),\n", 1097 | " array([30246, 75734, 53772, 25180, 53339, 88337, 96452, 50906, 38709,\n", 1098 | " 51332, 16, 59303, 80768, 61806, 77893, 6377, 4054, 81162,\n", 1099 | " 73804, 22252, 93761, 84574, 38955, 79220, 45585, 86292, 80268,\n", 1100 | " 97802, 65521, 28748, 68134, 84287, 89651, 78371, 61999, 93546,\n", 1101 | " 60148, 85623, 75980, 1700, 85124, 44074, 8552, 75488, 95770,\n", 1102 | " 46658, 61378, 56303, 75070, 92031, 93586, 16374, 13552, 91420,\n", 1103 | " 82934, 92206, 93587, 23949, 77571, 84743, 16552, 68189, 25216,\n", 1104 | " 44322, 40463, 77413, 3774, 90630, 72355, 67236, 35545, 31831,\n", 1105 | " 71633, 42852, 97606, 52664, 43026, 96226, 71669, 66843, 24868,\n", 1106 | " 7301, 60513, 21315, 33683, 38091, 42571, 90938, 79758, 37378,\n", 1107 | " 57145, 10511, 30897, 4486, 14218, 85360, 34350, 84935, 89468,\n", 1108 | " 31486, 35180, 54876, 55799, 3456, 52296, 56811, 31934, 4571,\n", 1109 | " 9971, 98258, 45044, 34922, 50679, 22039, 55429, 42175, 22950,\n", 1110 | " 30392, 49041, 58950, 78901, 97588, 18236, 32403, 91288, 90284,\n", 1111 | " 27877, 82077, 68796, 5634, 57835, 96383, 47175, 48581, 68394,\n", 1112 | " 90723, 25469, 72890, 81877, 75021, 19170, 31321, 61163, 70077,\n", 1113 | " 82231, 20842, 75018, 15109, 54933, 31818, 44332, 68800, 49762,\n", 1114 | " 81163, 39347, 67378, 50073, 27079, 10676, 33919, 79733, 48593,\n", 1115 | " 82101, 57965, 10446, 30641, 25926, 47363, 93165, 92096, 24444,\n", 1116 | " 1829, 969, 71306, 39046, 55829, 2004, 13478, 45364, 75692,\n", 1117 | " 40134, 91474, 18799, 88641, 83912, 6107, 87769, 85931, 35540,\n", 1118 | " 54399, 91978, 30073, 94001, 55051, 76457, 4175, 78116, 19575,\n", 1119 | " 42305, 64779, 67569, 87086, 22129, 7747, 67355, 29076, 33173,\n", 1120 | " 83677, 73920, 21276, 23078, 76931, 60930, 72591, 18863, 19073,\n", 1121 | " 98193, 26330, 79550, 9455, 35727, 49715, 71965, 97461, 45591,\n", 1122 | " 46822, 72995, 73525, 25340, 50839, 63392, 6538, 3464, 89622,\n", 1123 | " 71577, 95785, 24498, 442, 20356, 60680, 42917, 26349, 28195,\n", 1124 | " 59173, 63814, 23287, 62058, 24538, 87210, 95339, 23553, 38160,\n", 1125 | " 3683, 53586, 92567, 89361, 68059, 88094, 20328, 73104, 8683,\n", 1126 | " 31353, 26609, 78961, 58654, 75538, 35855, 35968, 46877, 54283,\n", 1127 | " 30738, 27868, 56827, 3798, 13948, 49420, 44753, 88560, 62534,\n", 1128 | " 84001, 24168, 25629, 45672, 36023, 84138, 88076, 99237, 67835,\n", 1129 | " 87891, 12592, 61364, 29950, 862, 86554, 66546, 32404, 60548,\n", 1130 | " 71577, 22372, 72272, 83117, 44463, 13363, 99290, 91775, 57841,\n", 1131 | " 69428, 38149, 67811, 37013, 10059, 5435, 75747, 36694, 20795,\n", 1132 | " 81518, 45123, 19426, 77000, 94457, 85878, 41896, 21871, 32200,\n", 1133 | " 37522, 16807, 75146, 72821, 34409, 94020, 13098, 22292, 69607,\n", 1134 | " 11611, 47561, 68139, 96622, 93455, 73304, 90478, 19405, 37250,\n", 1135 | " 39582, 94505, 7662, 3269, 46799, 3500, 16648, 31973, 86954,\n", 1136 | " 47951, 19881, 63628, 83840, 52012, 99437, 96824, 47795, 18016,\n", 1137 | " 32469, 47432, 54184, 82239, 63579, 61397, 96463, 66254, 8313,\n", 1138 | " 70161, 80103, 35496, 29393, 20130, 61181, 20699, 63458, 17926,\n", 1139 | " 81779, 24007, 76794, 6317, 82301, 15389, 29882, 328, 80187,\n", 1140 | " 43290, 78028, 10981, 89258, 26338, 36687, 47497, 54330, 83416,\n", 1141 | " 24405, 62041, 67157, 99561, 90258, 87867, 80602, 65972, 49819,\n", 1142 | " 88423, 22991, 66217, 21610, 12940, 22204, 44900, 65755, 88029,\n", 1143 | " 99654, 32712, 35669]),\n", 1144 | " array([29031, 84556, 45873, 29408, 63772, 12078, 79579, 32045, 11484,\n", 1145 | " 37766, 3270, 42040, 16211, 34281, 31101, 40064, 49321, 74013,\n", 1146 | " 10796, 7144, 86393, 14940, 88732, 26964, 14838, 59644, 53322,\n", 1147 | " 7736, 8505, 11961, 59952, 4396, 37413, 29779, 86888, 46387,\n", 1148 | " 54889, 34147, 28879, 60353, 92201, 48571, 81031, 19044, 77150,\n", 1149 | " 96964, 45868, 42787, 54455, 56161, 98902, 99632, 62179, 13393,\n", 1150 | " 34505, 33273, 92146, 16025, 35437, 88879, 80486, 21450, 30030,\n", 1151 | " 64556, 9076, 68915, 50423, 11498, 1597, 89125, 7789, 95130,\n", 1152 | " 74578, 21905, 23158, 45553, 4688, 68018, 21753, 17108, 64505,\n", 1153 | " 37940, 22010, 52356, 32114, 90359, 49197, 36686, 90334, 74031,\n", 1154 | " 90947, 23960, 23147, 48225, 2668, 71077, 17893, 71064, 57952,\n", 1155 | " 42984, 14773, 9144, 21883, 99362, 57095, 27355, 8737, 88955,\n", 1156 | " 45094, 45513, 65831, 58884, 58359, 36338, 62295, 80120, 13105,\n", 1157 | " 7273, 2898, 36442, 12018, 35094, 34614, 3262, 55965, 31330,\n", 1158 | " 47867, 4456, 53424, 21078, 4689, 62204, 60321, 88606, 6263,\n", 1159 | " 16973, 19682, 52227, 34003, 59741, 40286, 45061, 60442, 70179,\n", 1160 | " 12255, 67366, 5523, 82311, 10750, 85492, 53846, 38817, 10809,\n", 1161 | " 39892, 85055, 88561, 98888, 58553, 58145, 64897, 92170, 28288,\n", 1162 | " 56124, 93676, 67986, 42473, 5336, 99459, 5722, 98929, 9647,\n", 1163 | " 63238, 43617, 92165, 13062, 15391, 29654, 35765, 62780, 54095,\n", 1164 | " 3229, 28261, 12616, 95602, 7385, 67855, 78443, 88156, 8728,\n", 1165 | " 89269, 48821, 62901, 91815, 68897, 45312, 963, 7484, 47573,\n", 1166 | " 49522, 86897, 57859, 19348, 46731, 19546, 86560, 96221, 51515,\n", 1167 | " 75366, 77377, 25086, 87260, 62681, 11539, 71990, 76771, 80569,\n", 1168 | " 58301, 77278, 80627, 63474, 65642, 85911, 69316, 68667, 49187,\n", 1169 | " 59879, 68680, 9631, 49630, 3639, 26848, 49797, 2652, 73262,\n", 1170 | " 19050, 40260, 44296, 70200, 56951, 15357, 85089, 70851, 15985,\n", 1171 | " 18458, 33589, 21622, 97770, 46361, 19933, 40003, 743, 88731,\n", 1172 | " 74108, 56564, 68636, 37908, 86171, 4366, 75247, 92806, 36180,\n", 1173 | " 29514, 45281, 53648, 75648, 57401, 78388, 19504, 3588, 63800,\n", 1174 | " 97698, 42631, 5620, 88187, 32033, 986, 28358, 41308, 90176,\n", 1175 | " 76285, 35756, 52173, 83679, 66167, 37994, 19494, 82371, 97750,\n", 1176 | " 68581, 61373, 33948, 41460, 95296, 83794, 32125, 70786, 28127,\n", 1177 | " 97115, 49386, 42203, 86245, 62425, 58713, 45366, 41238, 47225,\n", 1178 | " 98023, 62169, 36322, 5670, 47814, 35193, 30525, 97370, 87838,\n", 1179 | " 7191, 5495, 73226, 42094, 78613, 54706, 75888, 89590, 28830,\n", 1180 | " 38191, 9580, 22396, 34771, 6197, 4923, 2479, 10228, 99071,\n", 1181 | " 58839, 22512, 17735, 62973, 89480, 12358, 4907, 35893, 58008,\n", 1182 | " 73382, 53819, 37498, 34126, 36318, 17412, 37071, 98458, 27857,\n", 1183 | " 79496, 30501, 44976, 53887, 32596, 76585, 21614, 66370, 46883,\n", 1184 | " 31181, 61119, 5946, 74694, 84172, 33217, 47022, 7489, 25586,\n", 1185 | " 14200, 37734, 95704, 9914, 26024, 90860, 31746, 20759, 45178,\n", 1186 | " 41365, 91613, 93704, 5013, 64874, 41416, 19503, 94341, 89583,\n", 1187 | " 58771, 67932, 33353, 16017, 67978, 10492, 24098, 78279, 95458,\n", 1188 | " 56365, 65372, 55267, 12566, 89110, 89264, 17085, 87649, 58466,\n", 1189 | " 21682, 87474, 36022, 55878, 57295, 3440, 67630, 99198, 8323,\n", 1190 | " 32708, 83397, 87392]),\n", 1191 | " array([25400, 36298, 94292, 84887, 3705, 76236, 58734, 74514, 87981,\n", 1192 | " 12497, 42710, 23401, 84495, 40894, 75424, 589, 98431, 34876,\n", 1193 | " 78571, 85550, 2062, 16194, 44916, 92125, 41075, 7021, 35554,\n", 1194 | " 2793, 26774, 13837, 45015, 25549, 79660, 64067, 53602, 35399,\n", 1195 | " 96060, 13544, 8071, 46587, 72523, 60862, 41407, 82528, 49987,\n", 1196 | " 88722, 86667, 3238, 37431, 81169, 92877, 47830, 90696, 93704,\n", 1197 | " 6613, 41065, 64986, 31942, 41566, 38759, 39500, 83248, 73325,\n", 1198 | " 39364, 38499, 71570, 14440, 10465, 54787, 36385, 44637, 26679,\n", 1199 | " 61641, 45343, 70641, 14202, 2229, 308, 23389, 86463, 10880,\n", 1200 | " 87820, 42102, 28602, 57929, 97673, 66201, 25057, 58386, 20578,\n", 1201 | " 24336, 65517, 62818, 32132, 73298, 35105, 14967, 2454, 63327,\n", 1202 | " 48062, 2709, 93308, 84910, 89311, 21029, 81236, 64737, 15982,\n", 1203 | " 62480, 41749, 88966, 80861, 73593, 78283, 92297, 15887, 32400,\n", 1204 | " 71647, 48039, 40302, 67795, 16447, 91121, 36719, 1385, 6017,\n", 1205 | " 42708, 7641, 4593, 10755, 2995, 24070, 56825, 14085, 36856,\n", 1206 | " 82848, 45375, 17846, 25851, 1624, 48574, 11946, 41103, 36881,\n", 1207 | " 82162, 89171, 57612, 19035, 11051, 25457, 51625, 27902, 22832,\n", 1208 | " 50314, 71266, 76677, 66356, 43486, 18417, 38709, 62556, 57694,\n", 1209 | " 26578, 32691, 74103, 94351, 78015, 45719, 80590, 83525, 1667,\n", 1210 | " 42600, 85216, 42517, 9888, 96230, 16518, 76401, 32161, 15466,\n", 1211 | " 5, 23941, 40969, 23497, 34093, 13515, 78846, 15069, 78917,\n", 1212 | " 51991, 80720, 88464, 91368, 87835, 47344, 2075, 27998, 62452,\n", 1213 | " 69878, 34124, 13291, 86575, 50723, 43001, 52938, 26000, 49598,\n", 1214 | " 14217, 80892, 41711, 23557, 44111, 78297, 25116, 57170, 48343,\n", 1215 | " 53157, 55663, 3043, 4479, 74356, 1724, 76306, 78801, 43212,\n", 1216 | " 47671, 20462, 75911, 88820, 14921, 59123, 28397, 15236, 29042,\n", 1217 | " 60071, 79820, 95356, 98589, 59422, 11930, 10439, 2814, 52364,\n", 1218 | " 23324, 87694, 3289, 94448, 70810, 58488, 22778, 89104, 23902,\n", 1219 | " 62216, 29026, 68327, 20062, 58442, 73111, 16245, 21839, 50546,\n", 1220 | " 64660, 46821, 38607, 79654, 84933, 21384, 53044, 77428, 23171,\n", 1221 | " 60840, 79774, 43444, 32109, 18098, 95380, 90501, 29386, 69636,\n", 1222 | " 68731, 42523, 25602, 43476, 76929, 71447, 49490, 47633, 10464,\n", 1223 | " 15619, 70572, 34954, 68016, 83454, 80490, 65249, 63559, 51530,\n", 1224 | " 18710, 16123, 10112, 86148, 3594, 59777, 36462, 81483, 75670,\n", 1225 | " 85846, 90936, 76932, 41640, 20434, 37533, 47698, 53770, 40192,\n", 1226 | " 78776, 80695, 78143, 12447, 20837, 4994, 5422, 66951, 39296,\n", 1227 | " 41633, 2102, 29283, 10247, 5345, 95112, 79700, 64451, 11002,\n", 1228 | " 37851, 81178, 39581, 75269, 4286, 62967, 98029, 7320, 15297,\n", 1229 | " 23959, 61962, 25309, 56233, 5924, 59077, 12860, 62811, 71344,\n", 1230 | " 95496, 43302, 84415, 77193, 74949, 84909, 95769, 65649, 96436,\n", 1231 | " 57355, 4809, 57896, 1293, 67039, 23425, 29146, 79452, 86569,\n", 1232 | " 64779, 2773, 40936, 95892, 21133, 89643, 11961, 24258, 38802,\n", 1233 | " 16276, 82581, 24340, 29070, 70740, 50579, 19197, 8352, 34144,\n", 1234 | " 63465, 57903, 71955, 90357, 27016, 78667, 38133, 13429, 24178,\n", 1235 | " 56715, 21192, 79494, 26023, 71360, 70046, 7077, 60266, 83854,\n", 1236 | " 49834, 60318, 85960, 31341, 64542, 23849, 51053, 54636, 34707,\n", 1237 | " 89036, 27973]),\n", 1238 | " array([55089, 48859, 86135, 27653, 81541, 80197, 22512, 26423, 54537,\n", 1239 | " 7518, 24290, 85654, 80545, 5112, 45812, 12044, 41597, 35685,\n", 1240 | " 16032, 2741, 54642, 33612, 94832, 33207, 68159, 41798, 15808,\n", 1241 | " 59913, 25826, 18166, 71249, 8424, 94061, 71926, 13228, 36046,\n", 1242 | " 14423, 26980, 75877, 40157, 89439, 8090, 51872, 81827, 70472,\n", 1243 | " 53799, 9424, 11884, 15717, 56196, 52248, 61942, 20652, 77076,\n", 1244 | " 83380, 58855, 57131, 92718, 54343, 19661, 71022, 80664, 48051,\n", 1245 | " 76430, 35479, 85177, 29000, 20264, 51798, 68382, 42273, 16680,\n", 1246 | " 11628, 38143, 78236, 93117, 8649, 34576, 58137, 90135, 99448,\n", 1247 | " 62063, 32905, 40185, 90514, 26795, 38915, 38280, 83440, 30568,\n", 1248 | " 34965, 57007, 15077, 78842, 50520, 96982, 60997, 91272, 63469,\n", 1249 | " 1198, 92660, 32578, 94702, 76701, 35201, 45857, 49287, 48551,\n", 1250 | " 29060, 6736, 24987, 59797, 90929, 86664, 377, 83519, 31149,\n", 1251 | " 539, 12039, 44008, 92403, 61183, 43114, 28716, 73391, 1442,\n", 1252 | " 1801, 79123, 46931, 71298, 17915, 15487, 5458, 51334, 51673,\n", 1253 | " 26561, 13454, 60627, 49509, 4084, 19322, 97816, 59448, 99700,\n", 1254 | " 61200, 86912, 73743, 37732, 75161, 17840, 37762, 27219, 25396,\n", 1255 | " 50594, 23421, 48939, 84351, 81068, 59203, 98133, 21306, 15292,\n", 1256 | " 99536, 67752, 38458, 23990, 69528, 76746, 36025, 17960, 35314,\n", 1257 | " 62136, 7895, 77468, 5936, 3208, 98849, 87998, 27117, 65528,\n", 1258 | " 17118, 49575, 792, 10529, 26681, 97939, 6155, 55264, 7548,\n", 1259 | " 80267, 61637, 75130, 8348, 41164, 78440, 96324, 23910, 54688,\n", 1260 | " 38082, 34135, 81759, 6720, 46610, 86681, 85199, 3811, 63877,\n", 1261 | " 26215, 43199, 69799, 93347, 22261, 17349, 37919, 93912, 69426,\n", 1262 | " 22243, 22017, 4743, 54493, 84930, 25247, 31514, 4355, 50730,\n", 1263 | " 73811, 41227, 17028, 5331, 91508, 24122, 51200, 11138, 44127,\n", 1264 | " 90806, 77022, 64562, 10898, 14174, 57913, 99828, 57706, 42772,\n", 1265 | " 54179, 68862, 76345, 88100, 72139, 30147, 45699, 93063, 11577,\n", 1266 | " 94785, 1717, 96386, 26568, 25113, 6798, 19647, 2788, 62534,\n", 1267 | " 91619, 12402, 30850, 7600, 46501, 85409, 38677, 68801, 36002,\n", 1268 | " 55182, 65801, 85868, 96940, 44912, 77689, 3985, 51174, 32874,\n", 1269 | " 53751, 3903, 74851, 21809, 97624, 84626, 67521, 64527, 60793,\n", 1270 | " 11559, 71589, 42158, 11201, 23790, 31542, 53567, 76873, 43710,\n", 1271 | " 63793, 22247, 21891, 58106, 11862, 13876, 65170, 67826, 37654,\n", 1272 | " 82869, 27342, 71249, 76014, 78362, 90595, 87212, 47904, 63778,\n", 1273 | " 46775, 17269, 78978, 74667, 20049, 98112, 9934, 1577, 12606,\n", 1274 | " 200, 19884, 4397, 22854, 14313, 74765, 23727, 26694, 58000,\n", 1275 | " 91095, 94519, 67833, 47448, 61996, 8433, 96791, 94240, 63468,\n", 1276 | " 37776, 96938, 64397, 70325, 3465, 45726, 24296, 78209, 98297,\n", 1277 | " 59382, 78362, 50303, 48305, 53011, 56718, 16154, 11122, 52286,\n", 1278 | " 61757, 10110, 37164, 40601, 65825, 36576, 34943, 64910, 74708,\n", 1279 | " 48105, 89720, 82707, 30607, 45693, 5616, 76611, 71829, 58655,\n", 1280 | " 49, 28841, 96414, 45350, 77407, 96970, 2763, 78034, 29117,\n", 1281 | " 34884, 28101, 70907, 97462, 47138, 80405, 60233, 88443, 90548,\n", 1282 | " 20092, 48496, 6044, 53731, 59364, 88567, 81135, 43713, 74604,\n", 1283 | " 95751, 84810, 90817, 80139, 76085, 63316, 16613, 84413, 84048,\n", 1284 | " 24994, 27104]),\n", 1285 | " array([33629, 52925, 1612, 68572, 19643, 28450, 29381, 58091, 67925,\n", 1286 | " 24570, 80341, 62258, 68138, 35566, 7720, 11147, 77200, 26219,\n", 1287 | " 38666, 54037, 84103, 42013, 77278, 382, 37611, 20500, 39904,\n", 1288 | " 93788, 90500, 74245, 56705, 25521, 22059, 40351, 63133, 4421,\n", 1289 | " 95238, 8037, 7385, 69054, 31272, 38738, 96539, 98408, 46165,\n", 1290 | " 98376, 55733, 7455, 15620, 70403, 44502, 44869, 83228, 67642,\n", 1291 | " 86760, 61364, 4051, 21647, 78853, 22601, 78600, 26946, 84746,\n", 1292 | " 74347, 64246, 30552, 21960, 20803, 33696, 24709, 56727, 49360,\n", 1293 | " 89432, 64282, 95093, 64036, 96100, 75730, 19912, 40296, 5576,\n", 1294 | " 74665, 76835, 74765, 29160, 45511, 97921, 61411, 65662, 76829,\n", 1295 | " 37528, 85487, 12267, 4315, 41632, 66377, 55330, 39209, 64830,\n", 1296 | " 63232, 36191, 84189, 51336, 71310, 47439, 72667, 61905, 93717,\n", 1297 | " 30230, 92124, 77418, 9741, 65484, 33601, 14730, 32388, 71917,\n", 1298 | " 65947, 12240, 66876, 34033, 63522, 70475, 15571, 22147, 72689,\n", 1299 | " 22581, 39724, 48563, 2466, 23414, 44, 58384, 65412, 30379,\n", 1300 | " 47102, 14197, 80069, 65916, 4810, 66280, 71394, 77604, 31238,\n", 1301 | " 9509, 80019, 59997, 71770, 65305, 64450, 43156, 56013, 85957,\n", 1302 | " 85503, 44973, 72255, 42333, 61782, 64236, 55454, 32738, 36878,\n", 1303 | " 11154, 64859, 55458, 73886, 54085, 72637, 9663, 28550, 25753,\n", 1304 | " 34285, 50093, 23964, 6750, 38056, 19822, 92321, 68399, 49920,\n", 1305 | " 35424, 7928, 30282, 28379, 26424, 90600, 61804, 28984, 41985,\n", 1306 | " 58993, 16527, 58494, 95192, 66992, 53001, 13340, 20606, 24993,\n", 1307 | " 83724, 84847, 90092, 38104, 92373, 85010, 16604, 14771, 38182,\n", 1308 | " 22055, 4187, 54083, 71764, 69130, 3460, 79384, 56945, 39851,\n", 1309 | " 96667, 89715, 11301, 11581, 62738, 47171, 39821, 55295, 23686,\n", 1310 | " 68069, 55072, 87276, 93634, 71456, 17147, 70730, 95517, 5926,\n", 1311 | " 62997, 17967, 78427, 99549, 1617, 52819, 14809, 63507, 43635,\n", 1312 | " 73718, 79137, 80335, 17584, 53603, 66886, 46503, 34993, 54154,\n", 1313 | " 89025, 57031, 42187, 96996, 6837, 99192, 57984, 85881, 11362,\n", 1314 | " 89583, 60030, 9650, 25546, 32900, 51589, 65190, 65193, 87397,\n", 1315 | " 6144, 92220, 93340, 52426, 45850, 41512, 64485, 54493, 39624,\n", 1316 | " 13912, 23964, 8115, 16021, 83886, 26330, 93189, 55651, 44196,\n", 1317 | " 53259, 11779, 58389, 91055, 66093, 15360, 61597, 95118, 63363,\n", 1318 | " 44215, 1878, 1135, 91371, 20310, 88206, 16760, 2627, 50337,\n", 1319 | " 86546, 80038, 64418, 96787, 31432, 13694, 14568, 46860, 81106,\n", 1320 | " 71548, 9010, 20427, 18951, 41138, 33346, 92090, 10819, 55635,\n", 1321 | " 32228, 59676, 5272, 30084, 86267, 16851, 16231, 25470, 2912,\n", 1322 | " 87496, 3113, 31952, 59259, 75495, 73256, 72880, 86759, 88311,\n", 1323 | " 72869, 71744, 86575, 54920, 39005, 52644, 46337, 10495, 32532,\n", 1324 | " 59922, 13881, 70599, 2007, 15150, 69579, 70124, 42661, 60176,\n", 1325 | " 26534, 72274, 49878, 66443, 62875, 17056, 56283, 3394, 99832,\n", 1326 | " 78251, 87728, 77820, 56774, 29531, 19059, 94748, 98742, 9413,\n", 1327 | " 93437, 17061, 65602, 40084, 48354, 57277, 47140, 55565, 41015,\n", 1328 | " 16030, 66510, 22110, 7553, 32201, 74986, 55981, 24145, 6370,\n", 1329 | " 28240, 42626, 34479, 37064, 5746, 39714, 72299, 17147, 41181,\n", 1330 | " 42116, 42427, 81107, 14180, 6630, 85127, 53502, 75895, 68420,\n", 1331 | " 61545, 97250]),\n", 1332 | " array([13154, 43591, 84672, 89591, 88342, 3063, 955, 7336, 78982,\n", 1333 | " 27765, 57155, 8589, 52505, 51577, 11604, 44879, 59125, 65705,\n", 1334 | " 95423, 32669, 49061, 31116, 42568, 70052, 84958, 25409, 6996,\n", 1335 | " 85809, 72239, 22757, 95010, 67410, 49207, 3816, 69137, 83347,\n", 1336 | " 54194, 7712, 95074, 55194, 25821, 82519, 86014, 94139, 23811,\n", 1337 | " 98424, 61195, 52113, 48201, 97578, 82559, 43594, 27216, 96322,\n", 1338 | " 65878, 23162, 31540, 97590, 30230, 92388, 35981, 97826, 76204,\n", 1339 | " 13485, 77130, 7643, 6655, 34813, 7703, 60837, 44787, 83427,\n", 1340 | " 30447, 20009, 81114, 2829, 83331, 17679, 65132, 16773, 81935,\n", 1341 | " 15126, 27465, 54036, 44603, 55671, 52899, 59387, 64427, 68132,\n", 1342 | " 72274, 32046, 98588, 81288, 52503, 71776, 67107, 97268, 11771,\n", 1343 | " 95036, 13171, 40494, 62764, 39567, 91870, 55411, 10093, 22041,\n", 1344 | " 40054, 37320, 21971, 78670, 78502, 99771, 22538, 29936, 25677,\n", 1345 | " 85732, 13648, 78728, 6353, 20590, 85049, 43792, 65441, 31932,\n", 1346 | " 16005, 76186, 76938, 91701, 30193, 99235, 15045, 71002, 91123,\n", 1347 | " 77174, 59359, 36413, 71801, 82702, 27976, 44913, 74784, 28152,\n", 1348 | " 13105, 45235, 67, 13960, 11700, 20921, 11061, 97555, 4344,\n", 1349 | " 8608, 11730, 61819, 61335, 83702, 35189, 22776, 20745, 66866,\n", 1350 | " 52345, 66262, 53241, 53036, 50949, 16982, 83017, 19775, 88012,\n", 1351 | " 1099, 53865, 61129, 78751, 32147, 4043, 39637, 46232, 11144,\n", 1352 | " 63432, 89940, 36944, 5852, 94568, 96349, 31460, 13508, 6484,\n", 1353 | " 56395, 81480, 4313, 47195, 66409, 61364, 99007, 18956, 60436,\n", 1354 | " 50841, 50278, 96908, 17698, 11447, 65535, 90915, 55088, 98787,\n", 1355 | " 17462, 90451, 24785, 44966, 2636, 75919, 3676, 30036, 81168,\n", 1356 | " 66497, 70013, 39814, 37211, 98045, 84475, 70435, 54565, 49542,\n", 1357 | " 1554, 57569, 33777, 42768, 85198, 38463, 53719, 52088, 52595,\n", 1358 | " 63403, 96178, 35636, 37974, 67134, 71100, 1062, 67291, 99084,\n", 1359 | " 5827, 20789, 44013, 10274, 78931, 30865, 11512, 16905, 43749,\n", 1360 | " 94892, 16231, 18088, 78225, 73614, 16070, 65747, 37528, 22746,\n", 1361 | " 34346, 71573, 33372, 74518, 12662, 38224, 89691, 2300, 6537,\n", 1362 | " 82204, 60876, 71601, 37375, 92312, 501, 89107, 95390, 28295,\n", 1363 | " 64993, 6625, 36105, 88471, 4110, 97276, 51990, 33526, 87517,\n", 1364 | " 12064, 43773, 92006, 86137, 93698, 12989, 27519, 34935, 49407,\n", 1365 | " 18004, 94940, 3532, 21540, 5336, 43164, 99381, 2575, 24386,\n", 1366 | " 64880, 92132, 50735, 33456, 91941, 60241, 99046, 15350, 30285,\n", 1367 | " 98377, 90383, 18086, 4635, 39578, 94724, 84584, 8333, 23463,\n", 1368 | " 88473, 34472, 75498, 94604, 63958, 18814, 11417, 22566, 80804,\n", 1369 | " 88207, 80187, 95787, 94912, 45672, 91999, 38648, 30372, 82686,\n", 1370 | " 34776, 35739, 13579, 34750, 51413, 50645, 32835, 7299, 17571,\n", 1371 | " 33367, 48884, 64365, 43636, 79549, 85208, 30239, 41824, 68758,\n", 1372 | " 86751, 71032, 59923, 521, 8761, 91270, 12407, 62751, 6579,\n", 1373 | " 89920, 12824, 72102, 13998, 12828, 47580, 22189, 69277, 90147,\n", 1374 | " 95471, 19312, 28939, 29738, 96186, 51350, 56697, 6409, 38194,\n", 1375 | " 60620, 99253, 66947, 39109, 76224, 75865, 77481, 73441, 67298,\n", 1376 | " 38891, 1615, 94340, 14687, 19239, 21798, 75329, 42060, 47113,\n", 1377 | " 28541, 62359, 18114, 36425, 56730, 69905, 58090, 17623, 89828,\n", 1378 | " 46154, 35581]),\n", 1379 | " array([ 3257, 43931, 46586, 73550, 16041, 14279, 86904, 86605, 61399,\n", 1380 | " 85142, 80352, 16371, 43718, 26687, 84560, 5236, 80662, 89849,\n", 1381 | " 94941, 28098, 99462, 22152, 95866, 18175, 13554, 91012, 71420,\n", 1382 | " 99147, 41764, 48875, 64269, 68024, 31448, 80631, 72210, 76149,\n", 1383 | " 98729, 88605, 68340, 2337, 41799, 86025, 74139, 66282, 71394,\n", 1384 | " 56470, 32343, 22482, 11122, 43367, 43249, 83505, 66189, 49238,\n", 1385 | " 43613, 21679, 54304, 72380, 2058, 86370, 95048, 93870, 18009,\n", 1386 | " 33804, 65908, 72997, 54317, 50893, 79401, 55429, 65965, 14637,\n", 1387 | " 70124, 93732, 19275, 41585, 37657, 79443, 2385, 27860, 10152,\n", 1388 | " 14695, 30039, 27594, 16402, 9006, 25161, 17680, 57388, 72438,\n", 1389 | " 30191, 44726, 76781, 61655, 35181, 7642, 48288, 66547, 54359,\n", 1390 | " 22892, 86814, 14750, 18934, 62982, 89772, 83242, 37602, 71139,\n", 1391 | " 56435, 60115, 28696, 28986, 91454, 16532, 7786, 2797, 53722,\n", 1392 | " 85972, 37547, 17747, 25622, 92305, 14336, 30579, 72788, 6688,\n", 1393 | " 64296, 66448, 81243, 46632, 69467, 76234, 68085, 71374, 38000,\n", 1394 | " 90033, 36007, 4047, 18408, 6919, 78352, 21213, 73782, 46146,\n", 1395 | " 18146, 44640, 45363, 54692, 34480, 33579, 58923, 79625, 4349,\n", 1396 | " 42410, 44897, 39439, 14461, 54375, 59070, 1973, 46173, 10378,\n", 1397 | " 54890, 17152, 39333, 2441, 24929, 68310, 81005, 31053, 37061,\n", 1398 | " 96504, 32906, 72046, 65555, 4846, 42690, 43953, 65116, 72373,\n", 1399 | " 11465, 83077, 3606, 34353, 55670, 76872, 27613, 1237, 23252,\n", 1400 | " 73910, 54384, 84331, 1391, 39376, 50905, 40066, 77824, 6222,\n", 1401 | " 31445, 64723, 29303, 37630, 66275, 46081, 91529, 49006, 973,\n", 1402 | " 83516, 70606, 74182, 16098, 74579, 83414, 36486, 86053, 34293,\n", 1403 | " 38234, 54919, 74105, 79224, 17509, 60860, 68278, 40873, 77604,\n", 1404 | " 58946, 59871, 29630, 42846, 60026, 61476, 84460, 19661, 76839,\n", 1405 | " 77505, 24295, 38253, 63182, 22355, 43689, 3845, 75718, 73988,\n", 1406 | " 48796, 67237, 92393, 78231, 77653, 42007, 62472, 68943, 94234,\n", 1407 | " 48010, 74564, 30316, 18924, 28770, 86568, 78445, 98967, 54795,\n", 1408 | " 25728, 25599, 11495, 68848, 96465, 45649, 23576, 20186, 42827,\n", 1409 | " 72614, 10201, 59377, 5334, 83379, 86906, 46904, 38457, 30048,\n", 1410 | " 87937, 42841, 71125, 90687, 86513, 36190, 84288, 58406, 7740,\n", 1411 | " 52088, 36518, 69888, 13598, 50772, 78762, 567, 393, 33052,\n", 1412 | " 15874, 65367, 36327, 86642, 80928, 65287, 64228, 76184, 47267,\n", 1413 | " 53479, 49592, 25247, 84249, 65048, 69030, 97180, 44397, 65856,\n", 1414 | " 63622, 58823, 53697, 68175, 44592, 79072, 35156, 79662, 86520,\n", 1415 | " 79029, 50566, 67635, 31994, 22887, 98299, 71062, 40747, 71813,\n", 1416 | " 41706, 69122, 65067, 32064, 58836, 30316, 36277, 54882, 97271,\n", 1417 | " 72625, 51234, 22900, 26593, 98085, 97197, 31398, 2399, 30360,\n", 1418 | " 65787, 73515, 15089, 44732, 24221, 85115, 5061, 14345, 82884,\n", 1419 | " 89591, 15890, 26748, 79375, 98985, 11395, 70733, 76442, 79224,\n", 1420 | " 88085, 43111, 20287, 69338, 35308, 33131, 3000, 44686, 74351,\n", 1421 | " 5412, 61113, 19817, 15671, 91089, 6355, 14040, 57761, 91676,\n", 1422 | " 64168, 79216, 20481, 96205, 55180, 9519, 17773, 72417, 78934,\n", 1423 | " 80269, 33117, 79454, 3803, 92342, 94155, 76071, 75911, 16876,\n", 1424 | " 58506, 53357, 60567, 45067, 80154, 9633, 73803, 88035, 85474,\n", 1425 | " 75956, 67376]),\n", 1426 | " array([21764, 22830, 63741, 2602, 5413, 79943, 11688, 39510, 81818,\n", 1427 | " 29482, 94772, 43678, 73933, 98800, 31426, 97286, 56089, 44459,\n", 1428 | " 37546, 93065, 62811, 85626, 65049, 99458, 71210, 57250, 86631,\n", 1429 | " 7522, 46642, 89353, 24502, 55591, 47981, 64810, 74338, 35014,\n", 1430 | " 92603, 55495, 11266, 68703, 42298, 77902, 87702, 26111, 23713,\n", 1431 | " 45154, 75644, 78027, 41026, 40511, 89349, 41567, 98734, 95145,\n", 1432 | " 86380, 55678, 16295, 74099, 70327, 79317, 71553, 6317, 23566,\n", 1433 | " 30750, 21959, 16524, 80541, 82701, 7735, 79801, 98006, 57461,\n", 1434 | " 37445, 38387, 90774, 17656, 3379, 73724, 98984, 51901, 39645,\n", 1435 | " 62279, 1805, 80025, 90873, 87247, 72462, 81763, 6326, 2157,\n", 1436 | " 73865, 83781, 55276, 28101, 99301, 61167, 25378, 64555, 66485,\n", 1437 | " 17671, 7079, 68771, 66567, 99485, 85177, 38460, 7553, 98133,\n", 1438 | " 36636, 7327, 1489, 65956, 73224, 28978, 50080, 94363, 31424,\n", 1439 | " 64798, 966, 83643, 46204, 92936, 16985, 55509, 76419, 99395,\n", 1440 | " 73757, 57749, 36771, 30917, 17746, 67176, 60193, 85089, 8907,\n", 1441 | " 38671, 82835, 78691, 84258, 90516, 68760, 67981, 60871, 42161,\n", 1442 | " 37609, 3322, 37582, 99969, 97551, 84379, 68095, 43550, 43130,\n", 1443 | " 27492, 18602, 30634, 22905, 67805, 85947, 30261, 24767, 26835,\n", 1444 | " 99988, 59557, 47943, 1194, 82760, 87763, 16116, 10037, 45383,\n", 1445 | " 13355, 7159, 89613, 46, 80661, 79245, 82235, 91688, 65744,\n", 1446 | " 43095, 60707, 23932, 15222, 12477, 57174, 73766, 160, 22445,\n", 1447 | " 52765, 20855, 48772, 5378, 62436, 4120, 50860, 64672, 36971,\n", 1448 | " 61424, 16315, 21645, 31294, 85889, 30245, 33859, 94112, 77452,\n", 1449 | " 71038, 83103, 22182, 85894, 68729, 71809, 25970, 67566, 18113,\n", 1450 | " 56203, 50024, 11760, 59153, 39800, 38920, 16366, 35960, 94569,\n", 1451 | " 84339, 80938, 44056, 16821, 44471, 94291, 75171, 84599, 56283,\n", 1452 | " 14443, 31605, 30128, 24767, 95238, 37085, 92883, 45780, 61553,\n", 1453 | " 70490, 5802, 80471, 19288, 45241, 44341, 55644, 81594, 51471,\n", 1454 | " 6988, 39793, 24615, 68832, 34833, 14533, 81511, 70058, 92946,\n", 1455 | " 72401, 37463, 44407, 42829, 1202, 2491, 58585, 99129, 77743,\n", 1456 | " 35742, 40411, 87487, 757, 77917, 59654, 54751, 23754, 61338,\n", 1457 | " 22035, 34306, 51319, 44620, 75966, 54855, 49528, 18973, 39280,\n", 1458 | " 14186, 76812, 24172, 42998, 96212, 94752, 43300, 85846, 40078,\n", 1459 | " 22552, 82945, 31385, 20668, 88844, 54275, 9693, 72026, 82356,\n", 1460 | " 94336, 96489, 75096, 13419, 79158, 80797, 54584, 30363, 15408,\n", 1461 | " 94247, 98904, 49417, 57522, 51937, 45696, 12700, 50050, 98086,\n", 1462 | " 67413, 40739, 99188, 82360, 58728, 56769, 53241, 63839, 28757,\n", 1463 | " 47873, 19423, 64252, 17911, 47461, 6050, 54271, 79498, 18871,\n", 1464 | " 52636, 8893, 52370, 53142, 32065, 31413, 72646, 76906, 53666,\n", 1465 | " 74060, 29467, 27333, 94825, 85863, 77458, 60410, 97424, 35349,\n", 1466 | " 34587, 58351, 82695, 42477, 58805, 27443, 83834, 34347, 82872,\n", 1467 | " 14439, 38346, 84410, 51051, 90622, 97798, 85952, 24388, 3872,\n", 1468 | " 26469, 80116, 95397, 25230, 84192, 55362, 27505, 3287, 97277,\n", 1469 | " 77903, 3513, 18302, 52612, 13160, 68836, 79735, 52406, 31450,\n", 1470 | " 76394, 49328, 65211, 3577, 30451, 96647, 19633, 65679, 19614,\n", 1471 | " 44075, 18036, 48383, 48486, 75594, 19071, 78317, 85360, 25723,\n", 1472 | " 44353, 23378]),\n", 1473 | " array([ 6698, 79667, 15751, 8469, 4086, 99613, 84107, 40560, 27216,\n", 1474 | " 4676, 79370, 57691, 28076, 61546, 34436, 28436, 47515, 73272,\n", 1475 | " 57573, 88934, 91683, 30812, 98134, 49121, 36447, 73997, 40153,\n", 1476 | " 68218, 8086, 13015, 61960, 6946, 90796, 92122, 47202, 16092,\n", 1477 | " 89921, 94515, 88956, 23263, 80729, 21684, 21861, 87976, 68714,\n", 1478 | " 57240, 68238, 8143, 16563, 68969, 93127, 63240, 70817, 32947,\n", 1479 | " 10054, 68423, 80477, 98134, 2352, 57762, 72, 72233, 72918,\n", 1480 | " 57166, 88860, 22321, 91243, 57140, 63112, 969, 8613, 88774,\n", 1481 | " 61351, 17117, 29183, 76836, 56495, 72580, 40866, 93511, 31254,\n", 1482 | " 63804, 8303, 48498, 19565, 52185, 69200, 24468, 61439, 64828,\n", 1483 | " 35736, 86408, 48116, 33605, 74164, 18967, 79439, 70828, 81264,\n", 1484 | " 86024, 35485, 66252, 87065, 38554, 60857, 15861, 26645, 21947,\n", 1485 | " 69259, 65022, 50957, 81911, 5835, 54102, 83163, 56962, 57566,\n", 1486 | " 89966, 16543, 44967, 91896, 920, 77213, 6428, 88005, 64978,\n", 1487 | " 4242, 49648, 11515, 56484, 5574, 68369, 61212, 530, 91062,\n", 1488 | " 93241, 118, 97957, 25097, 90055, 81267, 62881, 50990, 70124,\n", 1489 | " 47463, 73581, 3861, 89387, 70044, 68814, 18871, 12194, 22418,\n", 1490 | " 80675, 21068, 45391, 75989, 99696, 36585, 29901, 93484, 53417,\n", 1491 | " 85943, 90746, 73005, 60712, 96331, 55508, 32828, 76207, 1704,\n", 1492 | " 23777, 74910, 44959, 64653, 7506, 47412, 83302, 50736, 9055,\n", 1493 | " 67391, 41992, 21278, 41099, 68601, 89034, 82496, 52495, 19431,\n", 1494 | " 25568, 32529, 42421, 27744, 20029, 11681, 67981, 24135, 17489,\n", 1495 | " 42368, 49982, 65388, 28815, 90921, 39227, 43549, 67493, 8501,\n", 1496 | " 1609, 28041, 4480, 56727, 57170, 90447, 53563, 21631, 61584,\n", 1497 | " 35926, 66809, 26529, 80236, 59504, 61776, 7151, 18808, 2580,\n", 1498 | " 35876, 81463, 66490, 17475, 291, 98903, 25492, 13507, 80106,\n", 1499 | " 60621, 69393, 26314, 68888, 95160, 48003, 16630, 86440, 84208,\n", 1500 | " 74688, 50983, 7432, 25152, 52807, 76904, 64184, 38567, 83234,\n", 1501 | " 97801, 53251, 45947, 45652, 49775, 84615, 18912, 80017, 89578,\n", 1502 | " 6114, 87399, 24419, 32076, 3842, 71435, 3416, 36686, 75104,\n", 1503 | " 44290, 94142, 92780, 85724, 70738, 55916, 97492, 2514, 81394,\n", 1504 | " 51706, 62745, 88247, 86918, 11208, 26296, 4156, 62529, 1487,\n", 1505 | " 3056, 17428, 93888, 87787, 82586, 81182, 29909, 50217, 69028,\n", 1506 | " 85661, 89330, 913, 18066, 49540, 33520, 45775, 45265, 51567,\n", 1507 | " 15882, 54559, 12252, 51886, 58753, 65763, 54903, 35952, 63251,\n", 1508 | " 54861, 41481, 31733, 13265, 54875, 71453, 31541, 94725, 23092,\n", 1509 | " 51266, 40385, 56764, 61850, 93976, 24211, 1366, 67052, 21462,\n", 1510 | " 88034, 91363, 94051, 70348, 7955, 25676, 77876, 82717, 90330,\n", 1511 | " 48735, 70877, 67445, 32384, 45867, 86842, 43531, 20926, 28109,\n", 1512 | " 73627, 69509, 90412, 39480, 52798, 38707, 38366, 50231, 88334,\n", 1513 | " 54251, 18447, 92356, 29415, 33675, 94487, 93785, 55512, 29399,\n", 1514 | " 60232, 96020, 69256, 92131, 94292, 40196, 83998, 55511, 59575,\n", 1515 | " 88665, 43833, 69388, 36135, 52302, 92631, 35077, 61439, 4468,\n", 1516 | " 21545, 41620, 725, 14242, 11230, 56081, 37778, 43384, 83860,\n", 1517 | " 8504, 56406, 94951, 57166, 97160, 81698, 51315, 20267, 40616,\n", 1518 | " 11524, 57040, 11149, 53617, 24049, 11951, 53578, 68150, 4527,\n", 1519 | " 91666, 20896]),\n", 1520 | " array([86037, 35819, 33142, 48620, 96111, 43315, 97334, 77796, 53245,\n", 1521 | " 66059, 83328, 57600, 85940, 6341, 18674, 33186, 71332, 43797,\n", 1522 | " 17841, 84775, 34533, 79057, 11887, 38909, 75789, 74122, 44361,\n", 1523 | " 51493, 61367, 24637, 70567, 99337, 49871, 82942, 95035, 77295,\n", 1524 | " 70325, 90400, 25181, 61816, 69658, 25327, 5864, 99074, 12277,\n", 1525 | " 9312, 177, 15549, 8361, 6066, 36048, 24997, 37844, 7156,\n", 1526 | " 46788, 47055, 99397, 80949, 57971, 27956, 81406, 28842, 53279,\n", 1527 | " 13422, 90577, 46477, 66372, 84000, 52971, 236, 26529, 85168,\n", 1528 | " 32306, 61355, 58169, 84585, 3620, 63419, 37462, 89595, 96920,\n", 1529 | " 15534, 99683, 25343, 67843, 49095, 27388, 94484, 92334, 28582,\n", 1530 | " 68598, 80836, 81103, 87249, 1536, 26365, 55749, 63016, 42639,\n", 1531 | " 76909, 63340, 92013, 59746, 52692, 9547, 48932, 61493, 68713,\n", 1532 | " 54693, 52298, 3154, 34975, 99426, 18745, 22474, 54249, 83291,\n", 1533 | " 83709, 38768, 23384, 23489, 29262, 95169, 9123, 24139, 25254,\n", 1534 | " 48637, 31634, 56664, 16136, 51954, 74527, 36370, 73475, 14211,\n", 1535 | " 93612, 48444, 84676, 37165, 38055, 50979, 81635, 14813, 57192,\n", 1536 | " 28211, 12679, 61949, 6419, 34476, 67730, 49025, 11655, 56409,\n", 1537 | " 18641, 43443, 97466, 64230, 10771, 86572, 1908, 20166, 42031,\n", 1538 | " 87102, 81972, 146, 31959, 2910, 99521, 57691, 91148, 9266,\n", 1539 | " 63105, 48432, 72876, 28766, 35361, 47234, 28564, 14067, 38040,\n", 1540 | " 93319, 51772, 22603, 14741, 11196, 54638, 87459, 65985, 44385,\n", 1541 | " 10642, 90377, 15812, 47031, 58834, 23261, 58313, 9508, 83819,\n", 1542 | " 99757, 84803, 54511, 74276, 47860, 38208, 65839, 76233, 48317,\n", 1543 | " 96260, 52310, 57984, 15273, 30068, 18152, 91890, 60929, 87115,\n", 1544 | " 17420, 77629, 89650, 53648, 30539, 62048, 73991, 5800, 48309,\n", 1545 | " 69740, 48852, 43104, 88830, 16448, 28141, 44014, 69182, 59845,\n", 1546 | " 89815, 67556, 60168, 46392, 88039, 14809, 29414, 40725, 31683,\n", 1547 | " 21249, 65617, 10497, 35513, 37825, 65874, 98256, 82835, 73005,\n", 1548 | " 12530, 20970, 17618, 65878, 87353, 47560, 55130, 32010, 38831,\n", 1549 | " 1902, 73896, 942, 12654, 42744, 24548, 89002, 54842, 14121,\n", 1550 | " 60523, 71120, 89794, 76679, 11931, 46141, 95399, 9375, 82506,\n", 1551 | " 71172, 4311, 96596, 85316, 79479, 51370, 38371, 3148, 40131,\n", 1552 | " 5901, 87089, 21866, 8373, 55592, 8772, 98900, 44267, 40872,\n", 1553 | " 44585, 19991, 18929, 32129, 39798, 90359, 63856, 62002, 78133,\n", 1554 | " 11886, 12668, 94016, 65447, 53755, 13497, 26850, 74424, 79539,\n", 1555 | " 95781, 62313, 62779, 49178, 39161, 39170, 98792, 77824, 15788,\n", 1556 | " 56300, 83364, 10356, 66585, 92831, 86808, 71520, 3422, 47937,\n", 1557 | " 53743, 41406, 3059, 75600, 59865, 5741, 71362, 1774, 15570,\n", 1558 | " 45585, 3148, 42751, 98906, 74084, 34939, 33455, 44482, 87165,\n", 1559 | " 64418, 99191, 87161, 9295, 73117, 22104, 63882, 72983, 83798,\n", 1560 | " 66479, 91455, 21720, 13399, 89367, 82404, 32646, 3910, 99879,\n", 1561 | " 66873, 15561, 1275, 8955, 31440, 42478, 77283, 127, 62076,\n", 1562 | " 69051, 87512, 17120, 51049, 36762, 46848, 86135, 75463, 9459,\n", 1563 | " 74106, 27883, 28840, 41011, 76645, 10471, 48157, 23425, 61119,\n", 1564 | " 87758, 65364, 67109, 13040, 83785, 64908, 43599, 76322, 81990,\n", 1565 | " 33510, 15076, 55381, 25983, 3117, 46002, 77705, 23559, 83227,\n", 1566 | " 80361, 28847])]" 1567 | ] 1568 | }, 1569 | "execution_count": 11, 1570 | "metadata": {}, 1571 | "output_type": "execute_result" 1572 | } 1573 | ], 1574 | "source": [ 1575 | "direct['x']" 1576 | ] 1577 | }, 1578 | { 1579 | "cell_type": "markdown", 1580 | "metadata": {}, 1581 | "source": [ 1582 | "Let's try to apply the function in each different core" 1583 | ] 1584 | }, 1585 | { 1586 | "cell_type": "code", 1587 | "execution_count": 12, 1588 | "metadata": { 1589 | "collapsed": false 1590 | }, 1591 | "outputs": [ 1592 | { 1593 | "ename": "CompositeError", 1594 | "evalue": "one or more exceptions from call to method: execute\n[0:execute]: NameError: name 'f' is not defined\n[1:execute]: NameError: name 'f' is not defined\n[2:execute]: NameError: name 'f' is not defined\n[3:execute]: NameError: name 'f' is not defined\n.... 20 more exceptions ...", 1595 | "output_type": "error", 1596 | "traceback": [ 1597 | "[0:execute]: ", 1598 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m", 1599 | "\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m", 1600 | "\u001b[0m\u001b[0;31mNameError\u001b[0m: name 'f' is not defined", 1601 | "", 1602 | "[1:execute]: ", 1603 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m", 1604 | "\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m", 1605 | "\u001b[0m\u001b[0;31mNameError\u001b[0m: name 'f' is not defined", 1606 | "", 1607 | "[2:execute]: ", 1608 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m", 1609 | "\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m", 1610 | "\u001b[0m\u001b[0;31mNameError\u001b[0m: name 'f' is not defined", 1611 | "", 1612 | "[3:execute]: ", 1613 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m", 1614 | "\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m", 1615 | "\u001b[0m\u001b[0;31mNameError\u001b[0m: name 'f' is not defined", 1616 | "", 1617 | "... 20 more exceptions ..." 1618 | ] 1619 | } 1620 | ], 1621 | "source": [ 1622 | "%%px\n", 1623 | "y=f(x)" 1624 | ] 1625 | }, 1626 | { 1627 | "cell_type": "markdown", 1628 | "metadata": {}, 1629 | "source": [ 1630 | "Why the errors above? Because each core does not see the local engine. They work as separate machines and you have to load all variables and modules in each engine. That's easy." 1631 | ] 1632 | }, 1633 | { 1634 | "cell_type": "code", 1635 | "execution_count": 13, 1636 | "metadata": { 1637 | "collapsed": false 1638 | }, 1639 | "outputs": [ 1640 | { 1641 | "name": "stdout", 1642 | "output_type": "stream", 1643 | "text": [ 1644 | "Overwriting myscript.py\n" 1645 | ] 1646 | } 1647 | ], 1648 | "source": [ 1649 | "%%file myscript.py\n", 1650 | "# test if n is prime\n", 1651 | "def isprime(n):\n", 1652 | " for i in range(3, n):\n", 1653 | " if n % i == 0:\n", 1654 | " return False\n", 1655 | " return True\n", 1656 | "\n", 1657 | "# tests each element of an array if it is prime\n", 1658 | "def f(x):\n", 1659 | " return map(isprime,x) " 1660 | ] 1661 | }, 1662 | { 1663 | "cell_type": "markdown", 1664 | "metadata": {}, 1665 | "source": [ 1666 | "Execute code which defines the methods on the different engines" 1667 | ] 1668 | }, 1669 | { 1670 | "cell_type": "code", 1671 | "execution_count": 14, 1672 | "metadata": { 1673 | "collapsed": false 1674 | }, 1675 | "outputs": [ 1676 | { 1677 | "data": { 1678 | "text/plain": [ 1679 | "" 1680 | ] 1681 | }, 1682 | "execution_count": 14, 1683 | "metadata": {}, 1684 | "output_type": "execute_result" 1685 | } 1686 | ], 1687 | "source": [ 1688 | "direct.run(\"myscript.py\")" 1689 | ] 1690 | }, 1691 | { 1692 | "cell_type": "markdown", 1693 | "metadata": {}, 1694 | "source": [ 1695 | "Now compute the \"model grid\" correctly" 1696 | ] 1697 | }, 1698 | { 1699 | "cell_type": "code", 1700 | "execution_count": 15, 1701 | "metadata": { 1702 | "collapsed": false 1703 | }, 1704 | "outputs": [ 1705 | { 1706 | "name": "stdout", 1707 | "output_type": "stream", 1708 | "text": [ 1709 | "CPU times: user 55 ms, sys: 6.79 ms, total: 61.8 ms\n", 1710 | "Wall time: 2.7 s\n" 1711 | ] 1712 | } 1713 | ], 1714 | "source": [ 1715 | "%%time\n", 1716 | "%px y=f(x)" 1717 | ] 1718 | }, 1719 | { 1720 | "cell_type": "markdown", 1721 | "metadata": {}, 1722 | "source": [ 1723 | "Alternatively to the command above, you could use\n", 1724 | "\n", 1725 | " direct.apply(f,x)\n", 1726 | "or\n", 1727 | "\n", 1728 | " direct.execute('y=f(x)')\n", 1729 | "You should time this in your watch." 1730 | ] 1731 | }, 1732 | { 1733 | "cell_type": "markdown", 1734 | "metadata": {}, 1735 | "source": [ 1736 | "Now we have the separate arrays $y$ containing the results on each engine. How to get it back to the local engine?" 1737 | ] 1738 | }, 1739 | { 1740 | "cell_type": "code", 1741 | "execution_count": 16, 1742 | "metadata": { 1743 | "collapsed": false 1744 | }, 1745 | "outputs": [ 1746 | { 1747 | "data": { 1748 | "text/plain": [ 1749 | "\u001b[0;31mOut[0:3]: \u001b[0m417" 1750 | ] 1751 | }, 1752 | "metadata": {}, 1753 | "output_type": "display_data" 1754 | }, 1755 | { 1756 | "data": { 1757 | "text/plain": [ 1758 | "\u001b[0;31mOut[1:3]: \u001b[0m417" 1759 | ] 1760 | }, 1761 | "metadata": {}, 1762 | "output_type": "display_data" 1763 | }, 1764 | { 1765 | "data": { 1766 | "text/plain": [ 1767 | "\u001b[0;31mOut[2:3]: \u001b[0m417" 1768 | ] 1769 | }, 1770 | "metadata": {}, 1771 | "output_type": "display_data" 1772 | }, 1773 | { 1774 | "data": { 1775 | "text/plain": [ 1776 | "\u001b[0;31mOut[3:3]: \u001b[0m417" 1777 | ] 1778 | }, 1779 | "metadata": {}, 1780 | "output_type": "display_data" 1781 | }, 1782 | { 1783 | "data": { 1784 | "text/plain": [ 1785 | "\u001b[0;31mOut[4:3]: \u001b[0m417" 1786 | ] 1787 | }, 1788 | "metadata": {}, 1789 | "output_type": "display_data" 1790 | }, 1791 | { 1792 | "data": { 1793 | "text/plain": [ 1794 | "\u001b[0;31mOut[5:3]: \u001b[0m417" 1795 | ] 1796 | }, 1797 | "metadata": {}, 1798 | "output_type": "display_data" 1799 | }, 1800 | { 1801 | "data": { 1802 | "text/plain": [ 1803 | "\u001b[0;31mOut[6:3]: \u001b[0m417" 1804 | ] 1805 | }, 1806 | "metadata": {}, 1807 | "output_type": "display_data" 1808 | }, 1809 | { 1810 | "data": { 1811 | "text/plain": [ 1812 | "\u001b[0;31mOut[7:3]: \u001b[0m417" 1813 | ] 1814 | }, 1815 | "metadata": {}, 1816 | "output_type": "display_data" 1817 | }, 1818 | { 1819 | "data": { 1820 | "text/plain": [ 1821 | "\u001b[0;31mOut[8:3]: \u001b[0m417" 1822 | ] 1823 | }, 1824 | "metadata": {}, 1825 | "output_type": "display_data" 1826 | }, 1827 | { 1828 | "data": { 1829 | "text/plain": [ 1830 | "\u001b[0;31mOut[9:3]: \u001b[0m417" 1831 | ] 1832 | }, 1833 | "metadata": {}, 1834 | "output_type": "display_data" 1835 | }, 1836 | { 1837 | "data": { 1838 | "text/plain": [ 1839 | "\u001b[0;31mOut[10:3]: \u001b[0m417" 1840 | ] 1841 | }, 1842 | "metadata": {}, 1843 | "output_type": "display_data" 1844 | }, 1845 | { 1846 | "data": { 1847 | "text/plain": [ 1848 | "\u001b[0;31mOut[11:3]: \u001b[0m417" 1849 | ] 1850 | }, 1851 | "metadata": {}, 1852 | "output_type": "display_data" 1853 | }, 1854 | { 1855 | "data": { 1856 | "text/plain": [ 1857 | "\u001b[0;31mOut[12:3]: \u001b[0m417" 1858 | ] 1859 | }, 1860 | "metadata": {}, 1861 | "output_type": "display_data" 1862 | }, 1863 | { 1864 | "data": { 1865 | "text/plain": [ 1866 | "\u001b[0;31mOut[13:3]: \u001b[0m417" 1867 | ] 1868 | }, 1869 | "metadata": {}, 1870 | "output_type": "display_data" 1871 | }, 1872 | { 1873 | "data": { 1874 | "text/plain": [ 1875 | "\u001b[0;31mOut[14:3]: \u001b[0m417" 1876 | ] 1877 | }, 1878 | "metadata": {}, 1879 | "output_type": "display_data" 1880 | }, 1881 | { 1882 | "data": { 1883 | "text/plain": [ 1884 | "\u001b[0;31mOut[15:3]: \u001b[0m417" 1885 | ] 1886 | }, 1887 | "metadata": {}, 1888 | "output_type": "display_data" 1889 | }, 1890 | { 1891 | "data": { 1892 | "text/plain": [ 1893 | "\u001b[0;31mOut[16:3]: \u001b[0m416" 1894 | ] 1895 | }, 1896 | "metadata": {}, 1897 | "output_type": "display_data" 1898 | }, 1899 | { 1900 | "data": { 1901 | "text/plain": [ 1902 | "\u001b[0;31mOut[17:3]: \u001b[0m416" 1903 | ] 1904 | }, 1905 | "metadata": {}, 1906 | "output_type": "display_data" 1907 | }, 1908 | { 1909 | "data": { 1910 | "text/plain": [ 1911 | "\u001b[0;31mOut[18:3]: \u001b[0m416" 1912 | ] 1913 | }, 1914 | "metadata": {}, 1915 | "output_type": "display_data" 1916 | }, 1917 | { 1918 | "data": { 1919 | "text/plain": [ 1920 | "\u001b[0;31mOut[19:3]: \u001b[0m416" 1921 | ] 1922 | }, 1923 | "metadata": {}, 1924 | "output_type": "display_data" 1925 | }, 1926 | { 1927 | "data": { 1928 | "text/plain": [ 1929 | "\u001b[0;31mOut[20:3]: \u001b[0m416" 1930 | ] 1931 | }, 1932 | "metadata": {}, 1933 | "output_type": "display_data" 1934 | }, 1935 | { 1936 | "data": { 1937 | "text/plain": [ 1938 | "\u001b[0;31mOut[21:3]: \u001b[0m416" 1939 | ] 1940 | }, 1941 | "metadata": {}, 1942 | "output_type": "display_data" 1943 | }, 1944 | { 1945 | "data": { 1946 | "text/plain": [ 1947 | "\u001b[0;31mOut[22:3]: \u001b[0m416" 1948 | ] 1949 | }, 1950 | "metadata": {}, 1951 | "output_type": "display_data" 1952 | }, 1953 | { 1954 | "data": { 1955 | "text/plain": [ 1956 | "\u001b[0;31mOut[23:3]: \u001b[0m416" 1957 | ] 1958 | }, 1959 | "metadata": {}, 1960 | "output_type": "display_data" 1961 | } 1962 | ], 1963 | "source": [ 1964 | "%%px \n", 1965 | "import numpy\n", 1966 | "numpy.size(y)" 1967 | ] 1968 | }, 1969 | { 1970 | "cell_type": "code", 1971 | "execution_count": 17, 1972 | "metadata": { 1973 | "collapsed": false 1974 | }, 1975 | "outputs": [], 1976 | "source": [ 1977 | "y=direct.gather('y')" 1978 | ] 1979 | }, 1980 | { 1981 | "cell_type": "markdown", 1982 | "metadata": {}, 1983 | "source": [ 1984 | "We have it back in the local engine. :)" 1985 | ] 1986 | }, 1987 | { 1988 | "cell_type": "markdown", 1989 | "metadata": {}, 1990 | "source": [ 1991 | "# 3. Easy parallel Monte Carlo\n", 1992 | "\n", 1993 | "Suppose you need to do 100k Monte Carlo simulations. Wouldn't it be great if you could easily split them among your (hopefully many) cores?\n", 1994 | "\n", 1995 | "In this example, I have a dataset and I will just do bootstrapping resamples on the dataset. " 1996 | ] 1997 | }, 1998 | { 1999 | "cell_type": "code", 2000 | "execution_count": 18, 2001 | "metadata": { 2002 | "collapsed": false 2003 | }, 2004 | "outputs": [], 2005 | "source": [ 2006 | "import astropy.io.ascii as ascii" 2007 | ] 2008 | }, 2009 | { 2010 | "cell_type": "markdown", 2011 | "metadata": {}, 2012 | "source": [ 2013 | "Load dataset ([available in the repository](https://github.com/rsnemmen/parallel-python-tutorial/blob/master/allrb.dat))" 2014 | ] 2015 | }, 2016 | { 2017 | "cell_type": "code", 2018 | "execution_count": 20, 2019 | "metadata": { 2020 | "collapsed": false 2021 | }, 2022 | "outputs": [], 2023 | "source": [ 2024 | "data=ascii.read('/Users/nemmen/work/projects/finished/jetpower/data/allrb.dat')\n", 2025 | "\n", 2026 | "xdata=data['pb']\n", 2027 | "ydata=data['pj']" 2028 | ] 2029 | }, 2030 | { 2031 | "cell_type": "code", 2032 | "execution_count": 21, 2033 | "metadata": { 2034 | "collapsed": false 2035 | }, 2036 | "outputs": [], 2037 | "source": [ 2038 | "# number of desired bootstraps\n", 2039 | "nboot=400000\n", 2040 | "\n", 2041 | "# number of bootstraps that will go to each core\n", 2042 | "n=nboot/size(client.ids)" 2043 | ] 2044 | }, 2045 | { 2046 | "cell_type": "markdown", 2047 | "metadata": {}, 2048 | "source": [ 2049 | "## Passes variables to the engines" 2050 | ] 2051 | }, 2052 | { 2053 | "cell_type": "markdown", 2054 | "metadata": {}, 2055 | "source": [ 2056 | "First make sure all of them see the path to any custom modules" 2057 | ] 2058 | }, 2059 | { 2060 | "cell_type": "code", 2061 | "execution_count": 22, 2062 | "metadata": { 2063 | "collapsed": false 2064 | }, 2065 | "outputs": [], 2066 | "source": [ 2067 | "%%px\n", 2068 | "import sys, os\n", 2069 | "home=os.environ['HOME']\n", 2070 | "sys.path.append(home+'/work/software/python') # make sure pythonpath is updated" 2071 | ] 2072 | }, 2073 | { 2074 | "cell_type": "code", 2075 | "execution_count": 23, 2076 | "metadata": { 2077 | "collapsed": false 2078 | }, 2079 | "outputs": [ 2080 | { 2081 | "name": "stdout", 2082 | "output_type": "stream", 2083 | "text": [ 2084 | "importing numpy on engine(s)\n", 2085 | "importing nemmen on engine(s)\n", 2086 | "importing scipy on engine(s)\n" 2087 | ] 2088 | } 2089 | ], 2090 | "source": [ 2091 | "direct.push(dict(n=n,xdata=xdata,ydata=ydata))\n", 2092 | "\n", 2093 | "with direct.sync_imports():\n", 2094 | " import numpy, nemmen, scipy" 2095 | ] 2096 | }, 2097 | { 2098 | "cell_type": "markdown", 2099 | "metadata": {}, 2100 | "source": [ 2101 | "Now everything below is executed in parallel! (IPython magic)\n", 2102 | "\n", 2103 | "" 2106 | ] 2107 | }, 2108 | { 2109 | "cell_type": "code", 2110 | "execution_count": 24, 2111 | "metadata": { 2112 | "collapsed": false 2113 | }, 2114 | "outputs": [ 2115 | { 2116 | "name": "stdout", 2117 | "output_type": "stream", 2118 | "text": [ 2119 | "CPU times: user 65.9 ms, sys: 6.92 ms, total: 72.8 ms\n", 2120 | "Wall time: 8 s\n" 2121 | ] 2122 | } 2123 | ], 2124 | "source": [ 2125 | "%%time\n", 2126 | "%%px\n", 2127 | "r=numpy.zeros(n)\n", 2128 | "\n", 2129 | "for i in range(n):\n", 2130 | " [xsim,ysim]=nemmen.bootstrap([xdata,ydata]) # data bootstrapping\n", 2131 | " r[i]=scipy.stats.pearsonr(xsim,ysim)[0]\t # just compute simple Pearson coefficient" 2132 | ] 2133 | }, 2134 | { 2135 | "cell_type": "markdown", 2136 | "metadata": {}, 2137 | "source": [ 2138 | "Assemble result from cores" 2139 | ] 2140 | }, 2141 | { 2142 | "cell_type": "code", 2143 | "execution_count": 25, 2144 | "metadata": { 2145 | "collapsed": false 2146 | }, 2147 | "outputs": [], 2148 | "source": [ 2149 | "r=direct.gather('r')" 2150 | ] 2151 | }, 2152 | { 2153 | "cell_type": "markdown", 2154 | "metadata": {}, 2155 | "source": [ 2156 | "For comparison, how long does it take to do the same simulation in serial mode?" 2157 | ] 2158 | }, 2159 | { 2160 | "cell_type": "code", 2161 | "execution_count": 26, 2162 | "metadata": { 2163 | "collapsed": false 2164 | }, 2165 | "outputs": [ 2166 | { 2167 | "name": "stdout", 2168 | "output_type": "stream", 2169 | "text": [ 2170 | "CPU times: user 1min 33s, sys: 742 ms, total: 1min 34s\n", 2171 | "Wall time: 1min 35s\n" 2172 | ] 2173 | } 2174 | ], 2175 | "source": [ 2176 | "%%time\n", 2177 | "for i in range(nboot):\n", 2178 | " [xsim,ysim]=nemmen.bootstrap([xdata,ydata])\n", 2179 | " t=scipy.stats.pearsonr(xsim,ysim)[0]" 2180 | ] 2181 | }, 2182 | { 2183 | "cell_type": "markdown", 2184 | "metadata": {}, 2185 | "source": [ 2186 | "# Useful documentation\n", 2187 | "\n", 2188 | "## IPython video tutorials\n", 2189 | "\n", 2190 | "* [IPython in depth: high productivity interactive and parallel python - PyCon 2014](http://youtu.be/XFw1JVXKJss)\n", 2191 | "* [The IPython Notebook Revolution](http://youtu.be/t_TzRaK9kpU)\n", 2192 | "\n", 2193 | "## Parallel computing\n", 2194 | "\n", 2195 | "### General\n", 2196 | "\n", 2197 | "* [Introduction to parallel programming](https://computing.llnl.gov/tutorials/parallel_comp)\n", 2198 | "\n", 2199 | "### Python\n", 2200 | "\n", 2201 | "* [AstroPython blog](http://astropython.blogspot.com.br), maintained (not so often anymore) by the speaker\n", 2202 | "* [Using IPython for parallel computing](http://ipython.org/ipython-doc/stable/parallel/index.html)\n", 2203 | "* [Parallel computing with IPython](http://www.astro.washington.edu/users/vanderplas/Astr599/notebooks/21_IPythonParallel)\n", 2204 | "* [Simple python parallelism](http://scottsievert.github.io/blog/2014/07/30/simple-python-parallelism/) and [easily distributing a parallel IPy Notebook on a cluster](http://twiecki.github.io/blog/2014/02/24/ipython-nb-cluster/). Some ideas on making a function parallel easily\n", 2205 | "\n", 2206 | "### Executing general (non-python) jobs in parallel\n", 2207 | "\n", 2208 | "* [Submit non-python commands to a running IPython cluster](https://gist.github.com/zonca/8994544)\n", 2209 | "* [GNU Parallel](http://www.gnu.org/software/parallel/)\n", 2210 | "* [xjobs](http://www.maier-komor.de/xjobs.html)" 2211 | ] 2212 | }, 2213 | { 2214 | "cell_type": "code", 2215 | "execution_count": 7, 2216 | "metadata": { 2217 | "collapsed": false 2218 | }, 2219 | "outputs": [ 2220 | { 2221 | "data": { 2222 | "text/plain": [ 2223 | "[0,\n", 2224 | " 1,\n", 2225 | " 2,\n", 2226 | " 3,\n", 2227 | " 4,\n", 2228 | " 5,\n", 2229 | " 6,\n", 2230 | " 7,\n", 2231 | " 8,\n", 2232 | " 9,\n", 2233 | " 10,\n", 2234 | " 11,\n", 2235 | " 12,\n", 2236 | " 13,\n", 2237 | " 14,\n", 2238 | " 15,\n", 2239 | " 16,\n", 2240 | " 17,\n", 2241 | " 18,\n", 2242 | " 19,\n", 2243 | " 20,\n", 2244 | " 21,\n", 2245 | " 22,\n", 2246 | " 23]" 2247 | ] 2248 | }, 2249 | "execution_count": 7, 2250 | "metadata": {}, 2251 | "output_type": "execute_result" 2252 | } 2253 | ], 2254 | "source": [ 2255 | "client.ids" 2256 | ] 2257 | }, 2258 | { 2259 | "cell_type": "code", 2260 | "execution_count": null, 2261 | "metadata": { 2262 | "collapsed": true 2263 | }, 2264 | "outputs": [], 2265 | "source": [] 2266 | } 2267 | ], 2268 | "metadata": { 2269 | "kernelspec": { 2270 | "display_name": "Python 2", 2271 | "language": "python", 2272 | "name": "python2" 2273 | }, 2274 | "language_info": { 2275 | "codemirror_mode": { 2276 | "name": "ipython", 2277 | "version": 2 2278 | }, 2279 | "file_extension": ".py", 2280 | "mimetype": "text/x-python", 2281 | "name": "python", 2282 | "nbconvert_exporter": "python", 2283 | "pygments_lexer": "ipython2", 2284 | "version": "2.7.11" 2285 | } 2286 | }, 2287 | "nbformat": 4, 2288 | "nbformat_minor": 0 2289 | } 2290 | -------------------------------------------------------------------------------- /Parallel Computing with Python public.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Parallel Computing with Python\n", 8 | "================================\n", 9 | "\n", 10 | "**[Rodrigo Nemmen](http://rodrigonemmen.com), IAG USP**\n", 11 | "\n", 12 | "This IPython notebook illustrates a few simple ways of doing parallel computing.\n", 13 | "\n", 14 | "Practical examples included:\n", 15 | "\n", 16 | "1. Parallel function mapping to a list of arguments (multiprocessing module)\n", 17 | "2. Parallel execution of array function (scatter/gather) + parallel execution of scripts\n", 18 | "4. Easy parallel Monte Carlo (parallel magics)" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 1, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "import numpy as np" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "# 1. Mapping a model to a grid of parameters \n", 35 | "\n", 36 | "\n", 39 | "\n", 40 | "Uses the *multiprocess* module. *Note: We use `multiprocess` instead of `multiprocessing` because even though the latter comes by default with python it is known to be problematic with Jupyter.*\n", 41 | "\n", 42 | "Idea: you have a function $f(\\mathbf{x},\\mathbf{y})$ of two parameters (e.g., $f$ may represent your model) stored in the arrays $(\\mathbf{x},\\mathbf{y})$. Given the arrays $\\mathbf{x}$ and $\\mathbf{y}$, you want to compute the values of $f(\\mathbf{x},\\mathbf{y})$. Let's assume for simplicity that there is no dependence on the neighbours. This is an embarassingly parallel problem.\n", 43 | "\n", 44 | "" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "import multiprocess as mp" 58 | ] 59 | }, 60 | { 61 | "cell_type": "markdown", 62 | "metadata": {}, 63 | "source": [ 64 | "Time wasting function that depends on two parameters. Here, I generate 1E5 random numbers based on the normal distribution and then sum them. The two parameters are $\\mu$ and $\\sigma$." 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 8, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "def f(z):\n", 74 | " x=np.random.normal(z[0], z[1], 100000)\n", 75 | " return x.sum()" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "Arrays of input parameters. You could easily modify this to take as input a matrix, not two arrays." 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 9, 88 | "metadata": {}, 89 | "outputs": [], 90 | "source": [ 91 | "n=3000\n", 92 | "X=np.linspace(-1,1,n) # mean\n", 93 | "Y=np.linspace(0.1,1,n) # std. dev." 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 10, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [ 102 | "# creates list of arguments [Xi, Yi]\n", 103 | "pargs=[]\t# this is a list of lists!\n", 104 | "for i in range(X.size):\n", 105 | "\tpargs.append([X[i],Y[i]])" 106 | ] 107 | }, 108 | { 109 | "cell_type": "markdown", 110 | "metadata": {}, 111 | "source": [ 112 | "Parallel execution. Check out all the cores being used with a tool like [htop](http://hisham.hm/htop/)." 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": 11, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [ 121 | "ncores=mp.cpu_count() # number of cores\n", 122 | "pool = mp.Pool(processes=ncores) # initializes parallel engine" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 12, 128 | "metadata": {}, 129 | "outputs": [ 130 | { 131 | "name": "stdout", 132 | "output_type": "stream", 133 | "text": [ 134 | "CPU times: user 2.45 s, sys: 28.6 ms, total: 2.48 s\n", 135 | "Wall time: 29.5 s\n" 136 | ] 137 | } 138 | ], 139 | "source": [ 140 | "%%time \n", 141 | "t=pool.map(f, pargs)\t# parallel function map" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 13, 147 | "metadata": {}, 148 | "outputs": [], 149 | "source": [ 150 | "pool.close()\t# close the parallel engine" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "Serial execution" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 14, 163 | "metadata": {}, 164 | "outputs": [ 165 | { 166 | "name": "stdout", 167 | "output_type": "stream", 168 | "text": [ 169 | "CPU times: user 636 µs, sys: 3 µs, total: 639 µs\n", 170 | "Wall time: 645 µs\n" 171 | ] 172 | } 173 | ], 174 | "source": [ 175 | "%time t=map(f, pargs)" 176 | ] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "metadata": {}, 181 | "source": [ 182 | "If you want to convert the list to an array use `y=np.array(t)`. Notes: (1) there is a `map` method for `ipyparallel`. (2) the example I picked is not the best one because numpy is highly optimized hence faster than doing in parallel where communication between processes will kill the performance in this case. " 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": {}, 188 | "source": [ 189 | "# 2. Parallel execution of array function\n", 190 | "\n", 191 | "Uses [`ipyparallel`](https://ipyparallel.readthedocs.io/en/latest/index.html). Consider a function $f(x)$ which takes an array $x$ containing the grid of input parameters. We want to split the function calls (\"split the array\") to the different cores in our machine:\n", 192 | "\n", 193 | "\n", 194 | "![test](array_proc1.gif)\n", 195 | "![test](array_proc2.gif)" 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": {}, 201 | "source": [ 202 | "## Start parallel engine\n", 203 | "\n", 204 | "Make sure you have ipyparallel installed: \n", 205 | "\n", 206 | " conda install ipyparallel\n", 207 | "\n", 208 | "Now, start the parallel engines. Open a terminal and use the command:\n", 209 | "\n", 210 | " ipcluster start" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": {}, 216 | "source": [ 217 | "## Function to be parallelized" 218 | ] 219 | }, 220 | { 221 | "cell_type": "markdown", 222 | "metadata": {}, 223 | "source": [ 224 | "Our time-waster function $f(x)$ that can be applied to an array of integers" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": 16, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "# test if n is prime\n", 234 | "def isprime(n):\n", 235 | " for i in range(3, n):\n", 236 | " if n % i == 0:\n", 237 | " return False\n", 238 | " return True\n", 239 | "\n", 240 | "# tests each element of an array if it is prime\n", 241 | "def f(x):\n", 242 | " return list(map(isprime,x))" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "Generates big array (10k elements) of random integers between 0 and 100000" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 17, 255 | "metadata": {}, 256 | "outputs": [], 257 | "source": [ 258 | "x=np.random.randint(low=0, high=100000, size=10000)" 259 | ] 260 | }, 261 | { 262 | "cell_type": "markdown", 263 | "metadata": {}, 264 | "source": [ 265 | "## Tests" 266 | ] 267 | }, 268 | { 269 | "cell_type": "markdown", 270 | "metadata": {}, 271 | "source": [ 272 | "Serial execution" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 18, 278 | "metadata": {}, 279 | "outputs": [ 280 | { 281 | "name": "stdout", 282 | "output_type": "stream", 283 | "text": [ 284 | "CPU times: user 8.17 s, sys: 32.4 ms, total: 8.2 s\n", 285 | "Wall time: 9.74 s\n" 286 | ] 287 | } 288 | ], 289 | "source": [ 290 | "%time y=f(x)" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "Now explain how ipyparallel works **(here I show a slide)**. See documentation at the end of the notebook for details." 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 19, 303 | "metadata": {}, 304 | "outputs": [ 305 | { 306 | "name": "stdout", 307 | "output_type": "stream", 308 | "text": [ 309 | "Starting 8 engines with \n" 310 | ] 311 | }, 312 | { 313 | "data": { 314 | "text/plain": [ 315 | ", engine_sets=['1683573802'])>" 316 | ] 317 | }, 318 | "execution_count": 19, 319 | "metadata": {}, 320 | "output_type": "execute_result" 321 | } 322 | ], 323 | "source": [ 324 | "import ipyparallel as ipp\n", 325 | "\n", 326 | "cluster = ipp.Cluster(n=ncores)\n", 327 | "cluster.start_cluster_sync()" 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "We are going to use the direct view, which means that commands always run on all nodes. This as opposed to a balanced view, which asynchronously executes code on nodes which are idle. In addition, we are going to turn blocking on. This means that jobs will block further execution until all nodes have finished." 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": 21, 340 | "metadata": {}, 341 | "outputs": [], 342 | "source": [ 343 | "rc = cluster.connect_client_sync()\n", 344 | "rc.wait_for_engines()\n", 345 | "\n", 346 | "direct = rc[:] # use all engines\n", 347 | "direct.block=True" 348 | ] 349 | }, 350 | { 351 | "cell_type": "markdown", 352 | "metadata": {}, 353 | "source": [ 354 | "Splits the input array $x$ between the cores" 355 | ] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "execution_count": 22, 360 | "metadata": {}, 361 | "outputs": [], 362 | "source": [ 363 | "direct.scatter('x',x)" 364 | ] 365 | }, 366 | { 367 | "cell_type": "markdown", 368 | "metadata": {}, 369 | "source": [ 370 | "Verify that the array was indeed divided equally" 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "execution_count": 23, 376 | "metadata": {}, 377 | "outputs": [ 378 | { 379 | "data": { 380 | "text/plain": [ 381 | "[1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250]" 382 | ] 383 | }, 384 | "execution_count": 23, 385 | "metadata": {}, 386 | "output_type": "execute_result" 387 | } 388 | ], 389 | "source": [ 390 | "direct['x.size']" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 21, 396 | "metadata": {}, 397 | "outputs": [ 398 | { 399 | "data": { 400 | "text/plain": [ 401 | "[array([94305, 72839, 17104, ..., 29346, 73755, 29269]),\n", 402 | " array([31625, 37515, 37053, ..., 76381, 32938, 13199]),\n", 403 | " array([44846, 30440, 38205, ..., 83728, 5019, 84130]),\n", 404 | " array([29578, 88280, 80813, ..., 32620, 52857, 27595])]" 405 | ] 406 | }, 407 | "execution_count": 21, 408 | "metadata": {}, 409 | "output_type": "execute_result" 410 | } 411 | ], 412 | "source": [ 413 | "direct['x']" 414 | ] 415 | }, 416 | { 417 | "cell_type": "markdown", 418 | "metadata": {}, 419 | "source": [ 420 | "Let's try to apply the function in each different core" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 25, 426 | "metadata": {}, 427 | "outputs": [ 428 | { 429 | "name": "stderr", 430 | "output_type": "stream", 431 | "text": [ 432 | "[2:execute]\n", 433 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", 434 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\n", 435 | "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n", 436 | "\u001b[0;32m----> 1\u001b[0m y\u001b[38;5;241m=\u001b[39m\u001b[43mf\u001b[49m(x)\n", 437 | "\n", 438 | "\u001b[0;31mNameError\u001b[0m: name 'f' is not defined\n", 439 | "[3:execute]\n", 440 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", 441 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\n", 442 | "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n", 443 | "\u001b[0;32m----> 1\u001b[0m y\u001b[38;5;241m=\u001b[39m\u001b[43mf\u001b[49m(x)\n", 444 | "\n", 445 | "\u001b[0;31mNameError\u001b[0m: name 'f' is not defined\n", 446 | "[7:execute]\n", 447 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", 448 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\n", 449 | "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n", 450 | "\u001b[0;32m----> 1\u001b[0m y\u001b[38;5;241m=\u001b[39m\u001b[43mf\u001b[49m(x)\n", 451 | "\n", 452 | "\u001b[0;31mNameError\u001b[0m: name 'f' is not defined\n", 453 | "[0:execute]\n", 454 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", 455 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\n", 456 | "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n", 457 | "\u001b[0;32m----> 1\u001b[0m y\u001b[38;5;241m=\u001b[39m\u001b[43mf\u001b[49m(x)\n", 458 | "\n", 459 | "\u001b[0;31mNameError\u001b[0m: name 'f' is not defined\n", 460 | "[6:execute] NameError: name 'f' is not defined\n", 461 | "[4:execute] NameError: name 'f' is not defined\n", 462 | "[1:execute] NameError: name 'f' is not defined\n", 463 | "[5:execute] NameError: name 'f' is not defined\n" 464 | ] 465 | }, 466 | { 467 | "ename": "AlreadyDisplayedError", 468 | "evalue": "8 errors", 469 | "output_type": "error", 470 | "traceback": [ 471 | "8 errors" 472 | ] 473 | } 474 | ], 475 | "source": [ 476 | "%%px\n", 477 | "y=f(x)" 478 | ] 479 | }, 480 | { 481 | "cell_type": "markdown", 482 | "metadata": {}, 483 | "source": [ 484 | "Why the errors above? Because each core does not see the local engine. They work as separate machines and you have to load all variables and modules separately in each engine. Fortunately, that's easy." 485 | ] 486 | }, 487 | { 488 | "cell_type": "code", 489 | "execution_count": 30, 490 | "metadata": {}, 491 | "outputs": [ 492 | { 493 | "name": "stdout", 494 | "output_type": "stream", 495 | "text": [ 496 | "Overwriting myscript.py\n" 497 | ] 498 | } 499 | ], 500 | "source": [ 501 | "%%file myscript.py\n", 502 | "# test if n is prime\n", 503 | "def isprime(n):\n", 504 | " for i in range(3, n):\n", 505 | " if n % i == 0:\n", 506 | " return False\n", 507 | " return True\n", 508 | "\n", 509 | "# tests each element of an array if it is prime\n", 510 | "def f(x):\n", 511 | " return list(map(isprime,x))" 512 | ] 513 | }, 514 | { 515 | "cell_type": "markdown", 516 | "metadata": {}, 517 | "source": [ 518 | "Execute code which defines the methods on the different engines" 519 | ] 520 | }, 521 | { 522 | "cell_type": "code", 523 | "execution_count": 31, 524 | "metadata": {}, 525 | "outputs": [ 526 | { 527 | "data": { 528 | "text/plain": [ 529 | "" 530 | ] 531 | }, 532 | "execution_count": 31, 533 | "metadata": {}, 534 | "output_type": "execute_result" 535 | } 536 | ], 537 | "source": [ 538 | "direct.run(\"myscript.py\")" 539 | ] 540 | }, 541 | { 542 | "cell_type": "markdown", 543 | "metadata": {}, 544 | "source": [ 545 | "Now compute the \"model grid\" correctly" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 32, 551 | "metadata": {}, 552 | "outputs": [ 553 | { 554 | "data": { 555 | "application/vnd.jupyter.widget-view+json": { 556 | "model_id": "c2be13917ecd44949901a3e7586b3b6d", 557 | "version_major": 2, 558 | "version_minor": 0 559 | }, 560 | "text/plain": [ 561 | "%px: 0%| | 0/8 [00:00" 992 | ] 993 | }, 994 | { 995 | "cell_type": "code", 996 | "execution_count": 41, 997 | "metadata": {}, 998 | "outputs": [ 999 | { 1000 | "data": { 1001 | "application/vnd.jupyter.widget-view+json": { 1002 | "model_id": "92c70762ce0642a7b20f30c9485afcc5", 1003 | "version_major": 2, 1004 | "version_minor": 0 1005 | }, 1006 | "text/plain": [ 1007 | "%px: 0%| | 0/8 [00:00