From efe5c70255167d5d314638a9c4fcf2e41be40a3d Mon Sep 17 00:00:00 2001 From: Paxon Frady Date: Tue, 12 Mar 2024 14:02:01 -0700 Subject: [PATCH] resonator template demo. --- README.md | 9 +- colormaps.py | 1060 +++++++++++++++++++++++++++++++ res_utils.py | 598 ++++++++++++++++++ resonator_template.ipynb | 1272 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 2937 insertions(+), 2 deletions(-) create mode 100644 colormaps.py create mode 100644 res_utils.py create mode 100644 resonator_template.ipynb diff --git a/README.md b/README.md index 536bd0f..d98f24c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ -# resonatorNMI -Example notebook of resonator network for scene understanding +# Resonator NMI + +Example notebook of resonator network for scene understanding. This demo is for the paper: + +Renner, A., Supic, L., Danielescu, A., Indiveri, G., Olshausen, B.A., Sandamirskaya, Y., Sommer, F.T., Frady, E.P. (2024). Neuromorphic Visual Scene Understanding with Resonator Networks. Nature Machine Intelligence. + + diff --git a/colormaps.py b/colormaps.py new file mode 100644 index 0000000..91c5654 --- /dev/null +++ b/colormaps.py @@ -0,0 +1,1060 @@ + +# New matplotlib colormaps by Nathaniel J. Smith, Stefan van der Walt, +# and (in the case of viridis) Eric Firing. +# +# This file and the colormaps in it are released under the CC0 license / +# public domain dedication. We would appreciate credit if you use or +# redistribute these colormaps, but do not impose any legal restrictions. +# +# To the extent possible under law, the persons who associated CC0 with +# mpl-colormaps have waived all copyright and related or neighboring rights +# to mpl-colormaps. +# +# You should have received a copy of the CC0 legalcode along with this +# work. If not, see . + +__all__ = ['magma', 'inferno', 'plasma', 'viridis'] + +_magma_data = [[0.001462, 0.000466, 0.013866], + [0.002258, 0.001295, 0.018331], + [0.003279, 0.002305, 0.023708], + [0.004512, 0.003490, 0.029965], + [0.005950, 0.004843, 0.037130], + [0.007588, 0.006356, 0.044973], + [0.009426, 0.008022, 0.052844], + [0.011465, 0.009828, 0.060750], + [0.013708, 0.011771, 0.068667], + [0.016156, 0.013840, 0.076603], + [0.018815, 0.016026, 0.084584], + [0.021692, 0.018320, 0.092610], + [0.024792, 0.020715, 0.100676], + [0.028123, 0.023201, 0.108787], + [0.031696, 0.025765, 0.116965], + [0.035520, 0.028397, 0.125209], + [0.039608, 0.031090, 0.133515], + [0.043830, 0.033830, 0.141886], + [0.048062, 0.036607, 0.150327], + [0.052320, 0.039407, 0.158841], + [0.056615, 0.042160, 0.167446], + [0.060949, 0.044794, 0.176129], + [0.065330, 0.047318, 0.184892], + [0.069764, 0.049726, 0.193735], + [0.074257, 0.052017, 0.202660], + [0.078815, 0.054184, 0.211667], + [0.083446, 0.056225, 0.220755], + [0.088155, 0.058133, 0.229922], + [0.092949, 0.059904, 0.239164], + [0.097833, 0.061531, 0.248477], + [0.102815, 0.063010, 0.257854], + [0.107899, 0.064335, 0.267289], + [0.113094, 0.065492, 0.276784], + [0.118405, 0.066479, 0.286321], + [0.123833, 0.067295, 0.295879], + [0.129380, 0.067935, 0.305443], + [0.135053, 0.068391, 0.315000], + [0.140858, 0.068654, 0.324538], + [0.146785, 0.068738, 0.334011], + [0.152839, 0.068637, 0.343404], + [0.159018, 0.068354, 0.352688], + [0.165308, 0.067911, 0.361816], + [0.171713, 0.067305, 0.370771], + [0.178212, 0.066576, 0.379497], + [0.184801, 0.065732, 0.387973], + [0.191460, 0.064818, 0.396152], + [0.198177, 0.063862, 0.404009], + [0.204935, 0.062907, 0.411514], + [0.211718, 0.061992, 0.418647], + [0.218512, 0.061158, 0.425392], + [0.225302, 0.060445, 0.431742], + [0.232077, 0.059889, 0.437695], + [0.238826, 0.059517, 0.443256], + [0.245543, 0.059352, 0.448436], + [0.252220, 0.059415, 0.453248], + [0.258857, 0.059706, 0.457710], + [0.265447, 0.060237, 0.461840], + [0.271994, 0.060994, 0.465660], + [0.278493, 0.061978, 0.469190], + [0.284951, 0.063168, 0.472451], + [0.291366, 0.064553, 0.475462], + [0.297740, 0.066117, 0.478243], + [0.304081, 0.067835, 0.480812], + [0.310382, 0.069702, 0.483186], + [0.316654, 0.071690, 0.485380], + [0.322899, 0.073782, 0.487408], + [0.329114, 0.075972, 0.489287], + [0.335308, 0.078236, 0.491024], + [0.341482, 0.080564, 0.492631], + [0.347636, 0.082946, 0.494121], + [0.353773, 0.085373, 0.495501], + [0.359898, 0.087831, 0.496778], + [0.366012, 0.090314, 0.497960], + [0.372116, 0.092816, 0.499053], + [0.378211, 0.095332, 0.500067], + [0.384299, 0.097855, 0.501002], + [0.390384, 0.100379, 0.501864], + [0.396467, 0.102902, 0.502658], + [0.402548, 0.105420, 0.503386], + [0.408629, 0.107930, 0.504052], + [0.414709, 0.110431, 0.504662], + [0.420791, 0.112920, 0.505215], + [0.426877, 0.115395, 0.505714], + [0.432967, 0.117855, 0.506160], + [0.439062, 0.120298, 0.506555], + [0.445163, 0.122724, 0.506901], + [0.451271, 0.125132, 0.507198], + [0.457386, 0.127522, 0.507448], + [0.463508, 0.129893, 0.507652], + [0.469640, 0.132245, 0.507809], + [0.475780, 0.134577, 0.507921], + [0.481929, 0.136891, 0.507989], + [0.488088, 0.139186, 0.508011], + [0.494258, 0.141462, 0.507988], + [0.500438, 0.143719, 0.507920], + [0.506629, 0.145958, 0.507806], + [0.512831, 0.148179, 0.507648], + [0.519045, 0.150383, 0.507443], + [0.525270, 0.152569, 0.507192], + [0.531507, 0.154739, 0.506895], + [0.537755, 0.156894, 0.506551], + [0.544015, 0.159033, 0.506159], + [0.550287, 0.161158, 0.505719], + [0.556571, 0.163269, 0.505230], + [0.562866, 0.165368, 0.504692], + [0.569172, 0.167454, 0.504105], + [0.575490, 0.169530, 0.503466], + [0.581819, 0.171596, 0.502777], + [0.588158, 0.173652, 0.502035], + [0.594508, 0.175701, 0.501241], + [0.600868, 0.177743, 0.500394], + [0.607238, 0.179779, 0.499492], + [0.613617, 0.181811, 0.498536], + [0.620005, 0.183840, 0.497524], + [0.626401, 0.185867, 0.496456], + [0.632805, 0.187893, 0.495332], + [0.639216, 0.189921, 0.494150], + [0.645633, 0.191952, 0.492910], + [0.652056, 0.193986, 0.491611], + [0.658483, 0.196027, 0.490253], + [0.664915, 0.198075, 0.488836], + [0.671349, 0.200133, 0.487358], + [0.677786, 0.202203, 0.485819], + [0.684224, 0.204286, 0.484219], + [0.690661, 0.206384, 0.482558], + [0.697098, 0.208501, 0.480835], + [0.703532, 0.210638, 0.479049], + [0.709962, 0.212797, 0.477201], + [0.716387, 0.214982, 0.475290], + [0.722805, 0.217194, 0.473316], + [0.729216, 0.219437, 0.471279], + [0.735616, 0.221713, 0.469180], + [0.742004, 0.224025, 0.467018], + [0.748378, 0.226377, 0.464794], + [0.754737, 0.228772, 0.462509], + [0.761077, 0.231214, 0.460162], + [0.767398, 0.233705, 0.457755], + [0.773695, 0.236249, 0.455289], + [0.779968, 0.238851, 0.452765], + [0.786212, 0.241514, 0.450184], + [0.792427, 0.244242, 0.447543], + [0.798608, 0.247040, 0.444848], + [0.804752, 0.249911, 0.442102], + [0.810855, 0.252861, 0.439305], + [0.816914, 0.255895, 0.436461], + [0.822926, 0.259016, 0.433573], + [0.828886, 0.262229, 0.430644], + [0.834791, 0.265540, 0.427671], + [0.840636, 0.268953, 0.424666], + [0.846416, 0.272473, 0.421631], + [0.852126, 0.276106, 0.418573], + [0.857763, 0.279857, 0.415496], + [0.863320, 0.283729, 0.412403], + [0.868793, 0.287728, 0.409303], + [0.874176, 0.291859, 0.406205], + [0.879464, 0.296125, 0.403118], + [0.884651, 0.300530, 0.400047], + [0.889731, 0.305079, 0.397002], + [0.894700, 0.309773, 0.393995], + [0.899552, 0.314616, 0.391037], + [0.904281, 0.319610, 0.388137], + [0.908884, 0.324755, 0.385308], + [0.913354, 0.330052, 0.382563], + [0.917689, 0.335500, 0.379915], + [0.921884, 0.341098, 0.377376], + [0.925937, 0.346844, 0.374959], + [0.929845, 0.352734, 0.372677], + [0.933606, 0.358764, 0.370541], + [0.937221, 0.364929, 0.368567], + [0.940687, 0.371224, 0.366762], + [0.944006, 0.377643, 0.365136], + [0.947180, 0.384178, 0.363701], + [0.950210, 0.390820, 0.362468], + [0.953099, 0.397563, 0.361438], + [0.955849, 0.404400, 0.360619], + [0.958464, 0.411324, 0.360014], + [0.960949, 0.418323, 0.359630], + [0.963310, 0.425390, 0.359469], + [0.965549, 0.432519, 0.359529], + [0.967671, 0.439703, 0.359810], + [0.969680, 0.446936, 0.360311], + [0.971582, 0.454210, 0.361030], + [0.973381, 0.461520, 0.361965], + [0.975082, 0.468861, 0.363111], + [0.976690, 0.476226, 0.364466], + [0.978210, 0.483612, 0.366025], + [0.979645, 0.491014, 0.367783], + [0.981000, 0.498428, 0.369734], + [0.982279, 0.505851, 0.371874], + [0.983485, 0.513280, 0.374198], + [0.984622, 0.520713, 0.376698], + [0.985693, 0.528148, 0.379371], + [0.986700, 0.535582, 0.382210], + [0.987646, 0.543015, 0.385210], + [0.988533, 0.550446, 0.388365], + [0.989363, 0.557873, 0.391671], + [0.990138, 0.565296, 0.395122], + [0.990871, 0.572706, 0.398714], + [0.991558, 0.580107, 0.402441], + [0.992196, 0.587502, 0.406299], + [0.992785, 0.594891, 0.410283], + [0.993326, 0.602275, 0.414390], + [0.993834, 0.609644, 0.418613], + [0.994309, 0.616999, 0.422950], + [0.994738, 0.624350, 0.427397], + [0.995122, 0.631696, 0.431951], + [0.995480, 0.639027, 0.436607], + [0.995810, 0.646344, 0.441361], + [0.996096, 0.653659, 0.446213], + [0.996341, 0.660969, 0.451160], + [0.996580, 0.668256, 0.456192], + [0.996775, 0.675541, 0.461314], + [0.996925, 0.682828, 0.466526], + [0.997077, 0.690088, 0.471811], + [0.997186, 0.697349, 0.477182], + [0.997254, 0.704611, 0.482635], + [0.997325, 0.711848, 0.488154], + [0.997351, 0.719089, 0.493755], + [0.997351, 0.726324, 0.499428], + [0.997341, 0.733545, 0.505167], + [0.997285, 0.740772, 0.510983], + [0.997228, 0.747981, 0.516859], + [0.997138, 0.755190, 0.522806], + [0.997019, 0.762398, 0.528821], + [0.996898, 0.769591, 0.534892], + [0.996727, 0.776795, 0.541039], + [0.996571, 0.783977, 0.547233], + [0.996369, 0.791167, 0.553499], + [0.996162, 0.798348, 0.559820], + [0.995932, 0.805527, 0.566202], + [0.995680, 0.812706, 0.572645], + [0.995424, 0.819875, 0.579140], + [0.995131, 0.827052, 0.585701], + [0.994851, 0.834213, 0.592307], + [0.994524, 0.841387, 0.598983], + [0.994222, 0.848540, 0.605696], + [0.993866, 0.855711, 0.612482], + [0.993545, 0.862859, 0.619299], + [0.993170, 0.870024, 0.626189], + [0.992831, 0.877168, 0.633109], + [0.992440, 0.884330, 0.640099], + [0.992089, 0.891470, 0.647116], + [0.991688, 0.898627, 0.654202], + [0.991332, 0.905763, 0.661309], + [0.990930, 0.912915, 0.668481], + [0.990570, 0.920049, 0.675675], + [0.990175, 0.927196, 0.682926], + [0.989815, 0.934329, 0.690198], + [0.989434, 0.941470, 0.697519], + [0.989077, 0.948604, 0.704863], + [0.988717, 0.955742, 0.712242], + [0.988367, 0.962878, 0.719649], + [0.988033, 0.970012, 0.727077], + [0.987691, 0.977154, 0.734536], + [0.987387, 0.984288, 0.742002], + [0.987053, 0.991438, 0.749504]] + +_inferno_data = [[0.001462, 0.000466, 0.013866], + [0.002267, 0.001270, 0.018570], + [0.003299, 0.002249, 0.024239], + [0.004547, 0.003392, 0.030909], + [0.006006, 0.004692, 0.038558], + [0.007676, 0.006136, 0.046836], + [0.009561, 0.007713, 0.055143], + [0.011663, 0.009417, 0.063460], + [0.013995, 0.011225, 0.071862], + [0.016561, 0.013136, 0.080282], + [0.019373, 0.015133, 0.088767], + [0.022447, 0.017199, 0.097327], + [0.025793, 0.019331, 0.105930], + [0.029432, 0.021503, 0.114621], + [0.033385, 0.023702, 0.123397], + [0.037668, 0.025921, 0.132232], + [0.042253, 0.028139, 0.141141], + [0.046915, 0.030324, 0.150164], + [0.051644, 0.032474, 0.159254], + [0.056449, 0.034569, 0.168414], + [0.061340, 0.036590, 0.177642], + [0.066331, 0.038504, 0.186962], + [0.071429, 0.040294, 0.196354], + [0.076637, 0.041905, 0.205799], + [0.081962, 0.043328, 0.215289], + [0.087411, 0.044556, 0.224813], + [0.092990, 0.045583, 0.234358], + [0.098702, 0.046402, 0.243904], + [0.104551, 0.047008, 0.253430], + [0.110536, 0.047399, 0.262912], + [0.116656, 0.047574, 0.272321], + [0.122908, 0.047536, 0.281624], + [0.129285, 0.047293, 0.290788], + [0.135778, 0.046856, 0.299776], + [0.142378, 0.046242, 0.308553], + [0.149073, 0.045468, 0.317085], + [0.155850, 0.044559, 0.325338], + [0.162689, 0.043554, 0.333277], + [0.169575, 0.042489, 0.340874], + [0.176493, 0.041402, 0.348111], + [0.183429, 0.040329, 0.354971], + [0.190367, 0.039309, 0.361447], + [0.197297, 0.038400, 0.367535], + [0.204209, 0.037632, 0.373238], + [0.211095, 0.037030, 0.378563], + [0.217949, 0.036615, 0.383522], + [0.224763, 0.036405, 0.388129], + [0.231538, 0.036405, 0.392400], + [0.238273, 0.036621, 0.396353], + [0.244967, 0.037055, 0.400007], + [0.251620, 0.037705, 0.403378], + [0.258234, 0.038571, 0.406485], + [0.264810, 0.039647, 0.409345], + [0.271347, 0.040922, 0.411976], + [0.277850, 0.042353, 0.414392], + [0.284321, 0.043933, 0.416608], + [0.290763, 0.045644, 0.418637], + [0.297178, 0.047470, 0.420491], + [0.303568, 0.049396, 0.422182], + [0.309935, 0.051407, 0.423721], + [0.316282, 0.053490, 0.425116], + [0.322610, 0.055634, 0.426377], + [0.328921, 0.057827, 0.427511], + [0.335217, 0.060060, 0.428524], + [0.341500, 0.062325, 0.429425], + [0.347771, 0.064616, 0.430217], + [0.354032, 0.066925, 0.430906], + [0.360284, 0.069247, 0.431497], + [0.366529, 0.071579, 0.431994], + [0.372768, 0.073915, 0.432400], + [0.379001, 0.076253, 0.432719], + [0.385228, 0.078591, 0.432955], + [0.391453, 0.080927, 0.433109], + [0.397674, 0.083257, 0.433183], + [0.403894, 0.085580, 0.433179], + [0.410113, 0.087896, 0.433098], + [0.416331, 0.090203, 0.432943], + [0.422549, 0.092501, 0.432714], + [0.428768, 0.094790, 0.432412], + [0.434987, 0.097069, 0.432039], + [0.441207, 0.099338, 0.431594], + [0.447428, 0.101597, 0.431080], + [0.453651, 0.103848, 0.430498], + [0.459875, 0.106089, 0.429846], + [0.466100, 0.108322, 0.429125], + [0.472328, 0.110547, 0.428334], + [0.478558, 0.112764, 0.427475], + [0.484789, 0.114974, 0.426548], + [0.491022, 0.117179, 0.425552], + [0.497257, 0.119379, 0.424488], + [0.503493, 0.121575, 0.423356], + [0.509730, 0.123769, 0.422156], + [0.515967, 0.125960, 0.420887], + [0.522206, 0.128150, 0.419549], + [0.528444, 0.130341, 0.418142], + [0.534683, 0.132534, 0.416667], + [0.540920, 0.134729, 0.415123], + [0.547157, 0.136929, 0.413511], + [0.553392, 0.139134, 0.411829], + [0.559624, 0.141346, 0.410078], + [0.565854, 0.143567, 0.408258], + [0.572081, 0.145797, 0.406369], + [0.578304, 0.148039, 0.404411], + [0.584521, 0.150294, 0.402385], + [0.590734, 0.152563, 0.400290], + [0.596940, 0.154848, 0.398125], + [0.603139, 0.157151, 0.395891], + [0.609330, 0.159474, 0.393589], + [0.615513, 0.161817, 0.391219], + [0.621685, 0.164184, 0.388781], + [0.627847, 0.166575, 0.386276], + [0.633998, 0.168992, 0.383704], + [0.640135, 0.171438, 0.381065], + [0.646260, 0.173914, 0.378359], + [0.652369, 0.176421, 0.375586], + [0.658463, 0.178962, 0.372748], + [0.664540, 0.181539, 0.369846], + [0.670599, 0.184153, 0.366879], + [0.676638, 0.186807, 0.363849], + [0.682656, 0.189501, 0.360757], + [0.688653, 0.192239, 0.357603], + [0.694627, 0.195021, 0.354388], + [0.700576, 0.197851, 0.351113], + [0.706500, 0.200728, 0.347777], + [0.712396, 0.203656, 0.344383], + [0.718264, 0.206636, 0.340931], + [0.724103, 0.209670, 0.337424], + [0.729909, 0.212759, 0.333861], + [0.735683, 0.215906, 0.330245], + [0.741423, 0.219112, 0.326576], + [0.747127, 0.222378, 0.322856], + [0.752794, 0.225706, 0.319085], + [0.758422, 0.229097, 0.315266], + [0.764010, 0.232554, 0.311399], + [0.769556, 0.236077, 0.307485], + [0.775059, 0.239667, 0.303526], + [0.780517, 0.243327, 0.299523], + [0.785929, 0.247056, 0.295477], + [0.791293, 0.250856, 0.291390], + [0.796607, 0.254728, 0.287264], + [0.801871, 0.258674, 0.283099], + [0.807082, 0.262692, 0.278898], + [0.812239, 0.266786, 0.274661], + [0.817341, 0.270954, 0.270390], + [0.822386, 0.275197, 0.266085], + [0.827372, 0.279517, 0.261750], + [0.832299, 0.283913, 0.257383], + [0.837165, 0.288385, 0.252988], + [0.841969, 0.292933, 0.248564], + [0.846709, 0.297559, 0.244113], + [0.851384, 0.302260, 0.239636], + [0.855992, 0.307038, 0.235133], + [0.860533, 0.311892, 0.230606], + [0.865006, 0.316822, 0.226055], + [0.869409, 0.321827, 0.221482], + [0.873741, 0.326906, 0.216886], + [0.878001, 0.332060, 0.212268], + [0.882188, 0.337287, 0.207628], + [0.886302, 0.342586, 0.202968], + [0.890341, 0.347957, 0.198286], + [0.894305, 0.353399, 0.193584], + [0.898192, 0.358911, 0.188860], + [0.902003, 0.364492, 0.184116], + [0.905735, 0.370140, 0.179350], + [0.909390, 0.375856, 0.174563], + [0.912966, 0.381636, 0.169755], + [0.916462, 0.387481, 0.164924], + [0.919879, 0.393389, 0.160070], + [0.923215, 0.399359, 0.155193], + [0.926470, 0.405389, 0.150292], + [0.929644, 0.411479, 0.145367], + [0.932737, 0.417627, 0.140417], + [0.935747, 0.423831, 0.135440], + [0.938675, 0.430091, 0.130438], + [0.941521, 0.436405, 0.125409], + [0.944285, 0.442772, 0.120354], + [0.946965, 0.449191, 0.115272], + [0.949562, 0.455660, 0.110164], + [0.952075, 0.462178, 0.105031], + [0.954506, 0.468744, 0.099874], + [0.956852, 0.475356, 0.094695], + [0.959114, 0.482014, 0.089499], + [0.961293, 0.488716, 0.084289], + [0.963387, 0.495462, 0.079073], + [0.965397, 0.502249, 0.073859], + [0.967322, 0.509078, 0.068659], + [0.969163, 0.515946, 0.063488], + [0.970919, 0.522853, 0.058367], + [0.972590, 0.529798, 0.053324], + [0.974176, 0.536780, 0.048392], + [0.975677, 0.543798, 0.043618], + [0.977092, 0.550850, 0.039050], + [0.978422, 0.557937, 0.034931], + [0.979666, 0.565057, 0.031409], + [0.980824, 0.572209, 0.028508], + [0.981895, 0.579392, 0.026250], + [0.982881, 0.586606, 0.024661], + [0.983779, 0.593849, 0.023770], + [0.984591, 0.601122, 0.023606], + [0.985315, 0.608422, 0.024202], + [0.985952, 0.615750, 0.025592], + [0.986502, 0.623105, 0.027814], + [0.986964, 0.630485, 0.030908], + [0.987337, 0.637890, 0.034916], + [0.987622, 0.645320, 0.039886], + [0.987819, 0.652773, 0.045581], + [0.987926, 0.660250, 0.051750], + [0.987945, 0.667748, 0.058329], + [0.987874, 0.675267, 0.065257], + [0.987714, 0.682807, 0.072489], + [0.987464, 0.690366, 0.079990], + [0.987124, 0.697944, 0.087731], + [0.986694, 0.705540, 0.095694], + [0.986175, 0.713153, 0.103863], + [0.985566, 0.720782, 0.112229], + [0.984865, 0.728427, 0.120785], + [0.984075, 0.736087, 0.129527], + [0.983196, 0.743758, 0.138453], + [0.982228, 0.751442, 0.147565], + [0.981173, 0.759135, 0.156863], + [0.980032, 0.766837, 0.166353], + [0.978806, 0.774545, 0.176037], + [0.977497, 0.782258, 0.185923], + [0.976108, 0.789974, 0.196018], + [0.974638, 0.797692, 0.206332], + [0.973088, 0.805409, 0.216877], + [0.971468, 0.813122, 0.227658], + [0.969783, 0.820825, 0.238686], + [0.968041, 0.828515, 0.249972], + [0.966243, 0.836191, 0.261534], + [0.964394, 0.843848, 0.273391], + [0.962517, 0.851476, 0.285546], + [0.960626, 0.859069, 0.298010], + [0.958720, 0.866624, 0.310820], + [0.956834, 0.874129, 0.323974], + [0.954997, 0.881569, 0.337475], + [0.953215, 0.888942, 0.351369], + [0.951546, 0.896226, 0.365627], + [0.950018, 0.903409, 0.380271], + [0.948683, 0.910473, 0.395289], + [0.947594, 0.917399, 0.410665], + [0.946809, 0.924168, 0.426373], + [0.946392, 0.930761, 0.442367], + [0.946403, 0.937159, 0.458592], + [0.946903, 0.943348, 0.474970], + [0.947937, 0.949318, 0.491426], + [0.949545, 0.955063, 0.507860], + [0.951740, 0.960587, 0.524203], + [0.954529, 0.965896, 0.540361], + [0.957896, 0.971003, 0.556275], + [0.961812, 0.975924, 0.571925], + [0.966249, 0.980678, 0.587206], + [0.971162, 0.985282, 0.602154], + [0.976511, 0.989753, 0.616760], + [0.982257, 0.994109, 0.631017], + [0.988362, 0.998364, 0.644924]] + +_plasma_data = [[0.050383, 0.029803, 0.527975], + [0.063536, 0.028426, 0.533124], + [0.075353, 0.027206, 0.538007], + [0.086222, 0.026125, 0.542658], + [0.096379, 0.025165, 0.547103], + [0.105980, 0.024309, 0.551368], + [0.115124, 0.023556, 0.555468], + [0.123903, 0.022878, 0.559423], + [0.132381, 0.022258, 0.563250], + [0.140603, 0.021687, 0.566959], + [0.148607, 0.021154, 0.570562], + [0.156421, 0.020651, 0.574065], + [0.164070, 0.020171, 0.577478], + [0.171574, 0.019706, 0.580806], + [0.178950, 0.019252, 0.584054], + [0.186213, 0.018803, 0.587228], + [0.193374, 0.018354, 0.590330], + [0.200445, 0.017902, 0.593364], + [0.207435, 0.017442, 0.596333], + [0.214350, 0.016973, 0.599239], + [0.221197, 0.016497, 0.602083], + [0.227983, 0.016007, 0.604867], + [0.234715, 0.015502, 0.607592], + [0.241396, 0.014979, 0.610259], + [0.248032, 0.014439, 0.612868], + [0.254627, 0.013882, 0.615419], + [0.261183, 0.013308, 0.617911], + [0.267703, 0.012716, 0.620346], + [0.274191, 0.012109, 0.622722], + [0.280648, 0.011488, 0.625038], + [0.287076, 0.010855, 0.627295], + [0.293478, 0.010213, 0.629490], + [0.299855, 0.009561, 0.631624], + [0.306210, 0.008902, 0.633694], + [0.312543, 0.008239, 0.635700], + [0.318856, 0.007576, 0.637640], + [0.325150, 0.006915, 0.639512], + [0.331426, 0.006261, 0.641316], + [0.337683, 0.005618, 0.643049], + [0.343925, 0.004991, 0.644710], + [0.350150, 0.004382, 0.646298], + [0.356359, 0.003798, 0.647810], + [0.362553, 0.003243, 0.649245], + [0.368733, 0.002724, 0.650601], + [0.374897, 0.002245, 0.651876], + [0.381047, 0.001814, 0.653068], + [0.387183, 0.001434, 0.654177], + [0.393304, 0.001114, 0.655199], + [0.399411, 0.000859, 0.656133], + [0.405503, 0.000678, 0.656977], + [0.411580, 0.000577, 0.657730], + [0.417642, 0.000564, 0.658390], + [0.423689, 0.000646, 0.658956], + [0.429719, 0.000831, 0.659425], + [0.435734, 0.001127, 0.659797], + [0.441732, 0.001540, 0.660069], + [0.447714, 0.002080, 0.660240], + [0.453677, 0.002755, 0.660310], + [0.459623, 0.003574, 0.660277], + [0.465550, 0.004545, 0.660139], + [0.471457, 0.005678, 0.659897], + [0.477344, 0.006980, 0.659549], + [0.483210, 0.008460, 0.659095], + [0.489055, 0.010127, 0.658534], + [0.494877, 0.011990, 0.657865], + [0.500678, 0.014055, 0.657088], + [0.506454, 0.016333, 0.656202], + [0.512206, 0.018833, 0.655209], + [0.517933, 0.021563, 0.654109], + [0.523633, 0.024532, 0.652901], + [0.529306, 0.027747, 0.651586], + [0.534952, 0.031217, 0.650165], + [0.540570, 0.034950, 0.648640], + [0.546157, 0.038954, 0.647010], + [0.551715, 0.043136, 0.645277], + [0.557243, 0.047331, 0.643443], + [0.562738, 0.051545, 0.641509], + [0.568201, 0.055778, 0.639477], + [0.573632, 0.060028, 0.637349], + [0.579029, 0.064296, 0.635126], + [0.584391, 0.068579, 0.632812], + [0.589719, 0.072878, 0.630408], + [0.595011, 0.077190, 0.627917], + [0.600266, 0.081516, 0.625342], + [0.605485, 0.085854, 0.622686], + [0.610667, 0.090204, 0.619951], + [0.615812, 0.094564, 0.617140], + [0.620919, 0.098934, 0.614257], + [0.625987, 0.103312, 0.611305], + [0.631017, 0.107699, 0.608287], + [0.636008, 0.112092, 0.605205], + [0.640959, 0.116492, 0.602065], + [0.645872, 0.120898, 0.598867], + [0.650746, 0.125309, 0.595617], + [0.655580, 0.129725, 0.592317], + [0.660374, 0.134144, 0.588971], + [0.665129, 0.138566, 0.585582], + [0.669845, 0.142992, 0.582154], + [0.674522, 0.147419, 0.578688], + [0.679160, 0.151848, 0.575189], + [0.683758, 0.156278, 0.571660], + [0.688318, 0.160709, 0.568103], + [0.692840, 0.165141, 0.564522], + [0.697324, 0.169573, 0.560919], + [0.701769, 0.174005, 0.557296], + [0.706178, 0.178437, 0.553657], + [0.710549, 0.182868, 0.550004], + [0.714883, 0.187299, 0.546338], + [0.719181, 0.191729, 0.542663], + [0.723444, 0.196158, 0.538981], + [0.727670, 0.200586, 0.535293], + [0.731862, 0.205013, 0.531601], + [0.736019, 0.209439, 0.527908], + [0.740143, 0.213864, 0.524216], + [0.744232, 0.218288, 0.520524], + [0.748289, 0.222711, 0.516834], + [0.752312, 0.227133, 0.513149], + [0.756304, 0.231555, 0.509468], + [0.760264, 0.235976, 0.505794], + [0.764193, 0.240396, 0.502126], + [0.768090, 0.244817, 0.498465], + [0.771958, 0.249237, 0.494813], + [0.775796, 0.253658, 0.491171], + [0.779604, 0.258078, 0.487539], + [0.783383, 0.262500, 0.483918], + [0.787133, 0.266922, 0.480307], + [0.790855, 0.271345, 0.476706], + [0.794549, 0.275770, 0.473117], + [0.798216, 0.280197, 0.469538], + [0.801855, 0.284626, 0.465971], + [0.805467, 0.289057, 0.462415], + [0.809052, 0.293491, 0.458870], + [0.812612, 0.297928, 0.455338], + [0.816144, 0.302368, 0.451816], + [0.819651, 0.306812, 0.448306], + [0.823132, 0.311261, 0.444806], + [0.826588, 0.315714, 0.441316], + [0.830018, 0.320172, 0.437836], + [0.833422, 0.324635, 0.434366], + [0.836801, 0.329105, 0.430905], + [0.840155, 0.333580, 0.427455], + [0.843484, 0.338062, 0.424013], + [0.846788, 0.342551, 0.420579], + [0.850066, 0.347048, 0.417153], + [0.853319, 0.351553, 0.413734], + [0.856547, 0.356066, 0.410322], + [0.859750, 0.360588, 0.406917], + [0.862927, 0.365119, 0.403519], + [0.866078, 0.369660, 0.400126], + [0.869203, 0.374212, 0.396738], + [0.872303, 0.378774, 0.393355], + [0.875376, 0.383347, 0.389976], + [0.878423, 0.387932, 0.386600], + [0.881443, 0.392529, 0.383229], + [0.884436, 0.397139, 0.379860], + [0.887402, 0.401762, 0.376494], + [0.890340, 0.406398, 0.373130], + [0.893250, 0.411048, 0.369768], + [0.896131, 0.415712, 0.366407], + [0.898984, 0.420392, 0.363047], + [0.901807, 0.425087, 0.359688], + [0.904601, 0.429797, 0.356329], + [0.907365, 0.434524, 0.352970], + [0.910098, 0.439268, 0.349610], + [0.912800, 0.444029, 0.346251], + [0.915471, 0.448807, 0.342890], + [0.918109, 0.453603, 0.339529], + [0.920714, 0.458417, 0.336166], + [0.923287, 0.463251, 0.332801], + [0.925825, 0.468103, 0.329435], + [0.928329, 0.472975, 0.326067], + [0.930798, 0.477867, 0.322697], + [0.933232, 0.482780, 0.319325], + [0.935630, 0.487712, 0.315952], + [0.937990, 0.492667, 0.312575], + [0.940313, 0.497642, 0.309197], + [0.942598, 0.502639, 0.305816], + [0.944844, 0.507658, 0.302433], + [0.947051, 0.512699, 0.299049], + [0.949217, 0.517763, 0.295662], + [0.951344, 0.522850, 0.292275], + [0.953428, 0.527960, 0.288883], + [0.955470, 0.533093, 0.285490], + [0.957469, 0.538250, 0.282096], + [0.959424, 0.543431, 0.278701], + [0.961336, 0.548636, 0.275305], + [0.963203, 0.553865, 0.271909], + [0.965024, 0.559118, 0.268513], + [0.966798, 0.564396, 0.265118], + [0.968526, 0.569700, 0.261721], + [0.970205, 0.575028, 0.258325], + [0.971835, 0.580382, 0.254931], + [0.973416, 0.585761, 0.251540], + [0.974947, 0.591165, 0.248151], + [0.976428, 0.596595, 0.244767], + [0.977856, 0.602051, 0.241387], + [0.979233, 0.607532, 0.238013], + [0.980556, 0.613039, 0.234646], + [0.981826, 0.618572, 0.231287], + [0.983041, 0.624131, 0.227937], + [0.984199, 0.629718, 0.224595], + [0.985301, 0.635330, 0.221265], + [0.986345, 0.640969, 0.217948], + [0.987332, 0.646633, 0.214648], + [0.988260, 0.652325, 0.211364], + [0.989128, 0.658043, 0.208100], + [0.989935, 0.663787, 0.204859], + [0.990681, 0.669558, 0.201642], + [0.991365, 0.675355, 0.198453], + [0.991985, 0.681179, 0.195295], + [0.992541, 0.687030, 0.192170], + [0.993032, 0.692907, 0.189084], + [0.993456, 0.698810, 0.186041], + [0.993814, 0.704741, 0.183043], + [0.994103, 0.710698, 0.180097], + [0.994324, 0.716681, 0.177208], + [0.994474, 0.722691, 0.174381], + [0.994553, 0.728728, 0.171622], + [0.994561, 0.734791, 0.168938], + [0.994495, 0.740880, 0.166335], + [0.994355, 0.746995, 0.163821], + [0.994141, 0.753137, 0.161404], + [0.993851, 0.759304, 0.159092], + [0.993482, 0.765499, 0.156891], + [0.993033, 0.771720, 0.154808], + [0.992505, 0.777967, 0.152855], + [0.991897, 0.784239, 0.151042], + [0.991209, 0.790537, 0.149377], + [0.990439, 0.796859, 0.147870], + [0.989587, 0.803205, 0.146529], + [0.988648, 0.809579, 0.145357], + [0.987621, 0.815978, 0.144363], + [0.986509, 0.822401, 0.143557], + [0.985314, 0.828846, 0.142945], + [0.984031, 0.835315, 0.142528], + [0.982653, 0.841812, 0.142303], + [0.981190, 0.848329, 0.142279], + [0.979644, 0.854866, 0.142453], + [0.977995, 0.861432, 0.142808], + [0.976265, 0.868016, 0.143351], + [0.974443, 0.874622, 0.144061], + [0.972530, 0.881250, 0.144923], + [0.970533, 0.887896, 0.145919], + [0.968443, 0.894564, 0.147014], + [0.966271, 0.901249, 0.148180], + [0.964021, 0.907950, 0.149370], + [0.961681, 0.914672, 0.150520], + [0.959276, 0.921407, 0.151566], + [0.956808, 0.928152, 0.152409], + [0.954287, 0.934908, 0.152921], + [0.951726, 0.941671, 0.152925], + [0.949151, 0.948435, 0.152178], + [0.946602, 0.955190, 0.150328], + [0.944152, 0.961916, 0.146861], + [0.941896, 0.968590, 0.140956], + [0.940015, 0.975158, 0.131326]] + +_viridis_data = [[0.267004, 0.004874, 0.329415], + [0.268510, 0.009605, 0.335427], + [0.269944, 0.014625, 0.341379], + [0.271305, 0.019942, 0.347269], + [0.272594, 0.025563, 0.353093], + [0.273809, 0.031497, 0.358853], + [0.274952, 0.037752, 0.364543], + [0.276022, 0.044167, 0.370164], + [0.277018, 0.050344, 0.375715], + [0.277941, 0.056324, 0.381191], + [0.278791, 0.062145, 0.386592], + [0.279566, 0.067836, 0.391917], + [0.280267, 0.073417, 0.397163], + [0.280894, 0.078907, 0.402329], + [0.281446, 0.084320, 0.407414], + [0.281924, 0.089666, 0.412415], + [0.282327, 0.094955, 0.417331], + [0.282656, 0.100196, 0.422160], + [0.282910, 0.105393, 0.426902], + [0.283091, 0.110553, 0.431554], + [0.283197, 0.115680, 0.436115], + [0.283229, 0.120777, 0.440584], + [0.283187, 0.125848, 0.444960], + [0.283072, 0.130895, 0.449241], + [0.282884, 0.135920, 0.453427], + [0.282623, 0.140926, 0.457517], + [0.282290, 0.145912, 0.461510], + [0.281887, 0.150881, 0.465405], + [0.281412, 0.155834, 0.469201], + [0.280868, 0.160771, 0.472899], + [0.280255, 0.165693, 0.476498], + [0.279574, 0.170599, 0.479997], + [0.278826, 0.175490, 0.483397], + [0.278012, 0.180367, 0.486697], + [0.277134, 0.185228, 0.489898], + [0.276194, 0.190074, 0.493001], + [0.275191, 0.194905, 0.496005], + [0.274128, 0.199721, 0.498911], + [0.273006, 0.204520, 0.501721], + [0.271828, 0.209303, 0.504434], + [0.270595, 0.214069, 0.507052], + [0.269308, 0.218818, 0.509577], + [0.267968, 0.223549, 0.512008], + [0.266580, 0.228262, 0.514349], + [0.265145, 0.232956, 0.516599], + [0.263663, 0.237631, 0.518762], + [0.262138, 0.242286, 0.520837], + [0.260571, 0.246922, 0.522828], + [0.258965, 0.251537, 0.524736], + [0.257322, 0.256130, 0.526563], + [0.255645, 0.260703, 0.528312], + [0.253935, 0.265254, 0.529983], + [0.252194, 0.269783, 0.531579], + [0.250425, 0.274290, 0.533103], + [0.248629, 0.278775, 0.534556], + [0.246811, 0.283237, 0.535941], + [0.244972, 0.287675, 0.537260], + [0.243113, 0.292092, 0.538516], + [0.241237, 0.296485, 0.539709], + [0.239346, 0.300855, 0.540844], + [0.237441, 0.305202, 0.541921], + [0.235526, 0.309527, 0.542944], + [0.233603, 0.313828, 0.543914], + [0.231674, 0.318106, 0.544834], + [0.229739, 0.322361, 0.545706], + [0.227802, 0.326594, 0.546532], + [0.225863, 0.330805, 0.547314], + [0.223925, 0.334994, 0.548053], + [0.221989, 0.339161, 0.548752], + [0.220057, 0.343307, 0.549413], + [0.218130, 0.347432, 0.550038], + [0.216210, 0.351535, 0.550627], + [0.214298, 0.355619, 0.551184], + [0.212395, 0.359683, 0.551710], + [0.210503, 0.363727, 0.552206], + [0.208623, 0.367752, 0.552675], + [0.206756, 0.371758, 0.553117], + [0.204903, 0.375746, 0.553533], + [0.203063, 0.379716, 0.553925], + [0.201239, 0.383670, 0.554294], + [0.199430, 0.387607, 0.554642], + [0.197636, 0.391528, 0.554969], + [0.195860, 0.395433, 0.555276], + [0.194100, 0.399323, 0.555565], + [0.192357, 0.403199, 0.555836], + [0.190631, 0.407061, 0.556089], + [0.188923, 0.410910, 0.556326], + [0.187231, 0.414746, 0.556547], + [0.185556, 0.418570, 0.556753], + [0.183898, 0.422383, 0.556944], + [0.182256, 0.426184, 0.557120], + [0.180629, 0.429975, 0.557282], + [0.179019, 0.433756, 0.557430], + [0.177423, 0.437527, 0.557565], + [0.175841, 0.441290, 0.557685], + [0.174274, 0.445044, 0.557792], + [0.172719, 0.448791, 0.557885], + [0.171176, 0.452530, 0.557965], + [0.169646, 0.456262, 0.558030], + [0.168126, 0.459988, 0.558082], + [0.166617, 0.463708, 0.558119], + [0.165117, 0.467423, 0.558141], + [0.163625, 0.471133, 0.558148], + [0.162142, 0.474838, 0.558140], + [0.160665, 0.478540, 0.558115], + [0.159194, 0.482237, 0.558073], + [0.157729, 0.485932, 0.558013], + [0.156270, 0.489624, 0.557936], + [0.154815, 0.493313, 0.557840], + [0.153364, 0.497000, 0.557724], + [0.151918, 0.500685, 0.557587], + [0.150476, 0.504369, 0.557430], + [0.149039, 0.508051, 0.557250], + [0.147607, 0.511733, 0.557049], + [0.146180, 0.515413, 0.556823], + [0.144759, 0.519093, 0.556572], + [0.143343, 0.522773, 0.556295], + [0.141935, 0.526453, 0.555991], + [0.140536, 0.530132, 0.555659], + [0.139147, 0.533812, 0.555298], + [0.137770, 0.537492, 0.554906], + [0.136408, 0.541173, 0.554483], + [0.135066, 0.544853, 0.554029], + [0.133743, 0.548535, 0.553541], + [0.132444, 0.552216, 0.553018], + [0.131172, 0.555899, 0.552459], + [0.129933, 0.559582, 0.551864], + [0.128729, 0.563265, 0.551229], + [0.127568, 0.566949, 0.550556], + [0.126453, 0.570633, 0.549841], + [0.125394, 0.574318, 0.549086], + [0.124395, 0.578002, 0.548287], + [0.123463, 0.581687, 0.547445], + [0.122606, 0.585371, 0.546557], + [0.121831, 0.589055, 0.545623], + [0.121148, 0.592739, 0.544641], + [0.120565, 0.596422, 0.543611], + [0.120092, 0.600104, 0.542530], + [0.119738, 0.603785, 0.541400], + [0.119512, 0.607464, 0.540218], + [0.119423, 0.611141, 0.538982], + [0.119483, 0.614817, 0.537692], + [0.119699, 0.618490, 0.536347], + [0.120081, 0.622161, 0.534946], + [0.120638, 0.625828, 0.533488], + [0.121380, 0.629492, 0.531973], + [0.122312, 0.633153, 0.530398], + [0.123444, 0.636809, 0.528763], + [0.124780, 0.640461, 0.527068], + [0.126326, 0.644107, 0.525311], + [0.128087, 0.647749, 0.523491], + [0.130067, 0.651384, 0.521608], + [0.132268, 0.655014, 0.519661], + [0.134692, 0.658636, 0.517649], + [0.137339, 0.662252, 0.515571], + [0.140210, 0.665859, 0.513427], + [0.143303, 0.669459, 0.511215], + [0.146616, 0.673050, 0.508936], + [0.150148, 0.676631, 0.506589], + [0.153894, 0.680203, 0.504172], + [0.157851, 0.683765, 0.501686], + [0.162016, 0.687316, 0.499129], + [0.166383, 0.690856, 0.496502], + [0.170948, 0.694384, 0.493803], + [0.175707, 0.697900, 0.491033], + [0.180653, 0.701402, 0.488189], + [0.185783, 0.704891, 0.485273], + [0.191090, 0.708366, 0.482284], + [0.196571, 0.711827, 0.479221], + [0.202219, 0.715272, 0.476084], + [0.208030, 0.718701, 0.472873], + [0.214000, 0.722114, 0.469588], + [0.220124, 0.725509, 0.466226], + [0.226397, 0.728888, 0.462789], + [0.232815, 0.732247, 0.459277], + [0.239374, 0.735588, 0.455688], + [0.246070, 0.738910, 0.452024], + [0.252899, 0.742211, 0.448284], + [0.259857, 0.745492, 0.444467], + [0.266941, 0.748751, 0.440573], + [0.274149, 0.751988, 0.436601], + [0.281477, 0.755203, 0.432552], + [0.288921, 0.758394, 0.428426], + [0.296479, 0.761561, 0.424223], + [0.304148, 0.764704, 0.419943], + [0.311925, 0.767822, 0.415586], + [0.319809, 0.770914, 0.411152], + [0.327796, 0.773980, 0.406640], + [0.335885, 0.777018, 0.402049], + [0.344074, 0.780029, 0.397381], + [0.352360, 0.783011, 0.392636], + [0.360741, 0.785964, 0.387814], + [0.369214, 0.788888, 0.382914], + [0.377779, 0.791781, 0.377939], + [0.386433, 0.794644, 0.372886], + [0.395174, 0.797475, 0.367757], + [0.404001, 0.800275, 0.362552], + [0.412913, 0.803041, 0.357269], + [0.421908, 0.805774, 0.351910], + [0.430983, 0.808473, 0.346476], + [0.440137, 0.811138, 0.340967], + [0.449368, 0.813768, 0.335384], + [0.458674, 0.816363, 0.329727], + [0.468053, 0.818921, 0.323998], + [0.477504, 0.821444, 0.318195], + [0.487026, 0.823929, 0.312321], + [0.496615, 0.826376, 0.306377], + [0.506271, 0.828786, 0.300362], + [0.515992, 0.831158, 0.294279], + [0.525776, 0.833491, 0.288127], + [0.535621, 0.835785, 0.281908], + [0.545524, 0.838039, 0.275626], + [0.555484, 0.840254, 0.269281], + [0.565498, 0.842430, 0.262877], + [0.575563, 0.844566, 0.256415], + [0.585678, 0.846661, 0.249897], + [0.595839, 0.848717, 0.243329], + [0.606045, 0.850733, 0.236712], + [0.616293, 0.852709, 0.230052], + [0.626579, 0.854645, 0.223353], + [0.636902, 0.856542, 0.216620], + [0.647257, 0.858400, 0.209861], + [0.657642, 0.860219, 0.203082], + [0.668054, 0.861999, 0.196293], + [0.678489, 0.863742, 0.189503], + [0.688944, 0.865448, 0.182725], + [0.699415, 0.867117, 0.175971], + [0.709898, 0.868751, 0.169257], + [0.720391, 0.870350, 0.162603], + [0.730889, 0.871916, 0.156029], + [0.741388, 0.873449, 0.149561], + [0.751884, 0.874951, 0.143228], + [0.762373, 0.876424, 0.137064], + [0.772852, 0.877868, 0.131109], + [0.783315, 0.879285, 0.125405], + [0.793760, 0.880678, 0.120005], + [0.804182, 0.882046, 0.114965], + [0.814576, 0.883393, 0.110347], + [0.824940, 0.884720, 0.106217], + [0.835270, 0.886029, 0.102646], + [0.845561, 0.887322, 0.099702], + [0.855810, 0.888601, 0.097452], + [0.866013, 0.889868, 0.095953], + [0.876168, 0.891125, 0.095250], + [0.886271, 0.892374, 0.095374], + [0.896320, 0.893616, 0.096335], + [0.906311, 0.894855, 0.098125], + [0.916242, 0.896091, 0.100717], + [0.926106, 0.897330, 0.104071], + [0.935904, 0.898570, 0.108131], + [0.945636, 0.899815, 0.112838], + [0.955300, 0.901065, 0.118128], + [0.964894, 0.902323, 0.123941], + [0.974417, 0.903590, 0.130215], + [0.983868, 0.904867, 0.136897], + [0.993248, 0.906157, 0.143936]] + +from matplotlib.colors import ListedColormap + +cmaps = {} +for (name, data) in (('magma', _magma_data), + ('inferno', _inferno_data), + ('plasma', _plasma_data), + ('viridis', _viridis_data)): + + cmaps[name] = ListedColormap(data, name=name) + +magma = cmaps['magma'] +inferno = cmaps['inferno'] +plasma = cmaps['plasma'] +viridis = cmaps['viridis'] + \ No newline at end of file diff --git a/res_utils.py b/res_utils.py new file mode 100644 index 0000000..54957d2 --- /dev/null +++ b/res_utils.py @@ -0,0 +1,598 @@ +from __future__ import division + +from pylab import * +import scipy +import time + +import sklearn +from sklearn.decomposition import PCA, FastICA, TruncatedSVD, NMF + +import colormaps + +plt.rcParams.update({'axes.titlesize': 'xx-large'}) +plt.rcParams.update({'axes.labelsize': 'xx-large'}) +plt.rcParams.update({'xtick.labelsize': 'x-large', 'ytick.labelsize': 'x-large'}) +plt.rcParams.update({'legend.fontsize': 'x-large'}) +plt.rcParams.update({'text.usetex': True}) + +def clip(img): + cimg = img.copy() + cimg[cimg > 1] = 1 + cimg[cimg < 1] = -1 + return cimg + +def norm_range(v): + return (v-v.min())/(v.max()-v.min()) + +def svd_whiten(X): + + U, s, Vh = np.linalg.svd(X, full_matrices=False) + + # U and Vt are the singular matrices, and s contains the singular values. + # Since the rows of both U and Vt are orthonormal vectors, then U * Vt + # will be white + X_white = np.dot(U, Vh) + + return X_white + +def fhrr_vec(D, N): + if D == 1: + # pick a random phase + rphase = 2 * np.pi * np.random.rand(N // 2) + fhrrv = np.zeros(2 * (N//2)) + fhrrv[:(N//2)] = np.cos(rphase) + fhrrv[(N//2):] = np.sin(rphase) + return fhrrv + + # pick a random phase + rphase = 2 * np.pi * np.random.rand(D, N // 2) + + fhrrv = np.zeros((D, 2 * (N//2))) + fhrrv[:, :(N//2)] = np.cos(rphase) + fhrrv[:, (N//2):] = np.sin(rphase) + + return fhrrv + +def cdot(v1, v2): + return np.dot(np.real(v1), np.real(v2)) + np.dot(np.imag(v1), np.imag(v2)) + +def cvec(N, D=1): + rphase = 2 * np.pi * np.random.rand(N) + if D == 1: + return np.cos(rphase) + 1.0j * np.sin(rphase) + vecs = np.zeros((D,N), 'complex') + for i in range(D): + vecs[i] = np.cos(rphase * (i+1)) + 1.0j * np.sin(rphase * (i+1)) + return vecs + +def crvec(N, D=1): + rphase = 2*np.pi * np.random.rand(D, N) + return np.cos(rphase) + 1.0j * np.sin(rphase) + + +def roots(z, n): + nthRootOfr = np.abs(z)**(1.0/n) + t = np.angle(z) + return map(lambda k: nthRootOfr*np.exp((t+2*k*pi)*1j/n), range(n)) + +def cvecl(N, loopsize=None): + if loopsize is None: + loopsize=N + + unity_roots = np.array(list(roots(1.0 + 0.0j, loopsize))) + root_idxs = np.random.randint(loopsize, size=N) + X1 = unity_roots[root_idxs] + + return X1 + +def cvecff(N,D,iff=1, iNf=None): + if iNf is None: + iNf = N + + rphase = 2 * np.pi * np.random.randint(N//iff, size=(N,D)) / iNf + return np.cos(rphase) + 1.0j * np.sin(rphase) + +def inv_hyper(v): + conj = np.conj(v) + inv = conj / np.abs(conj) + return inv + +# D = (number x color x position) +def res_codebook_cts(N=10000, D=(180, 180, 80)): + vecs = [] + + for iD, Dv in enumerate(D): + #v = 2 * (np.random.randn(Dv, N) < 0) - 1 + v = cvec(N,Dv).T + + # stack the identity vector + cv = cvec(N,1) + cv[:] = 1.5 + v = np.vstack((v, cv)) + + vecs.append(v) + + return vecs + +# D = (number x color x position) +def res_codebook_bin(N=10000, D=(180, 180, 80)): + vecs = [] + + for iD, Dv in enumerate(D): + v = 2 * (np.random.randn(Dv, N) < 0) - 1 + + # stack the identity vector + cv = np.ones(N,1) + v = np.vstack((v, cv)) + + vecs.append(v) + + return vecs + +def make_sparse_ngram_vec(probs, vecs): + N = vecs[0].shape[1] + mem_vec = np.zeros(N).astype('complex') + sparse_ngrams = len(probs)*[0] + + for ip, pv in enumerate(probs): + bv = np.ones(N).astype('complex') + + ic_idxs = len(vecs)*[0] + + for iD in range(len(vecs)): + Dv = vecs[iD].shape[0] + + ic_idxs[iD] = np.random.randint(Dv) + + i_coefs = np.zeros(Dv).astype('complex') + i_coefs[ic_idxs[iD]] = 1.0 + + bv *= np.dot(i_coefs, vecs[iD]) + + mem_vec += pv * bv + sparse_ngrams[ip] = ic_idxs + + return mem_vec, sparse_ngrams + +def make_sparse_continuous_ngram_vec(probs, vecs): + N = vecs[0].shape[1] + mem_vec = np.zeros(N).astype('complex') + sparse_ngrams = len(probs)*[0] + + for ip, pv in enumerate(probs): + bv = np.ones(N).astype('complex') + + ic_idxs = len(vecs)*[0] + + for iD in range(len(vecs)): + Dv = vecs[iD].shape[0] + + ic_idxs[iD] = (Dv-2) * np.random.rand() + 1 + + bv *= vecs[iD][0,:] ** ic_idxs[iD] + #bv *= np.dot(i_coefs, vecs[iD]) + + mem_vec += pv * bv + sparse_ngrams[ip] = ic_idxs + + return mem_vec, sparse_ngrams + +def res_decode(bound_vec, vecs, max_steps=100): + + x_states = [] + x_hists = [] + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + x_st = cvec(N, 1) + x_st = x_st / np.linalg.norm(x_st) + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + + for i in range(max_steps): + th_vec = bound_vec.copy() + all_converged = np.zeros(len(vecs)) + for iD in range(len(vecs)): + x_hists[iD][i, :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD])) + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + xidx = np.argmax(np.abs(np.real(x_hists[iD][i, :]))) + x_states[iD] *= np.sign(x_hists[iD][i, xidx]) + + th_vec *= np.conj(x_states[iD]) + + if np.all(all_converged): + print('converged:', i, end=" ") + break + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_upd))) + + x_states[iD] = x_upd / np.linalg.norm(x_upd) + + return x_hists, i + +def res_decode_slow(bound_vec, vecs, max_steps=100): + + x_states = [] + x_hists = [] + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + x_st = cvec(N, 1) + x_st = x_st / np.linalg.norm(x_st) + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + + for i in range(max_steps): + th_vec = bound_vec.copy() + all_converged = np.zeros(len(vecs)) + for iD in range(len(vecs)): + x_hists[iD][i, :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD])) + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + xidx = np.argmax(np.abs(np.real(x_hists[iD][i, :]))) + x_states[iD] *= np.sign(x_hists[iD][i, xidx]) + + th_vec *= np.conj(x_states[iD]) + + if np.all(all_converged): + print('converged:', i, end=" ") + break + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_upd))) + + x_states[iD] = (0.9*x_upd / np.linalg.norm(x_upd) + 0.1 * x_states[iD]) + + return x_hists, i + +def res_decode_abs(bound_vec, vecs, max_steps=100, x_hi_init=None): + + x_states = [] + x_hists = [] + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + if x_hi_init is None: + x_st = crvec(N, 1) + x_st = np.squeeze(x_st / np.abs(x_st)) + else: + x_st = np.dot(vecs[iD].T, x_hi_init[iD]) + + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + + for i in range(max_steps): + th_vec = bound_vec.copy() + all_converged = np.zeros(len(vecs)) + for iD in range(len(vecs)): + if i > 1: + xidx = np.argmax(np.abs(np.real(x_hists[iD][i-1, :]))) + x_states[iD] *= np.sign(x_hists[iD][i-1, xidx]) + + th_vec *= np.conj(x_states[iD]) + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_upd)) ) + #x_upd = np.dot(vecs[iD].T, np.dot(np.conj(vecs[iD]), x_upd)) + + #x_states[iD] = 0.9*(x_upd / np.abs(x_upd)) + 0.1*x_states[iD] + x_states[iD] = (x_upd / np.abs(x_upd)) + + x_hists[iD][i, :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD])) + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + if np.all(all_converged): + print('converged:', i,) + break + + return x_hists, i + +def res_decode_abs_slow(bound_vec, vecs, max_steps=100, x_hi_init=None): + + x_states = [] + x_hists = [] + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + if x_hi_init is None: + x_st = crvec(N, 1) + x_st = np.squeeze(x_st / np.abs(x_st)) + else: + x_st = np.dot(vecs[iD].T, x_hi_init[iD]) + + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + + for i in range(max_steps): + th_vec = bound_vec.copy() + all_converged = np.zeros(len(vecs)) + for iD in range(len(vecs)): + if i > 1: + xidx = np.argmax(np.abs(np.real(x_hists[iD][i-1, :]))) + x_states[iD] *= np.sign(x_hists[iD][i-1, xidx]) + + th_vec *= np.conj(x_states[iD]) + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_upd)) ) + #x_upd = np.dot(vecs[iD].T, np.dot(np.conj(vecs[iD]), x_upd)) + + x_states[iD] = 0.9*(x_upd / np.abs(x_upd)) + 0.1*x_states[iD] + #x_states[iD] = (x_upd / np.abs(x_upd)) + + x_hists[iD][i, :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD])) + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + if np.all(all_converged): + print('converged:', i,) + break + + return x_hists, i + +def res_decode_abs_exaway(bound_vec, vecs, max_steps=100, x_hi_init=None): + x_states = [] + x_hists = [] + ra_hist = [] + vecsw = [] + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + if x_hi_init is None: + x_st = crvec(N, 1) + x_st = np.squeeze(x_st / np.abs(x_st)) + else: + x_st = np.dot(vecs[iD].T, x_hi_init[iD]) + + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + vecsw.append(svd_whiten(vecs[iD])) + print(vecsw[iD].shape, vecs[iD].shape) + for i in range(max_steps): + + res_recon = crvec(N, 1) ** 0 + + for iD in range(len(vecs)): + rr = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_states[iD]))) + rr /= np.abs(rr) + + res_recon *= rr + + + #res_recon = np.prod(x_states) + res_alpha = cdot(res_recon, bound_vec) / N + ra_hist.append(res_alpha) + + th_vec = bound_vec.copy() - res_alpha * res_recon + + all_converged = np.zeros(len(vecs)) + + + th_vec *= np.conj(res_recon) + + #rr2 = np.prod(x_states) + #th_vec *= np.conj(rr2) + + #for iD in range(len(vecs)): + #if i > 1: + # xidx = np.argmax(np.abs(np.real(x_hists[iD][i-1, :]))) + # x_states[iD] *= np.sign(x_hists[iD][i-1, xidx]) + + #th_vec *= np.conj(x_states[iD]) + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecsw[iD].T, np.real(np.dot(np.conj(vecsw[iD]), x_upd.T)) ) + #x_upd = np.dot(vecs[iD].T, np.dot(np.conj(vecs[iD]), x_upd)) + + #x_states[iD] = 0.85*(x_upd / np.abs(x_upd)) + 0.15*x_states[iD] + #x_states[iD] += + x_states[iD] += (x_upd / np.abs(x_upd)) + x_states[iD] /= np.abs(x_states[iD]) + + x_hists[iD][i, :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD])) + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + if np.all(all_converged): + print('converged:', i, end=" ") + break + + return x_hists, i, ra_hist + +def res_decode_exaway(bound_vec, vecs, max_steps=100, x_hi_init=None): + + x_states = [] + x_hists = [] + + bound_vec /= norm(bound_vec) + + for iD in range(len(vecs)): + N = vecs[iD].shape[1] + Dv = vecs[iD].shape[0] + + if x_hi_init is None: + x_st = crvec(N, 1) + x_st = x_st / np.abs(x_st) + else: + x_st = np.dot(vecs[iD], x_hi_init[iD]) + + x_states.append(x_st) + + x_hi = np.zeros((max_steps, Dv)) + x_hists.append(x_hi) + + + for i in range(max_steps): + th_vec = bound_vec.copy() + + all_converged = np.zeros(len(vecs)) + for iD in range(len(vecs)): + x_hists[iD][[i], :] = np.real(np.dot(np.conj(vecs[iD]), x_states[iD].T)/N).T + + if i > 1: + all_converged[iD] = np.allclose(x_hists[iD][i,:], x_hists[iD][i-1, :], + atol=5e-3, rtol=2e-2) + + #xidx = np.argmax(np.abs(np.real(x_hists[iD][i, :]))) + #x_states[iD] *= np.sign(x_hists[iD][i, xidx]) + + th_vec *= np.conj(x_states[iD]) + + if np.all(all_converged): + print('converged:', i, end=" ") + break + + for iD in range(len(vecs)): + x_upd = th_vec / np.conj(x_states[iD]) + + x_upd = np.dot(vecs[iD].T, np.real(np.dot(np.conj(vecs[iD]), x_upd.T))).T / N + + x_states[iD] += 0.9*x_upd + + return x_hists, i + +def resplot_im(coef_hists, nsteps=None, vals=None, labels=None, ticks=None, gt_labels=None): + + alphis = [] + for i in range(len(coef_hists)): + if nsteps is None: + alphis.append(np.argmax(np.abs(coef_hists[i][-1,:]))) + else: + alphis.append(np.argmax(np.abs(coef_hists[i][nsteps,:]))) + print(alphis) + + rows = 1 + columns = len(coef_hists) + + fig = gcf(); + ax = columns * [0] + + for j in range(columns): + ax[j] = fig.add_subplot(rows, columns, j+1) + if nsteps is not None: + a = np.sign(coef_hists[j][nsteps,alphis[j]]) + coef_hists[j] *= a + + x_h = coef_hists[j][:nsteps, :] + else: + a = np.sign(coef_hists[j][-1,alphis[j]]) + coef_hists[j] *= a + + x_h = coef_hists[j][:,:] + + imh = ax[j].imshow(x_h, interpolation='none', aspect='auto', cmap=colormaps.viridis) + + if j == 0: + ax[j].set_ylabel('Iterations') + else: + ax[j].set_yticks([]) + + if labels is not None: + ax[j].set_title(labels[j][alphis[j]]) + #ax[j].set_xlabel(labels[j][alphis[j]]) + + if ticks is not None: + ax[j].set_xticks(ticks[j]) + ax[j].set_xticklabels(labels[j][ticks[j]]) + else: + ax[j].set_xticks(np.arange(len(labels[j]))) + ax[j].set_xticklabels(labels[j]) + + elif vals is not None: + dot_val = np.dot(x_h[-1, :], vals[j]) + #ax[j].set_title(dot_val) + ax[j].set_xlabel(dot_val) + + #ax.set_title(vals[j][alphis[j]]) + + if ticks is not None: + ax[j].set_xticks(ticks[j]) + ax[j].set_xticklabels(vals[j][ticks]) + else: + ax[j].set_xticklabels(vals[j]) + else: + ax[j].set_title(alphis[j]) + #ax[j].set_xlabel(alphis[j]) + + if gt_labels is not None: + #ax[j].set_xlabel(gt_labels[j]) + ax[j].set_title(gt_labels[j]) + + #colorbar(imh, ticks=[]) + + plt.tight_layout() + +def get_output_conv(coef_hists, nsteps=None): + + alphis = [] + fstep = coef_hists[0].shape[0] + + for i in range(len(coef_hists)): + if nsteps is None: + alphis.append(np.argmax(np.abs(coef_hists[i][-1,:]))) + else: + alphis.append(np.argmax(np.abs(coef_hists[i][nsteps,:]))) + fstep = nsteps + + + for st in range(fstep-1, 0, -1): + aa = [] + for i in range(len(coef_hists)): + aa.append(np.argmax(np.abs(coef_hists[i][st,:]))) + + if not alphis == aa: + break + + return alphis, st + + diff --git a/resonator_template.ipynb b/resonator_template.ipynb new file mode 100644 index 0000000..2101bf2 --- /dev/null +++ b/resonator_template.ipynb @@ -0,0 +1,1272 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.26.3\n", + " warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n" + ] + } + ], + "source": [ + "from pylab import *\n", + "import scipy\n", + "import time\n", + "\n", + "import matplotlib.font_manager\n", + "import res_utils as ru\n", + "from scipy.ndimage.interpolation import shift\n", + "from PIL import ImageFont\n", + "from skimage.transform import resize\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/xn/hqbqng2d6nz8f1lcyd545kqr0000gn/T/ipykernel_2267/3468969993.py:4: MatplotlibDeprecationWarning: Support for setting an rcParam that expects a str value to a non-str value is deprecated since 3.5 and support will be removed two minor releases later.\n", + " matplotlib.rcParams['text.latex.preamble'] = [\n" + ] + } + ], + "source": [ + "%matplotlib inline\n", + "plt.rcParams.update({'font.size': 14})\n", + "plt.rcParams.update({'text.usetex': True})\n", + "matplotlib.rcParams['text.latex.preamble'] = [\n", + " r'\\usepackage{amsmath}',\n", + " r'\\usepackage{amssymb}']\n", + "plt.rcParams.update({'font.family': 'serif'})\n", + "plt.rcParams.update({'font.family': 'serif', 'font.serif':['Computer Modern']})\n", + "\n", + "np.set_printoptions(precision=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# You might want to see the fonts on your system and choose a different font\n", + "#matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def norm_range(v):\n", + " return (v-v.min())/(v.max()-v.min())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Factorization of shape, color and location\n", + "\n", + "In this notebook, we are going to set up a simple scene analysis problem that can be solved with the resonator network. This example generates a scene by combining several factors to create an object: the object is a conjunction of shape, color and location. The shapes of the objects are given by fixed templates (letters chosen from a font). The goal will be to use VSA principles and resonator networks to infer the factors of each object from the scene.\n", + "\n", + "First, lets get some letters for the scene." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# This will determine the size of the scene\n", + "patch_size=[56, 56]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "font = ImageFont.truetype('Georgia', size=18)\n", + "\n", + "letters = 'abcdefghijklmnopqrstuvwxyz'\n", + "\n", + "font_ims = []\n", + "fim_size = (patch_size[0],patch_size[1],3)\n", + "\n", + "for l in letters:\n", + "\n", + " font_obj = font.getmask(l)\n", + " \n", + " imtext = np.array(font_obj)\n", + " imsize = font_obj.size #font.getsize(l)\n", + "\n", + " imtext = np.tile(imtext.reshape((imsize[1], imsize[0], 1)), (1,1,3))\n", + " imtext = imtext[:patch_size[0], :patch_size[1], :]\n", + " \n", + " imsize = imtext.shape\n", + " \n", + " fim = np.zeros(fim_size)\n", + " \n", + " fimr = int(np.floor((fim_size[0] - imsize[0])/2))\n", + " fimc = int(np.floor((fim_size[1] - imsize[1])/2))\n", + " \n", + " fim[fimr:(fimr+imsize[0]), fimc:(fimc+imsize[1]), :] = imtext/255\n", + " \n", + " font_ims.append(fim)\n", + " \n", + "imshow(font_ims[11], interpolation='none')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Encoding locations with the exponentiation trick\n", + "\n", + "The first step of the scene analysis is to encode the scene into a high-dimensional VSA vector. This VSA encoding has some special properties. The first is that the encoding vectors for the pixels are designed in a special way such that the properties of translation are available as a simple operation. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Translating the scene in this fashion is possible because the pixels are encoded using the \"exponentiation trick\", where each pixel position is encoded by a single base vector raised to a power. For example, the vertical position 10 is encoded as $V^{10}$. Similarly, the horizontal position has base vector and is also exponentiated by the pixel location. The 2-D location is then indexed as the binding between the vector encodings, e.g. the position 10, 20 is given by $V^{10} \\odot H^{20}$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "N = int(3e4)\n", + "\n", + "# These are special base vectors for position that loop\n", + "Vt = ru.cvecl(N, font_ims[0].shape[0])\n", + "Ht = ru.cvecl(N, font_ims[0].shape[1])\n", + "\n", + "# This is a set of 3 independently random complex phasor vectors for color\n", + "Cv = ru.crvec(N, 3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def encode_pix(im, Vt, Ht):\n", + " N = Vt.shape[0]\n", + " \n", + " image_vec = 0.0 * ru.cvecl(N, 1)\n", + "\n", + " for m in range(im.shape[0]):\n", + " for n in range(im.shape[1]):\n", + " P_vec = (Vt ** m) * (Ht ** n)\n", + "\n", + " image_vec += P_vec * im[m, n]\n", + " \n", + " return image_vec" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def encode_pix_rgb(im, Vt, Ht, Cv):\n", + " N = Vt.shape[0]\n", + " \n", + " image_vec = 0.0 * ru.cvecl(N, 1)\n", + "\n", + " for m in range(im.shape[0]):\n", + " for n in range(im.shape[1]):\n", + " for c in range(im.shape[2]):\n", + " P_vec = Cv[c] * (Vt ** m) * (Ht ** n)\n", + "\n", + " image_vec += P_vec * im[m, n, c]\n", + " \n", + " return image_vec" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def decode_pix(image_vec, Vt, Ht):\n", + " N = Vt.shape[0]\n", + " im_r = np.zeros(patch_size)\n", + " \n", + " for m in range(im_r.shape[0]):\n", + " for n in range(im_r.shape[1]):\n", + " P_vec = (Vt ** m) * (Ht ** n)\n", + " im_r[m, n] = np.real(np.dot(np.conj(P_vec), image_vec)/N)\n", + " return im_r" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def decode_pix_rgb(image_vec, Vt, Ht, Cv):\n", + " N = Vt.shape[0]\n", + " im_r = np.zeros(fim_size)\n", + " \n", + " for m in range(im_r.shape[0]):\n", + " for n in range(im_r.shape[1]):\n", + " for c in range(im_r.shape[2]):\n", + " P_vec = Cv[c] * (Vt ** m) * (Ht ** n)\n", + " im_r[m, n, c] = np.real(np.dot(np.conj(P_vec), image_vec)/N)\n", + " return np.clip(im_r, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "l_idx=0\n", + "\n", + "f_vec = encode_pix_rgb(font_ims[l_idx], Vt, Ht, Cv)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# translate the image\n", + "f_vec_tr = f_vec * (Vt**5) * (Ht**30)\n", + "\n", + "f_im = decode_pix_rgb(f_vec_tr, Vt, Ht, Cv)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "subplot(121)\n", + "imshow(font_ims[l_idx], interpolation='none')\n", + "subplot(122)\n", + "imshow(np.clip(f_im, 0, 1), interpolation='none')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A toroidal image encoding\n", + "\n", + "There is a second special property to these vectors, which enables treating the image like a torus -- as we translate to the right and move off of the right side of the image, we will end up on the left side. Same for top and bottom. For this to be possible, we design the base vectors by considering the identity vector and the roots of the identity vector.\n", + "\n", + "What is the identity vector? Since the operation we are considering is element-wise multiply, the identity vector is simply a vector where each entry is 1. \n", + "\n", + "When we apply the exponentiation trick to a root of the identity vector, then as we increase the exponent, we will eventually go in a loop. We choose the order of the root based on how long we want the loop to be. If we choose a square root of the identity, then we will loop every two steps. If we choose the 4th root, we will loop every 4 steps. Here, we chose a loop the size of the image -- 56 pixels.\n", + "\n", + "What are the roots of the identity vector? Of course, the square roots of 1 are (+1, -1). The 4th roots of 1 are (1, i, -1, -i). The N-th root of 1 are the $N$ points around the complex plane: $e^{2 \\pi i k / N} \\forall k = 1, ..., N$. Thus, to form a VSA vector that will loop when raised to the $N$-th power, we choose one of the $N$ roots of identity randomly for each entry of the vector. This is implemented by the function $\\verb|cvecl|$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "loop_size = 10\n", + "loop_vec = ru.cvecl(N, loop_size)\n", + "\n", + "pows = np.linspace(-15, 15, 200)\n", + "sims = np.zeros_like(pows)\n", + "\n", + "for i, p in enumerate(pows):\n", + " sims[i] = np.real(np.dot(np.conj(loop_vec), loop_vec ** p)) / N\n", + " \n", + "plot(pows, sims)\n", + "xlabel('Exponent')\n", + "ylabel('Similarity')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we are examining the similarity between a loop vector and its powers. What we see is high similarity at power 1, as well as at powers 11, and -9. Because we designed the vector based on the roots, we can control how long it takes for it to loop!\n", + "\n", + "Note here we are also exponentiating the vectors by fractional powers -- we have the ability to perform fractional binding in the complex domain! This means that as we incremenet the exponent slightly we move smoothly along a manifold in the high-dimensional vector space. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "loop_size = 1000\n", + "loop_vec = ru.cvecl(N, loop_size)\n", + "\n", + "pows = np.linspace(-15, 15, 200)\n", + "sims = np.zeros_like(pows)\n", + "\n", + "for i, p in enumerate(pows):\n", + " sims[i] = np.real(np.dot(np.conj(loop_vec), loop_vec ** p)) / N\n", + " \n", + "plot(pows, sims)\n", + "\n", + "# compare to the sinc function\n", + "plot(pows+1, np.sin(np.pi*pows)/(np.pi*pows))\n", + "\n", + "xlabel('Exponent')\n", + "ylabel('Similarity')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we choose a very large loop size (or equivalently a completely random complex VSA vector), then we see a very special curve appear -- the sinc function. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dealing with correlations\n", + "\n", + "Now that we have a way to encode position (that is smooth and can loop), we next need to consider how to deal with encoding of shape and color. \n", + "\n", + "The representation for the shape of the object will be linked closely to the representation of pixel location. In essence, the shape of the object is the set of pixel locations that are active. Thus the representation of a particular letter will be the sum of the vector encoding of each pixel location. \n", + "\n", + "However, the issue that arises is that the shapes of the different objects are actually correlated. Conceptually, we want each letter to act as a symbol, meaning that it is orthogonal to the other letters. But the objects share many features in the pixel space. These correlations in the pixel space will cause issues with the resonator network when trying to solve the factorization problem. The solution to this issue is to use whitening on the patterns. Whitening orthogonalizes the patterns by adjusting the pixel magnitudes based on how many pixels are shared across letters. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def svd_whiten(X):\n", + "\n", + " U, s, Vh = np.linalg.svd(X, full_matrices=False)\n", + "\n", + " # U and Vt are the singular matrices, and s contains the singular values.\n", + " # Since the rows of both U and Vt are orthonormal vectors, then U * Vt\n", + " # will be white\n", + " X_white = np.dot(U, Vh)\n", + "\n", + " return X_white" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "font_im_vecs = np.zeros((len(font_ims), np.prod(font_ims[0].shape[:2])))\n", + "\n", + "for i in range(len(font_ims)):\n", + " font_im_vecs[i, :] = font_ims[i].mean(axis=2).ravel()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABGQAAAFYCAYAAAAV9Cq0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABbTUlEQVR4nO39eZxlVX3v/7/2cOZzqk7Vqbm7unqe6W5oGmhAQDCMguL0TTRGozGJJrnRXzSJGcxN4s10E2+cEmPURA0OiMQBFAVlbqaGnuepumvomucz773X749CkIAg0pxDnXo/Hw8ePLrOrqrPfqxae3jvtda2jDGIiIiIiIiIiEjl2NUuQERERERERERkvlEgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhXmvpiNw1bEREm8XLXIC5hmfMQY01zp36t2ry61+/xUrXYHtX21qc/PT2r3+UnH+vlLfX5+UrvPT8/X7i8qkImS4HzrijNTlbxod5lbTlbj96rdq0vtPj9Vq91BbV9t6vPzk9p9ftKxfv5Sn5+f1O7z0/O1u6YsiYiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmFvtAkR+IZaF5Tg4TRlMKvHMj6az+KPjGK8MxlSpQBGpKNvBbW/FxKPP+LKVL2KKJYLxcYznVak4ETnTrEgEKxzGrq8D18G4DlbZg1IZf3hE/b1W2A5WyMVpSIPrQsjFODZY1rO3NQarWMaUSviDQxUvVX5xdiKB3dqMsa2n2tYqe5ixCYJiEVMsVrlCqTTLdWeP8Y0Ns/1+emb2em56utqlnXEKZGROclIp6GznwIeSfOFV//GMz379vl9n9ccz2N19+BOTVapQRCrFjsexG9Kc/tcUH1v3jWd89r+P3UDP/k5Wf2IA73h3dQoUkTPO37KGyeUxUr/ax6aGXl5Vd5hvj57NY/2L6PxIGrPvkB7K1AC3vZXiijYO/ZrN4s5hrm/fw9LIEGk796xtS8bhX/ouZ9eBxax+/xRBoVCFiuUXMXXdWbzvr79B2smSsEoA3D65kTv/YytNewo49zxR3QKl4uylXUyd1YR5zzDXdOzni3e8msa9kP7SQ9Uu7YzTlCWZk4znYeUKhHrCfKLvCrImTIc7zWWxgGQ6TxB2wNKft8i8EASYYpGJEw18ou8KdhYWUTIOl8UCVqUHCeo8jOtUu0oROQPsRAJ34QKGz4kzusnQO5rmwFQbUavM2mQ/m9r6MLFQtcuUM8ByXSYu7OT01iirFp/GtQO+0XM2nz71av7l9KspGYdmJ8u5kRxP5BfzTyevYtfhRcRPuhg/qHb58iJEJjw+dfwy7plaw6if5OxIlotSR/AS4Ed0PT8vuQ5+xGJZ/QgXJw7jJX38SLWLennoL1zmpCCXwztxkmUfP0zhvY18eO+N3DJ5DmXjY1lmdjir/RzDWUWk5gSFAv7IKKv/6jCF327gX759DX968EYAHMtg2ea5h7eLyJxjdbQyfe4Clr/5MH91zTdouiXG6W8u5hM9VzDjR9maPqaHMjXCikQovWOcd7/tDt618AGOHm8j/eEI4fc4TP1+Gx8+cCNfGL2I4x589ptX477DsOp9u1j4t9sw5VK1y5cXIXz3bhp+dZy7vrCVDz9+I0fLsw9RjIXO3/OVZWGePIz7WFi+BTWas9bclCUrEsFpaWboNZ3kWy1y7QEmEoBtcKYdokM2LTtKxA4P4XWfqna58hKZmSyW45A7tpQ7Ymv5g8zeapckFWYnEpg1S5hcmWR8tUWpcbbPWyUbd9ImdRKaH5+GXYd1gVbjgpkstmXR8WA9veFGOKfaFcnL4Sd9fmJ1krF1FuV6H0IGK+cQHbFpPOBTt3sE//CxapcqL4PsqiZ6roYmY/HfQ2eTOpElddwwOtXFd+NdGNeio7sbz9Tolfs8YUej2A1p1jedZnlkgP8a3Eq0J4TVN4wpFnHKHtN7OrkH+HDL/RRbPIorWglPTePrXD/nGK9MMJOlrtujmE4wsKWu2iVJtQ0M07gDDvz7Oj7QsJ6ufWWip6dqMpOpuUDGTiUpd2YYubjMysUDvG3BwywLD5Gwyjxe6OLm/nPpYxEdMw1YJ3s0v3iOCwoFLD8g3m/T15LGV3vOL7aDXZdidHWSoS1w7YVPcGV6D4tDY/R79Twws5KbD55NeDpJw7EE/qQPgV/tquVlYopF/FKJ+HaH5NLl1S5HXg5P9vmRNSmGLwh460UPcknyIG3uNPuL7XxnZBOPJVcTnmogfNzVwq41aKbD4cpzdjKYr+PQcBOLe4fxBgZJP/70Nmr1uc8KhzGxCCviQyxwJzg40kJ0FPyREQAcINUNY+0pGuwYTn2JbFuUcFjT1eYkYzDFIrG+LPV1KUa9JHWO1gCaz/zRMRgdo3Hf01+rxTAGaiyQsSIRjv7/VhJePcVH193GX+64js/+6xuxy4Zy3Kb4K+Osbz7Nu999E3+efCtLZ1bB4W4t+lULDBijIY3ziu3gX7qRgQ1RfuM3b+dHI6u5fccGHn7sHGKjAWOrHApr89x88b/xdvddZNvX0Pm1bry+/mpXLi+3YhFLuVvtsR1KV55D/1kh3v3O73H7wFl87UcX8cM9FxOZChg628asyPLpN36O32p+B83tW2j63lH84eFqVy5niOW65Jst3t/yI/7o5BvIjce0VkiN8meyOI7DHafXUu/meN/K+/j7/utoW7cKe2Iak4ozflGR85d3M+TnoD9Kev8kJpevdunyUunZqswzNTXB1nIcyq1lNrT2syI8QDkbpv7xAZLbTtDw2CATPWlGCkluTIxRavEoNSewwuFqly1nig7g84oVchlfGWF6pc9rEgcoBQ7JIyGanpii7qGT1B8PMBNh1oSgPT1FsdFAqKYyaPlZAoOl0XI1xw6HGF8ZYmZFmQtix5gphak/ZJHZPk7dtm4y+wzeYJxNkQkWdw4zsRqsRKzaZcuZYllYrksQMXS5LoGxoGSDpibVpsDHFIv0HGvm1v6zsS1DrCXH8NYGxi/qZPTcJpqaZl9/++mxrcQGbOzRKUxZ46PmMp27BWbDd6euDre9DWfNCuwNq3FWLMVtb6t2aS+L2ro7CQLwLCZKMR7JLccdDuGd7IXAx85mWXhnM4dKiwitcki1zjC2poGO/XGYmqp25SLyIliui51Kkn5zH7+1YDs3T57LsW1dLPnn7bPzkCMRIhMeoakQJzyfsWwcd8YCPUkVmZMs18VKpei4sZv3tO7hr05ez/Q9rSz8wqMEvk9gDHW3jGL5m/niFRu4tn0vQ1edYs+t66G72tXLmWA5DlZ9HX4E4naYou9il2rquaL8D0E+z9r/00tufQdf+sAFvGPVI/zm+bsYDgzDfoybRi/kB4fWcPrry+k8cBqvt6/aJYvIS2S5Lna6nvK6RYysjzG5pUi6cYaJk82k99s0/+tAtUs842oqkDGeR/M2l55ji/lkQxdNewxOYxp/+QKyrVH6LrFpXzMEgGsH+C5g62Rea+LhMsWmFFNLV+JFLfIts1OZ7DIk+wISAyXCjx/FVxA3ZzlNGfyFzaxLH6LNneCrvVuIjFpPLdprPI/YqUlaHm/k+vr3U3fIoflYGTM9XeXK5Uxx29sIWhoYPjdNOWVRToLtgeVBZMIwvkFzlmqJ09w02+fr9tHsTnHkdAv1Y+YZa8QYz8PNG3ZNdbI1fYwtyePsjG7Cth2tHTWHWa7L1JvOJdtmk2szrDjvJADXte3hHrfE/g+uJDRpEZ6E1kcmMY/ve4GfKHOJiUUIwjYGuOnYuXxm/BIo21hlm8iQQ0OfIXF0BEYnql2qvExyzS7uxZuYWBmjmLbwo+AUITpqaNw7jXXgBEEup3VBa4SdaWT0ymVMrILo+nGuXXCcdCjHTaPn4Ydr873XNRfINHzxIRoALAunqQnT1szA1iTTy3w+8OrvsyV2HHCefDVylQuWl0V9pMBoq8PEqwuc03WKj3Z+B4CDpWb+Yv8NjO1uYHl3A0xP6+A9RwVtGaaWJzkneZK0k6P7eAstw0+3pfE8/ANHiB+AFbc+/X26JasRtkN5cSvja+Isf9chLm88yPWJw/T4EXrKGT7ZfTnnNdTeE5T5LGhtZHJ5go2JU9TZBTgVIzYaPOt1qE7B58BoC69uOMiF0T4+E3NwQi6mqN4/V1mRCFNvmeYdKx/mfzUcJGLNLtr6/oZu3t/Qjb884GC5yE3j5/MD/yKaHn+BHyhzh2XjNyYpNDhELEPwUAOrPjY7Evanr9/Uu2uYBdkOi5mFcVZcfYxfbnuULdEe9pTa+Fzfq+i7eQkdp+sxxaIWca8VTQ2MX5vjdat283/bdgDQ681wc+xsgpACmVc+y8Jd0kVhcYbu60OYxhINjTNMd/u4UzYfv+Ma6leO8fjmmzHG0qKPNWpDQx/f3LCAukdidP9wJb8S+SC5Dov684Y4r/0kS5c+zhes19BwoJ3017frAD4H+YkwhbRF3C5SNg521sEtaDrSfOCsXEZhcQMj78uytrmH0UKCv33gOj699/XYPvgR4FXjuI06wNcSPx6ilLIIWz7nRsZ4/w23ceg1bRz4nYXP2G5Z8iC/3PQwq0KThC2LUp1DrLEB77QCurkqyBdo+0SEbze9hq+0XoX/S+PsPu+rfGjgbH7ctwJze4bIpCGUC2jdN6Cb8xpihVz6Lksxs6zMZfUjDNa14WQa8McnMMVitcuTl9nS0AiJi4YZPZKhYa/F6c8v5R9DSxk9z2NB1yj/uPIbvOvyd3AqvphFX7M0Za1W9Jxm0WeXc+f6rSw5ezN/f/E3uDA6U+2qXlY1FchYjkN+aYbx1RE2bzlES2SGdCjHV05eSGTcIjIBo4k0bJ59I48VMLvujNSUuFPCRAPqThqS+0dgYpriWYs40dBErLWbX0/v5OsbzmGcRhrCYYzva6TMHGNciyBk4WDwjY0VgKUmnBdKHfWMrQrz+6tuY3F4mPdtfxupAyEWfnf27Vl+Y5JDaxMMNNVVuVI5k4xtYRywrYCUHebqxAEuiB1jNJ141ra+sdlfamDYr5s9z7s1dakz/wQ+zj1PkAyFqW9p4nBXF5wHO8cXMnGskVW3HMYfGQU0UqLWWJZFviUg3TbNotgY92R8Sqs6cMcbsPMlLD+YvX4zBoolTKlEMDmlB201ImF5LK4fY8RtJDpuqNs9jJUrgN1Fn9vI5rPg3AWnuH/FKkw8Wu1y5Qzxp6dxt+2jNbsS20uy+5xFXBit7bCtZq5S7GgUuymD9cfDvHfBdopBiI/ddxWrPptlzVAP+D4z53YxMTO7ZoxvLByduWvSbafWseQWQ2xPD97gMJiA0INTrN6d5Lt/ei7LrhzmM2f9F59vu4SemxbiDIzgj49Xu2x5EZycR2TSUDAh2uwJ/EyZUjLMs2/NpGZYFpYb4tTVEd557Y9YFh7ii8MXsex/52G4D29sAgC7P8Saj3Wx74ZV8Hs/qm7NcsaExvMkBiNM+zEeKER5z+2/S+Mum9a7T//sbzKG5OAevIKepIvMRcYYYkM20+0xfqfxUd55zSMMXhmjYEKUjEO/18CYl+RUsZHbD63HPhZj2RcH8I+f0rpRNeBIOcPOB1bSsT0g9f09BKUSJjA0f20agvUcuKLM6sQgp5fXY2LJapcrZ4oxmGIR50gvbRONHHxrKzRWu6iXV80EMlZ9HX5zmnMa97M60s9/DL2K6ICLfaIXfyY7+4aGnxoFYYyl1yTXqLLv4E6XMaXSUydkUyziF4tEh1Zx79gKXpM4wPL4EEc71hItlkGBzJxiT+WJjUaZ8ONEwx5tbRPk0q2z60k8x2gnZ+Uyyq11hHYdw9faQXOSHYthN2coN5e5OHmIPYVO9o600zwwjD859VRfD4oBzsg4oZlMlSuWM8nK5omOxhnzEyww45iwwS0YvOPdz7m9u6QLr7kOJ5fHtiyCbLayBYvIS+f71HUHlJNRfnzuQjZG+rgg6gABvvEYDU4wHRj64km8FQ7bkouZ2thCXSSMv/+wzvVzXMk4uFkLNxfMLtr7pGB6mlDeMB2ECdke9eE8M7ZGxdYaUyph54t4Qe0v+lozrxgy7U1MrUpxVrwHgHt2rab+WIA/MTk7dNG2CVwL81N7bP1kmKPMG6megMf3LmUsiNIZGmN0XYRSZ0O1y5IXyfSeJrFvkO5CE2m7xAeX3Um2M8BynGct8glw+pdaOf5bYBZ1zG4jc47dkGbmrHY6FoxxbrjELX3nMH6wcfYi7X8+Cc0XsD0d22uJf3qQ8NFBTuabCFkea1b1ku342Zcww5d0cOTtcYrrO7Fbm5/zuCAir2zG86j7zk4Wf3uKv9h5PV8ev+CpzxzLpsVJsCyU5JIofGrBI9x3zhfpv96j78oMlhuqYuVyJgTYWB6zU0//B8uHYb8OB0MqVKyhO1qZj2pnhEy2QHgyQS6IkLYLtC0aI9vaSkMqhZ2IYzJp+i92aF87CEBLaoa+9nqI1uZqzfLcnKLBydoUTIioXcaLgxd1CFe7MHlRTLGImZzmlh2b6Vud5s8X3M6STX30/6/zaN82g9s9iCkUMAvbGb6ggWIanN4odm4cz9cw5jkp5FJM29SHZl9tPpqNE5rRFdh8YcoeZnqG7z26iQOrWnlP5/389QUNjL9jK5ldk9gDowRT09gtTcysb2N6sYWJ+4Qmi5iRMT18EZljnLo6rMY03b+ykEJrQDDp87X7t3LLzEXY5dl1IIOQIQiBV+dz5eY9vLf5HpYsHKZ7ogNshbAiMjfUTiCTLxKeLDHmJXEwbG7q5QfNLVitTQTJGIW2BIkVE2xtOUHRlGmPT3G8pY2gLo4djRIUCtXeBakA2wO7ZOEbG5sAPzy7QKzMLcbzCGay1O0J85C9lHRnwBvbn+ALV0QZG28i4zVjT+XJLq9jdGuZ8ECIeL8F+YJuzOYo4zqU4xYR1yMgIJ+LEMkDgdpzXgh8gnyBxp02J2jn4pU9XLtkP7dceC5usY46x8IJhSh1Zhg5y6XY5INtsKcL+FNT1a5eRF4kq76OckcDXVd2szg5xp13n01ml6Hxh0cx09MYz8NOJma3W5jhzsQarkzvY136NKdaGrEsSysTiMicUDOBjD84jJvN8aVvXc6X15zH32/6Jutv6GX/azq4q3sVhUGb9pvq+N7yrfBmuKThMDde/gQfTr8eZ/85dP3tdky5VO3dkJdZOWFRbvBJ2EXGykki4xCa0Wr8c5Epl1j4jW5K21u4aPoPaFgyzo1du+EDUAhCPDK6mL7TZeoej9G0u0h0fx/+8Ei1y5ZfkFUsE50wTJci2NhEYyW8aFxPQecRUy7R+t3jZHa1cPn0h2BxlivP3kvmvCwh2+fQTCuHR3OUDkZpe9AivXsac7K32mWLyC9gYutCBs+DP2vfzhMzXaz4z1EYGiWYmHzq7Zj+1AxWNo8zNkHk+Fl8c9lmpspRvELN3N6IyDxQM0csUy4RTAc0HDRMeCn+s/Ui4m6ZkO1TKrk4MzZ1h8ZxynXcun8Ti9tGWV43jFdycfXm69pgPf0/41jPuWZAKWkRbizgYGYXhB0LcGZKeooyR3l9/YR9n8ZdS5koZrgjtJal9SMk3RK5cohgJkSqxyfSM4F3eqDa5cpLYEolImNlJgsRcqZMJpGjN1Wnp6DzjDcwiOMHNO1cxlgpwWPxRazMDNMYzpHzwmTzESKjFslTOfyDx/SmFZE5yotY+EmfDnecE6FmTNjFDoWwXBcTGGB23Tg7FsVqqMePGiKOx8mhBtyREEajYUXmNCscxsSjuHYBB4hFy5QjYIXCGK9cUyPeayaQgdlpDPU3b6fessn/U4j8k19f4R/EGENQKhHba7PyjhDYNqcsm1X+fowfaHTMXGeBZc12zLDr4yVcQs+xeOvMYvjtdQ9gWwE7ZhaR2XaaYGRMN3RzmDcwSNMXR2lyHCzHYdiyGMahzgxQF/RjPA9f68bMecHoGNHtRU70reLQuhjvXLSNfw8uhlAIisWaOjHL8/OHh6m7ZZy6J/v8pGUxiQNMs9RMza434/sKY0TmsOiET3TAJcDmitQ+vvTeC0nvStN+9zDO0CgmX8BubKC0rIX+i2Ksv/AIv996F2+/5QMs2lHElDX6WWROy6TJLW9gcbSXuO1w6cKjfPf02TiZBoKp6We8eWuuq6lABmZDGeBnByzGJyjoIq2m2BbG4qkRMltaT3HXZWfTVVhACDC5PHZzhumzWnCXT7MxdpK/67mWHQcXs2bqGKZQrGb1cgYYzwPPU7BWw4w/u4ZI8rjLnx59A+9bfDcXtpzgvtdfQP3RHM7uo2AMVixKdutyppbN/jV0RUfJNE0TpKJYkQimqP5eC9Tn5x8rHMJvb8RLzl7DLUqMczzThFWXws7la+riXCB+coqmUD1/fvB1rGgYprVznOF4ipnFTdilJqwAjAVBGLyUx87uTt7U+1ss3F8mcmoc32j4+1xUTkcpZGwSdomUnafQGlBMO0RcdzZoB5z6OsoJi2ZnilLYYTIW41T9SiJ1dVozrAbY8Thm1RIGz6tjfGuJ99UfIGq5XF5/gFNrGzny68tYcG8Wa9uuapd6xtRcICPzlD07Qykg4G2ZbSSuKnJXz1ZaZ5pxRqfJrmmm54aAd6/czsbwFHu2Lad9pyGYnHoqxBORVzBjMMUizTtLDNNB+D0+v9zwCHe8YQ35B9J09jZAEGDqEvRf4tC2fvaNeutjPZxszXCwcT3RVBJfgYzI3GNZWPE4010JnPrZB25npXo51tqE15TCVSBTc4LdB0kcijC9cDMPr2rgly98iHXL+tgU6aXZCQhhccQLsS23gi8fP4/y3U20PZTF2b0fP5utdvnyi7Adio0hsh2GlJ0nY+eIdk6TO1ZPfSwG+SfnPjQ1Uqq36HRzJKwyAHdlXKKZBpie1ojZOc6uSzF4bh3Fq6Y4cv6Xn/yqw/XxKTYu/iY/ePsqPjPzOlq3VbXMM0qBjNSMYDzMhdt/HefJqUv2NSOMXWeojxridh9nO2X+c+8F/Gffq1lyW57wyRE8hTEic0p01ykW9jfywea3E1o8w1VLDzD2pjiD19ZxfLAFbyJM407oTzTjnxWwJTJKZ/M9fPKvHe4+upKVf5mG4TH88fFq74qI/DxsB/+SjQytjXLuO3bxwcbZp6KvS+7lnOXdfPafL+PBPStY9e/N2D1D+INDVS5YzhRTKtFxxyBtD8V58I4LuC9i4YcszJMz0m0PnKIhPekR6RuCkTH8vN6aOhc5a1bQd1UzwaUT/N7KBzknMkHIsvmHjd/k35suZffydSy41xCe9Ch8aJw3d/yYVidCo+3T6vSx7Y8f57aDZ7Hy92cIJqe1FMUc5o9P0Pqj0xSPNHLhot95xme2Z3ALho69g9TSfBcFMjL3BQY3C5ERh/JIA/mowU8FrFzTy8aGPjbEe+gtNXL/6HKcYzFat/uE9p3E0w2ZyJzjDw5hjY7R/MS5TMykmOyMsToxyGszu/hO7Gx2DXaQ/H6SQsblznwMmwgAb848yrQXYTLWihUOVXkvROTnZdkWpbRLMQNXN+whbhX5YS4ENADway0PcqKrES+VJhIOV7dYObOMwT98DIDoC2xaSzdn81EQD5NrM6xpHGNVpJ8nimkAQvgsSw5zoquRfEMacHn9wl1sjJ7i3nz8qe+/tn4X3QszlEMhLMfGlKuyG3IGmGIR73g3zvFu0j9jm1rr7wpkZM4z5RJtX9qD5T7552zPvmHJikTY63ay1+6aHb7o+SzLHsTk85q2IDKHGc8j/e3dNEQiDH2hniE7zYP2aih7LPJGCSaO03V/hE9+/ZpnfmOpjBk4QqBFnkXmDON5JH64l+S9Eb7wX69+zjcoposF/JF9eFrIVWRu2n2EFd1J/FiMj4eve+Znvs/C0jjBTC/4Pvc8sY577LOe/TNKZbzBAS3oLnOOAhmpCcH0dLVLEJEKCnI5yOXgZ410KxRgYrKyRYnIy+IF+7uIzGmmXMIfHfu5tg26T73M1YhUll3tAkRERERERERE5hsFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFWYZY37+jS1rGDj58pUjL6DLGNNc6V+qdq86tfv8VJV2B7X9K4D6/Pykdp+fdKyfv9Tn5ye1+/z0M9v9RQUyIiIiIiIiIiLy0mnKkoiIiIiIiIhIhSmQERERERERERGpMAUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhSmQERERERERERGpMAUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhbkvZuOwFTFREi9XLfICphkfMcY0V/r3qt2rS+0+P1Wr3UFtX23q8/OT2n1+0rF+/lKfn5/U7vPT87X7iwpkoiQ437rizFQlL9pd5paT1fi9avfqUrvPT9Vqd1DbV5v6/Pykdp+fdKyfv9Tn5ye1+/z0fO2uKUsiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqzK12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xwlVt0oRERH5Ofn7DxPeD+Hn2UYPVucX/9BR7ENQ/8DzbFO5ckTOmJoLZKxCkVDOsKfQyRsz2/nta+7mU4NX8GjfIk7+zWpWn5jCn57WehI1ou623dT/KMqDn1jJg86aZ35YKrO63Is/NAyAtTPLmj+q54vJy2antBkDZY+umX06gM9h3slelv3jFFY0wsdj1z3zQ99naXGIYGq6BtdkFxERERGRuay2AhljsGZyJE4X+YdHryaaLJKMFRnuaSAy5JA4OgLDYwpjakiQy0EuB6NjL7itKZfwh4dhuAKFSeUEPv74eLWrEBEREREReVFqK5ABvIFB7IFBVtz79Ncanvy/RkGIiIiIiIiIyCuBXe0CRERERERERETmGwUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhSmQERERERERERGpMAUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhSmQERERERERERGpMAUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhSmQERERERERERGpMAUyIiIiIiIiIiIVpkBGRERERERERKTCFMiIiIiIiIiIiFSYAhkRERERERERkQpTICMiIiIiIiIiUmEKZEREREREREREKkyBjIiIiIiIiIhIhSmQERERERERERGpMMsY8/NvbFnDwMmXrxx5AV3GmOZK/1K1e9Wp3eenqrQ7qO1fAdTn5ye1+/ykY/38pT4/P6nd56ef2e4vKpAREREREREREZGXTlOWREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqzH0xG4etiImSeLlqkRcwzfiIMaa50r9X7V5davf5qVrtDmr7alOfn5/U7vOTjvXzl/r8/FTNPi+vTC8qkImS4HzriperFnkBd5lbTlbj96rdq0vtPj9Vq91BbV9t6vPzk9p9ftKxfv5Sn5+fqtnn5ZVJU5ZERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCpMgYyIiIiIiIiISIUpkBERERERERERqTAFMiIiIiIiIiIiFaZARkRERERERESkwhTIiIiIiIiIiIhUmAIZEREREREREZEKUyAjIiIiIiIiIlJhCmRERERERERERCrMrXYBIiIiIiIiWBaWG8LJNGBSiWd+5Png+QTDIwSFAtgOTjIBLRmwrKe3K5Xx+wcxXhmMqfQeiIi8KApkRERERESk6px0mmDZAg7+fojPX/jFZ3y2LbuC+0aWU/q79YTu2oHb2szADUv4pz/8t2ds99mBSxl/71Ls06P4w8OVLF9E5EXTlCWpOXYqhbt4EfnXncfk2y7AWbMCt6212mWJiIiIyPMwnoedLcJwhNsnN9LlTrE1WuTsSJYZP8Kh7nbcmTKYAFMuE5kwfHbgUqaCKOdGcmzLrmDPUDtWrgjlUrV3R0TkBSmQkZpjdbYzdmEH53zkCT7z0Y/Te00z+Q2d1S5LRERERJ5HMD2Nf/Aoy27Jc/e/XMD3smsY9oucKNt89YnzWPvREZydR8AY/JFR0j86wsgfdvHh3Tdy0jPc9NUryHw2gX/8FP7EZLV3R0TkBdXklCUrFMZpayG7oZ2hTSGKzQFBzMfybOy8RXjCJjIBkYmAxh8c03DG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Z782wW479azv7fRP6KHbHHb03R28/rqH2DfZzvGRDKH7F1NKQ3E0RqI3j3fipPp2jTKeR+NNj9HoOOz/aOyp+zmCJ8MW+3+suBEELPOeAN/HeArpZO6prUAGIPAxAeqQ89nENInuGPf3LeWO1DEuaTnK3Zttun9vHZExiI4HNPzwCP7IaLUrlTPEeB543s+cSx4UfCho8e5aF6iNa97PdW43BlMsam2JGmDKpRd8iBJktahrLbJ8i7wf4sLG4zRHZ3igYz3RUYuWhxzcgQk8hTE17YWu60RqSe0FMjLv+SMjWOPj5A5t4eb0Fv5+8a38WvoRhlfE+MrYBdzftwyzuxkUyIiIiIi84rh5OD7TxP+36BHWx3p4cNFSwsfjNHzlMTy9NU1EaogCGak9xmB8n2VfmyL74wX8RuMHwAIrgNBMQCbrYZ06Wu0qRUREROQ5LPrOCNkdC/hQ+n1YgaHrdJHQwAC+/+y1o0RE5jIFMlKbjMHs2EcYCD/Hx3q2IiIiIvLK5O8/THj/M6/hdO0mIrXIfuFNRERERERERETkTFIgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFWcaYn39jyxoGTr585cgL6DLGNFf6l6rdq07tPj9Vpd1Bbf8KoD4/P6nd5ycd6+cv9fn5qWp9Xl6ZXlQgIyIiIiIiIiIiL52mLImIiIiIiIiIVJgCGRERERERERGRClMgIyIiIiIiIiJSYQpkREREREREREQqTIGMiIiIiIiIiEiFKZAREREREREREakwBTIiIiIiIiIiIhWmQEZEREREREREpMIUyIiIiIiIiIiIVNj/H3+3qZaQC96wAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(figsize=(20,6))\n", + "for i in range(26):\n", + " subplot(3, 9, i+1)\n", + " imshow(font_im_vecs[i].reshape(font_ims[0].shape[:2]))\n", + " xticks([])\n", + " yticks([])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "font_ims_w = svd_whiten(font_im_vecs.T).T\n", + "imshow(norm_range(font_ims_w[15].reshape(font_ims[0].shape[:2])))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The whitened shapes look similar to the original shape with certain pixel emphasized or de-emphasized. We can see now that the shapes are orthogonalized." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([], [])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "original_xcorr = np.dot(font_im_vecs, font_im_vecs.T)\n", + "whiten_xcorr = np.dot(font_ims_w, font_ims_w.T)\n", + "\n", + "figure(figsize=(8,4))\n", + "subplot(121)\n", + "imshow(original_xcorr)\n", + "xticks([])\n", + "yticks([])\n", + "\n", + "subplot(122)\n", + "imshow(whiten_xcorr)\n", + "xticks([])\n", + "yticks([])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will just encode the templates and the decorrelated templates into a vector. Note that we are not considering the colors and just using the pixel locations for the encoding." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 elapsed: 41.050931215286255\n" + ] + } + ], + "source": [ + "font_vecs = ru.crvec(N, len(font_ims))\n", + "tst = time.time()\n", + "for i in range(len(font_ims)):\n", + " print(i, end=\" \")\n", + " font_vecs[i,:] = encode_pix(font_ims[i].mean(axis=2), Vt, Ht)\n", + "print(\"elapsed:\", time.time() - tst)\n", + "# this is stupidly slow, can be implemented by just a matrix multiply \n", + "# instead of a loop for better speed (need to store big matrix in memory though)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 elapsed: 41.320383071899414\n" + ] + } + ], + "source": [ + "font_vecs_w = ru.crvec(N, len(font_ims))\n", + "tst = time.time()\n", + "for i in range(len(font_ims)):\n", + " print(i, end=\" \")\n", + " font_vecs_w[i,:] = encode_pix(font_ims_w[i].reshape(font_ims[0].shape[:2]), Vt, Ht)\n", + "print(\"elapsed:\", time.time() - tst)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a similar fashion to the letters, we will also consider color as a factor. Further, we will use 7 different colors. But hmm... 7 colors can't all be orthogonal because color is only a 3 dimensional space! \n", + "\n", + "The whitening still has an effect, and is still necessary." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "colors_dict = {'red': [1, 0, 0], 'green': [0, 1, 0], 'blue': [0, 0, 1], 'cyan': [0, 1, 1],\n", + " 'magenta':[1,0,1], 'yellow': [1, 1, 0], 'white': [1, 1, 1]}" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "colors_arr = np.array(list(colors_dict.values()))\n", + "colors_lab = np.array(list(colors_dict.keys()))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cols_im = np.tile(colors_arr.reshape([1, colors_arr.shape[0], colors_arr.shape[1]]), [10, 1, 1])\n", + "imshow(cols_im*255, interpolation='none')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "colors_svd = svd_whiten(colors_arr)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cols_svd_im = np.tile(colors_svd.reshape([1, colors_svd.shape[0], colors_svd.shape[1]]), [10, 1, 1])\n", + "imshow(norm_range(cols_svd_im), interpolation='none')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "color_vecs = np.dot(colors_arr, Cv)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7, 30000)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "color_vecs_w = np.dot(colors_svd, Cv)\n", + "color_vecs_w.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up the resonator network\n", + "\n", + "Now that we have VSA encodings that allow for translation and that deal with correlations in the templates, we can set-up the scene anlaysis problem as a factorization problem that can be solved by the resonator network. \n", + "\n", + "The idea is that the scene is composed of several objects, and each object is composed from several factors -- shape, color, horizontal and vertical location. We can store the atomic vectors for location and the decorrelated vectors for shape and color into the clean-up memories of a resonator network. When we present a scene (encoded into the VSA vector) to the resonator network, it will search through combinations of factors that best matches with the input scene. " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "res_xlabels = [colors_lab, np.array(list(letters)), np.arange(patch_size[0]), np.arange(patch_size[1])]\n", + "res_xticks = [np.arange(0, len(res_xlabels[0]), 3, dtype='int'),\n", + " np.arange(0, len(res_xlabels[1]), 8, dtype='int'),\n", + " np.arange(0, len(res_xlabels[2]), 10, dtype='int'),\n", + " np.arange(0, len(res_xlabels[3]), 10, dtype='int')]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Here we are creating the clean-up memories for the resonator network\n", + "Vspan = font_ims[0].shape[0]\n", + "Hspan = font_ims[0].shape[1]\n", + "\n", + "Vt_span = ru.crvec(N, Vspan)\n", + "Ht_span = ru.crvec(N, Hspan)\n", + "\n", + "for i in range(Vspan):\n", + " ttV = i - Vspan//2\n", + " \n", + " Vt_span[i,:] = Vt ** ttV\n", + "\n", + " \n", + "for i in range(Hspan):\n", + " ttH = i - Hspan//2\n", + " \n", + " Ht_span[i,:] = Ht ** ttH\n", + "\n", + "res_vecs = []\n", + "\n", + "res_vecs.append(color_vecs_w)\n", + "res_vecs.append(font_vecs_w)\n", + "res_vecs.append(Vt_span)\n", + "res_vecs.append(Ht_span)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.154])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.rand(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4 magenta\n", + "2 blue\n", + "5 yellow\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Generate a scene of three objects with random factors\n", + "\n", + "im_idx1 = np.random.randint(len(font_ims))\n", + "tH = 0.8 * patch_size[1] * np.random.rand(1) - 0.4 * patch_size[1]\n", + "tV = 0.8 * patch_size[0] * np.random.rand(1) - 0.4 * patch_size[0]\n", + "rC = np.random.randint(colors_arr.shape[0])\n", + "print(rC, colors_lab[rC])\n", + "\n", + "t_im1 = font_ims[im_idx1].copy()\n", + "\n", + "for i in range(t_im1.shape[2]):\n", + " t_im1[:,:,i] = colors_arr[rC, i] * t_im1[:,:,i]\n", + "\n", + "t_im1 = shift(t_im1, (tV[0], tH[0], 0), mode='wrap', order=1)\n", + "\n", + "######\n", + "im_idx2 = np.random.randint(len(font_ims))\n", + "tH2 = 0.8 * patch_size[1] * np.random.rand(1) - 0.4 * patch_size[1]\n", + "tV2 = 0.8 * patch_size[0] * np.random.rand(1) - 0.4 * patch_size[0]\n", + "rC2 = np.random.randint(colors_arr.shape[0])\n", + "print(rC2, colors_lab[rC2])\n", + "\n", + "t_im2 = font_ims[im_idx2].copy()\n", + "\n", + "for i in range(t_im2.shape[2]):\n", + " t_im2[:,:,i] = colors_arr[rC2, i] * t_im2[:,:,i]\n", + "\n", + "t_im2 = shift(t_im2, (tV2[0], tH2[0], 0), mode='wrap', order=1)\n", + "\n", + "######\n", + "im_idx3 = np.random.randint(len(font_ims))\n", + "tH3 = 0.8 * patch_size[1] * np.random.rand(1) - 0.4 * patch_size[1]\n", + "tV3 = 0.8 * patch_size[0] * np.random.rand(1) - 0.4 * patch_size[0]\n", + "rC3 = np.random.randint(colors_arr.shape[0])\n", + "print(rC3, colors_lab[rC3])\n", + "\n", + "t_im3 = font_ims[im_idx3].copy()\n", + "\n", + "for i in range(t_im2.shape[2]):\n", + " t_im3[:,:,i] = colors_arr[rC3, i] * t_im3[:,:,i]\n", + "\n", + "t_im3 = shift(t_im3, (tV3[0], tH3[0], 0), mode='wrap', order=1)\n", + "\n", + "\n", + "#####\n", + "t_im = np.clip(t_im1 + t_im2 + t_im3, 0, 1)\n", + "#t_im = t_im1\n", + "figure(figsize=(3,3))\n", + "imshow(t_im, interpolation='none')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import importlib\n", + "importlib.reload(ru)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# encode the scene into a VSA vector\n", + "bound_vec = encode_pix_rgb(t_im, Vt, Ht, Cv)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "converged: 77\n", + "elapsed 2.1252570152282715\n" + ] + } + ], + "source": [ + "# run the resonator dynamics\n", + "tst= time.time()\n", + "res_hist, nsteps = ru.res_decode_abs_slow(bound_vec, res_vecs, 500)\n", + "print(\"elapsed\", time.time()-tst)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 1, 10, 21]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# visualize the convergence dynamics\n", + "figure(figsize=(8,3))\n", + "\n", + "ru.resplot_im(res_hist, nsteps, labels=res_xlabels, ticks=res_xticks)\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we see the resonator dynamics as it tries to find a solution. Each plot describes one of the 4 factors. The network will hone in on one particular object and find its factorization. The colors show the output of the network, with yellow indicating strong confidence on the output. The network will at first jump around the state space quite chaotically, until a good solution is stumbled upon and as if in a moment of insight the network rapdily converges to a factorization of the scene. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Explaining away to handle multiple objects\n", + "\n", + "The resonator network solves the factorization problem for one object at a time. In order to evaluate the rest of the scene, we expalin-away the output of the resonator network and reset the system. Now the resonator network will hone in and factorize a different object, and the process can be repeated for each object. This procedure is analogous to deflation in tensor decompositions." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 1, 10, 21] 37\n" + ] + } + ], + "source": [ + "out_w, out_c = ru.get_output_conv(res_hist, nsteps)\n", + "print(out_w, out_c)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# When we explain away, we want to subtract out the original templates, not the whitened templates\n", + "res_out = color_vecs[out_w[0]] * font_vecs[out_w[1]] * res_vecs[2][out_w[2]] * res_vecs[3][out_w[3]]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6138669514467746\n" + ] + } + ], + "source": [ + "res_out_sim = np.real(np.dot(np.conj(res_out)/norm(res_out), bound_vec/norm(bound_vec)))\n", + "print(res_out_sim)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "bound_vec2 = bound_vec/norm(bound_vec) - res_out_sim * res_out / norm(res_out)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "converged: 65\n", + "elapsed 1.7095818519592285\n" + ] + } + ], + "source": [ + "tst= time.time()\n", + "res_hist2, nsteps2 = ru.res_decode_abs_slow(bound_vec2, res_vecs, 200)\n", + "print(\"elapsed\", time.time()-tst)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 7, 12, 28]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "figure(figsize=(8,3))\n", + "\n", + "ru.resplot_im(res_hist2, nsteps2, labels=res_xlabels, ticks=res_xticks)\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 7, 12, 28] 32\n" + ] + } + ], + "source": [ + "out_w2, out_c2 = ru.get_output_conv(res_hist2, nsteps2)\n", + "print(out_w2, out_c2)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "res_out2 = color_vecs[out_w2[0]] * font_vecs[out_w2[1]] * res_vecs[2][out_w2[2]] * res_vecs[3][out_w2[3]]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.48068068720567714\n" + ] + } + ], + "source": [ + "res_out_sim2 = np.real(np.dot(np.conj(res_out2)/norm(res_out2), bound_vec2/norm(bound_vec2)))\n", + "print(res_out_sim2)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "bound_vec3 = bound_vec2/norm(bound_vec2) - res_out_sim2 * res_out2 / norm(res_out2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "converged: 82\n", + "elapsed 2.330627202987671\n" + ] + } + ], + "source": [ + "tst= time.time()\n", + "res_hist3, nsteps3 = ru.res_decode_abs_slow(bound_vec3, res_vecs, 200)\n", + "print(\"elapsed\", time.time()-tst)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 16, 16, 50]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "figure(figsize=(8,3))\n", + "\n", + "ru.resplot_im(res_hist3, nsteps3, labels=res_xlabels, ticks=res_xticks)\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}