From 67acadc92aedc7f74cdcd8c81fa9f5b2ef65508b Mon Sep 17 00:00:00 2001 From: amirfeqhi Date: Mon, 6 Apr 2020 18:35:54 +0430 Subject: [PATCH 01/49] added getData method --- src/NeuralNetwork/NeuralNetworkData.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NeuralNetwork/NeuralNetworkData.js b/src/NeuralNetwork/NeuralNetworkData.js index aa368d7fc..98571f3cf 100644 --- a/src/NeuralNetwork/NeuralNetworkData.js +++ b/src/NeuralNetwork/NeuralNetworkData.js @@ -956,6 +956,16 @@ class NeuralNetworkData { return parentCopy; } + + /** + * getData + * return data object's raw array + * to make getting raw data easier + */ + getData() { + const rawArray = this.data.raw; + return rawArray; + } } export default NeuralNetworkData; From 3ab3b09945a40e40a627d24d0e206df260f32d53 Mon Sep 17 00:00:00 2001 From: asvsfs Date: Thu, 6 Aug 2020 20:32:04 +0430 Subject: [PATCH 02/49] elementary dbscan algorithm --- examples/dbscans/data/data.csv | 3001 ++++++++++++++++++++++++++++++++ src/DBSCAN/index.js | 180 ++ src/DBSCAN/index_test.js | 33 + 3 files changed, 3214 insertions(+) create mode 100644 examples/dbscans/data/data.csv create mode 100644 src/DBSCAN/index.js create mode 100644 src/DBSCAN/index_test.js diff --git a/examples/dbscans/data/data.csv b/examples/dbscans/data/data.csv new file mode 100644 index 000000000..0532e7938 --- /dev/null +++ b/examples/dbscans/data/data.csv @@ -0,0 +1,3001 @@ +x,y +54620,43523 +52694,42750 +53253,43024 +54925,42624 +54973,43980 +52967,42955 +55143,40238 +53071,44896 +55710,44219 +54459,43964 +54467,44351 +53570,41898 +55155,43399 +54051,41019 +55335,44023 +54449,42872 +53399,42273 +54241,43580 +56000,41710 +53204,42630 +54524,42904 +55665,44100 +55829,40780 +54059,42096 +53106,42771 +54427,43777 +55368,41828 +53927,45077 +55278,44081 +55909,41497 +53344,42929 +55095,42443 +55645,43363 +55718,43777 +57115,44424 +54963,44875 +54483,43594 +54543,44843 +54263,39356 +53992,42499 +54729,40311 +55013,44589 +53332,43782 +52627,41645 +57103,40709 +54352,42520 +50478,42084 +54849,41733 +53055,42310 +55191,42127 +51936,41784 +54594,44345 +52164,42650 +56302,42288 +52913,44156 +53697,46311 +53582,40916 +52993,40890 +54222,43822 +52221,43490 +55062,44521 +52460,42366 +54341,45492 +52195,42091 +53141,41774 +53476,41355 +54256,44048 +56036,42102 +54916,42689 +53420,44299 +54924,42079 +56208,41204 +53855,42912 +55078,42668 +52975,43407 +52526,43275 +56191,42928 +56569,44022 +53730,42300 +56749,45529 +55281,42586 +56338,39718 +52456,43210 +55388,42905 +55983,42644 +54325,45723 +52346,41845 +52745,42741 +54393,42416 +53106,42336 +56285,41221 +54064,41409 +53703,44027 +54179,45588 +55395,42014 +53023,46128 +56830,40997 +57981,42287 +52898,41098 +54307,42992 +55303,44416 +52517,43287 +53727,41735 +55346,40987 +53531,43995 +54225,40013 +54111,43711 +55977,44177 +55227,44206 +52351,45876 +49952,42514 +55911,44667 +55825,42139 +53832,43983 +54353,42453 +50548,44199 +54329,44001 +54691,42918 +54026,42248 +54140,42328 +54032,42111 +54556,42397 +55092,43404 +54417,42391 +57398,41217 +55169,42237 +53973,44112 +53795,43670 +52409,41340 +51167,45741 +56804,43627 +56299,42413 +55062,43027 +54716,43766 +54943,41966 +57196,43284 +54033,40367 +56416,42968 +56087,43599 +54414,44613 +52304,42213 +57416,43226 +54876,42500 +52495,41064 +54272,43145 +55984,40501 +53322,41799 +55053,43347 +54308,42602 +54091,44335 +50545,49343 +50711,50227 +49983,48300 +51327,46829 +53980,49207 +52846,50052 +51816,47204 +51421,49806 +49762,47210 +51564,50111 +51541,48433 +54602,50309 +51116,48104 +53307,51015 +51683,49283 +51485,48750 +52477,50139 +52872,50375 +54275,48580 +51460,49224 +52073,50583 +50778,50832 +52994,49958 +52103,49204 +51076,50440 +49868,50597 +51122,48724 +53609,48195 +50862,48277 +50697,47557 +52531,50046 +51759,49073 +50162,50113 +51046,51417 +52256,47563 +54748,47435 +51069,50726 +53561,46928 +50745,51221 +51125,52196 +49630,48514 +53771,49411 +50498,50993 +52768,50430 +51476,50875 +50128,50117 +49685,48605 +49164,46821 +51674,48858 +50230,49055 +53145,48166 +50617,48690 +53365,47853 +53322,49129 +52899,49148 +53498,48141 +50423,47832 +51377,48123 +50843,49836 +51344,48631 +52620,47208 +53300,49981 +53300,50101 +51333,48502 +52533,48519 +49164,49656 +52172,50246 +52323,49316 +49154,48565 +50651,49838 +50835,50099 +53742,49907 +50691,50499 +51354,46853 +50952,49346 +52105,49253 +52045,48784 +51808,47875 +51536,50378 +52080,46732 +51189,50434 +51798,48228 +51985,49754 +53241,53420 +52899,48633 +54090,49415 +51910,50787 +51162,51612 +52155,50267 +49469,49205 +51308,49630 +50307,51082 +50059,45731 +50244,48477 +48977,47710 +48661,50836 +51554,51790 +51397,50323 +52757,50130 +52164,47191 +51089,48855 +52166,48385 +52613,50446 +51235,49140 +50455,50713 +52393,49486 +51011,48580 +51294,48648 +52558,50207 +53182,51978 +53694,51985 +50822,48480 +50663,49713 +49538,51625 +53264,48831 +51545,48362 +51808,52179 +53242,51473 +49352,49577 +51610,48965 +48381,48106 +48715,49479 +50929,50250 +50452,48945 +52903,49650 +52902,50105 +50369,49615 +51003,48693 +51586,49170 +52214,50324 +51815,49375 +50015,49385 +49968,44951 +51274,51159 +50139,48240 +51568,48212 +52094,49427 +53771,49868 +52696,51309 +51353,50271 +52110,48679 +53065,49559 +51243,49471 +49158,47569 +51589,53212 +50716,50226 +52917,51056 +52046,47422 +50183,48147 +49685,50701 +59637,45811 +60147,45082 +60025,50540 +62099,45862 +62457,44344 +60734,45976 +61654,45375 +62737,46856 +59434,45767 +61383,46454 +59180,45359 +62661,46734 +61930,45278 +61909,46072 +63957,47753 +62033,45635 +58244,45992 +61159,45013 +61495,46965 +62011,48870 +59014,46813 +59953,46852 +61075,46380 +59978,45921 +63518,45366 +60662,45183 +61917,49590 +58162,45461 +58656,47841 +60103,43554 +61360,46709 +61576,48371 +59026,46292 +61555,46519 +63261,45819 +61252,48636 +60366,46199 +59988,48268 +62906,45197 +59397,44267 +61898,46911 +62684,47619 +62113,46253 +61034,48519 +60097,49612 +59797,43693 +61500,44023 +58569,46086 +62098,48364 +60135,46592 +63119,45688 +61016,47793 +60779,47519 +61530,46159 +62512,46476 +59835,47222 +59495,47409 +58468,48906 +57948,47995 +59107,48912 +61258,46064 +59691,47572 +59628,46865 +60173,48289 +61201,45635 +62400,45584 +59578,48612 +61786,44837 +60755,44937 +61942,46526 +61501,45670 +59458,47430 +60630,47285 +59370,48566 +59677,46828 +62217,43734 +59962,46140 +59247,43976 +62951,43581 +64197,46477 +58954,45292 +62130,43638 +61766,44822 +61211,44484 +62982,45314 +60461,46738 +61434,46270 +60185,48738 +60602,44756 +62991,49882 +60817,46350 +59524,46701 +61589,48446 +63760,44658 +62292,48885 +63074,47510 +60573,45064 +62195,46716 +58990,47402 +58730,46167 +61872,46473 +62583,48197 +63311,44483 +61267,46010 +59364,48273 +61827,44599 +58938,46819 +60129,46161 +56623,47837 +60470,45222 +61691,45495 +60109,43495 +58717,46859 +58565,46331 +60601,47937 +62566,49149 +61903,46451 +61782,47084 +61954,45907 +62345,47091 +58264,45640 +61303,48326 +58773,43499 +63086,47075 +63081,47684 +60204,46955 +60597,46399 +59077,48115 +61768,44391 +58976,45060 +60989,47257 +61190,47066 +60972,46551 +60077,44786 +61432,46817 +62600,45672 +61396,48168 +62082,46029 +62480,45840 +60049,45388 +59918,48366 +62084,45119 +60707,46058 +60634,45826 +63489,44063 +62451,48261 +62426,44954 +61782,49028 +61595,47677 +62779,47041 +59953,50937 +60526,53180 +58802,53819 +62297,52300 +58604,54336 +60766,55324 +58238,51102 +60125,49071 +59177,52894 +61205,52646 +59620,53606 +61566,53795 +62010,50563 +55811,52761 +57938,52825 +62783,52794 +59198,52561 +59786,51948 +60902,55082 +60679,50894 +63223,53981 +60586,48986 +61159,54532 +61033,52468 +61475,53918 +62169,51916 +58904,53725 +60531,53274 +61442,51792 +60235,52007 +58915,50231 +62109,50367 +59971,53488 +60369,52563 +57329,51751 +59933,56156 +61775,53359 +61599,53671 +60106,49519 +57978,52975 +63057,51681 +61776,51655 +62364,50648 +60327,51525 +59857,53804 +59856,50041 +58313,52980 +62549,54640 +59146,54829 +61469,51409 +58371,50040 +61314,51110 +60548,53678 +59922,52786 +58762,51916 +60854,52169 +62313,53461 +60787,51558 +60948,49685 +60644,51665 +59095,50820 +58808,52874 +63244,53722 +61129,52867 +60730,52083 +61190,54253 +57940,53483 +60793,50532 +57987,50535 +57316,51557 +57344,53713 +59345,53451 +59309,53689 +63148,54994 +65535,51609 +58432,52328 +61739,52881 +58769,54508 +62146,50611 +61353,52949 +60249,52238 +60703,52037 +61407,52897 +59622,51840 +58297,53749 +58234,52471 +63457,52600 +60443,53128 +62485,51824 +59626,52498 +60245,51232 +60088,51401 +59466,51775 +59673,50869 +59396,54860 +60024,50389 +63143,53181 +61364,52426 +61272,52410 +61352,50032 +60794,53091 +58644,54218 +60576,51753 +59434,52433 +61099,50199 +57111,51732 +59385,51054 +59626,52424 +62053,52942 +59411,54228 +63256,53319 +61799,52927 +56783,52846 +61232,53224 +60221,52022 +58815,54259 +58336,53014 +60820,53919 +59816,53916 +60946,53614 +57803,50468 +59045,52706 +60617,51398 +61019,51535 +60753,50736 +62592,54099 +60868,51134 +60597,51012 +60201,52003 +60152,49128 +59566,53452 +59703,52501 +58933,53890 +59898,51245 +60079,53099 +62063,51857 +60308,51685 +61447,51661 +58543,53625 +61593,51496 +61290,54028 +61105,49647 +60231,53265 +59558,52776 +58402,52389 +58134,51877 +59040,54950 +63162,53609 +58718,49514 +60396,52805 +44040,46197 +46006,46521 +47260,47193 +45600,46395 +44324,44879 +42732,45444 +43609,46066 +46021,44331 +45527,42803 +44401,45918 +44023,46226 +44772,46447 +46125,45879 +45451,47318 +44081,47210 +45840,49753 +46384,44600 +44279,43434 +44882,47245 +45818,44321 +45019,45549 +43897,46696 +43524,46836 +42508,47345 +45015,46110 +45356,44834 +45010,47987 +43712,46227 +46179,46421 +45360,46378 +44163,47526 +46904,46553 +42409,44578 +43905,45300 +42749,45475 +44698,44129 +43280,46617 +45574,47897 +43851,47533 +44478,46315 +44520,46484 +46371,47909 +42904,44785 +44901,44409 +43361,48159 +43714,43305 +44492,45977 +43671,47848 +43629,46252 +45612,47971 +44877,48055 +44762,46708 +46340,45960 +42187,44860 +42896,46268 +44691,46276 +42616,48423 +44100,44734 +45893,47567 +45486,44940 +46071,50218 +46857,48357 +46050,46610 +44886,47155 +45351,45046 +44677,47921 +45206,46504 +44977,46050 +46042,47659 +44793,47895 +45298,46876 +42300,46449 +45015,44653 +46676,46171 +45440,45988 +46055,47085 +44201,48116 +45308,45173 +46229,46865 +45738,46899 +43439,43985 +42348,46774 +45146,47690 +46211,44206 +44565,44177 +46191,48317 +45909,45961 +44577,46345 +46157,45612 +41927,48543 +45309,46374 +46051,45145 +41508,47088 +44238,45158 +45806,46785 +45230,47186 +42223,47000 +44108,46834 +46761,47183 +45727,44795 +45234,46110 +46226,45384 +44460,46396 +46924,47066 +44201,46722 +45562,47033 +43711,47308 +46969,46954 +46080,45768 +43869,48571 +45755,46024 +44704,46111 +45754,46817 +44916,46930 +45205,44698 +45636,41946 +43794,43368 +42990,47111 +44324,47646 +46585,48285 +43138,47056 +44109,47298 +42078,45102 +44719,47108 +43690,44669 +43682,47550 +45997,46437 +45652,46746 +45705,47041 +45374,46355 +45536,44653 +45595,47049 +44325,46733 +46511,47373 +44717,47856 +45786,46580 +41089,45626 +41851,44047 +47162,47068 +46773,44941 +45806,45282 +43274,47372 +42182,45481 +43583,47308 +44362,45655 +43611,45959 +42283,44263 +48266,45184 +45821,47089 +47332,45389 +37900,43700 +38172,42792 +38870,44459 +36702,45802 +39220,45233 +39240,45636 +38915,45632 +37496,46121 +37626,43520 +36859,42832 +36497,45576 +37937,43875 +37414,45176 +39339,45642 +38768,44701 +41073,43678 +35880,44226 +37556,45014 +39028,46813 +39129,45517 +39139,43725 +39846,44359 +38946,42243 +37889,42985 +37202,42594 +39657,46012 +40225,43669 +39702,45456 +36022,44378 +39149,44151 +38749,44262 +36524,45489 +39630,45246 +38678,43050 +38805,43472 +36611,46457 +40358,44017 +42141,45706 +36701,43206 +37160,42132 +39036,46009 +38631,43541 +39553,42753 +38443,45629 +35876,43700 +37021,42818 +41819,44466 +40028,44930 +37346,45508 +38863,44153 +38508,42962 +37264,47422 +38967,44890 +37439,44820 +37270,43745 +38396,44576 +38385,42809 +38104,44902 +36294,42107 +36196,48017 +37836,43781 +38015,47510 +36982,42306 +34913,45567 +35954,45537 +37321,45452 +38878,44922 +36692,43157 +39976,45731 +36945,43736 +39339,47635 +37645,43455 +39633,45001 +36611,43308 +34906,46250 +38611,43370 +41704,45883 +39621,43859 +38077,43794 +40492,47761 +34702,44962 +37823,45829 +36125,46077 +39395,47560 +37207,41740 +37616,47074 +40281,44811 +38038,48847 +39125,42626 +36602,45948 +38478,45047 +37382,44795 +34334,42680 +36768,41959 +37938,45945 +35861,45653 +38094,44260 +37969,44116 +36962,45354 +36490,44675 +38348,45436 +40941,43844 +36794,42112 +37542,46600 +37933,46235 +41131,42932 +38015,46380 +36468,45109 +35208,47795 +38449,43572 +39124,42972 +35984,42959 +40255,44800 +37430,41616 +36451,44885 +38267,44239 +38653,43402 +39128,42928 +40318,44621 +39291,43282 +36671,44622 +37140,44018 +36271,44809 +38421,44847 +37125,44254 +41955,45767 +37094,44119 +37694,42646 +38965,45780 +37904,44387 +39379,44164 +36780,43453 +38535,43780 +38827,45565 +37760,44128 +37103,46501 +36567,45438 +39429,44771 +38365,45290 +37201,46980 +38197,42246 +38657,45536 +37755,43877 +37701,44638 +40228,46360 +35969,44284 +36903,42584 +38661,44045 +38646,42669 +37416,45799 +36035,49446 +38117,50251 +36690,49591 +34794,50227 +37120,50499 +35693,52595 +34424,50941 +35866,51091 +37703,52241 +34587,49905 +33678,52163 +36568,52539 +35268,51811 +38729,49255 +36501,48967 +34736,48182 +33096,50259 +37830,51496 +35451,47900 +35724,51642 +36425,52080 +35938,51733 +38012,50808 +33453,50485 +36714,49251 +37741,49565 +37294,50769 +37509,49964 +34605,51599 +35289,50416 +38044,50643 +37268,53110 +36656,50566 +36229,52718 +35130,50291 +36510,50240 +36021,48965 +36001,50147 +38506,49918 +38123,52510 +35792,48033 +38875,51578 +36128,48920 +33825,51800 +38347,52233 +33348,49892 +36163,53031 +38329,47862 +36978,48153 +37327,51814 +35640,50947 +38899,50810 +35153,49820 +37773,51076 +35854,49904 +36557,48528 +39462,50878 +35609,51438 +36400,49928 +39355,49950 +35678,48944 +36240,50203 +37851,50911 +35529,48483 +34856,50507 +34555,47854 +37617,51514 +35288,52498 +37102,50697 +36117,50939 +36195,51606 +37334,49489 +36894,47891 +36510,50444 +35679,51251 +34039,48581 +35416,50433 +35292,47507 +35473,49117 +36805,51837 +34907,49407 +38576,50876 +36911,52330 +34151,50380 +35994,50817 +35873,50003 +36406,50463 +36711,51816 +36773,50930 +36847,53455 +37462,52043 +37317,49835 +36221,54174 +34893,50011 +37153,52163 +34999,50316 +38215,53643 +36818,50538 +34119,52062 +36099,51107 +34017,50315 +34972,50553 +33611,50666 +33361,48121 +38446,48060 +34622,51962 +31946,51702 +34976,51227 +34143,49934 +35518,50270 +36539,51996 +34748,51075 +35055,51610 +37740,50009 +38157,49848 +37775,49692 +36319,52029 +36552,51655 +32979,50394 +34994,52092 +37047,48811 +36847,53569 +34617,52089 +37507,50353 +32954,50861 +36008,48930 +38371,51242 +34908,50703 +37348,49716 +35338,51900 +36979,51524 +35275,50848 +37365,52976 +36288,52087 +35328,53446 +34733,51912 +35553,51517 +38070,53037 +35152,50692 +37005,51257 +36522,50164 +37810,48108 +36619,46682 +35912,49827 +38795,48442 +34981,48664 +36403,48903 +34507,47459 +37485,51322 +38515,50074 +31066,46469 +30611,46226 +29328,44467 +29589,46786 +30863,47267 +32118,43011 +33642,48588 +29513,44633 +28483,46037 +30420,42435 +31130,46909 +29934,47200 +32303,47345 +30906,47311 +29581,44268 +28832,44831 +29906,47016 +31073,46483 +30198,47951 +31032,45152 +32141,43787 +27818,46878 +30370,43579 +30879,41734 +31448,44717 +33078,44208 +30581,46960 +32202,47711 +31905,46820 +36071,44535 +28440,44810 +31170,46097 +32193,45876 +34126,46746 +31067,45079 +31167,47656 +33790,46438 +30561,46264 +31109,44892 +33014,45886 +32463,45301 +30997,45889 +30534,46102 +29735,48055 +28512,45840 +32901,45871 +31926,45424 +32819,47173 +31542,45614 +30793,42766 +30764,43714 +31793,46337 +31657,46117 +30537,43629 +32209,47167 +32744,43999 +29246,46479 +29476,43739 +30758,41842 +30553,47040 +31802,47476 +29976,46087 +30957,47930 +32118,46390 +30694,44466 +30439,47075 +31920,46382 +31778,47518 +29259,45342 +30472,44653 +32252,46230 +31852,45306 +32198,46699 +31370,45222 +32264,46894 +32335,45997 +31154,45908 +28736,40792 +29679,46301 +32210,46786 +31213,43528 +31291,44107 +31127,47321 +28118,44775 +31119,46055 +29705,47057 +31624,45467 +30790,47566 +31604,46454 +30100,45879 +29919,45857 +30801,44512 +33008,44407 +32062,45990 +29052,45808 +30659,44846 +30026,45682 +30627,44454 +30382,43613 +31871,44973 +32139,46892 +30578,44542 +29043,45436 +32211,48405 +30016,44487 +31178,44394 +30522,46566 +32049,47819 +29855,45626 +31054,44541 +29608,45031 +29612,45840 +31350,44748 +30806,45234 +33610,44086 +33021,43481 +31152,46517 +29368,46709 +30888,45683 +33108,45964 +34179,48012 +29599,44203 +28615,47158 +31622,45004 +30047,45342 +31991,44255 +31144,43395 +29855,45069 +29912,46430 +30220,45595 +29812,46044 +29899,45748 +34751,49387 +30128,45204 +30635,43889 +30294,45296 +31764,46849 +34639,46169 +30302,47776 +30371,45565 +31911,45528 +29707,44749 +31573,45804 +30257,45725 +31476,44300 +28961,43127 +30635,45556 +31375,45645 +31662,45383 +30947,43537 +23842,44933 +25896,45359 +21800,47934 +24542,44728 +23441,45886 +24535,44138 +24486,43549 +25819,45207 +24646,45406 +24392,46261 +25166,45053 +22211,45191 +20458,45329 +24316,45453 +21958,45560 +22184,44249 +23144,45494 +24266,44510 +26221,45421 +22912,46671 +25740,44473 +23877,45909 +23609,46656 +23433,45945 +22387,47332 +22050,45954 +21444,46964 +22051,44212 +23554,45863 +24929,43868 +22096,47233 +23462,44483 +25301,46117 +22168,46142 +23939,46011 +24675,45135 +23107,46354 +20963,45739 +22876,45874 +23487,42557 +22163,45795 +23404,44335 +21221,44474 +22638,45554 +21615,48163 +20714,45805 +23688,45829 +23515,46366 +23692,44325 +24567,43379 +24343,46878 +23272,45633 +21255,44721 +22392,47698 +22575,45576 +23378,45780 +21147,44235 +23016,45266 +21108,45235 +23136,46375 +23584,44797 +24890,43027 +24311,41002 +24738,44640 +26216,43410 +23658,45171 +23855,45931 +22615,45157 +23820,44976 +23767,43141 +21854,45512 +20838,46554 +25822,48220 +21171,46906 +23376,45082 +24788,44771 +24522,45861 +25495,42792 +23958,44468 +23825,46811 +24527,46626 +23835,46847 +22937,43548 +21657,45779 +24273,42879 +26228,46553 +23338,46902 +24477,43061 +24736,45066 +22976,47248 +23230,46643 +23589,42521 +22285,45629 +26468,45504 +21561,44237 +22250,45658 +23906,45475 +23754,47759 +23594,45950 +24330,45763 +25198,46841 +24438,45278 +22378,42929 +25044,44899 +22934,45175 +24259,43678 +24947,45212 +23737,44771 +24847,44152 +23038,45476 +23277,44688 +20307,46589 +20494,45315 +25807,47714 +22166,45254 +25532,46572 +27376,45995 +22506,43691 +24987,44077 +22999,46007 +22034,44197 +20914,44091 +25535,46274 +23288,45258 +22341,46998 +23954,47601 +21368,45917 +23746,45135 +25316,46217 +22485,48161 +24868,46549 +23674,43785 +22995,44707 +27463,46986 +25679,47098 +21579,45924 +21055,45837 +26609,47476 +24628,45035 +24355,48292 +24966,43815 +23763,44750 +20485,46394 +23524,46587 +23628,44730 +25693,46232 +25345,45149 +22546,43351 +24514,48478 +22225,44140 +56907,37079 +60236,35088 +58110,38682 +59019,39748 +55932,35163 +57632,37220 +56429,35600 +59796,34874 +51782,34639 +54794,34578 +55615,36243 +57356,40144 +58457,37432 +58770,33452 +58965,33085 +55470,35116 +56993,32158 +58047,36416 +54381,36820 +57391,35246 +56730,35577 +52492,35399 +54286,34827 +55842,36136 +56678,35623 +56690,36823 +57832,36316 +56688,36583 +58706,36418 +55517,34972 +56809,36297 +55983,38451 +57652,35563 +56680,34674 +55269,35481 +56805,36159 +57312,35967 +55628,34757 +58214,37687 +57022,36838 +56611,34057 +55580,34586 +58427,32683 +55448,37197 +56636,35529 +53222,36200 +56396,37255 +57306,37084 +57593,37299 +57370,36555 +55510,35439 +56813,35086 +58070,35178 +57381,34383 +57335,32064 +57649,35291 +55892,36852 +56074,35582 +57906,33048 +55366,35650 +56413,36418 +56941,38327 +57154,33712 +57750,36800 +57857,36922 +56143,35658 +55338,35743 +56441,35275 +56414,37396 +59486,32151 +58706,36533 +52659,34777 +59404,32845 +56922,35768 +57726,35998 +57200,36580 +57944,36151 +56618,35436 +59034,35201 +57527,34254 +55893,34795 +59479,34096 +56696,36827 +58247,36777 +57425,33591 +55633,35639 +58824,35451 +56641,37864 +56541,35719 +58690,38619 +57601,35635 +57601,38899 +55493,35034 +56406,35362 +54744,37285 +56968,36170 +56554,34309 +57672,34909 +56549,36908 +54899,36989 +58177,34610 +52736,36955 +57200,36282 +56107,34721 +56844,34985 +59046,35909 +58878,34978 +55592,36014 +57442,38090 +55333,34329 +55756,36134 +57707,36517 +56490,35034 +55408,37045 +55350,37801 +57650,36971 +57240,34898 +56276,34870 +56026,35279 +55507,39069 +59313,34984 +59314,35053 +55148,36561 +55846,33030 +58280,35077 +57860,36410 +53799,37256 +56172,34623 +56629,34903 +57012,37189 +61328,34539 +58570,36942 +55822,35934 +58008,34512 +56810,36292 +57603,34029 +59246,36194 +53045,33476 +58231,34186 +53386,37554 +54858,34270 +54851,35170 +56299,36158 +55829,34669 +57130,33622 +57045,35018 +55963,37150 +57850,35626 +57398,33876 +57433,35084 +57353,60000 +58154,59780 +59668,60897 +58098,61604 +60212,56867 +58558,56754 +57238,61962 +57393,60130 +60954,58518 +59449,62121 +58116,61273 +56322,59335 +57785,59295 +60018,58622 +58845,62613 +58689,61640 +57082,58629 +56935,61044 +58391,61517 +60966,58270 +60804,57443 +60743,58206 +59138,60401 +59953,59003 +60969,59822 +57136,61329 +57366,61945 +56366,57724 +58665,59932 +60758,60881 +57980,59322 +59239,61982 +57812,61923 +59704,60580 +61020,59430 +59976,61896 +60409,59802 +59165,59687 +57762,60304 +58771,60580 +57753,59203 +57852,60171 +59079,59352 +56843,59151 +60331,57240 +57591,61596 +57063,58649 +56693,58774 +57642,59436 +58329,60180 +59112,63187 +57718,59894 +56937,59156 +57576,59542 +58613,58762 +60267,60706 +57706,56481 +59214,58361 +61073,59807 +57207,61078 +58015,59153 +58158,58562 +55203,57018 +58219,61499 +57782,60002 +55784,59163 +59345,61352 +59269,59992 +56691,59491 +59024,60718 +59110,60648 +58750,57843 +59118,60039 +57473,59889 +57935,59287 +58935,58666 +58889,60334 +60927,60647 +59624,59604 +58797,58377 +58624,58748 +58691,58145 +60046,58263 +59449,58883 +56818,60227 +60006,60524 +59772,62508 +57843,58840 +59475,60281 +57562,57847 +57692,60874 +59111,59739 +55418,59726 +57647,61654 +57192,63091 +56910,61194 +60549,59383 +58222,62395 +59915,58433 +59520,59618 +58928,60595 +59722,59830 +61347,59432 +61654,61450 +56954,58817 +56034,59874 +60069,58113 +58563,62792 +59022,58759 +56745,59632 +58611,56944 +58213,61124 +59832,61819 +57659,62508 +58167,57737 +56924,58052 +59983,59647 +60295,58226 +59571,59704 +59407,63359 +61438,60731 +58412,60555 +59087,60200 +59921,58297 +62507,59886 +56500,61376 +60955,57896 +58439,61605 +56364,59088 +56487,61747 +59447,57392 +57894,59036 +57925,61583 +61135,58271 +59445,59658 +59387,60014 +58154,60283 +55361,61450 +59573,59358 +60407,60339 +57851,60497 +56974,60278 +58959,61260 +58590,59525 +56814,60167 +56482,59948 +59678,56732 +56898,59377 +61084,58521 +60235,57996 +35967,36673 +33802,37020 +34261,37067 +37405,33958 +36836,39256 +37201,37141 +33942,34583 +36874,35950 +36087,35914 +35266,37658 +35368,35938 +37797,36278 +38059,35143 +37189,38589 +39025,38317 +39884,40043 +34384,37619 +35438,35961 +35228,34409 +36656,39035 +34657,37807 +34997,35538 +34596,37163 +36515,36356 +36659,37772 +37432,39281 +35778,38273 +35673,37211 +35254,33638 +36100,37456 +38717,38000 +37182,37411 +35648,39129 +35955,37847 +36359,37310 +35721,36229 +36528,36061 +39397,39374 +36008,35818 +34522,35773 +35101,38142 +36844,38976 +36672,36938 +36638,35819 +35636,37443 +36690,39754 +35091,35641 +36944,39148 +35483,38084 +33394,37319 +35390,35563 +37099,38588 +38095,39196 +36056,34964 +35612,35819 +34622,37604 +33618,37049 +37790,37999 +39063,35717 +36444,34614 +37971,36374 +32167,39987 +36206,36422 +36389,38939 +36095,33268 +37525,38632 +33540,39200 +35076,35331 +35191,37667 +33916,38665 +36172,35806 +36579,35985 +37915,37571 +35600,37619 +32910,36355 +35412,36473 +36407,36157 +36663,37415 +34432,35853 +36058,35597 +34996,36782 +38645,36855 +35811,37422 +34222,38934 +36509,37087 +34560,38446 +36209,37346 +34940,35990 +35403,36688 +32942,35010 +35436,37366 +37768,35501 +34772,37566 +37396,38924 +37109,39039 +36322,38482 +36164,36125 +35531,36570 +37177,35936 +35355,38390 +38130,36011 +36242,37643 +37882,36742 +36127,38450 +35394,38220 +34349,37125 +34947,39400 +33437,35442 +34167,36965 +36172,39484 +37370,38669 +37667,37350 +36974,38282 +35801,35541 +35609,37194 +36795,34454 +34626,36266 +35808,36376 +33613,39794 +37801,36929 +38443,39283 +33652,37501 +35332,38247 +37264,36885 +35768,33850 +33922,37009 +33846,33297 +33715,38111 +34553,37161 +36826,38107 +35007,39211 +36173,35498 +36725,35697 +36455,37227 +35395,37619 +34614,36595 +35110,36198 +34870,39058 +35579,39250 +36919,37870 +35851,39142 +38539,37485 +35082,36246 +32801,33333 +35038,34405 +35494,35663 +37480,35672 +35852,35216 +36125,38191 +36039,37098 +36216,62182 +37992,59534 +36398,59165 +33519,59516 +37891,59892 +37835,56856 +36486,58780 +36333,58448 +35492,58360 +39398,58165 +36215,57623 +36229,58559 +35847,60401 +33122,61567 +36575,58483 +38437,59774 +36403,61703 +36423,59073 +35423,57630 +36850,56751 +33959,57663 +36243,57771 +37479,60292 +39385,58486 +35322,59148 +35700,57384 +36242,57635 +36696,59198 +34637,57665 +34443,60316 +37166,58232 +39283,59107 +36049,59576 +34553,59382 +40134,59872 +33630,58312 +35047,60446 +36709,56868 +37404,56050 +37599,57510 +36454,59424 +38035,58873 +36308,60312 +38558,56670 +36529,58009 +32534,60827 +35346,58988 +34712,57869 +35561,59193 +35534,60214 +37053,57010 +38314,58604 +38318,60919 +38027,59660 +35355,60826 +35436,59180 +35727,58236 +39398,60099 +37269,57920 +36889,59486 +37566,59456 +39104,58213 +32504,60521 +35603,58464 +33987,58301 +38181,57802 +33486,56845 +36799,61300 +36246,57201 +33218,58279 +35125,58821 +36219,58974 +37589,58770 +40243,57661 +35361,62227 +38232,59464 +35237,58902 +35398,58700 +37988,59312 +35644,59384 +38422,59220 +37090,59149 +38945,59787 +34996,58737 +34596,59765 +36992,56453 +33822,59036 +35211,58983 +36283,59567 +38990,58154 +37488,61935 +35445,59206 +37798,56597 +35170,59819 +33624,58303 +35462,61614 +34945,57757 +38089,56389 +37372,57669 +39872,58481 +36960,58594 +35192,61069 +37556,56733 +37083,57931 +36878,61006 +37226,57241 +38515,58026 +34289,56684 +35741,57634 +37745,57622 +36805,60016 +34914,58404 +38566,59390 +36967,58135 +36433,57684 +34796,60094 +36645,58435 +36421,57942 +36037,57311 +35578,57692 +33356,61093 +33015,57987 +36045,57448 +33606,59280 +37937,56751 +35457,58671 +37360,59696 +35066,57896 +36783,59577 +34208,56715 +36846,60935 +35141,60571 +36861,59309 +34573,59067 +38523,59697 +35104,58388 +36442,57756 +36551,60388 +35711,57926 +36064,60505 +38706,57037 +36216,57898 +39611,56741 +35988,58251 +37263,57129 +37094,59676 +35217,59875 +36483,57847 +34924,58072 +37060,58762 +30908,61364 +29802,58114 +30571,60758 +34779,62221 +30304,61141 +30877,60859 +30681,62149 +31259,62320 +30567,62523 +28728,61702 +32333,61933 +29047,58154 +31463,61149 +30898,60616 +28229,59101 +33697,58534 +29758,63528 +30280,62465 +32349,61066 +32134,61037 +30612,61541 +33233,62021 +29987,61369 +29079,60255 +29589,60622 +28995,58890 +31627,61188 +29272,59183 +28392,61346 +31204,59112 +30174,60328 +31578,60296 +29445,64978 +31977,59480 +31182,60250 +30648,60178 +30532,61950 +31720,61379 +32583,61093 +30050,60218 +31627,61090 +31236,60424 +28553,62002 +30375,62924 +31573,60997 +27505,58926 +30061,61246 +32649,59545 +27696,59838 +30506,59686 +32074,61939 +28616,59416 +29085,60541 +30515,60969 +33532,59075 +28578,63180 +31643,60477 +28729,63139 +31112,61673 +32361,59991 +32426,59919 +31204,58913 +29626,60190 +30075,59907 +32218,62122 +30740,62257 +28555,61394 +31318,58248 +29618,60724 +32557,61120 +31530,59440 +32126,60135 +29801,61182 +29148,58130 +26807,61319 +31413,60511 +30647,61432 +30619,60514 +31284,61697 +31312,60742 +33387,61847 +32660,59958 +30795,63840 +30746,61100 +31879,60106 +33018,62972 +30887,62360 +31474,60121 +31797,61321 +30395,60514 +29160,57565 +30133,63934 +33171,59359 +28342,58906 +30960,62047 +30927,61258 +30161,62149 +29448,62355 +30068,62245 +32579,62231 +32590,63313 +28653,61470 +31663,61270 +33003,60476 +31142,59600 +27316,63731 +31472,59250 +31233,61286 +32954,59101 +28250,60235 +30145,59447 +30168,60662 +32390,58431 +30330,61187 +31866,61099 +29485,63621 +27659,60100 +29690,64853 +30276,59599 +31279,61858 +28391,59730 +31215,59848 +33275,60563 +30749,59966 +28904,59191 +27819,63600 +30019,58071 +31985,62537 +32412,63477 +27380,61315 +30483,60444 +28526,58659 +31133,64758 +32997,59655 +30720,60651 +31643,59695 +31779,59328 +31849,60708 +31872,60703 +29130,58041 +28327,60138 +30265,59751 +32061,59778 +29842,62137 +33359,62329 +29116,59119 +30071,60466 +29916,60125 +28434,59636 +29436,60956 +27434,54958 +25440,57862 +24392,57589 +26136,56016 +26253,58899 +24733,56201 +25528,59581 +25738,58235 +24618,55531 +26834,55097 +25201,54565 +25851,58222 +27108,57491 +28837,54748 +24946,56824 +25052,57829 +28402,57647 +25052,57022 +27181,54919 +28052,55809 +25196,55203 +26591,56646 +29474,56798 +27070,57594 +26481,56658 +24784,57237 +28064,58174 +27715,55387 +26470,56078 +23811,56713 +26542,57297 +27473,55726 +26275,56590 +25919,59329 +27550,55740 +28594,55605 +28250,58482 +27827,58698 +26215,55199 +27517,55156 +27881,60061 +27012,54253 +26172,55215 +26319,58948 +27900,56990 +28810,55914 +28021,56815 +27286,59569 +25494,55960 +25659,57314 +27469,55207 +26043,55705 +26718,53997 +27707,56661 +27634,56842 +27707,56972 +26205,53325 +26512,58723 +27821,56672 +25689,56135 +25979,56888 +26345,56949 +24731,56832 +25629,58886 +29908,56769 +25873,59678 +27128,54407 +27287,58184 +26387,58854 +26891,56558 +24536,56381 +28383,58361 +27493,56974 +28582,58290 +25283,58667 +26042,59496 +28772,57273 +25425,57151 +28909,58542 +26560,55691 +27188,56510 +26174,57058 +23262,57537 +26490,58074 +27874,55221 +24446,56245 +29227,57928 +26149,60135 +25540,56691 +25014,56055 +25970,55621 +28657,57812 +28212,55783 +25507,58317 +27306,57368 +27463,56882 +23994,55242 +24879,56386 +24594,58438 +28033,54727 +29053,58326 +26193,55842 +29259,57100 +27525,57634 +28073,56257 +26774,57001 +25383,56911 +25669,56972 +25208,56211 +27256,59403 +27196,59444 +27331,56041 +27937,58138 +28509,58324 +26717,60264 +27955,56280 +25446,55704 +26109,58656 +25760,55776 +28212,56159 +28233,54684 +26449,55946 +25001,58362 +26962,56689 +25916,54106 +28777,57742 +27815,58195 +25663,55384 +27901,55860 +25659,54386 +28759,58288 +25021,56847 +26692,57000 +27775,54914 +25818,53650 +25985,57795 +27033,60004 +27613,55744 +28592,54269 +25260,56723 +24970,59023 +23462,57642 +26119,56817 +29242,56662 +25347,57105 +26091,56821 +26145,58505 +26896,57284 +25137,55409 +27354,54316 +19261,63453 +20147,61505 +19188,57789 +19583,63659 +17969,62228 +21897,58917 +22606,61448 +19622,64221 +22246,61319 +20384,62437 +20960,61852 +21577,60141 +18709,61578 +18999,61780 +20587,62383 +19768,60627 +22982,59562 +19533,60480 +20782,61636 +19005,60807 +18261,60547 +21899,61237 +19257,62118 +18804,62526 +21096,59815 +20354,59784 +19943,63108 +19049,59645 +19177,58865 +19048,62924 +23096,59668 +21449,60845 +20765,60709 +21064,60931 +19837,60753 +18422,62176 +19779,61803 +19838,59122 +19108,61782 +21412,58791 +20671,61282 +18870,60325 +18642,58455 +19395,59800 +19335,61410 +19770,59397 +18068,61918 +21368,59942 +19530,58199 +20181,60841 +19764,63838 +18920,61044 +18680,62674 +19070,61422 +21307,64529 +19144,62358 +19290,60747 +19871,62381 +19696,57420 +19797,61359 +18344,59637 +20259,60511 +20316,61803 +22369,62265 +19096,59674 +20453,61587 +20380,60733 +16846,62613 +20002,57292 +19912,60502 +19641,59926 +19601,60881 +19285,60802 +21062,61940 +20568,59655 +20338,62938 +21393,62630 +19272,60480 +20007,61561 +20784,60935 +19038,60983 +17653,62598 +18996,59942 +19506,63413 +19294,57629 +19154,62093 +18934,63661 +20737,61019 +20490,62450 +18960,62751 +22403,62224 +20378,62549 +18929,59621 +20252,61749 +19309,61793 +16591,60560 +19015,62840 +17643,60949 +18426,62525 +20294,61802 +20151,62252 +18502,63614 +18015,60258 +19545,60834 +21792,62240 +19942,59731 +20535,59462 +20768,63354 +18347,59545 +19276,62396 +18781,60559 +20515,61410 +19925,58496 +21944,60190 +21072,63597 +19964,60809 +20709,63801 +18101,59879 +20971,58909 +22489,59259 +18892,60475 +22071,61236 +20481,60914 +20438,59851 +19803,60968 +20257,61196 +19242,61797 +18406,58116 +20868,59488 +17152,59537 +19680,62580 +19930,60962 +20911,63782 +18513,61092 +21616,62776 +21783,61970 +20687,60667 +18989,60037 +19871,62312 +17818,62484 +20526,61492 +20561,61164 +21231,59423 +18961,60872 +20211,60986 +21615,61597 +19972,62712 +19606,62894 +19063,62295 +20217,63442 +19143,53284 +17326,51720 +16296,54087 +16286,54449 +20417,56568 +16111,53619 +15846,56000 +19105,52235 +19655,54785 +16638,53423 +16223,56656 +16166,53836 +16738,54689 +17753,52609 +18846,53892 +15101,50950 +16371,54091 +19680,54296 +17314,54956 +19294,52649 +20358,53540 +18491,57638 +17300,51911 +13909,53337 +16250,56716 +16803,53706 +17777,51711 +17494,56321 +17023,52554 +18480,54137 +17989,54877 +14909,52137 +16271,55503 +15579,54275 +17775,55776 +17573,56376 +14562,54344 +16017,52583 +17725,53549 +17782,57990 +18273,55960 +16798,54135 +16402,54427 +17604,57415 +15159,52909 +17093,56620 +14665,53393 +16840,56442 +15944,52902 +15383,53914 +19752,54971 +17200,52488 +16393,55068 +17783,51416 +15985,51728 +16315,54450 +16104,56565 +17658,52827 +16905,55169 +18617,55656 +16219,53637 +17610,58180 +17395,54596 +17136,53618 +16675,50940 +19876,54521 +18453,56324 +17211,52619 +20832,53051 +17426,55344 +18261,53072 +16398,54369 +18211,53160 +16394,57589 +20680,56180 +16527,53323 +17108,54515 +15165,54667 +16265,53570 +16364,55389 +16595,52653 +14197,54364 +16746,55228 +14365,55602 +17741,55439 +14590,55330 +15981,55498 +17050,55534 +17805,55269 +19018,53560 +14927,54599 +17892,53512 +15779,56775 +16612,53816 +18536,55169 +16108,54076 +14127,53882 +18780,55399 +17650,54611 +16732,52426 +17318,55292 +18541,55919 +16938,55514 +15396,53105 +17508,55488 +17431,54420 +16714,55948 +17403,56861 +18068,54386 +14683,54085 +17898,55100 +17206,53687 +17583,57472 +17075,54403 +16780,53847 +15915,55154 +19939,54424 +14995,55889 +16928,56318 +16097,56428 +15133,52003 +15860,57599 +18488,56212 +17423,55459 +16507,54347 +17751,53859 +16898,54827 +16932,55866 +19892,54860 +16278,52466 +16719,55585 +17800,53918 +18378,56011 +13907,54576 +17044,55877 +15476,55040 +17358,55280 +18717,52598 +17547,55041 +17304,54119 +19798,52845 +16116,54683 +14980,53904 +16067,56094 +16546,54778 +16137,57399 +17141,54202 +17786,55157 +16714,51438 +14737,55071 +11897,49856 +8604,49746 +10766,51585 +12389,49818 +8766,51369 +11798,53052 +10834,51147 +9549,50996 +10321,50691 +10565,51704 +11845,51491 +11060,50234 +10171,48859 +10919,50525 +11480,50604 +12475,49220 +7385,51656 +11437,51406 +10670,49260 +8654,50049 +9927,51309 +11022,50515 +10633,50511 +11096,50971 +8723,52304 +12851,51373 +11786,51096 +11239,52647 +9454,51165 +8982,51774 +12236,51043 +9741,50089 +11398,47759 +9862,53085 +12114,49993 +9243,53664 +11639,50146 +9706,48399 +10229,53155 +10935,51458 +11745,50495 +13063,51433 +11225,51892 +10680,51164 +11263,48928 +8633,49581 +12697,52216 +9171,50386 +8066,52133 +10401,53090 +12416,51460 +10794,50115 +10580,51553 +11365,50973 +9763,50495 +9416,50770 +7934,48544 +10806,48952 +10904,51342 +9657,52423 +12791,50426 +8842,50261 +11640,50257 +11450,52510 +10480,51773 +11020,49726 +8705,49365 +8276,48524 +10859,51248 +6798,51275 +9359,51444 +8524,52422 +8506,50665 +7906,50299 +9247,50471 +11773,50161 +8730,51510 +8422,52679 +13020,50329 +10991,48211 +11536,49673 +11062,50068 +10653,51048 +8444,50174 +11876,50023 +11611,48473 +9327,52012 +10749,51406 +10026,52647 +10579,49821 +13981,49623 +10579,50729 +9390,51106 +12594,52133 +9198,50826 +11435,50996 +12436,48816 +9815,51501 +11037,50777 +8869,51886 +9744,50911 +10333,50182 +10622,52334 +7739,49873 +12376,48666 +12199,50485 +13144,49604 +8524,50708 +11095,51738 +9592,50262 +10879,49512 +11130,49369 +10337,49890 +9895,50510 +9703,51958 +7720,51431 +9481,49546 +7484,52113 +8583,49768 +6951,51758 +10191,49243 +11820,50017 +7445,50769 +10764,52080 +10444,50923 +9616,52793 +13482,49941 +11149,51188 +11076,53717 +11109,49944 +10704,51371 +9443,52075 +8868,52990 +10757,51325 +11396,53232 +10048,52277 +10606,53363 +9657,50553 +10058,49889 +9324,49714 +9816,55272 +11888,48809 +9837,50011 +11269,48664 +9836,52030 +10577,51583 +6885,51244 +11023,49802 +10839,50455 +10013,50471 +3364,56093 +5522,54143 +4557,54902 +4140,54842 +4927,52701 +5607,54784 +4864,55680 +5617,55660 +5366,53856 +6727,54732 +2968,54214 +5388,53392 +7034,50514 +4207,53376 +3110,55381 +3991,55631 +3589,53393 +1756,54502 +6577,53657 +6675,54728 +5984,55785 +3520,55818 +3375,53677 +6947,52316 +2677,54186 +3465,54037 +4750,55207 +4977,51710 +2847,54305 +5988,53574 +4362,53432 +5003,52684 +4715,54506 +4759,57743 +5027,55655 +7431,50756 +3849,54348 +2248,53985 +5088,52898 +2916,54180 +4382,53067 +3581,58080 +2707,55155 +4962,56531 +2326,53879 +4410,54098 +2875,55177 +5539,55039 +2796,57052 +7335,54395 +5489,52708 +4492,56754 +2056,56061 +6689,53870 +5902,53527 +5359,54762 +7002,54536 +6570,55309 +5909,54502 +4118,53600 +4081,56221 +3662,53763 +4418,56325 +4995,57057 +7625,54059 +5729,53643 +5509,54479 +2512,53861 +5781,54701 +3499,55206 +4780,56332 +6726,55910 +4567,55033 +3933,54316 +4329,53012 +6046,55497 +5418,54124 +5759,55028 +5970,54618 +5664,54114 +6835,55281 +5026,55207 +4332,56121 +6236,54262 +4946,55080 +4356,55423 +5755,53627 +4231,53432 +4453,53923 +5516,56043 +5268,56645 +4567,55451 +3441,55616 +4911,53538 +6503,53356 +3746,53927 +4245,55965 +4413,54165 +4159,54035 +4115,53150 +6251,55245 +5389,54870 +6666,54030 +2575,54211 +4749,55593 +2996,55489 +3594,53609 +5764,53896 +5192,52602 +0,54499 +7700,54988 +5770,53331 +4235,54556 +4731,54238 +4877,55291 +4023,57278 +3874,55784 +5255,52393 +6228,55206 +5618,54536 +2659,55959 +4084,54843 +4524,56226 +4061,54024 +3597,52748 +6267,57098 +3944,55580 +2596,56386 +6210,54578 +4785,54895 +5536,54428 +5945,52615 +4028,55483 +4222,57392 +5088,53006 +5378,55302 +6635,57985 +6044,55199 +3305,55031 +5133,53898 +4636,57162 +5065,57069 +4260,54579 +4761,54969 +4711,53314 +6752,54903 +6702,54483 +4405,54784 +7579,54208 +3600,53791 +10256,60907 +8676,57719 +9383,61340 +10156,60841 +8627,63762 +12376,62842 +12048,59831 +10279,57681 +11465,61289 +9589,60754 +8002,60609 +10364,61512 +12948,60162 +12277,61976 +8576,60303 +12546,60499 +7951,59432 +9986,60034 +10939,58346 +9893,59586 +12095,64166 +6646,63005 +11091,61195 +10950,57600 +10930,60322 +11468,61950 +8554,60761 +10663,59125 +9431,62300 +9966,59064 +6693,60430 +12090,59869 +10936,61184 +12124,60279 +11187,58843 +8710,58937 +10102,60364 +10616,60683 +11579,58617 +8521,59545 +12110,59455 +9117,60001 +14665,60436 +8431,61105 +11971,59851 +12613,59379 +10372,57097 +11306,60035 +10198,58488 +11721,61075 +10690,61867 +11511,62215 +8638,60548 +9347,61512 +8446,60600 +10530,56564 +10726,60737 +10334,60937 +11226,57861 +10802,56031 +12622,58547 +10938,62519 +11210,58343 +13252,62021 +12559,59819 +8908,59029 +12930,62857 +10570,63000 +8778,63637 +13836,60414 +8240,60831 +10210,58723 +12347,61746 +10963,57947 +10824,61369 +9766,58973 +9432,61396 +11631,59714 +10722,61544 +11103,60003 +12424,58655 +11681,59832 +13039,61888 +9932,59316 +11412,64537 +10853,62937 +9972,60044 +11616,60575 +10434,61086 +10993,59910 +9534,61767 +12150,59180 +9933,59269 +13206,62465 +7821,61712 +10844,63287 +13096,62112 +12171,61128 +13063,59700 +10031,61025 +12335,58115 +11878,60429 +10390,61299 +10336,60916 +8238,58683 +13779,60968 +13348,60275 +11955,59006 +8673,62255 +12822,62138 +8471,61739 +9954,60705 +11436,59452 +12430,62195 +10457,61257 +9639,62038 +11068,58255 +9730,63026 +9817,60728 +8339,61080 +10669,61473 +10438,63245 +9520,60139 +8957,61191 +11134,60627 +12965,61972 +9210,59309 +9829,61696 +10746,62172 +10595,61783 +8280,57997 +7644,61816 +11776,61448 +13598,63186 +9058,60416 +10200,62166 +10536,62434 +11719,61142 +9996,61355 +11775,61142 +9033,63414 +9287,62954 +9049,59370 +10457,58942 +9647,59886 +8754,61242 +11165,59822 +8828,59102 +8879,59244 +10002,61399 diff --git a/src/DBSCAN/index.js b/src/DBSCAN/index.js new file mode 100644 index 000000000..436a3ad48 --- /dev/null +++ b/src/DBSCAN/index.js @@ -0,0 +1,180 @@ +// Copyright (c) 2020 ml5 +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +/* eslint "no-param-reassign": [2, { "props": false }] */ +/* +DBSCAN Algorithm (with Euclidian distance). Influenced By jDBSCAN +*/ + +import * as tf from "@tensorflow/tfjs-node"; +import callCallback from '../utils/callcallback'; + +/** + * Read in a csv file from a path to its location. + * @param {string} path + */ +async function readCsv(path) { + const myCsv = tf.data.csv(path); + const loadedData = await myCsv.toArray(); + return loadedData; +} + +/** + * Load and flatten an array of arrays, an array of objects, or a string + * path to a csv. + * @param {string || array || object} inputData + */ +async function loadDataset(inputData) { + let data; + if (typeof inputData === "string") { + data = await readCsv(inputData); + } else { + data = inputData; + } + const dataFlat = data.map((d) => { + return Object.values(d); + }); + return dataFlat; +} + +class DBSCAN { + + /** + * Create a DBSCAN. + * @param {String || array || object} dataset - The dataset to cluster. in x, y format => [{x:1,y:2}] + * @param {options} options - An object describing a model's parameters: + * - eps: Minimum distance between neighbours + * - minPts: Minimum number of neighbours to count as a core point + * @param {function} callback - Optional. A callback to be called once + * the model has loaded. If no callback is provided, it will return a + * promise that will be resolved once the model has loaded. + */ + + constructor(dataset, options, callback) { + this.config = { + eps: options.eps || DEFAULTS.eps, + minPts: options.minPts || DEFAULTS.minPts, + }; + this.last_cluster_id = 0; + this.status = []; + this.load(dataset).then(callback); + this.ready = callCallback(this.load(dataset), callback); + } + + /** + * Load dataset, and run model. + * @param {string || array || object} dataset + */ + async load(dataset) { + this.dataset = await loadDataset(dataset); + tf.tidy(() => { + this.dataTensor = tf.tensor2d(this.dataset); + this.dataset.forEach((d) => { + const tensors = tf.tensor1d(Object.values(d)); + d.tensor = tensors; + }); + this.fit(); + }); + return this; + } + + /** + * Run DBSCAN algorithm. + */ + fit() { + this.dataset.forEach((d, idx) => { + if (d.status === undefined) { + d.status = 0; // initlize as a noise point + let neighbours_indices = this.get_neighbours_indices(d); + if (neighbours_indices.length < this.config.minPts) { // Border or noise + d.status = 0; + } else { + this.increment_cluster_id() + this.extend(idx, neighbours_indices); + } + } + }); + } + + /** + * Extend cluster by running algorithm on neighbours and detect neighbours that are core points as well + * @param {number} point_index + * @param {number[]} neighbours_indices + */ + extend(t_point_idx, neighbours_indices) { + this.dataset[t_point_idx].clusterid = this.get_cluster_id(); + this.dataset[t_point_idx].status = this.dataset[t_point_idx].clusterid; + for (let i = 0; i < neighbours_indices.length; i++) { + const curr_point_idx = neighbours_indices[i]; + + if (this.dataset[curr_point_idx].status === undefined) { + this.dataset[curr_point_idx].status = 0; + let curr_neighbours = this.get_neighbours_indices( + this.dataset[curr_point_idx] + ); + let curr_num_neighbours = curr_neighbours.length; + + if (curr_num_neighbours >= this.config.minPts) { + this.extend(curr_point_idx, curr_neighbours); + } + } + + if (this.dataset[curr_point_idx].status < 1) { + this.dataset[curr_point_idx].status = this.dataset[ + t_point_idx + ].clusterid; + this.dataset[curr_point_idx].clusterid = this.dataset[ + t_point_idx + ].clusterid; + } + } + } + + /** + * Return last generated cluster id + */ + get_cluster_id() { + return this.last_cluster_id; + } + /** + * increment cluster id + */ + increment_cluster_id() { + this.last_cluster_id++ + } + + /** + * Find closest neighbours to each observation. + */ + get_neighbours_indices(t_point) { + try { + let neighbours = tf.tidy(() => { + const { values, indices } = tf + .squaredDifference(t_point.tensor, this.dataTensor) + .sum(1) + .sqrt() + .topk(this.dataTensor.shape[0], true) + return tf + .stack([values.asType("float32"), indices.asType("float32")], 1) + .arraySync() + .filter((v, idx) => { + return v[0] <= this.config.eps; + }) + .reduce((prev, cur, idx, res) => { + prev.push(cur[1]); + return prev; + }, []); + }); + return neighbours; + } catch (error) { + console.log(`error ${error}`); + } + } +} + +const dbscan = (dataset, options, callback) => + new DBSCAN(dataset, options, callback); + +export default dbscan; diff --git a/src/DBSCAN/index_test.js b/src/DBSCAN/index_test.js new file mode 100644 index 000000000..a4ee4b176 --- /dev/null +++ b/src/DBSCAN/index_test.js @@ -0,0 +1,33 @@ +// Copyright (c) 2019 ml5 +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +const { dbscan } = ml5; + +const DBSCAN_DEFAULTS = { + eps: 50, + minPts: 3, +}; + +describe("DBSCAN", () => { + let dbscanModel; + const dataurl = + "https://raw.githubusercontent.com/asvsfs/ml5-library/development/examples/dbscan/data/data.csv"; + + beforeAll(async () => { + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; + dbscanModel = await dbscan(dataurl, DBSCAN_DEFAULTS, () => {}); + await dbscanModel.load(dataurl); + }); + + it("Should create dbscan with all the defaults", async () => { + expect(dbscanModel.config.eps).toBe(DBSCAN_DEFAULTS.k); + expect(dbscanModel.config.minPts).toBe(DBSCAN_DEFAULTS.maxIter); + }); + + it("dbscanModel dataset : Should have length 3000", async () => { + // await kmeansModel.load(dataurl) + expect(dbscanModel.dataset.length).toBe(3000); + }); +}); From 49be12453707c1991e7328e3c1ae1792bce2efb2 Mon Sep 17 00:00:00 2001 From: asvsfs Date: Thu, 6 Aug 2020 20:54:43 +0430 Subject: [PATCH 03/49] dbscan style corrected --- src/DBSCAN/index.js | 79 +++++++++++++++++++++++---------------------- src/index.js | 2 ++ 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/DBSCAN/index.js b/src/DBSCAN/index.js index 436a3ad48..cf474c261 100644 --- a/src/DBSCAN/index.js +++ b/src/DBSCAN/index.js @@ -8,7 +8,7 @@ DBSCAN Algorithm (with Euclidian distance). Influenced By jDBSCAN */ -import * as tf from "@tensorflow/tfjs-node"; +import * as tf from '@tensorflow/tfjs'; import callCallback from '../utils/callcallback'; /** @@ -39,6 +39,11 @@ async function loadDataset(inputData) { return dataFlat; } +const DEFAULTS = { + 'eps': 50, + 'minPts': 3, +}; + class DBSCAN { /** @@ -57,7 +62,7 @@ class DBSCAN { eps: options.eps || DEFAULTS.eps, minPts: options.minPts || DEFAULTS.minPts, }; - this.last_cluster_id = 0; + this.lastClusterId = 0; this.status = []; this.load(dataset).then(callback); this.ready = callCallback(this.load(dataset), callback); @@ -87,12 +92,12 @@ class DBSCAN { this.dataset.forEach((d, idx) => { if (d.status === undefined) { d.status = 0; // initlize as a noise point - let neighbours_indices = this.get_neighbours_indices(d); - if (neighbours_indices.length < this.config.minPts) { // Border or noise + const neighboursIndices = this.getNeighboursIndices(d); + if (neighboursIndices.length < this.config.minPts) { // Border or noise d.status = 0; } else { - this.increment_cluster_id() - this.extend(idx, neighbours_indices); + this.incrementClusterId() + this.extend(idx, neighboursIndices); } } }); @@ -100,77 +105,75 @@ class DBSCAN { /** * Extend cluster by running algorithm on neighbours and detect neighbours that are core points as well - * @param {number} point_index - * @param {number[]} neighbours_indices + * @param {number} pointIndex + * @param {number[]} neighboursIndices */ - extend(t_point_idx, neighbours_indices) { - this.dataset[t_point_idx].clusterid = this.get_cluster_id(); - this.dataset[t_point_idx].status = this.dataset[t_point_idx].clusterid; - for (let i = 0; i < neighbours_indices.length; i++) { - const curr_point_idx = neighbours_indices[i]; - - if (this.dataset[curr_point_idx].status === undefined) { - this.dataset[curr_point_idx].status = 0; - let curr_neighbours = this.get_neighbours_indices( - this.dataset[curr_point_idx] + extend(pointIndex, neighboursIndices) { + this.dataset[pointIndex].clusterid = this.getClusterId(); + this.dataset[pointIndex].status = this.dataset[pointIndex].clusterid; + neighboursIndices.forEach(neighbourIndex=>{ + if (this.dataset[neighbourIndex].status === undefined) { // Status unknown intialize as noise + this.dataset[neighbourIndex].status = 0; + const currNeighbours = this.getNeighboursIndices( // Neighbours of this point + this.dataset[neighbourIndex] ); - let curr_num_neighbours = curr_neighbours.length; + const currNumNeighbours = currNeighbours.length; - if (curr_num_neighbours >= this.config.minPts) { - this.extend(curr_point_idx, curr_neighbours); + if (currNumNeighbours >= this.config.minPts) {// If Neighbours are above minimum we go further and add this and potential neighbours to clusterId + this.extend(neighbourIndex, currNeighbours); } } - - if (this.dataset[curr_point_idx].status < 1) { - this.dataset[curr_point_idx].status = this.dataset[ - t_point_idx + if (this.dataset[neighbourIndex].status < 1) { + this.dataset[neighbourIndex].status = this.dataset[ + pointIndex ].clusterid; - this.dataset[curr_point_idx].clusterid = this.dataset[ - t_point_idx + this.dataset[neighbourIndex].clusterid = this.dataset[ + pointIndex ].clusterid; } - } + }) } /** * Return last generated cluster id */ - get_cluster_id() { - return this.last_cluster_id; + getClusterId() { + return this.lastClusterId; } /** * increment cluster id */ - increment_cluster_id() { - this.last_cluster_id++ + incrementClusterId() { + this.lastClusterId+=1 } /** * Find closest neighbours to each observation. */ - get_neighbours_indices(t_point) { + getNeighboursIndices(point) { try { - let neighbours = tf.tidy(() => { + const neighbours = tf.tidy(() => { const { values, indices } = tf - .squaredDifference(t_point.tensor, this.dataTensor) + .squaredDifference(point.tensor, this.dataTensor) .sum(1) .sqrt() .topk(this.dataTensor.shape[0], true) return tf .stack([values.asType("float32"), indices.asType("float32")], 1) .arraySync() - .filter((v, idx) => { + .filter((v) => { return v[0] <= this.config.eps; }) - .reduce((prev, cur, idx, res) => { + .reduce((prev, cur) => { prev.push(cur[1]); return prev; }, []); }); - return neighbours; + return neighbours || []; } catch (error) { console.log(`error ${error}`); } + return [] } } diff --git a/src/index.js b/src/index.js index e131231ae..3fdeb9bf7 100644 --- a/src/index.js +++ b/src/index.js @@ -29,6 +29,7 @@ import bodyPix from "./BodyPix"; import neuralNetwork from "./NeuralNetwork"; import faceApi from "./FaceApi"; import kmeans from "./KMeans"; +import dbscan from "./DBSCAN"; import cartoon from "./CartoonGAN"; import universalSentenceEncoder from "./UniversalSentenceEncoder"; import facemesh from "./Facemesh"; @@ -44,6 +45,7 @@ const withPreload = { featureExtractor, imageClassifier, kmeans, + dbscan, soundClassifier, pitchDetection, pix2pix, From 1ecd8315920b4855d1cbd3846e9f8d6d129df044 Mon Sep 17 00:00:00 2001 From: asvsfs Date: Thu, 6 Aug 2020 22:43:42 +0430 Subject: [PATCH 04/49] d3 example added --- .../data/gaussian2d_1.55clusters.csv} | 2 +- .../data/gaussian2d_1.56clusters.csv} | 2 +- .../data/gaussian2d_2clusters.csv | 2 +- .../data/gaussian2d_circleclusters.csv | 2 +- .../data/gaussian2d_moonclusters.csv | 2 +- examples/d3/DBSCAN/DBSCAN_Cluster/index.html | 22 + examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js | 112 + examples/dbscans/data/data.csv | 3001 ----------------- examples/examples.json | 2 +- src/DBSCAN/index_test.js | 6 +- 10 files changed, 143 insertions(+), 3010 deletions(-) rename examples/d3/{KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_3clusters.csv => DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.55clusters.csv} (99%) rename examples/d3/{KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_4clusters.csv => DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.56clusters.csv} (99%) rename examples/d3/{KMeans/KMeans_GaussianClusterDemo => DBSCAN/DBSCAN_Cluster}/data/gaussian2d_2clusters.csv (99%) rename examples/d3/{KMeans/KMeans_GaussianClusterDemo => DBSCAN/DBSCAN_Cluster}/data/gaussian2d_circleclusters.csv (99%) rename examples/d3/{KMeans/KMeans_GaussianClusterDemo => DBSCAN/DBSCAN_Cluster}/data/gaussian2d_moonclusters.csv (99%) create mode 100644 examples/d3/DBSCAN/DBSCAN_Cluster/index.html create mode 100644 examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js delete mode 100644 examples/dbscans/data/data.csv diff --git a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_3clusters.csv b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.55clusters.csv similarity index 99% rename from examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_3clusters.csv rename to examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.55clusters.csv index 3976c0e52..072b7adac 100644 --- a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_3clusters.csv +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.55clusters.csv @@ -1,4 +1,4 @@ -x1,x2 +x,y -7.849704268160314,-8.674808581953744 -8.69664575596503,-7.692212927859845 -1.0359915243020554,6.827713353515913 diff --git a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_4clusters.csv b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.56clusters.csv similarity index 99% rename from examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_4clusters.csv rename to examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.56clusters.csv index ae1b83fa1..789ee683f 100644 --- a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_4clusters.csv +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.56clusters.csv @@ -1,4 +1,4 @@ -x1,x2 +x,y -10.718663580210745,9.900472871349784 -7.9399489058067685,10.718096194668659 -9.199206305612545,6.923022960440686 diff --git a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_2clusters.csv b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_2clusters.csv similarity index 99% rename from examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_2clusters.csv rename to examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_2clusters.csv index 9abaa0cd6..d25fe19cf 100644 --- a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_2clusters.csv +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_2clusters.csv @@ -1,4 +1,4 @@ -x1,x2 +x,y 2.498895550686414,1.1683342316471301 5.073222450036444,0.8623713271387572 4.672790880324094,2.6418773621498803 diff --git a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_circleclusters.csv b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_circleclusters.csv similarity index 99% rename from examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_circleclusters.csv rename to examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_circleclusters.csv index efbf5fb70..e22dddb59 100644 --- a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_circleclusters.csv +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_circleclusters.csv @@ -1,4 +1,4 @@ -x1,x2 +x,y -0.9914878645939103,0.12004373871846165 -0.8064234011393798,-0.5891152116668836 -0.4265373027932866,-0.6749570357883385 diff --git a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_moonclusters.csv b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_moonclusters.csv similarity index 99% rename from examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_moonclusters.csv rename to examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_moonclusters.csv index ad01d28a1..32dc2344d 100644 --- a/examples/d3/KMeans/KMeans_GaussianClusterDemo/data/gaussian2d_moonclusters.csv +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_moonclusters.csv @@ -1,4 +1,4 @@ -x1,x2 +x,y 2.001164955520126,0.43029947571735944 -0.6744557747817002,0.7365153394030783 0.13616835175111489,1.0001429333017973 diff --git a/examples/d3/DBSCAN/DBSCAN_Cluster/index.html b/examples/d3/DBSCAN/DBSCAN_Cluster/index.html new file mode 100644 index 000000000..876aa1575 --- /dev/null +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/index.html @@ -0,0 +1,22 @@ + + + ml5.js DBSCAN example + + + + +
+

DBSCAN Example

+

DBSCAN is a density-based clustering non-parametric algorithm: given a set of points in some space, it groups together points that are closely packed together (points with many nearby neighbors), + marking as outliers points that lie alone in low-density regions (whose nearest neighbors are too far away). + DBSCAN is one of the most common clustering algorithms and also most cited in scientific literature. +

+
+ +
+
+
+
+ + + \ No newline at end of file diff --git a/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js new file mode 100644 index 000000000..294100183 --- /dev/null +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js @@ -0,0 +1,112 @@ +let dbscanModel; +const width = 640; +const height = 480; +const colDict = { + 0: 'skyblue', + 1: 'coral', + 2: 'olive', + 3: 'tan', + 4: 'grey' +} + +// ----- Initialize the example: ------ // +function init() { + // make all those nice buttons + createButtons(); + // start with 3 cluster + make(1.55); +} +init(); + +// STEP 1: +// create all the buttons +function createButtons() { + addClusterButton(1.55); + addClusterButton(1.56); + addClusterButton(2); + addClusterButton('circle'); + addClusterButton('moon'); +} + +// STEP 2: +// create the model +function make(eps) { + const options = { + 'eps': eps, + 'minPts': 3, + }; + // if moon or circle data, set the options to 2 clusters + // could also be a 1-liner: options.k = (eps === 'moon' || eps === 'circle') ? 2: options.k; + if(eps === 'moon' ){ + options.eps = 0.1; + }else if( eps === 'circle'){ + options.eps = 0.16; + } + console.log(eps, options.eps); + + + // get the path to the data in our data folder dynamically + const dataPath = `data/gaussian2d_${eps}clusters.csv` + // create a new dbscan clustering each time on make() + dbscanModel = ml5.dbscan(dataPath, options, modelReady); + +} + +// Step 3: +// when the model is ready, make the chart +function modelReady() { + console.log(dbscanModel.dataset) + makeChart() +} + +// Step 4: +// use the fancy d3 to make magic +function makeChart() { + const dataset = dbscanModel.dataset; + // clear the chart each time + // less efficient, but simple + d3.select('svg').remove(); + + // reappend the svg to the chart area + const svg = d3.select('#chart').append('svg') + .attr('width', width) + .attr('height', height); + + // d[0] is for the x value in the array + const xScale = d3.scaleLinear() + .domain(d3.extent(dataset, d => d[0])) + .range([10, width - 100]); + + // d[1] is for the y value in the array + const yScale = d3.scaleLinear() + .domain(d3.extent(dataset, d => d[1])) + .range([height - 50, 20]); + + svg.selectAll('circle').data(dataset) + .enter().append('circle') + .attr('cx', d => xScale(d[0])) + .attr('cy', d => yScale(d[1])) + .attr('r', 6) + .attr('fill', 'black') + + d3.select('svg').selectAll('circle') + .transition() + .attr('fill', (d, i) => colDict[dataset[i].clusterid]); + +} + +// adds the buttons for the respective cluster data +// we could also use d3.append() and d3.select() here :) +function addClusterButton(eps,minPts=3) { + const btn = document.createElement("BUTTON"); + btn.innerText = `cluster: ${eps} & minPts: ${minPts}` + + btn.addEventListener('click', function (e) { + make(eps); + }); + + document.querySelector('#buttons').appendChild(btn); + + return btn; +} + diff --git a/examples/dbscans/data/data.csv b/examples/dbscans/data/data.csv deleted file mode 100644 index 0532e7938..000000000 --- a/examples/dbscans/data/data.csv +++ /dev/null @@ -1,3001 +0,0 @@ -x,y -54620,43523 -52694,42750 -53253,43024 -54925,42624 -54973,43980 -52967,42955 -55143,40238 -53071,44896 -55710,44219 -54459,43964 -54467,44351 -53570,41898 -55155,43399 -54051,41019 -55335,44023 -54449,42872 -53399,42273 -54241,43580 -56000,41710 -53204,42630 -54524,42904 -55665,44100 -55829,40780 -54059,42096 -53106,42771 -54427,43777 -55368,41828 -53927,45077 -55278,44081 -55909,41497 -53344,42929 -55095,42443 -55645,43363 -55718,43777 -57115,44424 -54963,44875 -54483,43594 -54543,44843 -54263,39356 -53992,42499 -54729,40311 -55013,44589 -53332,43782 -52627,41645 -57103,40709 -54352,42520 -50478,42084 -54849,41733 -53055,42310 -55191,42127 -51936,41784 -54594,44345 -52164,42650 -56302,42288 -52913,44156 -53697,46311 -53582,40916 -52993,40890 -54222,43822 -52221,43490 -55062,44521 -52460,42366 -54341,45492 -52195,42091 -53141,41774 -53476,41355 -54256,44048 -56036,42102 -54916,42689 -53420,44299 -54924,42079 -56208,41204 -53855,42912 -55078,42668 -52975,43407 -52526,43275 -56191,42928 -56569,44022 -53730,42300 -56749,45529 -55281,42586 -56338,39718 -52456,43210 -55388,42905 -55983,42644 -54325,45723 -52346,41845 -52745,42741 -54393,42416 -53106,42336 -56285,41221 -54064,41409 -53703,44027 -54179,45588 -55395,42014 -53023,46128 -56830,40997 -57981,42287 -52898,41098 -54307,42992 -55303,44416 -52517,43287 -53727,41735 -55346,40987 -53531,43995 -54225,40013 -54111,43711 -55977,44177 -55227,44206 -52351,45876 -49952,42514 -55911,44667 -55825,42139 -53832,43983 -54353,42453 -50548,44199 -54329,44001 -54691,42918 -54026,42248 -54140,42328 -54032,42111 -54556,42397 -55092,43404 -54417,42391 -57398,41217 -55169,42237 -53973,44112 -53795,43670 -52409,41340 -51167,45741 -56804,43627 -56299,42413 -55062,43027 -54716,43766 -54943,41966 -57196,43284 -54033,40367 -56416,42968 -56087,43599 -54414,44613 -52304,42213 -57416,43226 -54876,42500 -52495,41064 -54272,43145 -55984,40501 -53322,41799 -55053,43347 -54308,42602 -54091,44335 -50545,49343 -50711,50227 -49983,48300 -51327,46829 -53980,49207 -52846,50052 -51816,47204 -51421,49806 -49762,47210 -51564,50111 -51541,48433 -54602,50309 -51116,48104 -53307,51015 -51683,49283 -51485,48750 -52477,50139 -52872,50375 -54275,48580 -51460,49224 -52073,50583 -50778,50832 -52994,49958 -52103,49204 -51076,50440 -49868,50597 -51122,48724 -53609,48195 -50862,48277 -50697,47557 -52531,50046 -51759,49073 -50162,50113 -51046,51417 -52256,47563 -54748,47435 -51069,50726 -53561,46928 -50745,51221 -51125,52196 -49630,48514 -53771,49411 -50498,50993 -52768,50430 -51476,50875 -50128,50117 -49685,48605 -49164,46821 -51674,48858 -50230,49055 -53145,48166 -50617,48690 -53365,47853 -53322,49129 -52899,49148 -53498,48141 -50423,47832 -51377,48123 -50843,49836 -51344,48631 -52620,47208 -53300,49981 -53300,50101 -51333,48502 -52533,48519 -49164,49656 -52172,50246 -52323,49316 -49154,48565 -50651,49838 -50835,50099 -53742,49907 -50691,50499 -51354,46853 -50952,49346 -52105,49253 -52045,48784 -51808,47875 -51536,50378 -52080,46732 -51189,50434 -51798,48228 -51985,49754 -53241,53420 -52899,48633 -54090,49415 -51910,50787 -51162,51612 -52155,50267 -49469,49205 -51308,49630 -50307,51082 -50059,45731 -50244,48477 -48977,47710 -48661,50836 -51554,51790 -51397,50323 -52757,50130 -52164,47191 -51089,48855 -52166,48385 -52613,50446 -51235,49140 -50455,50713 -52393,49486 -51011,48580 -51294,48648 -52558,50207 -53182,51978 -53694,51985 -50822,48480 -50663,49713 -49538,51625 -53264,48831 -51545,48362 -51808,52179 -53242,51473 -49352,49577 -51610,48965 -48381,48106 -48715,49479 -50929,50250 -50452,48945 -52903,49650 -52902,50105 -50369,49615 -51003,48693 -51586,49170 -52214,50324 -51815,49375 -50015,49385 -49968,44951 -51274,51159 -50139,48240 -51568,48212 -52094,49427 -53771,49868 -52696,51309 -51353,50271 -52110,48679 -53065,49559 -51243,49471 -49158,47569 -51589,53212 -50716,50226 -52917,51056 -52046,47422 -50183,48147 -49685,50701 -59637,45811 -60147,45082 -60025,50540 -62099,45862 -62457,44344 -60734,45976 -61654,45375 -62737,46856 -59434,45767 -61383,46454 -59180,45359 -62661,46734 -61930,45278 -61909,46072 -63957,47753 -62033,45635 -58244,45992 -61159,45013 -61495,46965 -62011,48870 -59014,46813 -59953,46852 -61075,46380 -59978,45921 -63518,45366 -60662,45183 -61917,49590 -58162,45461 -58656,47841 -60103,43554 -61360,46709 -61576,48371 -59026,46292 -61555,46519 -63261,45819 -61252,48636 -60366,46199 -59988,48268 -62906,45197 -59397,44267 -61898,46911 -62684,47619 -62113,46253 -61034,48519 -60097,49612 -59797,43693 -61500,44023 -58569,46086 -62098,48364 -60135,46592 -63119,45688 -61016,47793 -60779,47519 -61530,46159 -62512,46476 -59835,47222 -59495,47409 -58468,48906 -57948,47995 -59107,48912 -61258,46064 -59691,47572 -59628,46865 -60173,48289 -61201,45635 -62400,45584 -59578,48612 -61786,44837 -60755,44937 -61942,46526 -61501,45670 -59458,47430 -60630,47285 -59370,48566 -59677,46828 -62217,43734 -59962,46140 -59247,43976 -62951,43581 -64197,46477 -58954,45292 -62130,43638 -61766,44822 -61211,44484 -62982,45314 -60461,46738 -61434,46270 -60185,48738 -60602,44756 -62991,49882 -60817,46350 -59524,46701 -61589,48446 -63760,44658 -62292,48885 -63074,47510 -60573,45064 -62195,46716 -58990,47402 -58730,46167 -61872,46473 -62583,48197 -63311,44483 -61267,46010 -59364,48273 -61827,44599 -58938,46819 -60129,46161 -56623,47837 -60470,45222 -61691,45495 -60109,43495 -58717,46859 -58565,46331 -60601,47937 -62566,49149 -61903,46451 -61782,47084 -61954,45907 -62345,47091 -58264,45640 -61303,48326 -58773,43499 -63086,47075 -63081,47684 -60204,46955 -60597,46399 -59077,48115 -61768,44391 -58976,45060 -60989,47257 -61190,47066 -60972,46551 -60077,44786 -61432,46817 -62600,45672 -61396,48168 -62082,46029 -62480,45840 -60049,45388 -59918,48366 -62084,45119 -60707,46058 -60634,45826 -63489,44063 -62451,48261 -62426,44954 -61782,49028 -61595,47677 -62779,47041 -59953,50937 -60526,53180 -58802,53819 -62297,52300 -58604,54336 -60766,55324 -58238,51102 -60125,49071 -59177,52894 -61205,52646 -59620,53606 -61566,53795 -62010,50563 -55811,52761 -57938,52825 -62783,52794 -59198,52561 -59786,51948 -60902,55082 -60679,50894 -63223,53981 -60586,48986 -61159,54532 -61033,52468 -61475,53918 -62169,51916 -58904,53725 -60531,53274 -61442,51792 -60235,52007 -58915,50231 -62109,50367 -59971,53488 -60369,52563 -57329,51751 -59933,56156 -61775,53359 -61599,53671 -60106,49519 -57978,52975 -63057,51681 -61776,51655 -62364,50648 -60327,51525 -59857,53804 -59856,50041 -58313,52980 -62549,54640 -59146,54829 -61469,51409 -58371,50040 -61314,51110 -60548,53678 -59922,52786 -58762,51916 -60854,52169 -62313,53461 -60787,51558 -60948,49685 -60644,51665 -59095,50820 -58808,52874 -63244,53722 -61129,52867 -60730,52083 -61190,54253 -57940,53483 -60793,50532 -57987,50535 -57316,51557 -57344,53713 -59345,53451 -59309,53689 -63148,54994 -65535,51609 -58432,52328 -61739,52881 -58769,54508 -62146,50611 -61353,52949 -60249,52238 -60703,52037 -61407,52897 -59622,51840 -58297,53749 -58234,52471 -63457,52600 -60443,53128 -62485,51824 -59626,52498 -60245,51232 -60088,51401 -59466,51775 -59673,50869 -59396,54860 -60024,50389 -63143,53181 -61364,52426 -61272,52410 -61352,50032 -60794,53091 -58644,54218 -60576,51753 -59434,52433 -61099,50199 -57111,51732 -59385,51054 -59626,52424 -62053,52942 -59411,54228 -63256,53319 -61799,52927 -56783,52846 -61232,53224 -60221,52022 -58815,54259 -58336,53014 -60820,53919 -59816,53916 -60946,53614 -57803,50468 -59045,52706 -60617,51398 -61019,51535 -60753,50736 -62592,54099 -60868,51134 -60597,51012 -60201,52003 -60152,49128 -59566,53452 -59703,52501 -58933,53890 -59898,51245 -60079,53099 -62063,51857 -60308,51685 -61447,51661 -58543,53625 -61593,51496 -61290,54028 -61105,49647 -60231,53265 -59558,52776 -58402,52389 -58134,51877 -59040,54950 -63162,53609 -58718,49514 -60396,52805 -44040,46197 -46006,46521 -47260,47193 -45600,46395 -44324,44879 -42732,45444 -43609,46066 -46021,44331 -45527,42803 -44401,45918 -44023,46226 -44772,46447 -46125,45879 -45451,47318 -44081,47210 -45840,49753 -46384,44600 -44279,43434 -44882,47245 -45818,44321 -45019,45549 -43897,46696 -43524,46836 -42508,47345 -45015,46110 -45356,44834 -45010,47987 -43712,46227 -46179,46421 -45360,46378 -44163,47526 -46904,46553 -42409,44578 -43905,45300 -42749,45475 -44698,44129 -43280,46617 -45574,47897 -43851,47533 -44478,46315 -44520,46484 -46371,47909 -42904,44785 -44901,44409 -43361,48159 -43714,43305 -44492,45977 -43671,47848 -43629,46252 -45612,47971 -44877,48055 -44762,46708 -46340,45960 -42187,44860 -42896,46268 -44691,46276 -42616,48423 -44100,44734 -45893,47567 -45486,44940 -46071,50218 -46857,48357 -46050,46610 -44886,47155 -45351,45046 -44677,47921 -45206,46504 -44977,46050 -46042,47659 -44793,47895 -45298,46876 -42300,46449 -45015,44653 -46676,46171 -45440,45988 -46055,47085 -44201,48116 -45308,45173 -46229,46865 -45738,46899 -43439,43985 -42348,46774 -45146,47690 -46211,44206 -44565,44177 -46191,48317 -45909,45961 -44577,46345 -46157,45612 -41927,48543 -45309,46374 -46051,45145 -41508,47088 -44238,45158 -45806,46785 -45230,47186 -42223,47000 -44108,46834 -46761,47183 -45727,44795 -45234,46110 -46226,45384 -44460,46396 -46924,47066 -44201,46722 -45562,47033 -43711,47308 -46969,46954 -46080,45768 -43869,48571 -45755,46024 -44704,46111 -45754,46817 -44916,46930 -45205,44698 -45636,41946 -43794,43368 -42990,47111 -44324,47646 -46585,48285 -43138,47056 -44109,47298 -42078,45102 -44719,47108 -43690,44669 -43682,47550 -45997,46437 -45652,46746 -45705,47041 -45374,46355 -45536,44653 -45595,47049 -44325,46733 -46511,47373 -44717,47856 -45786,46580 -41089,45626 -41851,44047 -47162,47068 -46773,44941 -45806,45282 -43274,47372 -42182,45481 -43583,47308 -44362,45655 -43611,45959 -42283,44263 -48266,45184 -45821,47089 -47332,45389 -37900,43700 -38172,42792 -38870,44459 -36702,45802 -39220,45233 -39240,45636 -38915,45632 -37496,46121 -37626,43520 -36859,42832 -36497,45576 -37937,43875 -37414,45176 -39339,45642 -38768,44701 -41073,43678 -35880,44226 -37556,45014 -39028,46813 -39129,45517 -39139,43725 -39846,44359 -38946,42243 -37889,42985 -37202,42594 -39657,46012 -40225,43669 -39702,45456 -36022,44378 -39149,44151 -38749,44262 -36524,45489 -39630,45246 -38678,43050 -38805,43472 -36611,46457 -40358,44017 -42141,45706 -36701,43206 -37160,42132 -39036,46009 -38631,43541 -39553,42753 -38443,45629 -35876,43700 -37021,42818 -41819,44466 -40028,44930 -37346,45508 -38863,44153 -38508,42962 -37264,47422 -38967,44890 -37439,44820 -37270,43745 -38396,44576 -38385,42809 -38104,44902 -36294,42107 -36196,48017 -37836,43781 -38015,47510 -36982,42306 -34913,45567 -35954,45537 -37321,45452 -38878,44922 -36692,43157 -39976,45731 -36945,43736 -39339,47635 -37645,43455 -39633,45001 -36611,43308 -34906,46250 -38611,43370 -41704,45883 -39621,43859 -38077,43794 -40492,47761 -34702,44962 -37823,45829 -36125,46077 -39395,47560 -37207,41740 -37616,47074 -40281,44811 -38038,48847 -39125,42626 -36602,45948 -38478,45047 -37382,44795 -34334,42680 -36768,41959 -37938,45945 -35861,45653 -38094,44260 -37969,44116 -36962,45354 -36490,44675 -38348,45436 -40941,43844 -36794,42112 -37542,46600 -37933,46235 -41131,42932 -38015,46380 -36468,45109 -35208,47795 -38449,43572 -39124,42972 -35984,42959 -40255,44800 -37430,41616 -36451,44885 -38267,44239 -38653,43402 -39128,42928 -40318,44621 -39291,43282 -36671,44622 -37140,44018 -36271,44809 -38421,44847 -37125,44254 -41955,45767 -37094,44119 -37694,42646 -38965,45780 -37904,44387 -39379,44164 -36780,43453 -38535,43780 -38827,45565 -37760,44128 -37103,46501 -36567,45438 -39429,44771 -38365,45290 -37201,46980 -38197,42246 -38657,45536 -37755,43877 -37701,44638 -40228,46360 -35969,44284 -36903,42584 -38661,44045 -38646,42669 -37416,45799 -36035,49446 -38117,50251 -36690,49591 -34794,50227 -37120,50499 -35693,52595 -34424,50941 -35866,51091 -37703,52241 -34587,49905 -33678,52163 -36568,52539 -35268,51811 -38729,49255 -36501,48967 -34736,48182 -33096,50259 -37830,51496 -35451,47900 -35724,51642 -36425,52080 -35938,51733 -38012,50808 -33453,50485 -36714,49251 -37741,49565 -37294,50769 -37509,49964 -34605,51599 -35289,50416 -38044,50643 -37268,53110 -36656,50566 -36229,52718 -35130,50291 -36510,50240 -36021,48965 -36001,50147 -38506,49918 -38123,52510 -35792,48033 -38875,51578 -36128,48920 -33825,51800 -38347,52233 -33348,49892 -36163,53031 -38329,47862 -36978,48153 -37327,51814 -35640,50947 -38899,50810 -35153,49820 -37773,51076 -35854,49904 -36557,48528 -39462,50878 -35609,51438 -36400,49928 -39355,49950 -35678,48944 -36240,50203 -37851,50911 -35529,48483 -34856,50507 -34555,47854 -37617,51514 -35288,52498 -37102,50697 -36117,50939 -36195,51606 -37334,49489 -36894,47891 -36510,50444 -35679,51251 -34039,48581 -35416,50433 -35292,47507 -35473,49117 -36805,51837 -34907,49407 -38576,50876 -36911,52330 -34151,50380 -35994,50817 -35873,50003 -36406,50463 -36711,51816 -36773,50930 -36847,53455 -37462,52043 -37317,49835 -36221,54174 -34893,50011 -37153,52163 -34999,50316 -38215,53643 -36818,50538 -34119,52062 -36099,51107 -34017,50315 -34972,50553 -33611,50666 -33361,48121 -38446,48060 -34622,51962 -31946,51702 -34976,51227 -34143,49934 -35518,50270 -36539,51996 -34748,51075 -35055,51610 -37740,50009 -38157,49848 -37775,49692 -36319,52029 -36552,51655 -32979,50394 -34994,52092 -37047,48811 -36847,53569 -34617,52089 -37507,50353 -32954,50861 -36008,48930 -38371,51242 -34908,50703 -37348,49716 -35338,51900 -36979,51524 -35275,50848 -37365,52976 -36288,52087 -35328,53446 -34733,51912 -35553,51517 -38070,53037 -35152,50692 -37005,51257 -36522,50164 -37810,48108 -36619,46682 -35912,49827 -38795,48442 -34981,48664 -36403,48903 -34507,47459 -37485,51322 -38515,50074 -31066,46469 -30611,46226 -29328,44467 -29589,46786 -30863,47267 -32118,43011 -33642,48588 -29513,44633 -28483,46037 -30420,42435 -31130,46909 -29934,47200 -32303,47345 -30906,47311 -29581,44268 -28832,44831 -29906,47016 -31073,46483 -30198,47951 -31032,45152 -32141,43787 -27818,46878 -30370,43579 -30879,41734 -31448,44717 -33078,44208 -30581,46960 -32202,47711 -31905,46820 -36071,44535 -28440,44810 -31170,46097 -32193,45876 -34126,46746 -31067,45079 -31167,47656 -33790,46438 -30561,46264 -31109,44892 -33014,45886 -32463,45301 -30997,45889 -30534,46102 -29735,48055 -28512,45840 -32901,45871 -31926,45424 -32819,47173 -31542,45614 -30793,42766 -30764,43714 -31793,46337 -31657,46117 -30537,43629 -32209,47167 -32744,43999 -29246,46479 -29476,43739 -30758,41842 -30553,47040 -31802,47476 -29976,46087 -30957,47930 -32118,46390 -30694,44466 -30439,47075 -31920,46382 -31778,47518 -29259,45342 -30472,44653 -32252,46230 -31852,45306 -32198,46699 -31370,45222 -32264,46894 -32335,45997 -31154,45908 -28736,40792 -29679,46301 -32210,46786 -31213,43528 -31291,44107 -31127,47321 -28118,44775 -31119,46055 -29705,47057 -31624,45467 -30790,47566 -31604,46454 -30100,45879 -29919,45857 -30801,44512 -33008,44407 -32062,45990 -29052,45808 -30659,44846 -30026,45682 -30627,44454 -30382,43613 -31871,44973 -32139,46892 -30578,44542 -29043,45436 -32211,48405 -30016,44487 -31178,44394 -30522,46566 -32049,47819 -29855,45626 -31054,44541 -29608,45031 -29612,45840 -31350,44748 -30806,45234 -33610,44086 -33021,43481 -31152,46517 -29368,46709 -30888,45683 -33108,45964 -34179,48012 -29599,44203 -28615,47158 -31622,45004 -30047,45342 -31991,44255 -31144,43395 -29855,45069 -29912,46430 -30220,45595 -29812,46044 -29899,45748 -34751,49387 -30128,45204 -30635,43889 -30294,45296 -31764,46849 -34639,46169 -30302,47776 -30371,45565 -31911,45528 -29707,44749 -31573,45804 -30257,45725 -31476,44300 -28961,43127 -30635,45556 -31375,45645 -31662,45383 -30947,43537 -23842,44933 -25896,45359 -21800,47934 -24542,44728 -23441,45886 -24535,44138 -24486,43549 -25819,45207 -24646,45406 -24392,46261 -25166,45053 -22211,45191 -20458,45329 -24316,45453 -21958,45560 -22184,44249 -23144,45494 -24266,44510 -26221,45421 -22912,46671 -25740,44473 -23877,45909 -23609,46656 -23433,45945 -22387,47332 -22050,45954 -21444,46964 -22051,44212 -23554,45863 -24929,43868 -22096,47233 -23462,44483 -25301,46117 -22168,46142 -23939,46011 -24675,45135 -23107,46354 -20963,45739 -22876,45874 -23487,42557 -22163,45795 -23404,44335 -21221,44474 -22638,45554 -21615,48163 -20714,45805 -23688,45829 -23515,46366 -23692,44325 -24567,43379 -24343,46878 -23272,45633 -21255,44721 -22392,47698 -22575,45576 -23378,45780 -21147,44235 -23016,45266 -21108,45235 -23136,46375 -23584,44797 -24890,43027 -24311,41002 -24738,44640 -26216,43410 -23658,45171 -23855,45931 -22615,45157 -23820,44976 -23767,43141 -21854,45512 -20838,46554 -25822,48220 -21171,46906 -23376,45082 -24788,44771 -24522,45861 -25495,42792 -23958,44468 -23825,46811 -24527,46626 -23835,46847 -22937,43548 -21657,45779 -24273,42879 -26228,46553 -23338,46902 -24477,43061 -24736,45066 -22976,47248 -23230,46643 -23589,42521 -22285,45629 -26468,45504 -21561,44237 -22250,45658 -23906,45475 -23754,47759 -23594,45950 -24330,45763 -25198,46841 -24438,45278 -22378,42929 -25044,44899 -22934,45175 -24259,43678 -24947,45212 -23737,44771 -24847,44152 -23038,45476 -23277,44688 -20307,46589 -20494,45315 -25807,47714 -22166,45254 -25532,46572 -27376,45995 -22506,43691 -24987,44077 -22999,46007 -22034,44197 -20914,44091 -25535,46274 -23288,45258 -22341,46998 -23954,47601 -21368,45917 -23746,45135 -25316,46217 -22485,48161 -24868,46549 -23674,43785 -22995,44707 -27463,46986 -25679,47098 -21579,45924 -21055,45837 -26609,47476 -24628,45035 -24355,48292 -24966,43815 -23763,44750 -20485,46394 -23524,46587 -23628,44730 -25693,46232 -25345,45149 -22546,43351 -24514,48478 -22225,44140 -56907,37079 -60236,35088 -58110,38682 -59019,39748 -55932,35163 -57632,37220 -56429,35600 -59796,34874 -51782,34639 -54794,34578 -55615,36243 -57356,40144 -58457,37432 -58770,33452 -58965,33085 -55470,35116 -56993,32158 -58047,36416 -54381,36820 -57391,35246 -56730,35577 -52492,35399 -54286,34827 -55842,36136 -56678,35623 -56690,36823 -57832,36316 -56688,36583 -58706,36418 -55517,34972 -56809,36297 -55983,38451 -57652,35563 -56680,34674 -55269,35481 -56805,36159 -57312,35967 -55628,34757 -58214,37687 -57022,36838 -56611,34057 -55580,34586 -58427,32683 -55448,37197 -56636,35529 -53222,36200 -56396,37255 -57306,37084 -57593,37299 -57370,36555 -55510,35439 -56813,35086 -58070,35178 -57381,34383 -57335,32064 -57649,35291 -55892,36852 -56074,35582 -57906,33048 -55366,35650 -56413,36418 -56941,38327 -57154,33712 -57750,36800 -57857,36922 -56143,35658 -55338,35743 -56441,35275 -56414,37396 -59486,32151 -58706,36533 -52659,34777 -59404,32845 -56922,35768 -57726,35998 -57200,36580 -57944,36151 -56618,35436 -59034,35201 -57527,34254 -55893,34795 -59479,34096 -56696,36827 -58247,36777 -57425,33591 -55633,35639 -58824,35451 -56641,37864 -56541,35719 -58690,38619 -57601,35635 -57601,38899 -55493,35034 -56406,35362 -54744,37285 -56968,36170 -56554,34309 -57672,34909 -56549,36908 -54899,36989 -58177,34610 -52736,36955 -57200,36282 -56107,34721 -56844,34985 -59046,35909 -58878,34978 -55592,36014 -57442,38090 -55333,34329 -55756,36134 -57707,36517 -56490,35034 -55408,37045 -55350,37801 -57650,36971 -57240,34898 -56276,34870 -56026,35279 -55507,39069 -59313,34984 -59314,35053 -55148,36561 -55846,33030 -58280,35077 -57860,36410 -53799,37256 -56172,34623 -56629,34903 -57012,37189 -61328,34539 -58570,36942 -55822,35934 -58008,34512 -56810,36292 -57603,34029 -59246,36194 -53045,33476 -58231,34186 -53386,37554 -54858,34270 -54851,35170 -56299,36158 -55829,34669 -57130,33622 -57045,35018 -55963,37150 -57850,35626 -57398,33876 -57433,35084 -57353,60000 -58154,59780 -59668,60897 -58098,61604 -60212,56867 -58558,56754 -57238,61962 -57393,60130 -60954,58518 -59449,62121 -58116,61273 -56322,59335 -57785,59295 -60018,58622 -58845,62613 -58689,61640 -57082,58629 -56935,61044 -58391,61517 -60966,58270 -60804,57443 -60743,58206 -59138,60401 -59953,59003 -60969,59822 -57136,61329 -57366,61945 -56366,57724 -58665,59932 -60758,60881 -57980,59322 -59239,61982 -57812,61923 -59704,60580 -61020,59430 -59976,61896 -60409,59802 -59165,59687 -57762,60304 -58771,60580 -57753,59203 -57852,60171 -59079,59352 -56843,59151 -60331,57240 -57591,61596 -57063,58649 -56693,58774 -57642,59436 -58329,60180 -59112,63187 -57718,59894 -56937,59156 -57576,59542 -58613,58762 -60267,60706 -57706,56481 -59214,58361 -61073,59807 -57207,61078 -58015,59153 -58158,58562 -55203,57018 -58219,61499 -57782,60002 -55784,59163 -59345,61352 -59269,59992 -56691,59491 -59024,60718 -59110,60648 -58750,57843 -59118,60039 -57473,59889 -57935,59287 -58935,58666 -58889,60334 -60927,60647 -59624,59604 -58797,58377 -58624,58748 -58691,58145 -60046,58263 -59449,58883 -56818,60227 -60006,60524 -59772,62508 -57843,58840 -59475,60281 -57562,57847 -57692,60874 -59111,59739 -55418,59726 -57647,61654 -57192,63091 -56910,61194 -60549,59383 -58222,62395 -59915,58433 -59520,59618 -58928,60595 -59722,59830 -61347,59432 -61654,61450 -56954,58817 -56034,59874 -60069,58113 -58563,62792 -59022,58759 -56745,59632 -58611,56944 -58213,61124 -59832,61819 -57659,62508 -58167,57737 -56924,58052 -59983,59647 -60295,58226 -59571,59704 -59407,63359 -61438,60731 -58412,60555 -59087,60200 -59921,58297 -62507,59886 -56500,61376 -60955,57896 -58439,61605 -56364,59088 -56487,61747 -59447,57392 -57894,59036 -57925,61583 -61135,58271 -59445,59658 -59387,60014 -58154,60283 -55361,61450 -59573,59358 -60407,60339 -57851,60497 -56974,60278 -58959,61260 -58590,59525 -56814,60167 -56482,59948 -59678,56732 -56898,59377 -61084,58521 -60235,57996 -35967,36673 -33802,37020 -34261,37067 -37405,33958 -36836,39256 -37201,37141 -33942,34583 -36874,35950 -36087,35914 -35266,37658 -35368,35938 -37797,36278 -38059,35143 -37189,38589 -39025,38317 -39884,40043 -34384,37619 -35438,35961 -35228,34409 -36656,39035 -34657,37807 -34997,35538 -34596,37163 -36515,36356 -36659,37772 -37432,39281 -35778,38273 -35673,37211 -35254,33638 -36100,37456 -38717,38000 -37182,37411 -35648,39129 -35955,37847 -36359,37310 -35721,36229 -36528,36061 -39397,39374 -36008,35818 -34522,35773 -35101,38142 -36844,38976 -36672,36938 -36638,35819 -35636,37443 -36690,39754 -35091,35641 -36944,39148 -35483,38084 -33394,37319 -35390,35563 -37099,38588 -38095,39196 -36056,34964 -35612,35819 -34622,37604 -33618,37049 -37790,37999 -39063,35717 -36444,34614 -37971,36374 -32167,39987 -36206,36422 -36389,38939 -36095,33268 -37525,38632 -33540,39200 -35076,35331 -35191,37667 -33916,38665 -36172,35806 -36579,35985 -37915,37571 -35600,37619 -32910,36355 -35412,36473 -36407,36157 -36663,37415 -34432,35853 -36058,35597 -34996,36782 -38645,36855 -35811,37422 -34222,38934 -36509,37087 -34560,38446 -36209,37346 -34940,35990 -35403,36688 -32942,35010 -35436,37366 -37768,35501 -34772,37566 -37396,38924 -37109,39039 -36322,38482 -36164,36125 -35531,36570 -37177,35936 -35355,38390 -38130,36011 -36242,37643 -37882,36742 -36127,38450 -35394,38220 -34349,37125 -34947,39400 -33437,35442 -34167,36965 -36172,39484 -37370,38669 -37667,37350 -36974,38282 -35801,35541 -35609,37194 -36795,34454 -34626,36266 -35808,36376 -33613,39794 -37801,36929 -38443,39283 -33652,37501 -35332,38247 -37264,36885 -35768,33850 -33922,37009 -33846,33297 -33715,38111 -34553,37161 -36826,38107 -35007,39211 -36173,35498 -36725,35697 -36455,37227 -35395,37619 -34614,36595 -35110,36198 -34870,39058 -35579,39250 -36919,37870 -35851,39142 -38539,37485 -35082,36246 -32801,33333 -35038,34405 -35494,35663 -37480,35672 -35852,35216 -36125,38191 -36039,37098 -36216,62182 -37992,59534 -36398,59165 -33519,59516 -37891,59892 -37835,56856 -36486,58780 -36333,58448 -35492,58360 -39398,58165 -36215,57623 -36229,58559 -35847,60401 -33122,61567 -36575,58483 -38437,59774 -36403,61703 -36423,59073 -35423,57630 -36850,56751 -33959,57663 -36243,57771 -37479,60292 -39385,58486 -35322,59148 -35700,57384 -36242,57635 -36696,59198 -34637,57665 -34443,60316 -37166,58232 -39283,59107 -36049,59576 -34553,59382 -40134,59872 -33630,58312 -35047,60446 -36709,56868 -37404,56050 -37599,57510 -36454,59424 -38035,58873 -36308,60312 -38558,56670 -36529,58009 -32534,60827 -35346,58988 -34712,57869 -35561,59193 -35534,60214 -37053,57010 -38314,58604 -38318,60919 -38027,59660 -35355,60826 -35436,59180 -35727,58236 -39398,60099 -37269,57920 -36889,59486 -37566,59456 -39104,58213 -32504,60521 -35603,58464 -33987,58301 -38181,57802 -33486,56845 -36799,61300 -36246,57201 -33218,58279 -35125,58821 -36219,58974 -37589,58770 -40243,57661 -35361,62227 -38232,59464 -35237,58902 -35398,58700 -37988,59312 -35644,59384 -38422,59220 -37090,59149 -38945,59787 -34996,58737 -34596,59765 -36992,56453 -33822,59036 -35211,58983 -36283,59567 -38990,58154 -37488,61935 -35445,59206 -37798,56597 -35170,59819 -33624,58303 -35462,61614 -34945,57757 -38089,56389 -37372,57669 -39872,58481 -36960,58594 -35192,61069 -37556,56733 -37083,57931 -36878,61006 -37226,57241 -38515,58026 -34289,56684 -35741,57634 -37745,57622 -36805,60016 -34914,58404 -38566,59390 -36967,58135 -36433,57684 -34796,60094 -36645,58435 -36421,57942 -36037,57311 -35578,57692 -33356,61093 -33015,57987 -36045,57448 -33606,59280 -37937,56751 -35457,58671 -37360,59696 -35066,57896 -36783,59577 -34208,56715 -36846,60935 -35141,60571 -36861,59309 -34573,59067 -38523,59697 -35104,58388 -36442,57756 -36551,60388 -35711,57926 -36064,60505 -38706,57037 -36216,57898 -39611,56741 -35988,58251 -37263,57129 -37094,59676 -35217,59875 -36483,57847 -34924,58072 -37060,58762 -30908,61364 -29802,58114 -30571,60758 -34779,62221 -30304,61141 -30877,60859 -30681,62149 -31259,62320 -30567,62523 -28728,61702 -32333,61933 -29047,58154 -31463,61149 -30898,60616 -28229,59101 -33697,58534 -29758,63528 -30280,62465 -32349,61066 -32134,61037 -30612,61541 -33233,62021 -29987,61369 -29079,60255 -29589,60622 -28995,58890 -31627,61188 -29272,59183 -28392,61346 -31204,59112 -30174,60328 -31578,60296 -29445,64978 -31977,59480 -31182,60250 -30648,60178 -30532,61950 -31720,61379 -32583,61093 -30050,60218 -31627,61090 -31236,60424 -28553,62002 -30375,62924 -31573,60997 -27505,58926 -30061,61246 -32649,59545 -27696,59838 -30506,59686 -32074,61939 -28616,59416 -29085,60541 -30515,60969 -33532,59075 -28578,63180 -31643,60477 -28729,63139 -31112,61673 -32361,59991 -32426,59919 -31204,58913 -29626,60190 -30075,59907 -32218,62122 -30740,62257 -28555,61394 -31318,58248 -29618,60724 -32557,61120 -31530,59440 -32126,60135 -29801,61182 -29148,58130 -26807,61319 -31413,60511 -30647,61432 -30619,60514 -31284,61697 -31312,60742 -33387,61847 -32660,59958 -30795,63840 -30746,61100 -31879,60106 -33018,62972 -30887,62360 -31474,60121 -31797,61321 -30395,60514 -29160,57565 -30133,63934 -33171,59359 -28342,58906 -30960,62047 -30927,61258 -30161,62149 -29448,62355 -30068,62245 -32579,62231 -32590,63313 -28653,61470 -31663,61270 -33003,60476 -31142,59600 -27316,63731 -31472,59250 -31233,61286 -32954,59101 -28250,60235 -30145,59447 -30168,60662 -32390,58431 -30330,61187 -31866,61099 -29485,63621 -27659,60100 -29690,64853 -30276,59599 -31279,61858 -28391,59730 -31215,59848 -33275,60563 -30749,59966 -28904,59191 -27819,63600 -30019,58071 -31985,62537 -32412,63477 -27380,61315 -30483,60444 -28526,58659 -31133,64758 -32997,59655 -30720,60651 -31643,59695 -31779,59328 -31849,60708 -31872,60703 -29130,58041 -28327,60138 -30265,59751 -32061,59778 -29842,62137 -33359,62329 -29116,59119 -30071,60466 -29916,60125 -28434,59636 -29436,60956 -27434,54958 -25440,57862 -24392,57589 -26136,56016 -26253,58899 -24733,56201 -25528,59581 -25738,58235 -24618,55531 -26834,55097 -25201,54565 -25851,58222 -27108,57491 -28837,54748 -24946,56824 -25052,57829 -28402,57647 -25052,57022 -27181,54919 -28052,55809 -25196,55203 -26591,56646 -29474,56798 -27070,57594 -26481,56658 -24784,57237 -28064,58174 -27715,55387 -26470,56078 -23811,56713 -26542,57297 -27473,55726 -26275,56590 -25919,59329 -27550,55740 -28594,55605 -28250,58482 -27827,58698 -26215,55199 -27517,55156 -27881,60061 -27012,54253 -26172,55215 -26319,58948 -27900,56990 -28810,55914 -28021,56815 -27286,59569 -25494,55960 -25659,57314 -27469,55207 -26043,55705 -26718,53997 -27707,56661 -27634,56842 -27707,56972 -26205,53325 -26512,58723 -27821,56672 -25689,56135 -25979,56888 -26345,56949 -24731,56832 -25629,58886 -29908,56769 -25873,59678 -27128,54407 -27287,58184 -26387,58854 -26891,56558 -24536,56381 -28383,58361 -27493,56974 -28582,58290 -25283,58667 -26042,59496 -28772,57273 -25425,57151 -28909,58542 -26560,55691 -27188,56510 -26174,57058 -23262,57537 -26490,58074 -27874,55221 -24446,56245 -29227,57928 -26149,60135 -25540,56691 -25014,56055 -25970,55621 -28657,57812 -28212,55783 -25507,58317 -27306,57368 -27463,56882 -23994,55242 -24879,56386 -24594,58438 -28033,54727 -29053,58326 -26193,55842 -29259,57100 -27525,57634 -28073,56257 -26774,57001 -25383,56911 -25669,56972 -25208,56211 -27256,59403 -27196,59444 -27331,56041 -27937,58138 -28509,58324 -26717,60264 -27955,56280 -25446,55704 -26109,58656 -25760,55776 -28212,56159 -28233,54684 -26449,55946 -25001,58362 -26962,56689 -25916,54106 -28777,57742 -27815,58195 -25663,55384 -27901,55860 -25659,54386 -28759,58288 -25021,56847 -26692,57000 -27775,54914 -25818,53650 -25985,57795 -27033,60004 -27613,55744 -28592,54269 -25260,56723 -24970,59023 -23462,57642 -26119,56817 -29242,56662 -25347,57105 -26091,56821 -26145,58505 -26896,57284 -25137,55409 -27354,54316 -19261,63453 -20147,61505 -19188,57789 -19583,63659 -17969,62228 -21897,58917 -22606,61448 -19622,64221 -22246,61319 -20384,62437 -20960,61852 -21577,60141 -18709,61578 -18999,61780 -20587,62383 -19768,60627 -22982,59562 -19533,60480 -20782,61636 -19005,60807 -18261,60547 -21899,61237 -19257,62118 -18804,62526 -21096,59815 -20354,59784 -19943,63108 -19049,59645 -19177,58865 -19048,62924 -23096,59668 -21449,60845 -20765,60709 -21064,60931 -19837,60753 -18422,62176 -19779,61803 -19838,59122 -19108,61782 -21412,58791 -20671,61282 -18870,60325 -18642,58455 -19395,59800 -19335,61410 -19770,59397 -18068,61918 -21368,59942 -19530,58199 -20181,60841 -19764,63838 -18920,61044 -18680,62674 -19070,61422 -21307,64529 -19144,62358 -19290,60747 -19871,62381 -19696,57420 -19797,61359 -18344,59637 -20259,60511 -20316,61803 -22369,62265 -19096,59674 -20453,61587 -20380,60733 -16846,62613 -20002,57292 -19912,60502 -19641,59926 -19601,60881 -19285,60802 -21062,61940 -20568,59655 -20338,62938 -21393,62630 -19272,60480 -20007,61561 -20784,60935 -19038,60983 -17653,62598 -18996,59942 -19506,63413 -19294,57629 -19154,62093 -18934,63661 -20737,61019 -20490,62450 -18960,62751 -22403,62224 -20378,62549 -18929,59621 -20252,61749 -19309,61793 -16591,60560 -19015,62840 -17643,60949 -18426,62525 -20294,61802 -20151,62252 -18502,63614 -18015,60258 -19545,60834 -21792,62240 -19942,59731 -20535,59462 -20768,63354 -18347,59545 -19276,62396 -18781,60559 -20515,61410 -19925,58496 -21944,60190 -21072,63597 -19964,60809 -20709,63801 -18101,59879 -20971,58909 -22489,59259 -18892,60475 -22071,61236 -20481,60914 -20438,59851 -19803,60968 -20257,61196 -19242,61797 -18406,58116 -20868,59488 -17152,59537 -19680,62580 -19930,60962 -20911,63782 -18513,61092 -21616,62776 -21783,61970 -20687,60667 -18989,60037 -19871,62312 -17818,62484 -20526,61492 -20561,61164 -21231,59423 -18961,60872 -20211,60986 -21615,61597 -19972,62712 -19606,62894 -19063,62295 -20217,63442 -19143,53284 -17326,51720 -16296,54087 -16286,54449 -20417,56568 -16111,53619 -15846,56000 -19105,52235 -19655,54785 -16638,53423 -16223,56656 -16166,53836 -16738,54689 -17753,52609 -18846,53892 -15101,50950 -16371,54091 -19680,54296 -17314,54956 -19294,52649 -20358,53540 -18491,57638 -17300,51911 -13909,53337 -16250,56716 -16803,53706 -17777,51711 -17494,56321 -17023,52554 -18480,54137 -17989,54877 -14909,52137 -16271,55503 -15579,54275 -17775,55776 -17573,56376 -14562,54344 -16017,52583 -17725,53549 -17782,57990 -18273,55960 -16798,54135 -16402,54427 -17604,57415 -15159,52909 -17093,56620 -14665,53393 -16840,56442 -15944,52902 -15383,53914 -19752,54971 -17200,52488 -16393,55068 -17783,51416 -15985,51728 -16315,54450 -16104,56565 -17658,52827 -16905,55169 -18617,55656 -16219,53637 -17610,58180 -17395,54596 -17136,53618 -16675,50940 -19876,54521 -18453,56324 -17211,52619 -20832,53051 -17426,55344 -18261,53072 -16398,54369 -18211,53160 -16394,57589 -20680,56180 -16527,53323 -17108,54515 -15165,54667 -16265,53570 -16364,55389 -16595,52653 -14197,54364 -16746,55228 -14365,55602 -17741,55439 -14590,55330 -15981,55498 -17050,55534 -17805,55269 -19018,53560 -14927,54599 -17892,53512 -15779,56775 -16612,53816 -18536,55169 -16108,54076 -14127,53882 -18780,55399 -17650,54611 -16732,52426 -17318,55292 -18541,55919 -16938,55514 -15396,53105 -17508,55488 -17431,54420 -16714,55948 -17403,56861 -18068,54386 -14683,54085 -17898,55100 -17206,53687 -17583,57472 -17075,54403 -16780,53847 -15915,55154 -19939,54424 -14995,55889 -16928,56318 -16097,56428 -15133,52003 -15860,57599 -18488,56212 -17423,55459 -16507,54347 -17751,53859 -16898,54827 -16932,55866 -19892,54860 -16278,52466 -16719,55585 -17800,53918 -18378,56011 -13907,54576 -17044,55877 -15476,55040 -17358,55280 -18717,52598 -17547,55041 -17304,54119 -19798,52845 -16116,54683 -14980,53904 -16067,56094 -16546,54778 -16137,57399 -17141,54202 -17786,55157 -16714,51438 -14737,55071 -11897,49856 -8604,49746 -10766,51585 -12389,49818 -8766,51369 -11798,53052 -10834,51147 -9549,50996 -10321,50691 -10565,51704 -11845,51491 -11060,50234 -10171,48859 -10919,50525 -11480,50604 -12475,49220 -7385,51656 -11437,51406 -10670,49260 -8654,50049 -9927,51309 -11022,50515 -10633,50511 -11096,50971 -8723,52304 -12851,51373 -11786,51096 -11239,52647 -9454,51165 -8982,51774 -12236,51043 -9741,50089 -11398,47759 -9862,53085 -12114,49993 -9243,53664 -11639,50146 -9706,48399 -10229,53155 -10935,51458 -11745,50495 -13063,51433 -11225,51892 -10680,51164 -11263,48928 -8633,49581 -12697,52216 -9171,50386 -8066,52133 -10401,53090 -12416,51460 -10794,50115 -10580,51553 -11365,50973 -9763,50495 -9416,50770 -7934,48544 -10806,48952 -10904,51342 -9657,52423 -12791,50426 -8842,50261 -11640,50257 -11450,52510 -10480,51773 -11020,49726 -8705,49365 -8276,48524 -10859,51248 -6798,51275 -9359,51444 -8524,52422 -8506,50665 -7906,50299 -9247,50471 -11773,50161 -8730,51510 -8422,52679 -13020,50329 -10991,48211 -11536,49673 -11062,50068 -10653,51048 -8444,50174 -11876,50023 -11611,48473 -9327,52012 -10749,51406 -10026,52647 -10579,49821 -13981,49623 -10579,50729 -9390,51106 -12594,52133 -9198,50826 -11435,50996 -12436,48816 -9815,51501 -11037,50777 -8869,51886 -9744,50911 -10333,50182 -10622,52334 -7739,49873 -12376,48666 -12199,50485 -13144,49604 -8524,50708 -11095,51738 -9592,50262 -10879,49512 -11130,49369 -10337,49890 -9895,50510 -9703,51958 -7720,51431 -9481,49546 -7484,52113 -8583,49768 -6951,51758 -10191,49243 -11820,50017 -7445,50769 -10764,52080 -10444,50923 -9616,52793 -13482,49941 -11149,51188 -11076,53717 -11109,49944 -10704,51371 -9443,52075 -8868,52990 -10757,51325 -11396,53232 -10048,52277 -10606,53363 -9657,50553 -10058,49889 -9324,49714 -9816,55272 -11888,48809 -9837,50011 -11269,48664 -9836,52030 -10577,51583 -6885,51244 -11023,49802 -10839,50455 -10013,50471 -3364,56093 -5522,54143 -4557,54902 -4140,54842 -4927,52701 -5607,54784 -4864,55680 -5617,55660 -5366,53856 -6727,54732 -2968,54214 -5388,53392 -7034,50514 -4207,53376 -3110,55381 -3991,55631 -3589,53393 -1756,54502 -6577,53657 -6675,54728 -5984,55785 -3520,55818 -3375,53677 -6947,52316 -2677,54186 -3465,54037 -4750,55207 -4977,51710 -2847,54305 -5988,53574 -4362,53432 -5003,52684 -4715,54506 -4759,57743 -5027,55655 -7431,50756 -3849,54348 -2248,53985 -5088,52898 -2916,54180 -4382,53067 -3581,58080 -2707,55155 -4962,56531 -2326,53879 -4410,54098 -2875,55177 -5539,55039 -2796,57052 -7335,54395 -5489,52708 -4492,56754 -2056,56061 -6689,53870 -5902,53527 -5359,54762 -7002,54536 -6570,55309 -5909,54502 -4118,53600 -4081,56221 -3662,53763 -4418,56325 -4995,57057 -7625,54059 -5729,53643 -5509,54479 -2512,53861 -5781,54701 -3499,55206 -4780,56332 -6726,55910 -4567,55033 -3933,54316 -4329,53012 -6046,55497 -5418,54124 -5759,55028 -5970,54618 -5664,54114 -6835,55281 -5026,55207 -4332,56121 -6236,54262 -4946,55080 -4356,55423 -5755,53627 -4231,53432 -4453,53923 -5516,56043 -5268,56645 -4567,55451 -3441,55616 -4911,53538 -6503,53356 -3746,53927 -4245,55965 -4413,54165 -4159,54035 -4115,53150 -6251,55245 -5389,54870 -6666,54030 -2575,54211 -4749,55593 -2996,55489 -3594,53609 -5764,53896 -5192,52602 -0,54499 -7700,54988 -5770,53331 -4235,54556 -4731,54238 -4877,55291 -4023,57278 -3874,55784 -5255,52393 -6228,55206 -5618,54536 -2659,55959 -4084,54843 -4524,56226 -4061,54024 -3597,52748 -6267,57098 -3944,55580 -2596,56386 -6210,54578 -4785,54895 -5536,54428 -5945,52615 -4028,55483 -4222,57392 -5088,53006 -5378,55302 -6635,57985 -6044,55199 -3305,55031 -5133,53898 -4636,57162 -5065,57069 -4260,54579 -4761,54969 -4711,53314 -6752,54903 -6702,54483 -4405,54784 -7579,54208 -3600,53791 -10256,60907 -8676,57719 -9383,61340 -10156,60841 -8627,63762 -12376,62842 -12048,59831 -10279,57681 -11465,61289 -9589,60754 -8002,60609 -10364,61512 -12948,60162 -12277,61976 -8576,60303 -12546,60499 -7951,59432 -9986,60034 -10939,58346 -9893,59586 -12095,64166 -6646,63005 -11091,61195 -10950,57600 -10930,60322 -11468,61950 -8554,60761 -10663,59125 -9431,62300 -9966,59064 -6693,60430 -12090,59869 -10936,61184 -12124,60279 -11187,58843 -8710,58937 -10102,60364 -10616,60683 -11579,58617 -8521,59545 -12110,59455 -9117,60001 -14665,60436 -8431,61105 -11971,59851 -12613,59379 -10372,57097 -11306,60035 -10198,58488 -11721,61075 -10690,61867 -11511,62215 -8638,60548 -9347,61512 -8446,60600 -10530,56564 -10726,60737 -10334,60937 -11226,57861 -10802,56031 -12622,58547 -10938,62519 -11210,58343 -13252,62021 -12559,59819 -8908,59029 -12930,62857 -10570,63000 -8778,63637 -13836,60414 -8240,60831 -10210,58723 -12347,61746 -10963,57947 -10824,61369 -9766,58973 -9432,61396 -11631,59714 -10722,61544 -11103,60003 -12424,58655 -11681,59832 -13039,61888 -9932,59316 -11412,64537 -10853,62937 -9972,60044 -11616,60575 -10434,61086 -10993,59910 -9534,61767 -12150,59180 -9933,59269 -13206,62465 -7821,61712 -10844,63287 -13096,62112 -12171,61128 -13063,59700 -10031,61025 -12335,58115 -11878,60429 -10390,61299 -10336,60916 -8238,58683 -13779,60968 -13348,60275 -11955,59006 -8673,62255 -12822,62138 -8471,61739 -9954,60705 -11436,59452 -12430,62195 -10457,61257 -9639,62038 -11068,58255 -9730,63026 -9817,60728 -8339,61080 -10669,61473 -10438,63245 -9520,60139 -8957,61191 -11134,60627 -12965,61972 -9210,59309 -9829,61696 -10746,62172 -10595,61783 -8280,57997 -7644,61816 -11776,61448 -13598,63186 -9058,60416 -10200,62166 -10536,62434 -11719,61142 -9996,61355 -11775,61142 -9033,63414 -9287,62954 -9049,59370 -10457,58942 -9647,59886 -8754,61242 -11165,59822 -8828,59102 -8879,59244 -10002,61399 diff --git a/examples/examples.json b/examples/examples.json index 66d37ae71..934bf0b44 100644 --- a/examples/examples.json +++ b/examples/examples.json @@ -1 +1 @@ -{"BodyPix":{"p5js":[{"name":"BodyPix_Image","url":"../p5js/BodyPix/BodyPix_Image"},{"name":"BodyPix_Preload","url":"../p5js/BodyPix/BodyPix_Preload"},{"name":"BodyPix_Webcam","url":"../p5js/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../p5js/BodyPix/BodyPix_Webcam_Parts"},{"name":"BodyPix_p5Instance","url":"../p5js/BodyPix/BodyPix_p5Instance"}],"p5webeditor":[{"name":"BodyPix_Image","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Image"},{"name":"BodyPix_Preload","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Preload"},{"name":"BodyPix_Webcam","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam_Parts"},{"name":"BodyPix_p5Instance","url":"https://editor.p5js.org/ml5/sketches/BodyPix_p5Instance"}],"javascript":[{"name":"BodyPix_Image","url":"../javascript/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../javascript/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../javascript/BodyPix/BodyPix_Webcam_Parts"}]},"CVAE":{"p5js":[{"name":"CVAE_QuickDraw","url":"../p5js/CVAE/CVAE_QuickDraw"}],"p5webeditor":[{"name":"CVAE_QuickDraw","url":"https://editor.p5js.org/ml5/sketches/CVAE_QuickDraw"}],"javascript":[{"name":"CVAE_QuickDraw","url":"../javascript/CVAE/CVAE_QuickDraw"}]},"CartoonGAN":{"p5js":[{"name":"CartoonGan_Basic","url":"../p5js/CartoonGAN/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"../p5js/CartoonGAN/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"../p5js/CartoonGAN/CartoonGan_WebCam"}],"p5webeditor":[{"name":"CartoonGan_Basic","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_WebCam"}]},"CharRNN":{"p5js":[{"name":"CharRNN_Interactive","url":"../p5js/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../p5js/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../p5js/CharRNN/CharRNN_Text_Stateful"}],"p5webeditor":[{"name":"CharRNN_Interactive","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text_Stateful"}],"javascript":[{"name":"CharRNN_Interactive","url":"../javascript/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../javascript/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../javascript/CharRNN/CharRNN_Text_Stateful"}]},"DCGAN":{"p5js":[{"name":"DCGAN_LatentVector_RandomWalk","url":"../p5js/DCGAN/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"../p5js/DCGAN/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"../p5js/DCGAN/DCGAN_Random"}],"p5webeditor":[{"name":"DCGAN_LatentVector_RandomWalk","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"https://editor.p5js.org/ml5/sketches/DCGAN_Random"}],"javascript":[{"name":"DCGAN_Random","url":"../javascript/DCGAN/DCGAN_Random"}]},"FaceApi":{"p5js":[{"name":"FaceApi_Image_Landmarks","url":"../p5js/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../p5js/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../p5js/FaceApi/FaceApi_Video_Landmarks_LocalModels"}],"p5webeditor":[{"name":"FaceApi_Image_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks_LocalModels"}],"javascript":[{"name":"FaceApi_Image_Landmarks","url":"../javascript/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../javascript/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../javascript/FaceApi/FaceApi_Video_Landmarks_LocalModels"}]},"Facemesh":{"p5js":[{"name":"Facemesh_Image","url":"../p5js/Facemesh/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"../p5js/Facemesh/Facemesh_Webcam"}],"p5webeditor":[{"name":"Facemesh_Image","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Webcam"}]},"FeatureExtractor":{"p5js":[{"name":"FeatureExtractor_Image_Classification","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Regression"}],"p5webeditor":[{"name":"FeatureExtractor_Image_Classification","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Regression"}],"javascript":[{"name":"FeatureExtractor_Image_Classification","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Regression"}]},"Handpose":{"p5js":[{"name":"Handpose_Image","url":"../p5js/Handpose/Handpose_Image"},{"name":"Handpose_Webcam","url":"../p5js/Handpose/Handpose_Webcam"}],"p5webeditor":[{"name":"Handpose_Image","url":"https://editor.p5js.org/ml5/sketches/Handpose_Image"},{"name":"Handpose_Webcam","url":"https://editor.p5js.org/ml5/sketches/Handpose_Webcam"}]},"ImageClassification":{"p5js":[{"name":"ImageClassification","url":"../p5js/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../p5js/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../p5js/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../p5js/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../p5js/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"../p5js/ImageClassification/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"../p5js/ImageClassification/ImageClassification_Video_Load"}],"p5webeditor":[{"name":"ImageClassification","url":"https://editor.p5js.org/ml5/sketches/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video_Load"}],"javascript":[{"name":"ImageClassification","url":"../javascript/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../javascript/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../javascript/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../javascript/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../javascript/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_Video_Load","url":"../javascript/ImageClassification/ImageClassification_Video_Load"}]},"KMeans":{"p5js":[{"name":"KMeans_imageSegmentation","url":"../p5js/KMeans/KMeans_imageSegmentation"}],"p5webeditor":[{"name":"KMeans_imageSegmentation","url":"https://editor.p5js.org/ml5/sketches/KMeans_imageSegmentation"}],"d3":[{"name":"KMeans_GaussianClusterDemo","url":"../d3/KMeans/KMeans_GaussianClusterDemo"}]},"KNNClassification":{"p5js":[{"name":"KNNClassification_PoseNet","url":"../p5js/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../p5js/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../p5js/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../p5js/KNNClassification/KNNClassification_VideoSquare"}],"p5webeditor":[{"name":"KNNClassification_PoseNet","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSquare"}],"javascript":[{"name":"KNNClassification_PoseNet","url":"../javascript/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../javascript/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../javascript/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../javascript/KNNClassification/KNNClassification_VideoSquare"}]},"NeuralNetwork":{"p5js":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Letters2","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters2"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"../p5js/NeuralNetwork/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"../p5js/NeuralNetwork/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"../p5js/NeuralNetwork/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"../p5js/NeuralNetwork/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"../p5js/NeuralNetwork/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"../p5js/NeuralNetwork/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"../p5js/NeuralNetwork/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"../p5js/NeuralNetwork/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"../p5js/NeuralNetwork/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"../p5js/NeuralNetwork/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"../p5js/NeuralNetwork/NeuroEvolution_testing"}],"p5webeditor":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Letters2","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters2"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_testing"}]},"ObjectDetector":{"p5js":[{"name":"ObjectDetector_COCOSSD_Video","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_single_image"},{"name":"ObjectDetector_YOLO_Video","url":"../p5js/ObjectDetector/ObjectDetector_YOLO_Video"},{"name":"ObjectDetector_YOLO_single_image","url":"../p5js/ObjectDetector/ObjectDetector_YOLO_single_image"}],"p5webeditor":[{"name":"ObjectDetector_COCOSSD_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_single_image"},{"name":"ObjectDetector_YOLO_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_YOLO_Video"},{"name":"ObjectDetector_YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_YOLO_single_image"}],"javascript":[{"name":"COCOSSD_single_image","url":"../javascript/ObjectDetector/COCOSSD_single_image"},{"name":"COCOSSD_webcam","url":"../javascript/ObjectDetector/COCOSSD_webcam"},{"name":"YOLO_single_image","url":"../javascript/ObjectDetector/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/ObjectDetector/YOLO_webcam"}]},"PitchDetection":{"p5js":[{"name":"PitchDetection","url":"../p5js/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../p5js/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../p5js/PitchDetection/PitchDetection_Piano"}],"p5webeditor":[{"name":"PitchDetection","url":"https://editor.p5js.org/ml5/sketches/PitchDetection"},{"name":"PitchDetection_Game","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Piano"}],"javascript":[{"name":"PitchDetection","url":"../javascript/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../javascript/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../javascript/PitchDetection/PitchDetection_Piano"}]},"Pix2Pix":{"p5js":[{"name":"Pix2Pix_callback","url":"../p5js/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../p5js/Pix2Pix/Pix2Pix_promise"}],"p5webeditor":[{"name":"Pix2Pix_callback","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_promise"}],"javascript":[{"name":"Pix2Pix_callback","url":"../javascript/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../javascript/Pix2Pix/Pix2Pix_promise"}]},"PoseNet":{"p5js":[{"name":"PoseNet_image_single","url":"../p5js/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../p5js/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../p5js/PoseNet/PoseNet_webcam"}],"p5webeditor":[{"name":"PoseNet_image_single","url":"https://editor.p5js.org/ml5/sketches/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"https://editor.p5js.org/ml5/sketches/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"https://editor.p5js.org/ml5/sketches/PoseNet_webcam"}],"javascript":[{"name":"PoseNet_image_single","url":"../javascript/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../javascript/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../javascript/PoseNet/PoseNet_webcam"}]},"Sentiment":{"p5js":[{"name":"Sentiment_Interactive","url":"../p5js/Sentiment/Sentiment_Interactive"}],"p5webeditor":[{"name":"Sentiment_Interactive","url":"https://editor.p5js.org/ml5/sketches/Sentiment_Interactive"}],"javascript":[{"name":"Sentiment_Interactive","url":"../javascript/Sentiment/Sentiment_Interactive"}]},"SketchRNN":{"p5js":[{"name":"SketchRNN_basic","url":"../p5js/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../p5js/SketchRNN/SketchRNN_interactive"}],"p5webeditor":[{"name":"SketchRNN_basic","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_interactive"}],"javascript":[{"name":"SketchRNN_basic","url":"../javascript/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../javascript/SketchRNN/SketchRNN_interactive"}]},"SoundClassification":{"p5js":[{"name":"SoundClassification_speechcommand","url":"../p5js/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../p5js/SoundClassification/SoundClassification_speechcommand_load"}],"p5webeditor":[{"name":"SoundClassification_speechcommand","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand_load"}],"javascript":[{"name":"SoundClassification_speechcommand","url":"../javascript/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../javascript/SoundClassification/SoundClassification_speechcommand_load"}]},"StyleTransfer":{"p5js":[{"name":"StyleTransfer_Image","url":"../p5js/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../p5js/StyleTransfer/StyleTransfer_Video"}],"p5webeditor":[{"name":"StyleTransfer_Image","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Video"}],"javascript":[{"name":"StyleTransfer_Image","url":"../javascript/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../javascript/StyleTransfer/StyleTransfer_Video"}]},"TeachableMachine":{"p5js":[{"name":"ImageModel_TM","url":"../p5js/TeachableMachine/ImageModel_TM"},{"name":"SoundModel_TM","url":"../p5js/TeachableMachine/SoundModel_TM"}],"p5webeditor":[{"name":"ImageModel_TM","url":"https://editor.p5js.org/ml5/sketches/ImageModel_TM"},{"name":"SoundModel_TM","url":"https://editor.p5js.org/ml5/sketches/SoundModel_TM"}]},"UNET":{"p5js":[{"name":"UNET_webcam","url":"../p5js/UNET/UNET_webcam"}],"p5webeditor":[{"name":"UNET_webcam","url":"https://editor.p5js.org/ml5/sketches/UNET_webcam"}],"javascript":[{"name":"UNET_webcam","url":"../javascript/UNET/UNET_webcam"}]},"UniversalSentenceEncoder":{"p5js":[{"name":"UniversalSentenceEncoder_Basic","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_WithTokenizer"}],"p5webeditor":[{"name":"UniversalSentenceEncoder_Basic","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_WithTokenizer"}]},"Word2Vec":{"p5js":[{"name":"Word2Vec_Interactive","url":"../p5js/Word2Vec/Word2Vec_Interactive"}],"p5webeditor":[{"name":"Word2Vec_Interactive","url":"https://editor.p5js.org/ml5/sketches/Word2Vec_Interactive"}],"javascript":[{"name":"Word2Vec_Interactive","url":"../javascript/Word2Vec/Word2Vec_Interactive"}]},"YOLO":{"p5js":[{"name":"YOLO_single_image","url":"../p5js/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../p5js/YOLO/YOLO_webcam"}],"p5webeditor":[{"name":"YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/YOLO_single_image"},{"name":"YOLO_webcam","url":"https://editor.p5js.org/ml5/sketches/YOLO_webcam"}],"javascript":[{"name":"YOLO_single_image","url":"../javascript/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/YOLO/YOLO_webcam"}]},"ml5_boilerplate":{"p5js":[],"p5webeditor":[],"javascript":[]}} \ No newline at end of file +{"BodyPix":{"p5js":[{"name":"BodyPix_Image","url":"../p5js/BodyPix/BodyPix_Image"},{"name":"BodyPix_Preload","url":"../p5js/BodyPix/BodyPix_Preload"},{"name":"BodyPix_Webcam","url":"../p5js/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../p5js/BodyPix/BodyPix_Webcam_Parts"},{"name":"BodyPix_p5Instance","url":"../p5js/BodyPix/BodyPix_p5Instance"}],"p5webeditor":[{"name":"BodyPix_Image","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Image"},{"name":"BodyPix_Preload","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Preload"},{"name":"BodyPix_Webcam","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam_Parts"},{"name":"BodyPix_p5Instance","url":"https://editor.p5js.org/ml5/sketches/BodyPix_p5Instance"}],"javascript":[{"name":"BodyPix_Image","url":"../javascript/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../javascript/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../javascript/BodyPix/BodyPix_Webcam_Parts"}]},"CVAE":{"p5js":[{"name":"CVAE_QuickDraw","url":"../p5js/CVAE/CVAE_QuickDraw"}],"p5webeditor":[{"name":"CVAE_QuickDraw","url":"https://editor.p5js.org/ml5/sketches/CVAE_QuickDraw"}],"javascript":[{"name":"CVAE_QuickDraw","url":"../javascript/CVAE/CVAE_QuickDraw"}]},"CartoonGAN":{"p5js":[{"name":"CartoonGan_Basic","url":"../p5js/CartoonGAN/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"../p5js/CartoonGAN/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"../p5js/CartoonGAN/CartoonGan_WebCam"}],"p5webeditor":[{"name":"CartoonGan_Basic","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_WebCam"}]},"CharRNN":{"p5js":[{"name":"CharRNN_Interactive","url":"../p5js/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../p5js/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../p5js/CharRNN/CharRNN_Text_Stateful"}],"p5webeditor":[{"name":"CharRNN_Interactive","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text_Stateful"}],"javascript":[{"name":"CharRNN_Interactive","url":"../javascript/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../javascript/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../javascript/CharRNN/CharRNN_Text_Stateful"}]},"DBSCAN":{"p5js":[{"name":"DBSCAN_Cluster","url":"../p5js/DBSCAN/DBSCAN_Cluster"}],"p5webeditor":[{"name":"DBSCAN_Cluster","url":"https://editor.p5js.org/ml5/sketches/DBSCAN_Cluster"}],"d3":[{"name":"DBSCAN_Cluster","url":"../d3/DBSCAN/DBSCAN_Cluster"}]},"DCGAN":{"p5js":[{"name":"DCGAN_LatentVector_RandomWalk","url":"../p5js/DCGAN/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"../p5js/DCGAN/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"../p5js/DCGAN/DCGAN_Random"}],"p5webeditor":[{"name":"DCGAN_LatentVector_RandomWalk","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"https://editor.p5js.org/ml5/sketches/DCGAN_Random"}],"javascript":[{"name":"DCGAN_Random","url":"../javascript/DCGAN/DCGAN_Random"}]},"FaceApi":{"p5js":[{"name":"FaceApi_Image_Landmarks","url":"../p5js/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../p5js/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../p5js/FaceApi/FaceApi_Video_Landmarks_LocalModels"}],"p5webeditor":[{"name":"FaceApi_Image_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks_LocalModels"}],"javascript":[{"name":"FaceApi_Image_Landmarks","url":"../javascript/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../javascript/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../javascript/FaceApi/FaceApi_Video_Landmarks_LocalModels"}]},"Facemesh":{"p5js":[{"name":"Facemesh_Image","url":"../p5js/Facemesh/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"../p5js/Facemesh/Facemesh_Webcam"}],"p5webeditor":[{"name":"Facemesh_Image","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Webcam"}]},"FeatureExtractor":{"p5js":[{"name":"FeatureExtractor_Image_Classification","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Regression"}],"p5webeditor":[{"name":"FeatureExtractor_Image_Classification","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Regression"}],"javascript":[{"name":"FeatureExtractor_Image_Classification","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Regression"}]},"Handpose":{"p5js":[{"name":"Handpose_Webcam","url":"../p5js/Handpose/Handpose_Webcam"}],"p5webeditor":[{"name":"Handpose_Webcam","url":"https://editor.p5js.org/ml5/sketches/Handpose_Webcam"}]},"ImageClassification":{"p5js":[{"name":"ImageClassification","url":"../p5js/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../p5js/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../p5js/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../p5js/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../p5js/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"../p5js/ImageClassification/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"../p5js/ImageClassification/ImageClassification_Video_Load"}],"p5webeditor":[{"name":"ImageClassification","url":"https://editor.p5js.org/ml5/sketches/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video_Load"}],"javascript":[{"name":"ImageClassification","url":"../javascript/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../javascript/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../javascript/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../javascript/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../javascript/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_Video_Load","url":"../javascript/ImageClassification/ImageClassification_Video_Load"}]},"KMeans":{"p5js":[{"name":"KMeans_imageSegmentation","url":"../p5js/KMeans/KMeans_imageSegmentation"}],"p5webeditor":[{"name":"KMeans_imageSegmentation","url":"https://editor.p5js.org/ml5/sketches/KMeans_imageSegmentation"}],"d3":[{"name":"KMeans_GaussianClusterDemo","url":"../d3/KMeans/KMeans_GaussianClusterDemo"}]},"KNNClassification":{"p5js":[{"name":"KNNClassification_PoseNet","url":"../p5js/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../p5js/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../p5js/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../p5js/KNNClassification/KNNClassification_VideoSquare"}],"p5webeditor":[{"name":"KNNClassification_PoseNet","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSquare"}],"javascript":[{"name":"KNNClassification_PoseNet","url":"../javascript/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../javascript/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../javascript/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../javascript/KNNClassification/KNNClassification_VideoSquare"}]},"NeuralNetwork":{"p5js":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Letters2","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters2"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"../p5js/NeuralNetwork/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"../p5js/NeuralNetwork/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"../p5js/NeuralNetwork/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"../p5js/NeuralNetwork/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"../p5js/NeuralNetwork/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"../p5js/NeuralNetwork/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"../p5js/NeuralNetwork/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"../p5js/NeuralNetwork/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"../p5js/NeuralNetwork/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"../p5js/NeuralNetwork/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"../p5js/NeuralNetwork/NeuroEvolution_testing"}],"p5webeditor":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Letters2","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters2"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_testing"}]},"ObjectDetector":{"p5js":[{"name":"ObjectDetector_COCOSSD_Video","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_single_image"},{"name":"ObjectDetector_YOLO_Video","url":"../p5js/ObjectDetector/ObjectDetector_YOLO_Video"},{"name":"ObjectDetector_YOLO_single_image","url":"../p5js/ObjectDetector/ObjectDetector_YOLO_single_image"}],"p5webeditor":[{"name":"ObjectDetector_COCOSSD_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_single_image"},{"name":"ObjectDetector_YOLO_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_YOLO_Video"},{"name":"ObjectDetector_YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_YOLO_single_image"}],"javascript":[{"name":"COCOSSD_single_image","url":"../javascript/ObjectDetector/COCOSSD_single_image"},{"name":"COCOSSD_webcam","url":"../javascript/ObjectDetector/COCOSSD_webcam"},{"name":"YOLO_single_image","url":"../javascript/ObjectDetector/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/ObjectDetector/YOLO_webcam"}]},"PitchDetection":{"p5js":[{"name":"PitchDetection","url":"../p5js/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../p5js/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../p5js/PitchDetection/PitchDetection_Piano"}],"p5webeditor":[{"name":"PitchDetection","url":"https://editor.p5js.org/ml5/sketches/PitchDetection"},{"name":"PitchDetection_Game","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Piano"}],"javascript":[{"name":"PitchDetection","url":"../javascript/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../javascript/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../javascript/PitchDetection/PitchDetection_Piano"}]},"Pix2Pix":{"p5js":[{"name":"Pix2Pix_callback","url":"../p5js/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../p5js/Pix2Pix/Pix2Pix_promise"}],"p5webeditor":[{"name":"Pix2Pix_callback","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_promise"}],"javascript":[{"name":"Pix2Pix_callback","url":"../javascript/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../javascript/Pix2Pix/Pix2Pix_promise"}]},"PoseNet":{"p5js":[{"name":"PoseNet_image_single","url":"../p5js/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../p5js/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../p5js/PoseNet/PoseNet_webcam"}],"p5webeditor":[{"name":"PoseNet_image_single","url":"https://editor.p5js.org/ml5/sketches/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"https://editor.p5js.org/ml5/sketches/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"https://editor.p5js.org/ml5/sketches/PoseNet_webcam"}],"javascript":[{"name":"PoseNet_image_single","url":"../javascript/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../javascript/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../javascript/PoseNet/PoseNet_webcam"}]},"Sentiment":{"p5js":[{"name":"Sentiment_Interactive","url":"../p5js/Sentiment/Sentiment_Interactive"}],"p5webeditor":[{"name":"Sentiment_Interactive","url":"https://editor.p5js.org/ml5/sketches/Sentiment_Interactive"}],"javascript":[{"name":"Sentiment_Interactive","url":"../javascript/Sentiment/Sentiment_Interactive"}]},"SketchRNN":{"p5js":[{"name":"SketchRNN_basic","url":"../p5js/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../p5js/SketchRNN/SketchRNN_interactive"}],"p5webeditor":[{"name":"SketchRNN_basic","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_interactive"}],"javascript":[{"name":"SketchRNN_basic","url":"../javascript/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../javascript/SketchRNN/SketchRNN_interactive"}]},"SoundClassification":{"p5js":[{"name":"SoundClassification_speechcommand","url":"../p5js/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../p5js/SoundClassification/SoundClassification_speechcommand_load"}],"p5webeditor":[{"name":"SoundClassification_speechcommand","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand_load"}],"javascript":[{"name":"SoundClassification_speechcommand","url":"../javascript/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../javascript/SoundClassification/SoundClassification_speechcommand_load"}]},"StyleTransfer":{"p5js":[{"name":"StyleTransfer_Image","url":"../p5js/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../p5js/StyleTransfer/StyleTransfer_Video"}],"p5webeditor":[{"name":"StyleTransfer_Image","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Video"}],"javascript":[{"name":"StyleTransfer_Image","url":"../javascript/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../javascript/StyleTransfer/StyleTransfer_Video"}]},"TeachableMachine":{"p5js":[{"name":"ImageModel_TM","url":"../p5js/TeachableMachine/ImageModel_TM"},{"name":"SoundModel_TM","url":"../p5js/TeachableMachine/SoundModel_TM"}],"p5webeditor":[{"name":"ImageModel_TM","url":"https://editor.p5js.org/ml5/sketches/ImageModel_TM"},{"name":"SoundModel_TM","url":"https://editor.p5js.org/ml5/sketches/SoundModel_TM"}]},"UNET":{"p5js":[{"name":"UNET_webcam","url":"../p5js/UNET/UNET_webcam"}],"p5webeditor":[{"name":"UNET_webcam","url":"https://editor.p5js.org/ml5/sketches/UNET_webcam"}],"javascript":[{"name":"UNET_webcam","url":"../javascript/UNET/UNET_webcam"}]},"UniversalSentenceEncoder":{"p5js":[{"name":"UniversalSentenceEncoder_Basic","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_WithTokenizer"}],"p5webeditor":[{"name":"UniversalSentenceEncoder_Basic","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_WithTokenizer"}]},"Word2Vec":{"p5js":[{"name":"Word2Vec_Interactive","url":"../p5js/Word2Vec/Word2Vec_Interactive"}],"p5webeditor":[{"name":"Word2Vec_Interactive","url":"https://editor.p5js.org/ml5/sketches/Word2Vec_Interactive"}],"javascript":[{"name":"Word2Vec_Interactive","url":"../javascript/Word2Vec/Word2Vec_Interactive"}]},"YOLO":{"p5js":[{"name":"YOLO_single_image","url":"../p5js/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../p5js/YOLO/YOLO_webcam"}],"p5webeditor":[{"name":"YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/YOLO_single_image"},{"name":"YOLO_webcam","url":"https://editor.p5js.org/ml5/sketches/YOLO_webcam"}],"javascript":[{"name":"YOLO_single_image","url":"../javascript/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/YOLO/YOLO_webcam"}]},"ml5_boilerplate":{"p5js":[],"p5webeditor":[],"javascript":[]}} \ No newline at end of file diff --git a/src/DBSCAN/index_test.js b/src/DBSCAN/index_test.js index a4ee4b176..dd2508719 100644 --- a/src/DBSCAN/index_test.js +++ b/src/DBSCAN/index_test.js @@ -13,7 +13,7 @@ const DBSCAN_DEFAULTS = { describe("DBSCAN", () => { let dbscanModel; const dataurl = - "https://raw.githubusercontent.com/asvsfs/ml5-library/development/examples/dbscan/data/data.csv"; + "https://raw.githubusercontent.com/asvsfs/ml5-library/dbscan/examples/dbscans/data/data.csv"; beforeAll(async () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; @@ -22,8 +22,8 @@ describe("DBSCAN", () => { }); it("Should create dbscan with all the defaults", async () => { - expect(dbscanModel.config.eps).toBe(DBSCAN_DEFAULTS.k); - expect(dbscanModel.config.minPts).toBe(DBSCAN_DEFAULTS.maxIter); + expect(dbscanModel.config.eps).toBe(DBSCAN_DEFAULTS.eps); + expect(dbscanModel.config.minPts).toBe(DBSCAN_DEFAULTS.minPts); }); it("dbscanModel dataset : Should have length 3000", async () => { From 8620147cee7a7e738102afa90d973826ef82aa33 Mon Sep 17 00:00:00 2001 From: asvsfs Date: Thu, 6 Aug 2020 22:45:25 +0430 Subject: [PATCH 05/49] corrected comments --- examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js index 294100183..9d3610b2f 100644 --- a/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js @@ -35,8 +35,7 @@ function make(eps) { 'eps': eps, 'minPts': 3, }; - // if moon or circle data, set the options to 2 clusters - // could also be a 1-liner: options.k = (eps === 'moon' || eps === 'circle') ? 2: options.k; + // if moon or circle data, set the options to 0.1 and 0.16 eps if(eps === 'moon' ){ options.eps = 0.1; }else if( eps === 'circle'){ From 6b5c15b8a607695445f58b72e98143c773e742b5 Mon Sep 17 00:00:00 2001 From: asvsfs Date: Thu, 6 Aug 2020 22:58:36 +0430 Subject: [PATCH 06/49] corrected test with new datasets --- src/DBSCAN/index_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DBSCAN/index_test.js b/src/DBSCAN/index_test.js index dd2508719..7fa1e0079 100644 --- a/src/DBSCAN/index_test.js +++ b/src/DBSCAN/index_test.js @@ -13,7 +13,7 @@ const DBSCAN_DEFAULTS = { describe("DBSCAN", () => { let dbscanModel; const dataurl = - "https://raw.githubusercontent.com/asvsfs/ml5-library/dbscan/examples/dbscans/data/data.csv"; + "https://raw.githubusercontent.com/asvsfs/ml5-library/dbscan/examples/d3/DBSCAN/DBSCAN_Cluster/data/gaussian2d_1.55clusters.csv"; beforeAll(async () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; @@ -26,8 +26,8 @@ describe("DBSCAN", () => { expect(dbscanModel.config.minPts).toBe(DBSCAN_DEFAULTS.minPts); }); - it("dbscanModel dataset : Should have length 3000", async () => { + it("dbscanModel dataset : Should have length 300", async () => { // await kmeansModel.load(dataurl) - expect(dbscanModel.dataset.length).toBe(3000); + expect(dbscanModel.dataset.length).toBe(300); }); }); From 2ec61c6d6e858255bf6d5ccfe3ff2eaefedfa66a Mon Sep 17 00:00:00 2001 From: asvsfs Date: Fri, 28 Aug 2020 11:21:40 +0430 Subject: [PATCH 07/49] some minor changed , and removed duplicated load in dbscan init --- examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js | 84 +++++++++++---------- src/DBSCAN/index.js | 67 ++++++++-------- 2 files changed, 76 insertions(+), 75 deletions(-) diff --git a/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js index 9d3610b2f..9529ff098 100644 --- a/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js +++ b/examples/d3/DBSCAN/DBSCAN_Cluster/sketch.js @@ -2,12 +2,12 @@ let dbscanModel; const width = 640; const height = 480; const colDict = { - 0: 'skyblue', - 1: 'coral', - 2: 'olive', - 3: 'tan', - 4: 'grey' -} + 0: "skyblue", + 1: "coral", + 2: "olive", + 3: "tan", + 4: "grey", +}; // ----- Initialize the example: ------ // function init() { @@ -24,88 +24,92 @@ function createButtons() { addClusterButton(1.55); addClusterButton(1.56); addClusterButton(2); - addClusterButton('circle'); - addClusterButton('moon'); + addClusterButton("circle"); + addClusterButton("moon"); } // STEP 2: // create the model function make(eps) { const options = { - 'eps': eps, - 'minPts': 3, + eps: eps, + minPts: 3, }; // if moon or circle data, set the options to 0.1 and 0.16 eps - if(eps === 'moon' ){ + if (eps === "moon") { options.eps = 0.1; - }else if( eps === 'circle'){ + } else if (eps === "circle") { options.eps = 0.16; } console.log(eps, options.eps); - // get the path to the data in our data folder dynamically - const dataPath = `data/gaussian2d_${eps}clusters.csv` + const dataPath = `data/gaussian2d_${eps}clusters.csv`; // create a new dbscan clustering each time on make() dbscanModel = ml5.dbscan(dataPath, options, modelReady); - } // Step 3: // when the model is ready, make the chart function modelReady() { - console.log(dbscanModel.dataset) - makeChart() + console.log(dbscanModel.dataset); + makeChart(); } -// Step 4: +// Step 4: // use the fancy d3 to make magic function makeChart() { - const dataset = dbscanModel.dataset; + const { dataset } = dbscanModel; // clear the chart each time // less efficient, but simple - d3.select('svg').remove(); + d3.select("svg").remove(); // reappend the svg to the chart area - const svg = d3.select('#chart').append('svg') - .attr('width', width) - .attr('height', height); + const svg = d3 + .select("#chart") + .append("svg") + .attr("width", width) + .attr("height", height); // d[0] is for the x value in the array - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain(d3.extent(dataset, d => d[0])) .range([10, width - 100]); // d[1] is for the y value in the array - const yScale = d3.scaleLinear() + const yScale = d3 + .scaleLinear() .domain(d3.extent(dataset, d => d[1])) .range([height - 50, 20]); - svg.selectAll('circle').data(dataset) - .enter().append('circle') - .attr('cx', d => xScale(d[0])) - .attr('cy', d => yScale(d[1])) - .attr('r', 6) - .attr('fill', 'black') - - d3.select('svg').selectAll('circle') + svg + .selectAll("circle") + .data(dataset) + .enter() + .append("circle") + .attr("cx", d => xScale(d[0])) + .attr("cy", d => yScale(d[1])) + .attr("r", 6) + .attr("fill", "black"); + + d3.select("svg") + .selectAll("circle") .transition() - .attr('fill', (d, i) => colDict[dataset[i].clusterid]); - + .attr("fill", (d, i) => colDict[dataset[i].clusterid]); } // adds the buttons for the respective cluster data // we could also use d3.append() and d3.select() here :) -function addClusterButton(eps,minPts=3) { +function addClusterButton(eps, minPts = 3) { const btn = document.createElement("BUTTON"); - btn.innerText = `cluster: ${eps} & minPts: ${minPts}` + btn.innerText = `cluster: ${eps} & minPts: ${minPts}`; - btn.addEventListener('click', function (e) { + btn.addEventListener("click", function(e) { make(eps); }); - document.querySelector('#buttons').appendChild(btn); + document.querySelector("#buttons").appendChild(btn); return btn; } - diff --git a/src/DBSCAN/index.js b/src/DBSCAN/index.js index cf474c261..af99840cc 100644 --- a/src/DBSCAN/index.js +++ b/src/DBSCAN/index.js @@ -8,8 +8,8 @@ DBSCAN Algorithm (with Euclidian distance). Influenced By jDBSCAN */ -import * as tf from '@tensorflow/tfjs'; -import callCallback from '../utils/callcallback'; +import * as tf from "@tensorflow/tfjs"; +import callCallback from "../utils/callcallback"; /** * Read in a csv file from a path to its location. @@ -33,27 +33,26 @@ async function loadDataset(inputData) { } else { data = inputData; } - const dataFlat = data.map((d) => { + const dataFlat = data.map(d => { return Object.values(d); }); return dataFlat; } const DEFAULTS = { - 'eps': 50, - 'minPts': 3, + eps: 50, + minPts: 3, }; class DBSCAN { - /** * Create a DBSCAN. * @param {String || array || object} dataset - The dataset to cluster. in x, y format => [{x:1,y:2}] * @param {options} options - An object describing a model's parameters: * - eps: Minimum distance between neighbours * - minPts: Minimum number of neighbours to count as a core point - * @param {function} callback - Optional. A callback to be called once - * the model has loaded. If no callback is provided, it will return a + * @param {function} callback - Optional. A callback to be called once + * the model has loaded. If no callback is provided, it will return a * promise that will be resolved once the model has loaded. */ @@ -64,19 +63,18 @@ class DBSCAN { }; this.lastClusterId = 0; this.status = []; - this.load(dataset).then(callback); this.ready = callCallback(this.load(dataset), callback); } /** * Load dataset, and run model. - * @param {string || array || object} dataset + * @param {string || array || object} dataset */ async load(dataset) { this.dataset = await loadDataset(dataset); tf.tidy(() => { this.dataTensor = tf.tensor2d(this.dataset); - this.dataset.forEach((d) => { + this.dataset.forEach(d => { const tensors = tf.tensor1d(Object.values(d)); d.tensor = tensors; }); @@ -85,7 +83,7 @@ class DBSCAN { return this; } - /** + /** * Run DBSCAN algorithm. */ fit() { @@ -93,45 +91,45 @@ class DBSCAN { if (d.status === undefined) { d.status = 0; // initlize as a noise point const neighboursIndices = this.getNeighboursIndices(d); - if (neighboursIndices.length < this.config.minPts) { // Border or noise + if (neighboursIndices.length < this.config.minPts) { + // Border or noise d.status = 0; } else { - this.incrementClusterId() + this.incrementClusterId(); this.extend(idx, neighboursIndices); } } }); } - + /** * Extend cluster by running algorithm on neighbours and detect neighbours that are core points as well - * @param {number} pointIndex + * @param {number} pointIndex * @param {number[]} neighboursIndices - */ + */ extend(pointIndex, neighboursIndices) { this.dataset[pointIndex].clusterid = this.getClusterId(); this.dataset[pointIndex].status = this.dataset[pointIndex].clusterid; - neighboursIndices.forEach(neighbourIndex=>{ - if (this.dataset[neighbourIndex].status === undefined) { // Status unknown intialize as noise + neighboursIndices.forEach(neighbourIndex => { + if (this.dataset[neighbourIndex].status === undefined) { + // Status unknown intialize as noise this.dataset[neighbourIndex].status = 0; - const currNeighbours = this.getNeighboursIndices( // Neighbours of this point - this.dataset[neighbourIndex] + const currNeighbours = this.getNeighboursIndices( + // Neighbours of this point + this.dataset[neighbourIndex], ); const currNumNeighbours = currNeighbours.length; - if (currNumNeighbours >= this.config.minPts) {// If Neighbours are above minimum we go further and add this and potential neighbours to clusterId + if (currNumNeighbours >= this.config.minPts) { + // If Neighbours are above minimum we go further and add this and potential neighbours to clusterId this.extend(neighbourIndex, currNeighbours); } } if (this.dataset[neighbourIndex].status < 1) { - this.dataset[neighbourIndex].status = this.dataset[ - pointIndex - ].clusterid; - this.dataset[neighbourIndex].clusterid = this.dataset[ - pointIndex - ].clusterid; + this.dataset[neighbourIndex].status = this.dataset[pointIndex].clusterid; + this.dataset[neighbourIndex].clusterid = this.dataset[pointIndex].clusterid; } - }) + }); } /** @@ -144,7 +142,7 @@ class DBSCAN { * increment cluster id */ incrementClusterId() { - this.lastClusterId+=1 + this.lastClusterId += 1; } /** @@ -157,11 +155,11 @@ class DBSCAN { .squaredDifference(point.tensor, this.dataTensor) .sum(1) .sqrt() - .topk(this.dataTensor.shape[0], true) + .topk(this.dataTensor.shape[0], true); return tf .stack([values.asType("float32"), indices.asType("float32")], 1) .arraySync() - .filter((v) => { + .filter(v => { return v[0] <= this.config.eps; }) .reduce((prev, cur) => { @@ -173,11 +171,10 @@ class DBSCAN { } catch (error) { console.log(`error ${error}`); } - return [] + return []; } } -const dbscan = (dataset, options, callback) => - new DBSCAN(dataset, options, callback); +const dbscan = (dataset, options, callback) => new DBSCAN(dataset, options, callback); export default dbscan; From d171ff45d583272987d1558e2b863e919402e196 Mon Sep 17 00:00:00 2001 From: shiffman Date: Sun, 20 Sep 2020 20:17:13 -0400 Subject: [PATCH 08/49] poseNet single image function --- .../PoseNet/PoseNet_image_single/sketch.js | 79 +++++++------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/examples/p5js/PoseNet/PoseNet_image_single/sketch.js b/examples/p5js/PoseNet/PoseNet_image_single/sketch.js index 1a896b22f..ed79b3408 100644 --- a/examples/p5js/PoseNet/PoseNet_image_single/sketch.js +++ b/examples/p5js/PoseNet/PoseNet_image_single/sketch.js @@ -1,66 +1,41 @@ let img; let poseNet; -let poses = []; -function setup() { - createCanvas(640, 360); - - // create an image using the p5 dom library - // call modelReady() when it is loaded - img = createImg("data/runner.jpg", imageReady); - // set the image size to the size of the canvas - img.size(width, height); - - img.hide(); // hide the image in the browser - frameRate(1); // set the frameRate to 1 since we don't need it to be running quickly in this case +function preload() { + // load an image for pose detection + img = loadImage('data/runner.jpg'); } -// when the image is ready, then load up poseNet -function imageReady() { - // set some options - const options = { - minConfidence: 0.1, - inputResolution: { width, height }, - }; - - // assign poseNet - poseNet = ml5.poseNet(modelReady, options); - // This sets up an event that listens to 'pose' events - poseNet.on("pose", function(results) { - poses = results; - }); +function setup() { + createCanvas(640, 360); + image(img, 0, 0); + poseNet = ml5.poseNet(modelReady); } // when poseNet is ready, do the detection function modelReady() { - select("#status").html("Model Loaded"); - + select('#status').html('Model Loaded'); + // If/When a pose is detected, poseNet.on('pose', ...) will be listening for the detection results + poseNet.on('pose', function (poses) { + if (poses.length > 0) { + drawSkeleton(poses); + drawKeypoints(poses); + } + }); // When the model is ready, run the singlePose() function... - // If/When a pose is detected, poseNet.on('pose', ...) will be listening for the detection results - // in the draw() loop, if there are any poses, then carry out the draw commands poseNet.singlePose(img); } -// draw() will not show anything until poses are found -function draw() { - if (poses.length > 0) { - image(img, 0, 0, width, height); - drawSkeleton(poses); - drawKeypoints(poses); - noLoop(); // stop looping when the poses are estimated - } -} - // The following comes from https://ml5js.org/docs/posenet-webcam // A function to draw ellipses over the detected keypoints -function drawKeypoints() { +function drawKeypoints(poses) { // Loop through all the poses detected - for (let i = 0; i < poses.length; i += 1) { + for (let i = 0; i < poses.length; i++) { // For each pose detected, loop through all the keypoints - const pose = poses[i].pose; - for (let j = 0; j < pose.keypoints.length; j += 1) { + let pose = poses[i].pose; + for (let j = 0; j < pose.keypoints.length; j++) { // A keypoint is an object describing a body part (like rightArm or leftShoulder) - const keypoint = pose.keypoints[j]; + let keypoint = pose.keypoints[j]; // Only draw an ellipse is the pose probability is bigger than 0.2 if (keypoint.score > 0.2) { fill(255); @@ -73,17 +48,17 @@ function drawKeypoints() { } // A function to draw the skeletons -function drawSkeleton() { +function drawSkeleton(poses) { // Loop through all the skeletons detected - for (let i = 0; i < poses.length; i += 1) { - const skeleton = poses[i].skeleton; + for (let i = 0; i < poses.length; i++) { + let skeleton = poses[i].skeleton; // For every skeleton, loop through all body connections - for (let j = 0; j < skeleton.length; j += 1) { - const partA = skeleton[j][0]; - const partB = skeleton[j][1]; + for (let j = 0; j < skeleton.length; j++) { + let partA = skeleton[j][0]; + let partB = skeleton[j][1]; stroke(255); strokeWeight(1); line(partA.position.x, partA.position.y, partB.position.x, partB.position.y); } } -} +} \ No newline at end of file From 7d77fa63b3583fc9fa583d07811e080059d77d37 Mon Sep 17 00:00:00 2001 From: Mudasar-Makandar <46401916+Mudasar-Makandar@users.noreply.github.com> Date: Tue, 23 Mar 2021 12:41:11 +0530 Subject: [PATCH 09/49] Word2vec.nearestFromSet() is always null output Word2vec.nearestFromSet() is giving always null output. Reason: !miniModel.length is always true because miniModel is object and length attribute is undefined. --- src/Word2vec/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Word2vec/index.js b/src/Word2vec/index.js index 6ecbbc070..fd868b7ae 100644 --- a/src/Word2vec/index.js +++ b/src/Word2vec/index.js @@ -127,7 +127,7 @@ class Word2Vec { }); // If none of the words in the set are found, also bail out - if (!miniModel.length) { + if (!Object.Keys(miniModel).length) { if(callback) callback(undefined, null); return null; } From 5082173198bc8dca9683fd342d399a673ec28267 Mon Sep 17 00:00:00 2001 From: Mudasar-Makandar <46401916+Mudasar-Makandar@users.noreply.github.com> Date: Sat, 17 Apr 2021 10:40:06 +0530 Subject: [PATCH 10/49] resolve typo, Object.Keys --> Object.keys --- src/Word2vec/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Word2vec/index.js b/src/Word2vec/index.js index fd868b7ae..0052d9dd6 100644 --- a/src/Word2vec/index.js +++ b/src/Word2vec/index.js @@ -127,7 +127,7 @@ class Word2Vec { }); // If none of the words in the set are found, also bail out - if (!Object.Keys(miniModel).length) { + if (!Object.keys(miniModel).length) { if(callback) callback(undefined, null); return null; } From 4b0f6c500fc6c5f3666d794c1a86343fa56fc3e4 Mon Sep 17 00:00:00 2001 From: Tom Saeger Date: Wed, 3 Nov 2021 16:15:38 +0100 Subject: [PATCH 11/49] disbaled p5 web editor examples --- docs/reference/charrnn.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/reference/charrnn.md b/docs/reference/charrnn.md index 6c3822303..f072ee74a 100644 --- a/docs/reference/charrnn.md +++ b/docs/reference/charrnn.md @@ -158,10 +158,11 @@ charrnn.reset(); * [CharRNN_Text_Stateful](https://github.com/ml5js/ml5-library/tree/main/examples/p5js/CharRNN/CharRNN_Text_Stateful) **p5 web editor** - -* [CharRNN_Interactive](https://editor.p5js.org/ml5/sketches/CharRNN_Interactive) +Please be advised, that due to an incompatibility of the p5 web-editor and the weights that are used in this example, this example does not work in the p5 we-editor. +Please use the p5.js example locally. Learn more about how to run examples locally [here.](https://github.com/ml5js/ml5-library/blob/main/examples/README.md#setup) + **plain javascript** * [CharRNN_Interactive](https://github.com/ml5js/ml5-library/tree/main/examples/javascript/CharRNN/CharRNN_Interactive) From 8795d4840011c24a454b1ce7b5d6e3bb1d38e41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom-Lucas=20S=C3=A4ger?= <33449313+tlsaeger@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:24:00 +0100 Subject: [PATCH 12/49] Update charrnn.md added a line break --- docs/reference/charrnn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reference/charrnn.md b/docs/reference/charrnn.md index f072ee74a..5f560ef89 100644 --- a/docs/reference/charrnn.md +++ b/docs/reference/charrnn.md @@ -158,6 +158,7 @@ charrnn.reset(); * [CharRNN_Text_Stateful](https://github.com/ml5js/ml5-library/tree/main/examples/p5js/CharRNN/CharRNN_Text_Stateful) **p5 web editor** + Please be advised, that due to an incompatibility of the p5 web-editor and the weights that are used in this example, this example does not work in the p5 we-editor. Please use the p5.js example locally. Learn more about how to run examples locally [here.](https://github.com/ml5js/ml5-library/blob/main/examples/README.md#setup) From ad1246c8b7eb23ccf096bcbe592d0baace1278e1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Feb 2022 02:58:49 +0000 Subject: [PATCH 32/49] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 975ca5ab5..b0e69c20b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1287,6 +1287,16 @@ "code", "ideas" ] + }, + { + "login": "asvsfs", + "name": "Amir", + "avatar_url": "https://avatars.githubusercontent.com/u/119840?v=4", + "profile": "https://github.com/asvsfs", + "contributions": [ + "code", + "example" + ] } ], "contributorsPerLine": 7, From 87245fb9ec5e7d1b2bb5ca868811f016b591e5a8 Mon Sep 17 00:00:00 2001 From: ml5 Date: Wed, 23 Feb 2022 03:14:16 +0000 Subject: [PATCH 33/49] bumps package, readme, and package-lock --- README.md | 8 +++++--- package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b9d1eb166..b20a22a71 100644 --- a/README.md +++ b/README.md @@ -63,15 +63,16 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. +

-* You can use the latest version (0.10.2) by adding it to the head section of your HTML document: +* You can use the latest version (0.10.3) by adding it to the head section of your HTML document: -**v0.10.2** +**v0.10.3** - +

@@ -108,6 +109,7 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. + diff --git a/package.json b/package.json index 112cb1488..78caa1c98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.10.2", + "version": "0.10.3", "description": "A friendly machine learning library for the web.", "main": "dist/ml5.min.js", "directories": { From 792add44229a5c28eabd5920e05cd83bae95066a Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Thu, 24 Feb 2022 12:11:28 -0600 Subject: [PATCH 34/49] Modify `callCallback` to reject the returned Promise when a callback function is provided. --- src/utils/callcallback.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/callcallback.js b/src/utils/callcallback.js index 3fd6dd42e..4085a04fc 100644 --- a/src/utils/callcallback.js +++ b/src/utils/callcallback.js @@ -4,16 +4,16 @@ // https://opensource.org/licenses/MIT export default function callCallback(promise, callback) { - if (callback) { + if (!callback) return promise; + return new Promise((resolve, reject) => { promise .then((result) => { callback(undefined, result); - return result; + resolve(result); }) .catch((error) => { callback(error); - return error; + reject(error); }); - } - return promise; + }); } From 552d16da576460de1dcecf01bc0d5970ea3bac69 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Thu, 24 Feb 2022 20:39:48 -0600 Subject: [PATCH 35/49] Add JSDoc documentation for generic helper function `callCallback`. --- src/utils/callcallback.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/utils/callcallback.js b/src/utils/callcallback.js index 4085a04fc..a875d033e 100644 --- a/src/utils/callcallback.js +++ b/src/utils/callcallback.js @@ -3,6 +3,27 @@ // This software is released under the MIT License. // https://opensource.org/licenses/MIT + +/** + * Most ml5 methods accept a callback function which will be + * called with the arguments (error, result). + * + * Generic type T describes the type of the result. + * @template T + * @callback ML5Callback + * @param {unknown} error - any error thrown during the execution of the function. + * @param {T} [result] - the expected result, if successful. + * @return {void} - callbacks can have side effects, but should not return a value. + */ + +/** + * Generic type T describes the type of the result, ie. the value that the Promise will resolve to. + * @template T + * @param {Promise} promise - the Promise to resolve. + * @param {ML5Callback} [callback] - optional callback function to be called + * with the result or error from the resolved Promise. + * @return {Promise} - returns the underlying Promise, which may be rejected. + */ export default function callCallback(promise, callback) { if (!callback) return promise; return new Promise((resolve, reject) => { From d1caa00b0df9c5d3c2b351a2540a337107fc7d38 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sat, 26 Feb 2022 16:52:33 -0600 Subject: [PATCH 36/49] * Add JSDoc types to existing Video class. * Add `typeof HTMLVideoElement !== 'undefined'` check to prevent errors in Node.js environments. * Reject `loadVideo` promise if there is no video. * Check that `this.size` is a non-zero number before using it. * Set `this.videoReady` to `true` from the base class. --- src/StyleTransfer/index.js | 1 - src/utils/Video.js | 48 +++++++++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/StyleTransfer/index.js b/src/StyleTransfer/index.js index e7835094d..0473a3479 100644 --- a/src/StyleTransfer/index.js +++ b/src/StyleTransfer/index.js @@ -54,7 +54,6 @@ class StyleTransfer extends Video { async load(model) { if (this.videoElt) { await this.loadVideo(); - this.videoReady = true; } await this.loadCheckpoints(model); return this; diff --git a/src/utils/Video.js b/src/utils/Video.js index fa297017a..f8a3767f4 100644 --- a/src/utils/Video.js +++ b/src/utils/Video.js @@ -8,22 +8,51 @@ Image and Video base class */ class Video { + /** + * @property {HTMLVideoElement} [video] + */ + + /** + * @param {HTMLVideoElement | p5.Video | null | undefined} [video] - Can pass a video + * into the constructor of the model in order to run the model on every frame of the video. + * @param {number | null | undefined} [size] - The size expected by the underlying model. + * NOT the size of the current video. The size will be used to resize the current video. + */ constructor(video, size) { + /** + * @type {HTMLVideoElement | null} + */ this.videoElt = null; + /** + * @type {number | null | undefined} + */ this.size = size; + /** + * @type {boolean} + */ this.videoReady = false; - if (video instanceof HTMLVideoElement) { - this.videoElt = video; - } else if (video !== null && typeof video === 'object' && video.elt instanceof HTMLVideoElement) { - // Handle p5.js video element - this.videoElt = video.elt; + if (typeof HTMLVideoElement !== 'undefined') { + if (video instanceof HTMLVideoElement) { + this.videoElt = video; + } else if (video !== null && typeof video === 'object' && video.elt instanceof HTMLVideoElement) { + // Handle p5.js video element + this.videoElt = video.elt; + } } } + /** + * Copies the stream from the source video into a new video element. + * The copied element is set to property `this.video` and is also returned by the function. + * @returns {Promise} + */ async loadVideo() { let stream; - return new Promise((resolve) => { + return new Promise((resolve, reject) => { + if (!this.videoElt) { + reject(new Error('No video was passed to the constructor.')); + } this.video = document.createElement('video'); const sUsrAg = navigator.userAgent; if (sUsrAg.indexOf('Firefox') > -1) { @@ -32,14 +61,17 @@ class Video { stream = this.videoElt.captureStream(); } this.video.srcObject = stream; - this.video.width = this.size; - this.video.height = this.size; + if (this.size) { + this.video.width = this.size; + this.video.height = this.size; + } this.video.autoplay = true; this.video.playsinline = true; this.video.muted = true; const playPromise = this.video.play(); if (playPromise !== undefined) { playPromise.then(() => { + this.videoReady = true; resolve(this.video); }); } From 8a18de737205f5b67049d30d2300a5645c429850 Mon Sep 17 00:00:00 2001 From: joeyklee Date: Thu, 3 Mar 2022 22:23:21 -0500 Subject: [PATCH 37/49] refactor: pickup utils in tests and adds callCallback tests --- examples/examples.json | 2 +- karma.conf.js | 2 + package-lock.json | 2 +- package.json | 2 +- src/utils/callcallback_test.js | 80 ++++++++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/utils/callcallback_test.js diff --git a/examples/examples.json b/examples/examples.json index 07b378569..12ead0dc5 100644 --- a/examples/examples.json +++ b/examples/examples.json @@ -1 +1 @@ -{"BodyPix":{"p5js":[{"name":"BodyPix_Image","url":"../p5js/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../p5js/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../p5js/BodyPix/BodyPix_Webcam_Parts"}],"p5webeditor":[{"name":"BodyPix_Image","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam_Parts"}],"javascript":[{"name":"BodyPix_Image","url":"../javascript/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../javascript/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../javascript/BodyPix/BodyPix_Webcam_Parts"}]},"CVAE":{"p5js":[{"name":"CVAE_QuickDraw","url":"../p5js/CVAE/CVAE_QuickDraw"}],"p5webeditor":[{"name":"CVAE_QuickDraw","url":"https://editor.p5js.org/ml5/sketches/CVAE_QuickDraw"}],"javascript":[{"name":"CVAE_QuickDraw","url":"../javascript/CVAE/CVAE_QuickDraw"}]},"CartoonGAN":{"p5js":[{"name":"CartoonGan_Basic","url":"../p5js/CartoonGAN/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"../p5js/CartoonGAN/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"../p5js/CartoonGAN/CartoonGan_WebCam"}],"p5webeditor":[{"name":"CartoonGan_Basic","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_WebCam"}]},"CharRNN":{"p5js":[{"name":"CharRNN_Interactive","url":"../p5js/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../p5js/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../p5js/CharRNN/CharRNN_Text_Stateful"}],"p5webeditor":[{"name":"CharRNN_Interactive","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text_Stateful"}],"javascript":[{"name":"CharRNN_Interactive","url":"../javascript/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../javascript/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../javascript/CharRNN/CharRNN_Text_Stateful"}]},"DBSCAN":{"p5js":[],"p5webeditor":[],"d3":[{"name":"DBSCAN_Cluster","url":"../d3/DBSCAN/DBSCAN_Cluster"}]},"DCGAN":{"p5js":[{"name":"DCGAN_LatentVector_RandomWalk","url":"../p5js/DCGAN/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"../p5js/DCGAN/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"../p5js/DCGAN/DCGAN_Random"}],"p5webeditor":[{"name":"DCGAN_LatentVector_RandomWalk","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"https://editor.p5js.org/ml5/sketches/DCGAN_Random"}],"javascript":[{"name":"DCGAN_Random","url":"../javascript/DCGAN/DCGAN_Random"}]},"FaceApi":{"p5js":[{"name":"FaceApi_Image_Landmarks","url":"../p5js/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../p5js/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../p5js/FaceApi/FaceApi_Video_Landmarks_LocalModels"}],"p5webeditor":[{"name":"FaceApi_Image_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks_LocalModels"}],"javascript":[{"name":"FaceApi_Image_Landmarks","url":"../javascript/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../javascript/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../javascript/FaceApi/FaceApi_Video_Landmarks_LocalModels"}]},"Facemesh":{"p5js":[{"name":"Facemesh_Image","url":"../p5js/Facemesh/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"../p5js/Facemesh/Facemesh_Webcam"}],"p5webeditor":[{"name":"Facemesh_Image","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Webcam"}]},"FeatureExtractor":{"p5js":[{"name":"FeatureExtractor_Image_Classification","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Regression"}],"p5webeditor":[{"name":"FeatureExtractor_Image_Classification","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Regression"}],"javascript":[{"name":"FeatureExtractor_Image_Classification","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Regression"}]},"Handpose":{"p5js":[{"name":"Handpose_Image","url":"../p5js/Handpose/Handpose_Image"},{"name":"Handpose_Part_Selection","url":"../p5js/Handpose/Handpose_Part_Selection"},{"name":"Handpose_Webcam","url":"../p5js/Handpose/Handpose_Webcam"}],"p5webeditor":[{"name":"Handpose_Image","url":"https://editor.p5js.org/ml5/sketches/Handpose_Image"},{"name":"Handpose_Part_Selection","url":"https://editor.p5js.org/ml5/sketches/Handpose_Part_Selection"},{"name":"Handpose_Webcam","url":"https://editor.p5js.org/ml5/sketches/Handpose_Webcam"}]},"ImageClassification":{"p5js":[{"name":"ImageClassification","url":"../p5js/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../p5js/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../p5js/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../p5js/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../p5js/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"../p5js/ImageClassification/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"../p5js/ImageClassification/ImageClassification_Video_Load"}],"p5webeditor":[{"name":"ImageClassification","url":"https://editor.p5js.org/ml5/sketches/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video_Load"}],"javascript":[{"name":"ImageClassification","url":"../javascript/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../javascript/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../javascript/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../javascript/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../javascript/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_Video_Load","url":"../javascript/ImageClassification/ImageClassification_Video_Load"}]},"KMeans":{"p5js":[{"name":"KMeans_imageSegmentation","url":"../p5js/KMeans/KMeans_imageSegmentation"},{"name":"KMeans_mouseClustering","url":"../p5js/KMeans/KMeans_mouseClustering"}],"p5webeditor":[{"name":"KMeans_imageSegmentation","url":"https://editor.p5js.org/ml5/sketches/KMeans_imageSegmentation"},{"name":"KMeans_mouseClustering","url":"https://editor.p5js.org/ml5/sketches/KMeans_mouseClustering"}],"d3":[{"name":"KMeans_GaussianClusterDemo","url":"../d3/KMeans/KMeans_GaussianClusterDemo"}]},"KNNClassification":{"p5js":[{"name":"KNNClassification_PoseNet","url":"../p5js/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../p5js/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../p5js/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../p5js/KNNClassification/KNNClassification_VideoSquare"}],"p5webeditor":[{"name":"KNNClassification_PoseNet","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSquare"}],"javascript":[{"name":"KNNClassification_PoseNet","url":"../javascript/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../javascript/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../javascript/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../javascript/KNNClassification/KNNClassification_VideoSquare"}]},"NeuralNetwork":{"p5js":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"../p5js/NeuralNetwork/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"../p5js/NeuralNetwork/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"../p5js/NeuralNetwork/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"../p5js/NeuralNetwork/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"../p5js/NeuralNetwork/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"../p5js/NeuralNetwork/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"../p5js/NeuralNetwork/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"../p5js/NeuralNetwork/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"../p5js/NeuralNetwork/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"../p5js/NeuralNetwork/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"../p5js/NeuralNetwork/NeuroEvolution_testing"}],"p5webeditor":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_testing"}]},"ObjectDetector":{"p5js":[{"name":"ObjectDetector_COCOSSD_Video","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_single_image"}],"p5webeditor":[{"name":"ObjectDetector_COCOSSD_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_single_image"}],"javascript":[{"name":"COCOSSD_single_image","url":"../javascript/ObjectDetector/COCOSSD_single_image"},{"name":"COCOSSD_webcam","url":"../javascript/ObjectDetector/COCOSSD_webcam"},{"name":"YOLO_single_image","url":"../javascript/ObjectDetector/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/ObjectDetector/YOLO_webcam"}]},"PitchDetection":{"p5js":[{"name":"PitchDetection","url":"../p5js/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../p5js/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../p5js/PitchDetection/PitchDetection_Piano"}],"p5webeditor":[{"name":"PitchDetection","url":"https://editor.p5js.org/ml5/sketches/PitchDetection"},{"name":"PitchDetection_Game","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Piano"}],"javascript":[{"name":"PitchDetection","url":"../javascript/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../javascript/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../javascript/PitchDetection/PitchDetection_Piano"}]},"Pix2Pix":{"p5js":[{"name":"Pix2Pix_callback","url":"../p5js/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../p5js/Pix2Pix/Pix2Pix_promise"}],"p5webeditor":[{"name":"Pix2Pix_callback","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_promise"}],"javascript":[{"name":"Pix2Pix_callback","url":"../javascript/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../javascript/Pix2Pix/Pix2Pix_promise"}]},"PoseNet":{"p5js":[{"name":"PoseNet_image_single","url":"../p5js/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../p5js/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../p5js/PoseNet/PoseNet_webcam"}],"p5webeditor":[{"name":"PoseNet_image_single","url":"https://editor.p5js.org/ml5/sketches/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"https://editor.p5js.org/ml5/sketches/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"https://editor.p5js.org/ml5/sketches/PoseNet_webcam"}],"javascript":[{"name":"PoseNet_image_single","url":"../javascript/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../javascript/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../javascript/PoseNet/PoseNet_webcam"}]},"Sentiment":{"p5js":[{"name":"Sentiment_Interactive","url":"../p5js/Sentiment/Sentiment_Interactive"}],"p5webeditor":[{"name":"Sentiment_Interactive","url":"https://editor.p5js.org/ml5/sketches/Sentiment_Interactive"}],"javascript":[{"name":"Sentiment_Interactive","url":"../javascript/Sentiment/Sentiment_Interactive"}]},"SketchRNN":{"p5js":[{"name":"SketchRNN_basic","url":"../p5js/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../p5js/SketchRNN/SketchRNN_interactive"}],"p5webeditor":[{"name":"SketchRNN_basic","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_interactive"}],"javascript":[{"name":"SketchRNN_basic","url":"../javascript/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../javascript/SketchRNN/SketchRNN_interactive"}]},"SoundClassification":{"p5js":[{"name":"SoundClassification_speechcommand","url":"../p5js/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../p5js/SoundClassification/SoundClassification_speechcommand_load"}],"p5webeditor":[{"name":"SoundClassification_speechcommand","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand_load"}],"javascript":[{"name":"SoundClassification_speechcommand","url":"../javascript/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../javascript/SoundClassification/SoundClassification_speechcommand_load"}]},"StyleTransfer":{"p5js":[{"name":"StyleTransfer_Image","url":"../p5js/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../p5js/StyleTransfer/StyleTransfer_Video"}],"p5webeditor":[{"name":"StyleTransfer_Image","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Video"}],"javascript":[{"name":"StyleTransfer_Image","url":"../javascript/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../javascript/StyleTransfer/StyleTransfer_Video"}]},"TeachableMachine":{"p5js":[{"name":"ImageModel_TM","url":"../p5js/TeachableMachine/ImageModel_TM"},{"name":"SoundModel_TM","url":"../p5js/TeachableMachine/SoundModel_TM"}],"p5webeditor":[{"name":"ImageModel_TM","url":"https://editor.p5js.org/ml5/sketches/ImageModel_TM"},{"name":"SoundModel_TM","url":"https://editor.p5js.org/ml5/sketches/SoundModel_TM"}]},"UNET":{"p5js":[{"name":"UNET_webcam","url":"../p5js/UNET/UNET_webcam"}],"p5webeditor":[{"name":"UNET_webcam","url":"https://editor.p5js.org/ml5/sketches/UNET_webcam"}],"javascript":[{"name":"UNET_webcam","url":"../javascript/UNET/UNET_webcam"}]},"UniversalSentenceEncoder":{"p5js":[{"name":"UniversalSentenceEncoder_Basic","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_WithTokenizer"}],"p5webeditor":[{"name":"UniversalSentenceEncoder_Basic","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_WithTokenizer"}]},"YOLO":{"p5js":[{"name":"YOLO_single_image","url":"../p5js/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../p5js/YOLO/YOLO_webcam"}],"p5webeditor":[{"name":"YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/YOLO_single_image"},{"name":"YOLO_webcam","url":"https://editor.p5js.org/ml5/sketches/YOLO_webcam"}],"javascript":[{"name":"YOLO_single_image","url":"../javascript/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/YOLO/YOLO_webcam"}]},"ml5Boilerplate":{"p5js":[{"name":"ml5Boilerplate_Version","url":"../p5js/ml5Boilerplate/ml5Boilerplate_Version"}],"p5webeditor":[{"name":"ml5Boilerplate_Version","url":"https://editor.p5js.org/ml5/sketches/ml5Boilerplate_Version"}],"javascript":[{"name":"ml5Boilerplate_Version","url":"../javascript/ml5Boilerplate/ml5Boilerplate_Version"}]}} +{"BodyPix":{"p5js":[{"name":"BodyPix_Image","url":"../p5js/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../p5js/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../p5js/BodyPix/BodyPix_Webcam_Parts"}],"p5webeditor":[{"name":"BodyPix_Image","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"https://editor.p5js.org/ml5/sketches/BodyPix_Webcam_Parts"}],"javascript":[{"name":"BodyPix_Image","url":"../javascript/BodyPix/BodyPix_Image"},{"name":"BodyPix_Webcam","url":"../javascript/BodyPix/BodyPix_Webcam"},{"name":"BodyPix_Webcam_Parts","url":"../javascript/BodyPix/BodyPix_Webcam_Parts"}]},"CVAE":{"p5js":[{"name":"CVAE_QuickDraw","url":"../p5js/CVAE/CVAE_QuickDraw"}],"p5webeditor":[{"name":"CVAE_QuickDraw","url":"https://editor.p5js.org/ml5/sketches/CVAE_QuickDraw"}],"javascript":[{"name":"CVAE_QuickDraw","url":"../javascript/CVAE/CVAE_QuickDraw"}]},"CartoonGAN":{"p5js":[{"name":"CartoonGan_Basic","url":"../p5js/CartoonGAN/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"../p5js/CartoonGAN/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"../p5js/CartoonGAN/CartoonGan_WebCam"}],"p5webeditor":[{"name":"CartoonGan_Basic","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_Basic"},{"name":"CartoonGan_LoadModel","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_LoadModel"},{"name":"CartoonGan_WebCam","url":"https://editor.p5js.org/ml5/sketches/CartoonGan_WebCam"}]},"CharRNN":{"p5js":[{"name":"CharRNN_Interactive","url":"../p5js/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../p5js/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../p5js/CharRNN/CharRNN_Text_Stateful"}],"p5webeditor":[{"name":"CharRNN_Interactive","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"https://editor.p5js.org/ml5/sketches/CharRNN_Text_Stateful"}],"javascript":[{"name":"CharRNN_Interactive","url":"../javascript/CharRNN/CharRNN_Interactive"},{"name":"CharRNN_Text","url":"../javascript/CharRNN/CharRNN_Text"},{"name":"CharRNN_Text_Stateful","url":"../javascript/CharRNN/CharRNN_Text_Stateful"}]},"DBSCAN":{"p5js":[],"p5webeditor":[],"d3":[{"name":"DBSCAN_Cluster","url":"../d3/DBSCAN/DBSCAN_Cluster"}]},"DCGAN":{"p5js":[{"name":"DCGAN_LatentVector_RandomWalk","url":"../p5js/DCGAN/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"../p5js/DCGAN/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"../p5js/DCGAN/DCGAN_Random"}],"p5webeditor":[{"name":"DCGAN_LatentVector_RandomWalk","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_RandomWalk"},{"name":"DCGAN_LatentVector_Slider","url":"https://editor.p5js.org/ml5/sketches/DCGAN_LatentVector_Slider"},{"name":"DCGAN_Random","url":"https://editor.p5js.org/ml5/sketches/DCGAN_Random"}],"javascript":[{"name":"DCGAN_Random","url":"../javascript/DCGAN/DCGAN_Random"}]},"FaceApi":{"p5js":[{"name":"FaceApi_Image_Landmarks","url":"../p5js/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../p5js/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../p5js/FaceApi/FaceApi_Video_Landmarks_LocalModels"}],"p5webeditor":[{"name":"FaceApi_Image_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"https://editor.p5js.org/ml5/sketches/FaceApi_Video_Landmarks_LocalModels"}],"javascript":[{"name":"FaceApi_Image_Landmarks","url":"../javascript/FaceApi/FaceApi_Image_Landmarks"},{"name":"FaceApi_Video_Landmarks","url":"../javascript/FaceApi/FaceApi_Video_Landmarks"},{"name":"FaceApi_Video_Landmarks_LocalModels","url":"../javascript/FaceApi/FaceApi_Video_Landmarks_LocalModels"}]},"Facemesh":{"p5js":[{"name":"Facemesh_Image","url":"../p5js/Facemesh/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"../p5js/Facemesh/Facemesh_Webcam"}],"p5webeditor":[{"name":"Facemesh_Image","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Image"},{"name":"Facemesh_Webcam","url":"https://editor.p5js.org/ml5/sketches/Facemesh_Webcam"}]},"FeatureExtractor":{"p5js":[{"name":"FeatureExtractor_Image_Classification","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../p5js/FeatureExtractor/FeatureExtractor_Image_Regression"}],"p5webeditor":[{"name":"FeatureExtractor_Image_Classification","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"https://editor.p5js.org/ml5/sketches/FeatureExtractor_Image_Regression"}],"javascript":[{"name":"FeatureExtractor_Image_Classification","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Classification"},{"name":"FeatureExtractor_Image_Regression","url":"../javascript/FeatureExtractor/FeatureExtractor_Image_Regression"}]},"Handpose":{"p5js":[{"name":"Handpose_Image","url":"../p5js/Handpose/Handpose_Image"},{"name":"Handpose_Part_Selection","url":"../p5js/Handpose/Handpose_Part_Selection"},{"name":"Handpose_Webcam","url":"../p5js/Handpose/Handpose_Webcam"}],"p5webeditor":[{"name":"Handpose_Image","url":"https://editor.p5js.org/ml5/sketches/Handpose_Image"},{"name":"Handpose_Part_Selection","url":"https://editor.p5js.org/ml5/sketches/Handpose_Part_Selection"},{"name":"Handpose_Webcam","url":"https://editor.p5js.org/ml5/sketches/Handpose_Webcam"}]},"ImageClassification":{"p5js":[{"name":"ImageClassification","url":"../p5js/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../p5js/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../p5js/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../p5js/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../p5js/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../p5js/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"../p5js/ImageClassification/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"../p5js/ImageClassification/ImageClassification_Video_Load"}],"p5webeditor":[{"name":"ImageClassification","url":"https://editor.p5js.org/ml5/sketches/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSound"},{"name":"ImageClassification_VideoSoundTranslate","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_VideoSoundTranslate"},{"name":"ImageClassification_Video_Load","url":"https://editor.p5js.org/ml5/sketches/ImageClassification_Video_Load"}],"javascript":[{"name":"ImageClassification","url":"../javascript/ImageClassification/ImageClassification"},{"name":"ImageClassification_DoodleNet_Canvas","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Canvas"},{"name":"ImageClassification_DoodleNet_Video","url":"../javascript/ImageClassification/ImageClassification_DoodleNet_Video"},{"name":"ImageClassification_MultipleImages","url":"../javascript/ImageClassification/ImageClassification_MultipleImages"},{"name":"ImageClassification_Video","url":"../javascript/ImageClassification/ImageClassification_Video"},{"name":"ImageClassification_VideoScavengerHunt","url":"../javascript/ImageClassification/ImageClassification_VideoScavengerHunt"},{"name":"ImageClassification_VideoSound","url":"../javascript/ImageClassification/ImageClassification_VideoSound"},{"name":"ImageClassification_Video_Load","url":"../javascript/ImageClassification/ImageClassification_Video_Load"}]},"KMeans":{"p5js":[{"name":"KMeans_imageSegmentation","url":"../p5js/KMeans/KMeans_imageSegmentation"},{"name":"KMeans_mouseClustering","url":"../p5js/KMeans/KMeans_mouseClustering"}],"p5webeditor":[{"name":"KMeans_imageSegmentation","url":"https://editor.p5js.org/ml5/sketches/KMeans_imageSegmentation"},{"name":"KMeans_mouseClustering","url":"https://editor.p5js.org/ml5/sketches/KMeans_mouseClustering"}],"d3":[{"name":"KMeans_GaussianClusterDemo","url":"../d3/KMeans/KMeans_GaussianClusterDemo"}]},"KNNClassification":{"p5js":[{"name":"KNNClassification_PoseNet","url":"../p5js/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../p5js/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../p5js/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../p5js/KNNClassification/KNNClassification_VideoSquare"}],"p5webeditor":[{"name":"KNNClassification_PoseNet","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"https://editor.p5js.org/ml5/sketches/KNNClassification_VideoSquare"}],"javascript":[{"name":"KNNClassification_PoseNet","url":"../javascript/KNNClassification/KNNClassification_PoseNet"},{"name":"KNNClassification_Video","url":"../javascript/KNNClassification/KNNClassification_Video"},{"name":"KNNClassification_VideoSound","url":"../javascript/KNNClassification/KNNClassification_VideoSound"},{"name":"KNNClassification_VideoSquare","url":"../javascript/KNNClassification/KNNClassification_VideoSquare"}]},"NeuralNetwork":{"p5js":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"../p5js/NeuralNetwork/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"../p5js/NeuralNetwork/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"../p5js/NeuralNetwork/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"../p5js/NeuralNetwork/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"../p5js/NeuralNetwork/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"../p5js/NeuralNetwork/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"../p5js/NeuralNetwork/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"../p5js/NeuralNetwork/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"../p5js/NeuralNetwork/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"../p5js/NeuralNetwork/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"../p5js/NeuralNetwork/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"../p5js/NeuralNetwork/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"../p5js/NeuralNetwork/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"../p5js/NeuralNetwork/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"../p5js/NeuralNetwork/NeuroEvolution_testing"}],"p5webeditor":[{"name":"NeuralNetwork_ImageClassifier_Colors","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Colors"},{"name":"NeuralNetwork_ImageClassifier_Letters","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Letters"},{"name":"NeuralNetwork_ImageClassifier_Video","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_ImageClassifier_Video"},{"name":"NeuralNetwork_Interactive_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Interactive_Regression"},{"name":"NeuralNetwork_Simple_AorB","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_AorB"},{"name":"NeuralNetwork_Simple_Classification","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Classification"},{"name":"NeuralNetwork_Simple_Regression","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_Simple_Regression"},{"name":"NeuralNetwork_XOR","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_XOR"},{"name":"NeuralNetwork_basics","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_basics"},{"name":"NeuralNetwork_co2net","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_co2net"},{"name":"NeuralNetwork_color_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_color_classifier"},{"name":"NeuralNetwork_load_model","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_model"},{"name":"NeuralNetwork_load_saved_data","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_load_saved_data"},{"name":"NeuralNetwork_lowres_pixels","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_lowres_pixels"},{"name":"NeuralNetwork_multiple_layers","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_multiple_layers"},{"name":"NeuralNetwork_musical_face","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_face"},{"name":"NeuralNetwork_musical_mouse","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_musical_mouse"},{"name":"NeuralNetwork_pose_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_pose_classifier"},{"name":"NeuralNetwork_titanic","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_titanic"},{"name":"NeuralNetwork_xy_classifier","url":"https://editor.p5js.org/ml5/sketches/NeuralNetwork_xy_classifier"},{"name":"NeuroEvolution_FlappyBird","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_FlappyBird"},{"name":"NeuroEvolution_Path","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_Path"},{"name":"NeuroEvolution_testing","url":"https://editor.p5js.org/ml5/sketches/NeuroEvolution_testing"}]},"ObjectDetector":{"p5js":[{"name":"ObjectDetector_COCOSSD_Video","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"../p5js/ObjectDetector/ObjectDetector_COCOSSD_single_image"}],"p5webeditor":[{"name":"ObjectDetector_COCOSSD_Video","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_Video"},{"name":"ObjectDetector_COCOSSD_single_image","url":"https://editor.p5js.org/ml5/sketches/ObjectDetector_COCOSSD_single_image"}],"javascript":[{"name":"COCOSSD_single_image","url":"../javascript/ObjectDetector/COCOSSD_single_image"},{"name":"COCOSSD_webcam","url":"../javascript/ObjectDetector/COCOSSD_webcam"},{"name":"YOLO_single_image","url":"../javascript/ObjectDetector/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/ObjectDetector/YOLO_webcam"}]},"PitchDetection":{"p5js":[{"name":"PitchDetection","url":"../p5js/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../p5js/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../p5js/PitchDetection/PitchDetection_Piano"}],"p5webeditor":[{"name":"PitchDetection","url":"https://editor.p5js.org/ml5/sketches/PitchDetection"},{"name":"PitchDetection_Game","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"https://editor.p5js.org/ml5/sketches/PitchDetection_Piano"}],"javascript":[{"name":"PitchDetection","url":"../javascript/PitchDetection/PitchDetection"},{"name":"PitchDetection_Game","url":"../javascript/PitchDetection/PitchDetection_Game"},{"name":"PitchDetection_Piano","url":"../javascript/PitchDetection/PitchDetection_Piano"}]},"Pix2Pix":{"p5js":[{"name":"Pix2Pix_callback","url":"../p5js/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../p5js/Pix2Pix/Pix2Pix_promise"}],"p5webeditor":[{"name":"Pix2Pix_callback","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"https://editor.p5js.org/ml5/sketches/Pix2Pix_promise"}],"javascript":[{"name":"Pix2Pix_callback","url":"../javascript/Pix2Pix/Pix2Pix_callback"},{"name":"Pix2Pix_promise","url":"../javascript/Pix2Pix/Pix2Pix_promise"}]},"PoseNet":{"p5js":[{"name":"PoseNet_image_single","url":"../p5js/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../p5js/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../p5js/PoseNet/PoseNet_webcam"}],"p5webeditor":[{"name":"PoseNet_image_single","url":"https://editor.p5js.org/ml5/sketches/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"https://editor.p5js.org/ml5/sketches/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"https://editor.p5js.org/ml5/sketches/PoseNet_webcam"}],"javascript":[{"name":"PoseNet_image_single","url":"../javascript/PoseNet/PoseNet_image_single"},{"name":"PoseNet_part_selection","url":"../javascript/PoseNet/PoseNet_part_selection"},{"name":"PoseNet_webcam","url":"../javascript/PoseNet/PoseNet_webcam"}]},"Sentiment":{"p5js":[{"name":"Sentiment_Interactive","url":"../p5js/Sentiment/Sentiment_Interactive"}],"p5webeditor":[{"name":"Sentiment_Interactive","url":"https://editor.p5js.org/ml5/sketches/Sentiment_Interactive"}],"javascript":[{"name":"Sentiment_Interactive","url":"../javascript/Sentiment/Sentiment_Interactive"}]},"SketchRNN":{"p5js":[{"name":"SketchRNN_basic","url":"../p5js/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../p5js/SketchRNN/SketchRNN_interactive"}],"p5webeditor":[{"name":"SketchRNN_basic","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"https://editor.p5js.org/ml5/sketches/SketchRNN_interactive"}],"javascript":[{"name":"SketchRNN_basic","url":"../javascript/SketchRNN/SketchRNN_basic"},{"name":"SketchRNN_interactive","url":"../javascript/SketchRNN/SketchRNN_interactive"}]},"SoundClassification":{"p5js":[{"name":"SoundClassification_speechcommand","url":"../p5js/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../p5js/SoundClassification/SoundClassification_speechcommand_load"}],"p5webeditor":[{"name":"SoundClassification_speechcommand","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"https://editor.p5js.org/ml5/sketches/SoundClassification_speechcommand_load"}],"javascript":[{"name":"SoundClassification_speechcommand","url":"../javascript/SoundClassification/SoundClassification_speechcommand"},{"name":"SoundClassification_speechcommand_load","url":"../javascript/SoundClassification/SoundClassification_speechcommand_load"}]},"StyleTransfer":{"p5js":[{"name":"StyleTransfer_Image","url":"../p5js/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../p5js/StyleTransfer/StyleTransfer_Video"}],"p5webeditor":[{"name":"StyleTransfer_Image","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"https://editor.p5js.org/ml5/sketches/StyleTransfer_Video"}],"javascript":[{"name":"StyleTransfer_Image","url":"../javascript/StyleTransfer/StyleTransfer_Image"},{"name":"StyleTransfer_Video","url":"../javascript/StyleTransfer/StyleTransfer_Video"}]},"TeachableMachine":{"p5js":[{"name":"ImageModel_TM","url":"../p5js/TeachableMachine/ImageModel_TM"},{"name":"SoundModel_TM","url":"../p5js/TeachableMachine/SoundModel_TM"}],"p5webeditor":[{"name":"ImageModel_TM","url":"https://editor.p5js.org/ml5/sketches/ImageModel_TM"},{"name":"SoundModel_TM","url":"https://editor.p5js.org/ml5/sketches/SoundModel_TM"}]},"UNET":{"p5js":[{"name":"UNET_webcam","url":"../p5js/UNET/UNET_webcam"}],"p5webeditor":[{"name":"UNET_webcam","url":"https://editor.p5js.org/ml5/sketches/UNET_webcam"}],"javascript":[{"name":"UNET_webcam","url":"../javascript/UNET/UNET_webcam"}]},"UniversalSentenceEncoder":{"p5js":[{"name":"UniversalSentenceEncoder_Basic","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"../p5js/UniversalSentenceEncoder/UniversalSentenceEncoder_WithTokenizer"}],"p5webeditor":[{"name":"UniversalSentenceEncoder_Basic","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_Basic"},{"name":"UniversalSentenceEncoder_WithTokenizer","url":"https://editor.p5js.org/ml5/sketches/UniversalSentenceEncoder_WithTokenizer"}]},"YOLO":{"p5js":[{"name":"YOLO_single_image","url":"../p5js/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../p5js/YOLO/YOLO_webcam"}],"p5webeditor":[{"name":"YOLO_single_image","url":"https://editor.p5js.org/ml5/sketches/YOLO_single_image"},{"name":"YOLO_webcam","url":"https://editor.p5js.org/ml5/sketches/YOLO_webcam"}],"javascript":[{"name":"YOLO_single_image","url":"../javascript/YOLO/YOLO_single_image"},{"name":"YOLO_webcam","url":"../javascript/YOLO/YOLO_webcam"}]},"ml5Boilerplate":{"p5js":[{"name":"ml5Boilerplate_Version","url":"../p5js/ml5Boilerplate/ml5Boilerplate_Version"}],"p5webeditor":[{"name":"ml5Boilerplate_Version","url":"https://editor.p5js.org/ml5/sketches/ml5Boilerplate_Version"}],"javascript":[{"name":"ml5Boilerplate_Version","url":"../javascript/ml5Boilerplate/ml5Boilerplate_Version"}]}} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 1d952d06d..9ca2f9f27 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -11,11 +11,13 @@ module.exports = config => { frameworks: ["jasmine"], files: [ "src/index.js", + "src/utils/*_test.js", `src/${config.model ? config.model : "**"}/*_test.js`, `src/${config.model ? config.model : "**"}/**/*_test.js`, ], preprocessors: { "src/index.js": ["webpack"], + "src/utils/*.js": ["webpack"], }, webpack: { // TODO: This is duplication of the webpack.common.babel.js file, but they diff --git a/package-lock.json b/package-lock.json index 8def46925..1910c35b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.10.1", + "version": "0.10.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 78caa1c98..f3a9a690f 100644 --- a/package.json +++ b/package.json @@ -133,4 +133,4 @@ "face-api.js": "~0.22.2", "onchange": "^6.1.0" } -} \ No newline at end of file +} diff --git a/src/utils/callcallback_test.js b/src/utils/callcallback_test.js new file mode 100644 index 000000000..df60a2b23 --- /dev/null +++ b/src/utils/callcallback_test.js @@ -0,0 +1,80 @@ +import callCallback from "./callcallback"; + +describe("callCallback", () => { + describe("if no arguments are passed", () => { + it("returns undefined", () => { + const result = callCallback(); + expect(result).toBe(undefined); + }); + }); + describe("if nothing is passed to the second argument", () => { + it("returns whatever is in the first argument if one exists", () => { + const mockArg = "yo"; + const result = callCallback(mockArg); + expect(result).toBe(mockArg); + }); + it("returns a promise if it passed as the first argument", async () => { + const mockFunction = greeting => + new Promise(resolve => { + resolve(greeting); + }); + const result = callCallback(mockFunction("yo")); + expect(result instanceof Promise).toBe(true); + expect(await callCallback(mockFunction("yo"))).toBe("yo"); + }); + }); + describe("if a promise object is passed as the first argument and a callback is passed as a second argument", () => { + describe("when the promise is successful", () => { + it("it calls the callback function with the result of the promise", async () => { + const mockFunction = greeting => + new Promise(resolve => { + resolve(greeting); + }); + + const mockCallback = (err, result) => { + return `hello ${result}`; + }; + + const mockUtils = { mockCallback }; + spyOn(mockUtils, "mockCallback").and.callThrough(); + + const result = callCallback(mockFunction("world"), mockUtils.mockCallback); + expect(result instanceof Promise).toBe(true); + + result.then(innerPromise => { + innerPromise.then(callbackResults => { + expect(mockUtils.mockCallback).toHaveBeenCalledTimes(1); + expect(callbackResults).toBe("hello world"); + }); + }); + }); + }); + describe("when the promise fails", () => { + it("it calls the callback function with the error", async () => { + const mockFunction = greeting => + new Promise(resolve => { + resolve(greeting); + }); + + const mockCallback = (err, result) => { + if (err) throw err; + return `hello ${result}`; + }; + + const mockUtils = { mockCallback, mockFunction }; + spyOn(mockUtils, "mockCallback").and.callThrough(); + spyOn(mockUtils, "mockFunction").and.returnValue(Promise.reject(new Error("error"))); + + const result = callCallback(mockFunction("world"), mockUtils.mockCallback); + expect(result instanceof Promise).toBe(true); + + result.then(innerPromise => { + innerPromise.catch(err => { + expect(mockUtils.mockCallback).toHaveBeenCalledTimes(1); + expect(mockUtils.mockCallback).toHaveBeenCalledOnceWith(err); + }); + }); + }); + }); + }); +}); From bcca70979ddb837e97e359d8e17da0f93c727243 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 03:42:03 +0000 Subject: [PATCH 38/49] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b20a22a71..a010971e6 100644 --- a/README.md +++ b/README.md @@ -338,6 +338,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Amir

💻 💡 +
lindapaiste

💻 🤔 🐛 From 4882dd79f7f68c65b1a5081a7c49b28bdfb03b0c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 03:42:04 +0000 Subject: [PATCH 39/49] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b0e69c20b..ebaca5996 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1297,6 +1297,17 @@ "code", "example" ] + }, + { + "login": "lindapaiste", + "name": "lindapaiste", + "avatar_url": "https://avatars.githubusercontent.com/u/28965286?v=4", + "profile": "http://lindapaiste.com", + "contributions": [ + "code", + "ideas", + "bug" + ] } ], "contributorsPerLine": 7, From b967557b468030a165d46c8aeda771b88f8d33f7 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sat, 5 Mar 2022 14:59:21 -0600 Subject: [PATCH 40/49] guard all `window` references --- src/BodyPix/index.js | 11 +++++------ src/FaceApi/index.js | 22 +++------------------- src/utils/modelLoader.js | 22 ++++++++++++++++++---- src/utils/p5Utils.js | 4 +++- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/BodyPix/index.js b/src/BodyPix/index.js index 57deedc07..1433485ba 100644 --- a/src/BodyPix/index.js +++ b/src/BodyPix/index.js @@ -90,14 +90,13 @@ class BodyPix { bodyPartsSpec(colorOptions) { const result = colorOptions !== undefined || Object.keys(colorOptions).length >= 24 ? colorOptions : this.config.palette; - // Check if we're getting p5 colors, make sure they are rgb - if (p5Utils.checkP5() && result !== undefined && Object.keys(result).length >= 24) { + // Check if we're getting p5 colors, make sure they are rgb + const p5 = p5Utils.p5Instance; + if (p5 && result !== undefined && Object.keys(result).length >= 24) { // Ensure the p5Color object is an RGB array Object.keys(result).forEach(part => { - if (result[part].color instanceof window.p5.Color) { + if (result[part].color instanceof p5.Color) { result[part].color = this.p5Color2RGB(result[part].color); - } else { - result[part].color = result[part].color; } }); } @@ -452,4 +451,4 @@ const bodyPix = (videoOrOptionsOrCallback, optionsOrCallback, cb) => { return callback ? instance : instance.ready; } -export default bodyPix; \ No newline at end of file +export default bodyPix; diff --git a/src/FaceApi/index.js b/src/FaceApi/index.js index 27469c1d5..0ea10814f 100644 --- a/src/FaceApi/index.js +++ b/src/FaceApi/index.js @@ -5,6 +5,7 @@ /* eslint prefer-destructuring: ["error", {AssignmentExpression: {array: false}}] */ /* eslint no-await-in-loop: "off" */ +/* eslint class-methods-use-this: "off" */ /* * FaceApi: real-time face recognition, and landmark detection @@ -14,6 +15,7 @@ import * as tf from "@tensorflow/tfjs"; import * as faceapi from "face-api.js"; import callCallback from "../utils/callcallback"; +import modelLoader from "../utils/modelLoader"; const DEFAULTS = { withLandmarks: true, @@ -93,7 +95,7 @@ class FaceApiBase { Object.keys(this.config.MODEL_URLS).forEach(item => { if (modelOptions.includes(item)) { - this.config.MODEL_URLS[item] = this.getModelPath(this.config.MODEL_URLS[item]); + this.config.MODEL_URLS[item] = modelLoader.getModelPath(this.config.MODEL_URLS[item]); } }); @@ -354,18 +356,6 @@ class FaceApiBase { return _param !== undefined ? _param : _default; } - /** - * Checks if the given string is an absolute or relative path and returns - * the path to the modelJson - * @param {String} absoluteOrRelativeUrl - */ - getModelPath(absoluteOrRelativeUrl) { - const modelJsonPath = this.isAbsoluteURL(absoluteOrRelativeUrl) - ? absoluteOrRelativeUrl - : window.location.pathname + absoluteOrRelativeUrl; - return modelJsonPath; - } - /** * Sets the return options for .detect() or .detectSingle() in case any are given * @param {Object} faceApiOptions @@ -399,12 +389,6 @@ class FaceApiBase { }); } - /* eslint class-methods-use-this: "off" */ - isAbsoluteURL(str) { - const pattern = new RegExp("^(?:[a-z]+:)?//", "i"); - return !!pattern.test(str); - } - /** * get parts from landmarks * @param {*} result diff --git a/src/utils/modelLoader.js b/src/utils/modelLoader.js index f4fc42514..f602d07d1 100644 --- a/src/utils/modelLoader.js +++ b/src/utils/modelLoader.js @@ -1,14 +1,28 @@ +/** + * Check if the provided URL string starts with a hostname, + * such as http://, https://, etc. + * @param {string} str + * @returns {boolean} + */ function isAbsoluteURL(str) { const pattern = new RegExp('^(?:[a-z]+:)?//', 'i'); - return !!pattern.test(str); + return pattern.test(str); } +/** + * Accepts a URL that may be a complete URL, or a relative location. + * Returns an absolute URL based on the current window location. + * @param {string} absoluteOrRelativeUrl + * @returns {string} + */ function getModelPath(absoluteOrRelativeUrl) { - const modelJsonPath = isAbsoluteURL(absoluteOrRelativeUrl) ? absoluteOrRelativeUrl : window.location.pathname + absoluteOrRelativeUrl - return modelJsonPath; + if (!isAbsoluteURL(absoluteOrRelativeUrl) && typeof window !== 'undefined') { + return window.location.pathname + absoluteOrRelativeUrl; + } + return absoluteOrRelativeUrl; } export default { isAbsoluteURL, getModelPath -} \ No newline at end of file +} diff --git a/src/utils/p5Utils.js b/src/utils/p5Utils.js index 829144faf..c1a2537c9 100644 --- a/src/utils/p5Utils.js +++ b/src/utils/p5Utils.js @@ -5,7 +5,9 @@ class P5Util { constructor() { + if (typeof window !== "undefined") { this.m_p5Instance = window; + } } /** @@ -19,7 +21,7 @@ class P5Util { /** * This getter will return p5, checking first if it is in * the window and next if it is in the p5 property of this.m_p5Instance - * @returns {boolean} if it is in p5 + * @returns {boolean} if it is in p5 */ get p5Instance() { if (typeof this.m_p5Instance !== "undefined" && From 11de63f78f4539e936229a0104b48a9e5bd27738 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sat, 5 Mar 2022 16:54:58 -0600 Subject: [PATCH 41/49] cleanup class p5Util --- src/utils/p5Utils.js | 94 +++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/src/utils/p5Utils.js b/src/utils/p5Utils.js index c1a2537c9..4c12a363b 100644 --- a/src/utils/p5Utils.js +++ b/src/utils/p5Utils.js @@ -6,22 +6,30 @@ class P5Util { constructor() { if (typeof window !== "undefined") { + /** + * Store the window as a private property regardless of whether p5 is present. + * Can also set this property by calling method setP5Instance(). + * @property {Window | p5 | {p5: p5} | undefined} m_p5Instance + * @private + */ this.m_p5Instance = window; } } /** - * Set p5 instance globally. - * @param {Object} p5Instance + * Set p5 instance globally in order to enable p5 features throughout ml5. + * Call this function with the p5 instance when using p5 in instance mode. + * @param {p5 | {p5: p5}} p5Instance */ setP5Instance(p5Instance) { - this.m_p5Instance = p5Instance; + this.m_p5Instance = p5Instance; } /** - * This getter will return p5, checking first if it is in - * the window and next if it is in the p5 property of this.m_p5Instance - * @returns {boolean} if it is in p5 + * Dynamic getter checks if p5 is loaded and will return undefined if p5 cannot be found, + * or will return an object containing all of the global p5 properties. + * It first checks if p5 is in the window, and then if it is in the p5 property of this.m_p5Instance. + * @returns {p5 | undefined} */ get p5Instance() { if (typeof this.m_p5Instance !== "undefined" && @@ -35,75 +43,81 @@ class P5Util { /** * This function will check if the p5 is in the environment - * Either it is in the p5Instance mode OR it is in the window - * @returns {boolean} if it is in p5 + * Either it is in the p5Instance mode OR it is in the window + * @returns {boolean} if it is in p5 */ checkP5() { return !!this.p5Instance; } /** - * Convert a canvas to Blob - * @param {HTMLCanvasElement} inputCanvas - * @returns {Blob} blob object - */ + * Convert a canvas to a Blob object. + * @param {HTMLCanvasElement} inputCanvas + * @returns {Promise} + */ /* eslint class-methods-use-this: ["error", { "exceptMethods": ["getBlob"] }] */ getBlob(inputCanvas) { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { inputCanvas.toBlob((blob) => { - resolve(blob); + if (blob) { + resolve(blob); + } else { + reject(new Error('Canvas could not be converted to Blob.')); + } }); }); }; /** - * Load image in async way. - * @param {String} url - */ + * Load a p5.Image from a URL in an async way. + * @param {string} url + * @return {Promise} + */ loadAsync(url) { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { this.p5Instance.loadImage(url, (img) => { resolve(img); + }, () => { + reject(new Error(`Could not load image from url ${url}`)); }); }); }; /** - * convert raw bytes to blob object - * @param {Array} raws - * @param {number} x - * @param {number} y - * @returns {Blob} - */ - async rawToBlob(raws, x, y) { + * convert raw bytes to blob object + * @param {number[] | Uint8ClampedArray | ArrayLike} raws + * @param {number} width + * @param {number} height + * @returns {Promise} + */ + async rawToBlob(raws, width, height) { const arr = Array.from(raws) const canvas = document.createElement('canvas'); // Consider using offScreenCanvas when it is ready? const ctx = canvas.getContext('2d'); - canvas.width = x; - canvas.height = y; + canvas.width = width; + canvas.height = height; - const imgData = ctx.createImageData(x, y); - const { data } = imgData; + const imgData = ctx.createImageData(width, height); + const {data} = imgData; - for (let i = 0; i < x * y * 4; i += 1 ) data[i] = arr[i]; + for (let i = 0; i < width * height * 4; i += 1) data[i] = arr[i]; ctx.putImageData(imgData, 0, 0); - const blob = await this.getBlob(canvas); - return blob; + return this.getBlob(canvas); }; /** - * Conver Blob to P5.Image - * @param {Blob} blob - * @param {Object} p5Img - */ + * Convert Blob to P5.Image + * @param {Blob} blob + * Note: may want to reject instead of returning null. + * @returns {Promise} + */ async blobToP5Image(blob) { - if (this.checkP5()) { - const p5Img = await this.loadAsync(URL.createObjectURL(blob)); - return p5Img; + if (this.checkP5() && typeof URL !== "undefined") { + return this.loadAsync(URL.createObjectURL(blob)); } - return null; + return null; }; } From 0561b5abd1502d2f7619663ea44f2f866761f426 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 6 Mar 2022 15:24:57 -0600 Subject: [PATCH 42/49] Don't call `this.predict()` unless there is a video. --- src/Facemesh/index.js | 23 +++++++++++++---------- src/Handpose/index.js | 21 +++++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/Facemesh/index.js b/src/Facemesh/index.js index ee0c35c37..905c4bd0d 100644 --- a/src/Facemesh/index.js +++ b/src/Facemesh/index.js @@ -3,9 +3,6 @@ // This software is released under the MIT License. // https://opensource.org/licenses/MIT -/* eslint prefer-destructuring: ["error", {AssignmentExpression: {array: false}}] */ -/* eslint no-await-in-loop: "off" */ - /* * Facemesh: Facial landmark detection in the browser * Ported and integrated from all the hard work by: https://github.com/tensorflow/tfjs-models/tree/master/facemesh @@ -19,14 +16,17 @@ import callCallback from "../utils/callcallback"; class Facemesh extends EventEmitter { /** * Create Facemesh. - * @param {HTMLVideoElement} video - An HTMLVideoElement. - * @param {object} options - An object with options. - * @param {function} callback - A callback to be called when the model is ready. + * @param {HTMLVideoElement} [video] - An HTMLVideoElement. + * @param {object} [options] - An object with options. + * @param {function} [callback] - A callback to be called when the model is ready. */ constructor(video, options, callback) { super(); this.video = video; + /** + * @type {null | facemeshCore.FaceMesh} + */ this.model = null; this.modelReady = false; this.config = options; @@ -49,18 +49,21 @@ class Facemesh extends EventEmitter { }; }); } - - this.predict(); + if (this.video) { + this.predict(); + } return this; } /** - * Load the model and set it to this.model - * @return {this} the Facemesh model. + * @return {Promise} an array of predictions. */ async predict(inputOr, callback) { const input = this.getInput(inputOr); + if (!input) { + throw new Error("No input image found."); + } const { flipHorizontal } = this.config; const predictions = await this.model.estimateFaces(input, flipHorizontal); const result = predictions; diff --git a/src/Handpose/index.js b/src/Handpose/index.js index 341a08cf7..029b43d62 100644 --- a/src/Handpose/index.js +++ b/src/Handpose/index.js @@ -3,9 +3,6 @@ // This software is released under the MIT License. // https://opensource.org/licenses/MIT -/* eslint prefer-destructuring: ["error", {AssignmentExpression: {array: false}}] */ -/* eslint no-await-in-loop: "off" */ - /* * Handpose: Palm detector and hand-skeleton finger tracking in the browser * Ported and integrated from all the hard work by: https://github.com/tensorflow/tfjs-models/tree/master/handpose @@ -19,14 +16,17 @@ import callCallback from "../utils/callcallback"; class Handpose extends EventEmitter { /** * Create Handpose. - * @param {HTMLVideoElement} video - An HTMLVideoElement. - * @param {object} options - An object with options. - * @param {function} callback - A callback to be called when the model is ready. + * @param {HTMLVideoElement} [video] - An HTMLVideoElement. + * @param {object} [options] - An object with options. + * @param {function} [callback] - A callback to be called when the model is ready. */ constructor(video, options, callback) { super(); this.video = video; + /** + * @type {null|handposeCore.HandPose} + */ this.model = null; this.modelReady = false; this.config = options; @@ -50,19 +50,20 @@ class Handpose extends EventEmitter { }); } - this.predict(); + if (this.video) { + this.predict(); + } return this; } /** - * Load the model and set it to this.model - * @return {this} the Handpose model. + * @return {Promise} an array of predictions. */ async predict(inputOr, callback) { const input = this.getInput(inputOr); if (!input) { - return []; + throw new Error("No input image found."); } const { flipHorizontal } = this.config; const predictions = await this.model.estimateHands(input, flipHorizontal); From 49f8d80861b0cd975dabc21ca9af345be31dea16 Mon Sep 17 00:00:00 2001 From: ml5 Date: Mon, 7 Mar 2022 03:12:07 +0000 Subject: [PATCH 43/49] bumps package, readme, and package-lock --- README.md | 8 +++++--- package.json | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a010971e6..c52b0adb9 100644 --- a/README.md +++ b/README.md @@ -64,15 +64,16 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. +

-* You can use the latest version (0.10.3) by adding it to the head section of your HTML document: +* You can use the latest version (0.10.4) by adding it to the head section of your HTML document: -**v0.10.3** +**v0.10.4** - +

@@ -110,6 +111,7 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. + diff --git a/package.json b/package.json index f3a9a690f..9ee8d4e34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.10.3", + "version": "0.10.4", "description": "A friendly machine learning library for the web.", "main": "dist/ml5.min.js", "directories": { @@ -133,4 +133,4 @@ "face-api.js": "~0.22.2", "onchange": "^6.1.0" } -} +} \ No newline at end of file From 2503b50f2c4b4349da3f29b29f60ee7de7909d2c Mon Sep 17 00:00:00 2001 From: ml5 Date: Tue, 15 Mar 2022 00:18:43 +0000 Subject: [PATCH 44/49] bumps package, readme, and package-lock --- README.md | 8 +++++--- package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c52b0adb9..dcdbcecbc 100644 --- a/README.md +++ b/README.md @@ -65,15 +65,16 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. +

-* You can use the latest version (0.10.4) by adding it to the head section of your HTML document: +* You can use the latest version (0.10.5) by adding it to the head section of your HTML document: -**v0.10.4** +**v0.10.5** - +

@@ -112,6 +113,7 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. + diff --git a/package.json b/package.json index 9ee8d4e34..cb6270803 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.10.4", + "version": "0.10.5", "description": "A friendly machine learning library for the web.", "main": "dist/ml5.min.js", "directories": { From cb4cf2bef5568a1900246f2c51169c9c18abf38c Mon Sep 17 00:00:00 2001 From: Evan Weinberg Date: Tue, 15 Mar 2022 15:09:58 +0700 Subject: [PATCH 45/49] Update README.md Updated URLs for the getting started, reference, and FAQ pages. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dcdbcecbc..0b5bb7e35 100644 --- a/README.md +++ b/README.md @@ -144,11 +144,11 @@ For example: ## Resources -- [Getting Started](https://ml5js.org/getting-started/) -- [API Reference](https://ml5js.org/reference/) +- [Getting Started](https://learn.ml5js.org/#/) +- [API Reference](https://learn.ml5js.org/#/reference/index) - [Examples](https://github.com/ml5js/ml5-library/tree/main/examples) - [Community](https://ml5js.org/community) -- [FAQ](https://ml5js.org/getting-started/faq/) +- [FAQ](https://learn.ml5js.org/#/faq) ## Standalone Examples From 2d007a6d4e4e796b3e4287dfeba773ffc87b5b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom-Lucas=20S=C3=A4ger?= <33449313+tlsaeger@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:54:25 +0100 Subject: [PATCH 46/49] Update README.md removed # on first link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b5bb7e35..2a18a2e5e 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ For example: ## Resources -- [Getting Started](https://learn.ml5js.org/#/) +- [Getting Started](https://learn.ml5js.org/) - [API Reference](https://learn.ml5js.org/#/reference/index) - [Examples](https://github.com/ml5js/ml5-library/tree/main/examples) - [Community](https://ml5js.org/community) From 5ebe6b53e3ed8a505cdbd064f53c3d8ae98345de Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:03:38 +0000 Subject: [PATCH 47/49] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dcdbcecbc..1e1b61a33 100644 --- a/README.md +++ b/README.md @@ -343,6 +343,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Amir

💻 💡
lindapaiste

💻 🤔 🐛 +
Evan Weinberg

📖 From 722389ce93a8a26ec91b2d188c02ca852597299a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:03:39 +0000 Subject: [PATCH 48/49] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ebaca5996..8c7d7b544 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1308,6 +1308,15 @@ "ideas", "bug" ] + }, + { + "login": "emwdx", + "name": "Evan Weinberg", + "avatar_url": "https://avatars.githubusercontent.com/u/1531831?v=4", + "profile": "http://evanweinberg.com", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From e616a57813a646da3d47887e87fc9c893da0a7eb Mon Sep 17 00:00:00 2001 From: ml5 Date: Sat, 2 Apr 2022 21:41:33 +0000 Subject: [PATCH 49/49] bumps package, readme, and package-lock --- README.md | 8 +++++--- package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 40e986959..23cb9c96e 100644 --- a/README.md +++ b/README.md @@ -66,15 +66,16 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. +

-* You can use the latest version (0.10.5) by adding it to the head section of your HTML document: +* You can use the latest version (0.10.6) by adding it to the head section of your HTML document: -**v0.10.5** +**v0.10.6** - +

@@ -114,6 +115,7 @@ Before getting started with ml5.js, review our [Code of Conduct](https://github. + diff --git a/package.json b/package.json index cb6270803..97e3452b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.10.5", + "version": "0.10.6", "description": "A friendly machine learning library for the web.", "main": "dist/ml5.min.js", "directories": {