Þ¤pathÙ8/home/runner/work/LINMA2472/LINMA2472/Lectures/sparse.jl¨metadata€¬cell_resultsÞWÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655Чrunning§runtimeÎL¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÁ

Acyclic coloring

Definition 6.3 A mapping $\phi: V \to \{1, \ldots, p\}$ is an acyclic coloring if

  1. $\phi$ is a distance-1 coloring

  2. every cycle uses at least 3 colors

Theorem 4.6 Let $A$ be a symmetric matrix with nonzero diagonal elements, $G$ be its adjacency matrix. A mapping $\phi$ is an acyclic coloring of the adjacency graph iff it induces a substitutable partition of the columns of $A$.

Name acyclic coloring comes from the fact that the subgraph induced by any pair of colors is a forest.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛áN‡°persist_js_state÷has_pluto_hook_featuresÂÙ$a546edb2-6a72-4c5f-95f7-cc7709bbb505Чrunning§runtimeÍI‚¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a546edb2-6a72-4c5f-95f7-cc7709bbb505¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefixÙ&Main.var"workspace#5".MyGradientTracer¨elements’’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements’’’¡2ªtext/plain’’¡1ªtext/plain¤type£Set¬prefix_short£Set¨objectid°4b491c7b1de0dcc9Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°3534e1cbe83eca9bÙ!application/vnd.pluto.tree+object’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements‘’’¡4ªtext/plain¤type£Set¬prefix_short£Set¨objectid°f35649581e935d69Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°5e2b24fc7d66ecd5Ù!application/vnd.pluto.tree+object¤type¥Array¬prefix_short ¨objectid°eed5e80ffeb55de6¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAڸ؜H¬q°persist_js_state·has_pluto_hook_featuresÂÙ$d5b7f51b-e451-40a7-aa41-a8006decba33Чrunning§runtimeΪ„¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d5b7f51b-e451-40a7-aa41-a8006decba33¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ‰

Red-Blue subgraph

To compute an off-diagonal entry $A_{ij}$, consider the subgraph induced by the two colors $\phi(i)$ and $\phi(j)$. The entry will be computed, from $B_{\phi(i)}$ and $B_{\phi(j)}$, possible after substitution.

Consider below left $B_\text{red}$ and right $B_\text{blue}$. The rows corresponding to diagonal entries have been omitted as we already found how to compute them in the previous slide. The rows corresponding to green nodes are in bold as they will be computed from the subgraph induced by red/green or blue/green so we can ignore them for now.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛á®°persist_js_state÷has_pluto_hook_featuresÂÙ$5892dfbb-b375-407b-a0a7-da66adb71b67Чrunning§runtimeÎMF¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$5892dfbb-b375-407b-a0a7-da66adb71b67¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚŸ

Theorem 3.5 A coloring of the columns is distance-2 in the bipartite graph iff columns of the same color are structurally orthogonal.

Let the $k$-th power $G^k$ of a graph $G$ be the graph with same nodes as $G$ and an edge in $G^k$ for each distance $k$ neighbors in $G$.

Lemma 3.7 The column intersection graph is the square of the biparted graph restricted to its column vertices.

Lemma 2.1 A coloring is distance-$k$ in $G$ iff it is distance-1 in $G^k$.

Corollary A coloring of the columns is distance-1 in the column intersection graph iff columns of the same color are structurally orthogonal.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ß`W°persist_js_state÷has_pluto_hook_featuresÂÙ$1f02fda8-6b22-429e-9ef4-243e97372526Чrunning§runtimeήJW¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1f02fda8-6b22-429e-9ef4-243e97372526¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚâ
Is this a distance-2 coloring ? Can we deduce all values of the hessian given the values of $AD$.

It is not a distance-2 coloring because the nodes 2 and 3 are distance 2 neighbors. Because of this, in the first row of the second column of $AD$ we get $a_2 + a_3$ which prevents us distinguish $a_2$ or $a_3$. However, $a_2$ and $a_3$ can be obtained from the first column of $AD$ so we can retrieve all values of the Hessian from $AD$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟Ë�¡°persist_js_state·has_pluto_hook_featuresÂÙ$1167ae71-b63d-4ccc-a120-31c8483eca85Чrunning§runtimeÍ:}¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1167ae71-b63d-4ccc-a120-31c8483eca85¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements“’’¡3ªtext/plain’’¡2ªtext/plain’’¡1ªtext/plain¤type£Set¬prefix_short£Set¨objectid°162b0f1061597b3aÙ!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°aeb4d4d11c4ebd5d¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee§ytracer²last_run_timestampËAڸ؜?μ°persist_js_state·has_pluto_hook_featuresÂÙ$45f4edeb-d934-413f-9f45-568465111b6eЧrunning§runtimeÎ Þ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$45f4edeb-d934-413f-9f45-568465111b6e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ|

Sparsity detection with multiple outputs

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ¸Ø›Þæâ°persist_js_state÷has_pluto_hook_featuresÂÙ$a413c12c-72c1-4f46-b7f2-0b0118c1b232Чrunning§runtimeΰÆýó+»÷ë7«<„[úòékÜ?¿²{ÿ°Îoûø•U^îøY!I IPHÒ€B’’4 �¤…$ ($i@!IŠIN\+KÐA=„=¸~å0ž¸ÞË[’4 ˜®tTaÂq„ë…+’4 �¤Åq5Û„ýi¶ Ò:Í6á›B’×ýÈɉ½ës³F– mòñ+«¼Üñ³B’’4 �¤…$ ($i@!I IPHÒ€B’—œ8Š,Aº©—;¶*$i@q\á8‚t[áJ…$ ($i@¡ßi¶ Í6ašmÂ15Û„*$i@¡?ê~d�äÄ[úܬ‘%ì]Ÿ›5²„÷à˧¬qÿüÊ‘’4 �¤…$ ($i@!I IPHÒ€B’’4 Ð%'®•%E– ‹ûçW…$ (ô;ázá8‚¾ô…$ ($i@¡ßi¶ Í6AïA³M˜Õl¾)$i@¡?ê~d�äÄ[úܬ‘%èúܬònêãWVy¹ãg…$ ($i@!I IPHÒ€B’’4 �¤…$ (ôGɉke Ò›Â.¼Ü±U!I ýN¸^�Þö!\©�¤…$ (Ž«Ù&ìO³MØŸf› ·4Û„‹f›ðM!IŠƒë~d�äÄÞõ¹Y#KؽÏÍ*A+ýÃ:O¼íãWVy¹ãg…$ ($i@!I IPHÒ€B’’4 �¤…$ (.9qYÂa< {âz/wlUHÒ€â¸Âq„ãš®®THÒ€B’z/šm¬f›pÑlö§Ù&ìL!I ½+Ý�¬‘œ¸©ÏÍ*á-}nÖÈvïs³ÊCØ«B’’4 �¤…$ ($i@!I IPHÒ€B’zW’»ð®•%ÆCøÛ’4 Ð{ö!\/G8ˆB’’4 Ðï4Û„cj¶ ÇÔl¨�¤…þ¨û‘5’ïAŸ›5²„÷à˧¬qÿüÊ‘’4 �¤…$ ($i@!I IPHÒ€B’’4 Ð%'t‘%èâþùA!I ýNÐ÷‚¾ô…$ ($i@±OÍ6ᘚmÂE³M˜Õl.šmÂ15Û„A…$ (v¬ÏÍYÂ{Ðçf�,á-Ý�¬‘œ¸©ÏÍ*á-}nÖÈÞ…X牛($i@!I IPHÒ€B’’4 �¤…$ ($i@±cY‚.²„k%'vá!\+KÐwžøO’4 Ø§ ï…ë…}× ú^Ø�B’’4 øQ³MÐÞ5Û„YÍ6á¢Ù&Ìj¶ THÒ€âºY#9¡¿K÷#k$'nês³ÊCxKŸ›5²„[úòékÜ?¿rd…$ ($i@!I IPHÒ€B’’4 �¤…$ (~!9¡cJNìÂC¸V–°÷ϯ IPü(è¨Â>„ë…}ú¿B’’4 øQ³M˜Õl¤ušm‚~©�¤Å/t?²Frâ–úܬ‘%H[|ùô�5îŸ_Ñï’4 �¤…$ ($i@!I IPHÒ€B’’4 ø…äÄd Ò-Ý?¿¢…$ (~ö!H·4ª�¤…$ (ô;Í6ᘚm¬f›0«Ù&P!I ýQ÷#k$'Þƒ>7kd ·Ôçf�,á–¾|úÀ÷ϯY!I IPHÒ€B’’4 �¤…$ ($i@!I ýQrBYÂd {pÿüŠ �¤…~'è{aÂ>ý_!I IPèÖšm¬f› [j¶ ³šmÂ7…$ (ô¯ès³F–pKÝ�¬‘œÐ¿ès³ÊC¸©�_Yå原’4 �¤…$ ($i@!I IPHÒ€B’’4 Ð¿"K؃ä„vè!ìÂË[’4 Ð­…}Ú£°áJ…$ ($i@ñ£f›0«Ù&S³MØŸf› ·4Û„‹f›ðM!IŠ_è~d�äÄ-õ¹Y#Kxúܬ‘%ìÞçf•‡ •þa�'Þöñ+«¼Üñ³B’’4 �¤…$ ($i@!I IPHÒ€B’¿�œØƒ,AYÂa< {âz/wlUHÒ€âGa‚¾Ž#hZ¸^¸R!I IPìS³M¸h¶ ³šmÂE³MÐÞ5Û„‹f›pÑl¾)$i@±c}nÖÈÞÒýÈɉ[ês³F–ð–>7kd úË|nVyoú‡užxÛǯ¬òrÇÏ IPHÒ€B’’4 �¤…$ ($i@!I IPìX–p­äÄd ×ÊtPájO\ï厭 IPìS¸^؇p½ £ × × W*$i@!Iþ¿(qVÆ"«IEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Ûem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’ÈȉPNG  IHDRi5L()sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<FIDATxíÁ±mÝà–…Ño;u ÔÁíÅ=ìàÆ³A=¨uàÀ ¨€3‰1|4ÈñÿÞ¶æ¬eZ<Óâ™ÏìcĦ#>V1FlŠ1â™Ï¨ºs…´r¦ž‹+´ˆÏôëÇ7®x|yçÔO®yâS˜Ï´x¦Å3-žiñL‹gZ<Óâ™Ï�Vfi _Þ™öÄ•iñÌž˜'2ˆy"€iñL‹göŠ1bSŒí�iñÌ�ª;WH+g깸B‹hÿ7Óâ™Ï´x¦Å3-žiñL‹gZ<Óâ™ÒÊ,-¢} Óâ™=1O´eZ<Ó♽bŒØcĦ#6ű)ƈM1FüaZ�iñÌ�ª;WH+g깸B‹8õV\rŸê'×<ñ)L‹gZ<Óâ™Ï´x¦Å3-žiñL‹gH+³´ˆi7á‰ÿ*Óâ™=1OÌDÓâ™ÏìcĦ#6ű)ƈ0¦Å3ªî\!­œ©çâ -âÔ[qÉMœùõãW<¾¼“Ê´x¦Å3-žiñL‹gZ<Óâ™Ï´x怴2K‹˜v³_Þù×™Ïì‰ybž˜'¾Óâ™ÏìcĦ#>V1F„1-ž9Puç iåL=WhŸé×�o\ñøòN*Óâ™Ï´x¦Å3-žiñL‹gZ<Óâ™ÒÊ,-"ÁãË;ÿ:Óâ™=1Od_„iñL‹göŠ1bSŒ«#˜Ï¨ºs…´r¦ž‹+´ˆÏôëÇ7®x|y'•iñL‹gZ<Óâ™Ï´x¦Å3-žiñÌie–‘àñå��iñÌž˜'2ˆ/´x¦Å3{ű)ƈM1Fä)ƈ?L‹gTݹBZ9SÏÅZÄ©·â’›ˆ÷ý7—¼>ð7Óâ™Ï´x¦Å3-žiñL‹gZ<Óâ™ÒÊ,-bÚM|¯Œ2-žÙóÄ<ñuˆI¦Å3-žÙ+ƈM1FlŠ1âccĦ#þ0-ž9Puç iåL=Wh§ÞŠKnâSýäš'Î}ÿÍ%¯üÍ´x¦Å3-žiñL‹gZ<Óâ™Ï´x怴2K‹˜vž˜÷úÀ(Óâ™=1OÌÄ<1É´x¦Å3{ű)ƈM1F|¬bŒØcĦÅ3ªî\!­œ©çâ -âÔ[qÉM|ªŸ\óĹäõ�¿™Ï´x¦Å3-žiñL‹gZ<Óâ™Ï�VfiÓn"Âó^eZ<³'æ‰y"ƒ˜'&™Ï´xÿþÛÉK<5IEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟¾4D°persist_js_state·has_pluto_hook_featuresÂÙ$60070a94-d9ca-474b-9c6f-37468e3f030dЧrunning§runtimeÎÕ2¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$60070a94-d9ca-474b-9c6f-37468e3f030d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚW
How do we get the value of $a_4$ ?

Two ways:

  1. Get the value of $a_2$ from $(AD)_{12}$ then get $a_4$ from $(AD)_{21} - a_2$

  2. Get the value of $a_6$ from $(AD)_{41}$ then get $a_4$ from $(AD)_{32} - a_6$

$a_4$ cannot be read directly from a single entry, it needs substitutions. This example shows that enabling substitutions allows us to use less colors to find all entries of the Hessian!

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟Ì,¶°persist_js_state·has_pluto_hook_featuresÂÙ$15cf368c-cada-4a72-b59b-a0f9dd0115b4Чrunning§runtimeÎ� ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$15cf368c-cada-4a72-b59b-a0f9dd0115b4¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚá
How to compute the non-bold entries ?

For star graphs, the entry $a_{uv}$ was the edge of a star with either center $u$ and leaf $v$ or center $v$ and leaf $u$. It was then obtained from the HVP of the color of the center.

We need to generalize this for arbitrary trees. For any edge from a leaf $u$ to a node $v$, we can compute $a_{uv}$ from the $u$th entry of the HVP of color $\phi(v)$. Then, we subtract $a_{uv}$ from the $v$th row of the HVP of color $\phi(u)$. So we can do

  • $a_{71} \gets (h_\text{red})_7$ then $(h_\text{blue})_1 \gets (h_\text{blue})_1 - a_{71}$

  • $a_{43} \gets (h_\text{red})_4$ then $(h_\text{blue})_3 \gets (h_\text{blue})_3 - a_{43}$

  • $a_{52} \gets (h_\text{blue})_5$ then $(h_\text{red})_2 \gets (h_\text{red})_2 - a_{52}$

Then, we can remove these leaves and edges. Doing so, some of their parents in the tree become leaves and we can apply the same procedure recursively. So we get

  • $a_{12} \gets (h_\text{blue})_5$ then $(h_\text{red})_2 \gets (h_\text{red})_2 - a_{12}$

  • $a_{32} \gets (h_\text{blue})_5$ then $(h_\text{red})_2 \gets (h_\text{red})_2 - a_{32}$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟̼<°persist_js_state·has_pluto_hook_featuresÂÙ$2fe7f4eb-ca33-4338-ba8e-29b769b0dcceЧrunning§runtimeÎ1¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜áy·°persist_js_state·has_pluto_hook_featuresÂÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48Чrunning§runtimeÎÛZ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ"F (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜Fˆ¹°persist_js_state·has_pluto_hook_featuresÂÙ$44a6b427-bd4b-4fa1-95d8-a8ea55719192Чrunning§runtimeÎT¤¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$44a6b427-bd4b-4fa1-95d8-a8ea55719192¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ
How can the diagonal entries be determined ?

The value of $(h_{\phi(i)})_i$ is the sum of the entries of the $i$th row of $B_{\phi(i)}$. Since the only nonzero entry of this row is $A_{ii}$, we have $A_{ii} = (h_{\phi(i)})_i$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟̊ΰpersist_js_state·has_pluto_hook_featuresÂÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58Чrunning§runtimeÎŽ»¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’ÙÛ
  • The columns 1, 2 and 5 do not share any rows with nonzero entries.

  • So their entries can be recovered unambiguously with just one JVP!

©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Úžù©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�Wµ�°persist_js_state·has_pluto_hook_featuresÂÙ$39e06fde-d734-11f0-a308-89fba7e8abd6Чrunning§runtimeÎÆl#¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$39e06fde-d734-11f0-a308-89fba7e8abd6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚV

Sparse AD

Benoît Legat

      ¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؜ ]î°persist_js_state·has_pluto_hook_featuresÂÙ$21898d8d-f822-4128-ad56-d9a10865fb1dЧrunning§runtimeÎ KK¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$21898d8d-f822-4128-ad56-d9a10865fb1d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ.three_columns (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�f”-°persist_js_state·has_pluto_hook_featuresÂÙ$4f8de444-dcb4-411a-b087-6948699614e0Чrunning§runtimeÎd¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4f8de444-dcb4-411a-b087-6948699614e0¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؛枿°persist_js_state·has_pluto_hook_featuresÂÙ$75597493-3e69-437f-9408-b43a89b35559Чrunning§runtimeΨZ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$75597493-3e69-437f-9408-b43a89b35559¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸؚš¿8°persist_js_state·has_pluto_hook_featuresÂÙ$9b427766-5290-4dee-8dd5-5aab20080d0aЧrunning§runtimeÎ5{0¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9b427766-5290-4dee-8dd5-5aab20080d0a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’ȉ‰PNG  IHDR©â¸sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<IDATxíÁÁm EÁ÷�¾:eÀ¨ŒÉ@gtf„¢RNAô^Œ¥ ›ö`ØÜ�^U!I IPHÒ€âGÍ6Aúï4Û„«f›°?Í6aP!IŠ_è~f�äŒôéK³F–pÓ[³Ê)ìÝ×ÏŸXãéõ�G($i@!I IPHÒ€B’’4 �¤…$ ($i@ñ Éiﲄ»�ÂQ<½¾ó*$i@ñ£ í_¸_8ް…$ ($i@1¯Ù&\5ÛIÿ‹B’ÒýÌÉ™[úÒ¬‘%Hú’4 �¤…$ ($i@!I IPHÒ€B’’4 x�ä̽²I‡B’óÂý‚¤¿J!I IPÌk¶ WÍ6A{×lf5Û„ýi¶ WÍ6á›B’ÒýÌÉ™[úÒ¬‘%è/óÖ¬r õÖ¬r {÷õó'Öxz}ç¦/¬óÂO IPHÒ€B’’4 �¤…$ ($i@!I IP„·f•S8²B’’4 �¤…$ ($i@!I IPHÒ€B’ú£ä̽²„£Èô�S’4 Ðï„û…ãú^п IPHÒ€B¿Ól®šm‚>‚f›0«Ù&|SHÒ€BÔýÌÉ™[úÒ¬‘%èzkV9…‡úÂ:/ü¤�¤…$ ($i@!I IPHÒ€B’’4 �¤…þ(9s¯,Aºévá…Í IPèwÂý‚t[؇p§B’’4 8®f›°?Í6ašm‚ni¶ WÍ6á›B’×ýÌÉ™½ëK³F–°{oÍ*§ u¾~þÄO¯ïÜô…u^øI!I IPHÒ€B’’4 �¤…$ ($i@!IŠƒKÎE–p§ YO¯ïÜí…Í IPW8ŽpAÓÂýÂ� IPHÒ€BE³M˜Õl®šmÂþ4Û„�)$i@¡¥û™5’3õÖ¬r ·ô¥Y#Kؽ·f•SØ«B’’4 �¤…$ ($i@!I IPHÒ€B’úP’3»p ÷Êãþv…$ (ôQ„}÷ Ç¢�¤…$ (ô;Í6ᘚmÂ15Û„*$i@¡?ê~f�äÌGЗf�,áCxkV9…#+$i@!I IPHÒ€B’’4 �¤…$ ($i@¡?JÎè*KÐwNAPHÒ€B¿ô½ ïý«�¤…$ (ö©Ù&S³M¸j¶ ³šmÂU³M8¦f›0¨�¤ÅŽõ¥Y#KøúÒ¬‘%ÜÒýÌÉ™‡zkV9…[úÒ¬‘%|_?b�§×w¡�¤…$ ($i@!I IPHÒ€B’’4 �¤ÅŽe ºÊمS¸W– «§×wþO…$ (ö)è{á~aÂý‚¾v �¤…$ (~Ôl´wÍ6aV³M¸j¶ ³šmÂ’4 ø…îgÖHÎèïÒýÌÉ™‡zkV9…[úÒ¬‘%<Ô[³Ê)Y!I IPHÒ€B’’4 �¤…$ ($i@!IŠ_HÎ蘒3»p ÷Êvá…$ (~tTaÂýÂ>ý«�¤…$ (~Ôlf5Ûi�f› _*$i@ñ ÝϬ‘œy¤¾4kd Ò&oÍ*§ ß+$i@!I IPHÒ€B’’4 �¤…$ ($i@ñ É™=Ȥ‡:Í($i@ñ£°Az¬ Q…$ ($i@¡ßi¶ ÇÔlf5Û„YÍ6ဠIPè�ºŸY#9óô¥Y#Kx¤¾4kd õÖ¬r GVHÒ€B’’4 �¤…$ ($i@!I IPHÒ€B”œÑU–°YÂ.œ‚ �¤…~'è{aÂ>ý«�¤…$ (ôhÍ6aV³MÐ#5Û„YÍ6á›B’úOô¥Y#Kx¤îgÖHÎè?ôÖ¬r õ…u^øI!I IPHÒ€B’’4 �¤…$ ($i@!I ý'²„=HÎh‡Na^ج�¤…-ìCÐ…}w*$i@!IŠ5Û„YÍ6ᘚmÂþ4ÛÝÒl®šmÂ7…$ (~¡û™5’3�Ô—f�,á#èK³F–°{oÍ*§ u¾~þÄO¯ïÜô…u^øI!I IPHÒ€B’’4 �¤…$ ($i@!IŠ_HÎìA– «,á0NA³ž^ß¹Û ›’4 øQ؇ ï…ãšîîTHÒ€B’ûÔl®šm¬f›pÕl´wÍ6áªÙ&\5Û„o IPìX_š5²„[ºŸY#9óH}iÖÈnéK³F– ¿Ì[³Ê)Üòõó'Öxz}ç¦/¬óÂO IPHÒ€B’’4 �¤…$ ($i@!I IPìX–p¯äÌd ÷ÊtP§p¯§×wîöÂf…$ (ö)Ü/ìC¸_ÐQ…û…û…;’4 �¤ÿÒ¯!º] IEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’ÛeO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Èh‰PNG  IHDRX²}Á/sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<æIDATxíÁÁiäÜ…ÑoÞv Π¢j”A�=ðXŽÊt ༉yBXqooþjsÖ2-Ê´(Ó¢Ì^1FlŠ1bSŒ›bŒø‹L‹2ªî\!­œ©Gq…q꣸ä&Îüùý‹+^Þ?I0-Ê´(Ó¢L‹2-Ê´(Ó¢L‹2-Ê�VfiÓnbÖËû'ÿ%Ӣ̞˜'æ‰yâ ˜eZ”Ù+ƈM1Fü@¦E™Uw®�VÎÔ£¸B‹øÉL‹2-Ê´(Ó¢L‹2-Ê´(Ó¢L‹2¤•YZDӢ̞˜'Úÿ™eZ”Ù+ƈM1FlŠ1bSŒ›bŒøbZ”9Puç iåL=Š+´ˆSÅ%7qæÏï_\ñòþÉ©W®yãÓ¢L‹2-Ê´(Ó¢L‹2-Ê´(Ó¢Ìie–1í&f½¼2í�a¦E™=1OÌóÄ<1É´(Ó¢Ì^1FlŠ1âùcÄÓ¢Ì�ª;WH+gêQ\¡E<½W®yãÓ¢L‹2-Ê´(Ó¢L‹2-Ê´(Ó¢Ìie–ñc¼1Ì´(³'扟CL2-Ê´(³WŒ›bŒØcÄ“1-ʨºs…´r¦ÅZÄ©�â’›xV¦E™eZ”iQ¦E™eZ”iQ¦E™ÒÊ,-bÚMüëL‹2{bž˜'~Ó¢L‹2{ű)ƈM1Fü]ÅñÅ´(s êÎÒÊ™zWh§>ŠKn"ê•kÞøÆ´(Ó¢L‹2-Ê´(Ó¢L‹2-Ê´(s@Z™¥EL»‰§ðÆ0Ӣ̞˜'æ‰ç &™eZ”Ù+ƈM1FlŠ1bSŒ›bŒøbZ”9Puç iåL=Š+´ˆSÅ%7qæÏï_\ñòþÉ©W®yãÓ¢L‹2-Ê´(Ó¢L‹2-Ê´(Ó¢Ìie–1í&f½¼2í�a¦E™=1OÌóÄ<1É´(Ó¢Ì^1FlŠ1bSŒOÆ´(s êÎÒÊ™zWh§>ŠKnâY™eZ”iQ¦E™eZ”iQ¦E™eH+³´ˆi7ñ¯3-Êì‰ybžø!L‹2-ÊìcĦ#6ÅñdL‹2ªî\!­œ©Gq…q꣸ä&ž•iQ¦E™eZ”iQ¦E™eZ”iQ怴2K‹˜vÿ:Ӣ̞˜'扴(Ó¢Ì^1FlŠ1bSŒ›bŒø‹L‹2ªî\!­œ©Gq…q꣸ä&Îüùý‹+^Þ?I0-Ê´(Ó¢L‹2-Ê´(Ó¢L‹2-Ê�VfiÓnbÖËû'ÿ%Ӣ̞˜'æ‰yâ ˜eZ”Ù+ƈM1FlŠ1âɘeTݹBZ9S�â -âÔGqÉM<+Ó¢L‹2-Ê´(Ó¢L‹2-Ê´(Ó¢Ìie–1í&þu¦E™=1OÌ?„iQ¦E™½bŒØcĦ#žŒiQæ@Õ�+¤•3õ(®Ð"N}—Üij2-Ê´(Ó¢L‹2-Ê´(Ó¢L‹2-Ê�VfiÓnâ_gZ”ÙóÄ<ñC˜eZ”Ù+ƈM1FlŠ1âɘeTݹBZ9S�â -âÔGqÉM<+Ó¢L‹2-Ê´(Ó¢L‹2-Ê´(Ó¢Ìie–1í&þu¦E™=1OÌ?„iQ¦E™½bŒØcĦ#þ®bŒøbZ”9Puç iåL=Š+´ˆSÅ%7õÊ5o|cZ”iQ¦E™eZ”iQ¦E™eZ”9 ­ÌÒ"¦ÝÄSxc˜iQfOÌóÄs“L‹2-ÊìcĦ#6ű)ƈM1F|1-ʨºs…´r¦ÅZÄ©�â’›8óç÷/®xyÿäÔ+×¼ñ�iQ¦E™eZ”iQ¦E™eZ”iQ怴2K‹˜v³^Þ?™öÆ0Ӣ̞˜'æ‰ybž˜dZ”iQf¯#6ű)ƈM1FlŠ1â‹iQæ@Õ�+¤•3õ(®Ð"N}—ÜÄ™?¿qÅËû'§^¹æ�oL‹2-Ê´(Ó¢L‹2-Ê´(Ó¢L‹2¤•YZÄ´›˜õòþÉ´7†™eöÄ<1OÌóÄ$Ó¢L‹ú=ïóþ ÷ƒgIEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟¿I¡°persist_js_state·has_pluto_hook_featuresÂÙ$2578b84a-365a-47b6-b58f-1696517c5d02Чrunning§runtimeΞŸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2578b84a-365a-47b6-b58f-1696517c5d02¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚY

Sparse Jacobian

Suppose the Jacobian is sparse.

  • The sparsity pattern (rows and columns of nonzeros) is known

  • You want to determine the value of these nonzeros with AD

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ÛZ`°persist_js_state÷has_pluto_hook_featuresÂÙ$dfe3dffd-926b-4083-9e66-8536e5df198dЧrunning§runtimeÎZs¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$dfe3dffd-926b-4083-9e66-8536e5df198d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ$qa (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؟Æ|¿°persist_js_state·has_pluto_hook_featuresÂÙ$18594f1f-6036-4a95-8682-cf415c998311Чrunning§runtimeÎHå¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$18594f1f-6036-4a95-8682-cf415c998311¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙh

Sparsity detection of Jacobian

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ÜÐȰpersist_js_state÷has_pluto_hook_featuresÂÙ$e2eb1894-06ad-47a0-9ee0-c65b24a669b5Чrunning§runtimeÎ7�Ó¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e2eb1894-06ad-47a0-9ee0-c65b24a669b5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚȤmime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛Öâ‚°persist_js_state÷has_pluto_hook_featuresÂÙ$32440932-322a-46ce-911d-5fa6a1136bcaЧrunning§runtimeÍ?§¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$32440932-322a-46ce-911d-5fa6a1136bca¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙv4×4 SparseMatrixCSC{Int64, Int64} with 10 stored entries: 1 2 3 â‹… 2 4 â‹… 5 3 â‹… 6 â‹… â‹… 5 â‹… 7¤mimeªtext/plain¬rootassignee¤ijkl²last_run_timestampËAڸ؜wnç°persist_js_state·has_pluto_hook_featuresÂÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6eЧrunning§runtime΀$¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÇ

Section 2.4 Consider the adjacency graph $G$ of a matrix $A$ be the graph whose adjacency matrix has same sparsity pattern as $A$. So $i$ and $j$ are adjacent iff $a_{ij}$ is nonzero.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ßÊû°persist_js_state÷has_pluto_hook_featuresÂÙ$79910840-ec59-4433-bfb3-ae2d8da40d22Чrunning§runtimeÎw¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$79910840-ec59-4433-bfb3-ae2d8da40d22¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚg
What is the 1-chromatic number of planar graphs ?

The four color theorem shows that the 1-chromatic number of any planar graph $G$ is $\xi_1(G) \le 4$. This theorem is related to our context as it applies to the same coloring problem but the column intersection graphs of sparse matrices are not necessarily scalar hence the chromatic number can be as large as the number of columns of the matrices here.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟ÌÝ °persist_js_state·has_pluto_hook_featuresÂÙ$5a6aec48-54fb-4d88-a8a1-b06a2bb99108Чrunning§runtimeÍŸW¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$5a6aec48-54fb-4d88-a8a1-b06a2bb99108¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙŸ4×6 SparseMatrixCSC{Int64, Int64} with 9 stored entries: â‹… â‹… 1 1 â‹… 1 1 â‹… â‹… â‹… 1 â‹… â‹… 1 â‹… â‹… 1 â‹… â‹… 1 1 â‹… â‹… â‹…¤mimeªtext/plain¬rootassignee¡S²last_run_timestampËAڸ؜uˆD°persist_js_state·has_pluto_hook_featuresÂÙ$726208c6-e856-42a2-b027-555388bc505eЧrunning§runtimeÎ’€¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$726208c6-e856-42a2-b027-555388bc505e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’Úù†©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Ú¦£©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�^Ý{°persist_js_state·has_pluto_hook_featuresÂÙ$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8bЧrunning§runtimeÎ< õ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÆ

The sign function is constant over $x > 0$ and $x < 0$ so its output carries no variables

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ޠ¶°persist_js_state÷has_pluto_hook_featuresÂÙ$352c92ec-14da-4beb-85c4-f66d77fa42d6Чrunning§runtimeκÝ�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$352c92ec-14da-4beb-85c4-f66d77fa42d6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÛ R5¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�5wÕ°persist_js_state·has_pluto_hook_featuresÂÙ$647c372e-c094-4dfc-8a48-7b7f93fb94ddЧrunning§runtimeÎCиdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$647c372e-c094-4dfc-8a48-7b7f93fb94dd¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’È�‰PNG  IHDRŽŽçý0sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ< IDATxíÁÑiÃPÁ½pZU.C¸Ø—¿$6ˆƒPd²3A*©¤B� A*©Þ[\kxmq­áµÅµ† R!H… ÂAk=8ÓÌNc=gšmh¬çâL³ Ÿ$H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TÍìÜÁlÃÌ6ügA*©¤Bxo¸‡á} R!H… ‚TR!¼·¸ÖðÚâZý-®5¼¤B� A*„ƒÖzp¦™�Æz.Î4ÛðÉÖzp¦™�#‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H…pÐÌÎÌ6èÇÌÎ_R!H… Â{Ã= úm¸� ‚TR!H… Â{‹k ÷¶¸ÖpcA*©¤B8h­gšÙùdë¹8ÓlÃ' R!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ÂA3;ú1Û🩤B� á½A¿ ú¤B� A*©¤B¸¿Åµ†{[\kx!H… ‚Tf=gšmødk=8ÓÌÎA*©¤B� A*©¤B� A*©¤B� A*©¤B� A*©¤Bø0³ ú1³ó‚TR!H…pƒ~n H… ‚TR!H…/f/ qÛ#QIEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Û,ý 1 2 3 4 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’È/‰PNG  IHDRJŽ–©žÓsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<­IDATxíÁщÃ@Á~Щ*‡¡ .ؽ$Œ�÷cª¤"R©ˆTD*"‘{‹w ×ï.HE¤"R ­õáI3'ßX‹'Í1$¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆ„fNv0Çð R©ˆTDî {6 ‘ŠHE¤"R¹·x×pmñ®á‚TD*"‘ÐZž4sò�õ·xÒCB*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHhæds ¿ ‘ŠHEäÞ°‡aR©ˆTD*"‘{‹w ×ï.HE¤"R ­õáI3'ßX‹'Í1$¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆ„fNv0Çð R©ˆTDî {6 ‘ŠHE¤"R¹·x×pmñ®á‚TD*"‘ÐZž4sò�õ·xÒCB*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHhæds ¿ ‘ŠHEäÞ°‡aR©ˆTD*"ù±Ü&Þ{áÅIEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟½!–°persist_js_state·has_pluto_hook_featuresÂÙ$4da92dbb-fcbd-4991-a2f1-f866778a27efЧrunning§runtimeÎÚj¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4da92dbb-fcbd-4991-a2f1-f866778a27ef¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ6

Utils

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛áõ0°persist_js_state÷has_pluto_hook_featuresÂÙ$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Чrunning§runtimeÎ5¡{¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e820e135-2df2-4fa3-a09b-8ce7e5a1f745¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ,two_columns (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�MQ°persist_js_state·has_pluto_hook_featuresÂÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376Чrunning§runtimeÎè¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ™

Comparison of chromatic numbers

Theorem 7.1 For every graph $G$,

$$\xi_1(G) \le \xi_\text{acyclic}(G) \le \xi_\text{star}(G) \le \xi_2(G) = \xi_1(G^2)$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛áÞü°persist_js_state÷has_pluto_hook_featuresÂÙ$2728dc2c-ca17-4989-9259-451f95a24bd2Чrunning§runtimeÎWˆ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2728dc2c-ca17-4989-9259-451f95a24bd2¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ%img (generic function with 3 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�¡°persist_js_state·has_pluto_hook_featuresÂÙ$33b368e7-d71e-40ff-8170-a18d11db98fcЧrunning§runtimeο­¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$33b368e7-d71e-40ff-8170-a18d11db98fc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’È’‰PNG  IHDRŽŽçý0sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<IDATxíÁÁmãPÁ~À¤£°˜�ÃP Ëý½yu�b@ÐÜUA*©¤B� A*©Þ[œkxmq®áµÅ¹† R!H… ÂNk}q¤™;�õXi¶¡±‹#Í6|’ ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!ì4sç f®`¶á/ R!H… Â{Ã5 ×0èG� A*©¤B� á½Å¹†×ç®mq®á… ‚TR!ì´ÖGš¹ÓX�Å‘f>Ú÷âP·a� ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!ì4sç fôä6ü† ‚TR!¼7\àgé¤B� A*©Þ[œk¸¶Å¹† R!H… ÂNk}q¤™;Ÿl=Gšmø$A*©¤B� A*©¤B� A*©¤B� A*©¤B� A*©¤BØiæŽþ›møË‚TR!H…ðÞ gƒ~©¤B� A*©®oq®áÚç^R!H… ‡Y�Å‘f>Ú÷âP·a� ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!H… ‚TR!|˜Ù=¹ ¿!H… ‚T×7èÙpA*©¤B� A*ü‰,L²�‘ZIEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Û,ù 1 2 3 4 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Èk‰PNG  IHDRlŽÔêíDsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<éIDATxíÁÁmã@DÁ÷�—ŽÃbC(,4{Û“AOÃ]%E*ŠT©(RQ¤¢È{‹{ ¯-î5lL*ŠT©(rÒZß\iæÁ'Ösq¥9†$RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘“fì`Žá/“Š"E*м7ìa¨ÿ¤¢HE‘Š"E*м·¸×ðÚâ^Ãk‹{ /HE‘Š"ENZë›+Í<øÄz.®4Çð‘ŸÅ¥¾†3¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"'Í<ØÁþ†ß E*ŠTyoØÃ°‡aRQ¤¢HE‘Š"EÞ[Ükxmq¯acRQ¤¢HE‘“ÖúæJ3>±ž‹+Í1$‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*Šœ4ó`s ™T©(RQä½aCý'E*ŠT©(RQd‹{ ¯-î5¼ E*ŠT ³ž‹+Í1|ägq©¯á ©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢H˜9†-| ¿A*ŠT©(²¿aä¢HE‘Š"E*Ê?ð'äM\"IEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟�*5°persist_js_state·has_pluto_hook_featuresÂÙ$29d9f355-26aa-4714-9f9e-3d020016662eЧrunning§runtimeÎç¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$29d9f355-26aa-4714-9f9e-3d020016662e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙF

Small Example

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛àõw°persist_js_state÷has_pluto_hook_featuresÂÙ$e9135060-75d4-4f5a-9315-2e5fbb493cdfЧrunning§runtimeÎ"•.¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e9135060-75d4-4f5a-9315-2e5fbb493cdf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ.colored_plots (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�3×°persist_js_state·has_pluto_hook_featuresÂÙ$a4ecf92d-6c45-4112-8f0c-06a6d227cd84Чrunning§runtimeΨ>¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a4ecf92d-6c45-4112-8f0c-06a6d227cd84¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÓ

Star coloring

Definition 4.5 A mapping $\phi: V \to \{1, \ldots, p\}$ is a star coloring if

  1. $\phi$ is a distance-1 coloring

  2. every path of 4 vertices uses at least 3 colors

Theorem 4.6 Let $A$ be a symmetric matrix with nonzero diagonal elements, $G$ be its adjacency matrix. A mapping $\phi$ is a star coloring of the adjacency graph iff it induces a symmetrically structurally orthogonal partition of the columns of $A$.

Name star coloring comes from the fact that the subgraph induced by any pair of colors is a star.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛àÝ#°persist_js_state÷has_pluto_hook_featuresÂÙ$592510fd-a0e4-42e5-ae5b-cac301e74f0aЧrunning§runtimeÎ�Û¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$592510fd-a0e4-42e5-ae5b-cac301e74f0a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ�
How is the subgraph induced by a pair of colors ?

It does not contain paths of more than 3 vertices and adjacent vertices have opposite colors.

So it is a union of disjoint connected components and each component is a stars with one root node of a given color connected with leaf nodes of the other color.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟ËÉ“°persist_js_state·has_pluto_hook_featuresÂÙ$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3Чrunning§runtime΀Œ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ"f (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜dà°persist_js_state·has_pluto_hook_featuresÂÙ$760ef943-e9d9-4cdc-8977-932cf6fcb78aЧrunning§runtimeÎð¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$760ef943-e9d9-4cdc-8977-932cf6fcb78a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙP

Coloring of a star

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛à”÷°persist_js_state÷has_pluto_hook_featuresÂÙ$2e3cdd4b-9d04-477c-8c6a-fec6ec846919Чrunning§runtimeÍL¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2e3cdd4b-9d04-477c-8c6a-fec6ec846919¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefixÙ&Main.var"workspace#5".MyGradientTracer¨elements”’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements‘’’¡1ªtext/plain¤type£Set¬prefix_short£Set¨objectid°fec6125b6f42b200Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°c537fbbff0e70b0eÙ!application/vnd.pluto.tree+object’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements‘’’¡2ªtext/plain¤type£Set¬prefix_short£Set¨objectid°d55c840deca45388Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid¯e341aa755f9a5b8Ù!application/vnd.pluto.tree+object’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements‘’’¡3ªtext/plain¤type£Set¬prefix_short£Set¨objectid°c77767c2fc97a3f4Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°a93cfaa90e652a28Ù!application/vnd.pluto.tree+object’’…¦prefix°MyGradientTracer¨elements‘’¨indexset’…¦prefixªSet{Int64}¨elements‘’’¡4ªtext/plain¤type£Set¬prefix_short£Set¨objectid°1b5e917fb5c8482cÙ!application/vnd.pluto.tree+object¤type¦struct¬prefix_short°MyGradientTracer¨objectid°7f6b76360c6aaa0bÙ!application/vnd.pluto.tree+object¤type¥Array¬prefix_short ¨objectid°b01052d6806ef605¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee§xtracer²last_run_timestampËAڸ؜7¶¢°persist_js_state·has_pluto_hook_featuresÂÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476Чrunning§runtimeΜv¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙŠ

Do we need to aim for distance-2 coloring or does the symmetry of the matrix allows us to relax this ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ßáÒ°persist_js_state÷has_pluto_hook_featuresÂÙ$19dd6563-1a4e-479f-881d-9bcbc720ea36Чrunning§runtimeÎ\¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$19dd6563-1a4e-479f-881d-9bcbc720ea36¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÉ

What color is your Hessian ?

How many HVP do we need to find the values of this sparse symmetric matrix ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛߮¼°persist_js_state÷has_pluto_hook_featuresÂÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15Чrunning§runtimeÎçx¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚR
From which HVP do we determine the off-diagonal entries ?
  • For the edges 34 and 64, respectively between the yellow nodes 3, 6 and the blue nodes 4, they are part of the star centered at the blue node 4 so they are obtained from the entries 3 and 6 blue HVP.

  • For the edges 12, 32, 52 and 62, respectively between the yellow nodes 1, 3, 5, 6 and the pink node 2, they are part of the star centered at the pink node 2 so they are obtained from the entries 1, 3, 5 and 6 of the pink HVP.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟Ëò^°persist_js_state·has_pluto_hook_featuresÂÙ$04ea8b79-63ba-4eb4-938c-98a21668924aЧrunning§runtimeÎÒ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$04ea8b79-63ba-4eb4-938c-98a21668924a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ®
How is the subgraph induced by a pair of colors ?

It does not contain cycles so it is a union of disjoint trees or in other words a forest.

The concept of tree generalizes the concept of stars. Indeed, a star is a tree and, when rooted at the center of the star, the depth of the tree is 1. Since the depth is one, every edge is incident to a leaf so no substitutions are needed. With acyclic coloring, the edges incident to a leaf will be obtained directly but the edges that are not incident to any tree leaves will need the entries corresponding to the edges deeper in their tree to be determined first.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟ÌNM°persist_js_state·has_pluto_hook_featuresÂÙ$874b6593-7310-4788-beb0-2f18c0ca09a7Чrunning§runtimeÎæ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$874b6593-7310-4788-beb0-2f18c0ca09a7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙf

Three columns in just one JVP

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ÜuÕ°persist_js_state÷has_pluto_hook_featuresÂÙ$e3dec4ca-69c0-4955-9303-5f8a239546f2Чrunning§runtimeÎ6ç¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e3dec4ca-69c0-4955-9303-5f8a239546f2¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ­

Let $h_c$ be the sum of the columns of $B_c$ hence the result of the corresponding HVP.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ᓎ°persist_js_state÷has_pluto_hook_featuresÂÙ$e6697119-2801-48e2-b978-facc00af636dЧrunning§runtimeÎ@@¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e6697119-2801-48e2-b978-facc00af636d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ!

What changes with symmetry ?

$$D^\top = \begin{bmatrix} \color{yellow}\mathbf{1} & & & \\ & \color{pink}\mathbf{1} & \color{pink}\mathbf{1} & \\ & & & \color{blue}\mathbf{1} \end{bmatrix} \qquad\qquad\qquad AD = \begin{bmatrix} \color{yellow}a_1 & \color{pink}a_2 + a_3 &\\ \color{yellow}a_2 & \color{pink}a_4 & \color{blue}a_5\\ \color{yellow}a_3 & \color{pink}a_6 &\\ & a_5 & \color{blue}a_7 \end{bmatrix}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛àQ‹°persist_js_state÷has_pluto_hook_featuresÂÙ$f2418632-3261-4acb-8cc6-df333b5480a5Чrunning§runtimeÎ皸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f2418632-3261-4acb-8cc6-df333b5480a5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙT

Illustrative example

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛áeŒ°persist_js_state÷has_pluto_hook_featuresÂÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326Чrunning§runtimeÎDAð¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’Ù’

scale =

©text/html’Ù�

pad =

©text/html’Ù’

border =

©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø� Dݰpersist_js_state·has_pluto_hook_featuresÂÙ$285d3797-5086-4adc-839c-2204128585e1Чrunning§runtimeÎ&H¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$285d3797-5086-4adc-839c-2204128585e1¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ×
  • For any pink node $u > 1$, the offdiagonal entry $a_{u,1}$ can be obtained from the yellow HVP.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛à±K°persist_js_state÷has_pluto_hook_featuresÂÙ$a01688ec-8f16-4d39-b39d-6d1acd24d7adЧrunning§runtimeÎ}׸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a01688ec-8f16-4d39-b39d-6d1acd24d7ad¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’Úø’©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Ú¡¿©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�^ϰpersist_js_state·has_pluto_hook_featuresÂÙ$d0ba0c62-c788-4871-959c-fe7044519849Чrunning§runtimeÎô¿¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d0ba0c62-c788-4871-959c-fe7044519849¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙz

Less colors but nontrivial substitution

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛á å°persist_js_state÷has_pluto_hook_featuresÂÙ$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5Чrunning§runtimeÎ '²¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÕ

Coloring problems

Given a graph $G(V,E)$,

  • Nodes $u, v$ are distance $k$ neighbors if there exists a path from $u$ to $v$ of length at most $k$.

  • A distance-$k$ coloring : mapping $\phi:V \to \{1, \ldots, p\}$ such that $\phi(u) \neq \phi(v)$ whenever $u, v$ are distance-$k$ neighbors.

  • $k$-chromatic number $\xi_k(G)$ : minimum $p$ such that $\exists$ distance-$k$ coloring with $p$ colors.

  • Distance-$k$ coloring problem : Find distance-$k$ coloring with fewest colors.

  • For every fixed integer $k \ge 1$, the distance-$k$ graph coloring problem is NP-hard.

See Section 2.1, 2.2, 3.2 of What color is your Jacobian ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ß°persist_js_state÷has_pluto_hook_featuresÂÙ$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166Чrunning§runtimeÎdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ$viz (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�nÙ°persist_js_state·has_pluto_hook_featuresÂÙ$dc23180e-2b0f-41ae-aebf-0159a8f8677aЧrunning§runtimeÎ͸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$dc23180e-2b0f-41ae-aebf-0159a8f8677a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’ÚG

Consider the $4 \times 5$ sparse matrix on the right:

  • Forward mode would require 5 JVP as there are 5 columns

  • Reverse mode would require 4 VJP as there are 4 rows

Can we do better using the known sparsity pattern ?

©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Ú r©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�Wyî°persist_js_state·has_pluto_hook_featuresÂÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34Чrunning§runtimeÎóI¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜ Ë›°persist_js_state·has_pluto_hook_featuresÂÙ$aeb8b749-006a-400f-9b7d-05333fd7214fЧrunning§runtimeΫ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$aeb8b749-006a-400f-9b7d-05333fd7214f¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙh

Whole Jacobian in just two JVP

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ܛJ°persist_js_state÷has_pluto_hook_featuresÂÙ$f29078e8-242a-4b88-881f-781829c16ed5Чrunning§runtimeΠ‡¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f29078e8-242a-4b88-881f-781829c16ed5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÁ

Taken from a tutorial of the SparseMatrixColorings' doc

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ߓ¯°persist_js_state÷has_pluto_hook_featuresÂÙ$b33bf212-5f88-47ab-ba10-a2815d17f235Чrunning§runtimeÎ=ʸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b33bf212-5f88-47ab-ba10-a2815d17f235¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¶

With star coloring, we need at least 3 colors. With 2 colors, our two forward tangents are

$$D^\top = \begin{bmatrix} 1 & 0 & 1 & 0\\ 0 & 1 & 0 & 1 \end{bmatrix} \qquad\qquad\qquad AD = \begin{bmatrix} a_1 & a_2\\ a_2 + a_4 & a_3\\ a_5 & a_4 + a_6\\ a_6 & a_7 \end{bmatrix}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛á$ݰpersist_js_state÷has_pluto_hook_featuresÂÙ$76162106-fb90-4883-b2d2-b87e1419c072Чrunning§runtimeÎôÞ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$76162106-fb90-4883-b2d2-b87e1419c072¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙj

Formulation as coloring problem

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ß3ʰpersist_js_state÷has_pluto_hook_featuresÂÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5Чrunning§runtimeΓ;¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children“’ÙS

Color's columns are structurally orthogonal

©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Ù7

Jacobian from 3 JVP

©text/html¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�`8&°persist_js_state·has_pluto_hook_featuresÂÙ$97c94c5a-fab5-4226-b803-10c85a298f2aЧrunning§runtimeÎ E¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$97c94c5a-fab5-4226-b803-10c85a298f2a¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜ ‡ä°persist_js_state·has_pluto_hook_featuresÂÙ$e882ebee-36ad-43d9-8ab7-20f7e8b2d9feЧrunning§runtimeÎýf¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e882ebee-36ad-43d9-8ab7-20f7e8b2d9fe¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ�

Example

Consider the following sparsity pattern of the Jacobian matrix:

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ßz·°persist_js_state÷has_pluto_hook_featuresÂÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4Чrunning§runtimeÎdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’È ‰PNG  IHDRii9‚ :sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<IDATxíÁáiÃXDÑ;0í¸,wà2Ô�ËJAßþ ˜{O;æSñLÅ3Ïü4¬/ÃQo™ŠgÞ˜y°‡´ñÉ<‡=tõïLÅ3ÏT™ç°‡îâ“™{HWšy°‡´ñÉ̃=¤�ßLÅ3ÏT™y°‡´ñÑ×°ËM¤2ÏT 1 2 3 4 5 6 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’ÈO‰PNG  IHDRlÒ¯¦%ÈsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÍIDATxíÁÑiëPDÑ}`·ã²Ü�ËP)+Ý÷Þ‡ÂECf-©(RQ¤¢HE‘Š"Eö-®5¼·¸ÖpcRQ¤¢HE‘ƒÖzq¦™�O¬¯Å™æ9$‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*Š4³qóþ2©(RQ¤¢È¾á†ú!E*ŠT©(RQdßâZÃ{‹k 7&E*ŠT9h­gšÙøÄúZœižC©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢ÈA3w0Ïá/“Š"E*Šìîa¨RQ¤¢HE‘Š"Eö-®5¼·¸ÖðÞâZÃRQ¤¢HE‘ƒÖzq¦™�O¬¯Å™æ9|ä{qªÇp„T©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQä ™�;˜çp �á7HE‘Š"Eö ÷0ÜÃpRQ¤¢HE‘Š"Eö-®5ÜÛâZÃRQ¤¢HE‘ƒÖzq¦™�hß‹S=†#¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"ÍlÔÃo�Š"E*Šìêà HE‘Š"E*ŠTÙ·¸ÖðÞâZÃ�IE‘Š"EZëÅ™f6>±¾gšç�D*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(rÐÌÆÌsøË¤¢HE‘Š"û†{ê‡T©(RQ¤¢HE‘}‹k ï-®5¼·¸Öð†T©(RQä µ^œifãëkq¦yù^œê1!E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT9hfãæ9ÜÂcø RQ¤¢HE‘}Ã= ÷0Ü€T©(RQ¤¢HEùÏï>8ó™4ÄIEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟£y°persist_js_state·has_pluto_hook_featuresÂÙ$0445aae6-2f7e-42b8-b30b-f31298cdeed0Чrunning§runtimeÎ pQĸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0445aae6-2f7e-42b8-b30b-f31298cdeed0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ!

n = 5

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؜´ð‘°persist_js_state·has_pluto_hook_featuresÂÙ$e721600c-1887-4e99-b474-a427b665e591Чrunning§runtimeÎÚŽ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e721600c-1887-4e99-b474-a427b665e591¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ3
What are the nonzero entries of $i$th row of $B_{\phi(i)}$ ?

It contains $A_{ii}$ but can it contain other nonzero entries ? Suppose that $A_{ij}$ is nonzero with $\phi(j) = \phi(i)$. This would mean that $i$ and $j$ are adjacent and of same color which contradicts the fact that $\phi$ is a distance-1 coloring. So the only nonzero entry of the $i$th row of $B_{\phi(i)}$ is $A_{ii}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟Ìm@°persist_js_state·has_pluto_hook_featuresÂÙ$91226321-fc72-4bd9-8d78-9c2bff5c760aЧrunning§runtimeÎŽ‡¥¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$91226321-fc72-4bd9-8d78-9c2bff5c760a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’È·‰PNG  IHDRÒŽDÕVÎsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<5IDATxíÁÁm[WÀ}À¶ã²Ø�Ë`*+ýœbä`‚–`Èxf`Ö³˜5À¬f 0køª+Ïuò{Wžëäµ]y®“ßh€YÌ`Öð-×Ç•G:·“︮Ÿy¤sîyk]y¨'_ѳ˜5À¬f 0k€YÌ`Ö³˜5À¬f 0k€YÌ`Ö³˜5À¬á[Îíäœsÿòãä¿Ð³˜5À¬á«N^à ÿvò`Ö³˜5À¬fÍç®<× ïäÊs�¼°˜5À¬fÍ]×Ï<Ò9÷ðÿq}\y¤s;y' 0k€YÌ`Ö³˜5À¬f 0k€YÌ`Ö³˜5À¬f 0k€YÌš/:çøÌ¹�üÉ`Ö³˜5Ÿ;�Ï�ðKÌ`Ö³˜5À¬y}Wžë„¯¸ò\'/¬f 0k€Yóf®ëgéœ{Ø]WéÜNÞIÌ`Ö³˜5À¬f 0k€YÌ`Ö³˜5À¬f 0k€YÌ`Ö³æÍœs¯çÜNþd 0k€YÌš×wÂ+:á—˜5À¬f 0k€Yóú®<×Éï]y®ÞFÌ`Ö³æÍ\×Ï<Ò9÷|Çõqå‘Îí„÷Õ³˜5À¬f 0k€YÌ`Ö³˜5À¬f 0k€YÌ`Ö³˜5À¬y3çÜó Îíþѳ˜5À¬y}'¯á>ѳ˜5À¬f 0û�ñ)DÖIìÍIEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Û4‹ 1 2 3 4 5 6 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Èl‰PNG  IHDRlŽÔêíDsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<êIDATxíÁÁ�ÛPÁ~@§ã°˜�Â` Ë}ßö$„@ÐìTIE‘Š"E*ŠT©(rlq¯á³Å½†Ï÷>�Š"E*Šœ´Ö‹+Íì|c½WšmøÊßÅ¥þ gHE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"ENšÙy‚Ù†Gø3üRQ¤¢HE‘cÃ3 Ï0<€T©(RQ¤¢HE‘c‹{ Ÿ-î5<˜T©(RQ䤵^\ifç뽸ÒlC©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢ÈI3;O0Ûð›IE‘Š"EŽ Ï0Ô©(RQ¤¢HE‘Š"Ç÷>[Ükx0©(RQ¤¢ÈIk½¸ÒÌÎ7Ö{q¥Ù†$RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘“fvž`¶á7“Š"E*Šža¨RQ¤¢HE‘Š"EŽ-î5|¶¸×ð`RQ¤¢HE‘“Özq¥™�o¬÷âJ³ I¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"E*ŠT©(RQ¤¢HE‘Š"'Íì<ÁlÃo&E*ŠT96<ÃP?¤¢HE‘Š"E*Ê?3§)DÍøîIEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟hZ:°persist_js_state·has_pluto_hook_featuresÂÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3ddЧrunning§runtimeΡõ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3dd¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜ åÞ°persist_js_state·has_pluto_hook_featuresÂÙ$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2Чrunning§runtimeÎvwA¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜Æ•°persist_js_state·has_pluto_hook_featuresÂÙ$a7b85908-404b-475b-9875-c1190de5ff71Чrunning§runtimeÎ_ö¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7b85908-404b-475b-9875-c1190de5ff71¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚj

Definition 4.2 A coloring of the columns of a symmetric matrix $A$ is symmetrically orthogonal if for every nonzero element $a_{uv}$, either (1) there is no other column of color $\phi(u)$ with a nonzero in row $r_u$, or (2) there is no other column of color $\phi(v)$ with a nonzero in row $r_v$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ày�°persist_js_state÷has_pluto_hook_featuresÂÙ$22c1030b-bef5-4af5-9d5f-6afb4a7ae699Чrunning§runtimeÎdp¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$22c1030b-bef5-4af5-9d5f-6afb4a7ae699¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÃ�¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�Fåu°persist_js_state·has_pluto_hook_featuresÂÙ$a7e8569e-2fed-4069-aa84-ced67849ab15Чrunning§runtimeÎýP¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7e8569e-2fed-4069-aa84-ced67849ab15¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙl

The same applies to reverse mode

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ܷ9°persist_js_state÷has_pluto_hook_featuresÂÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebebЧrunning§runtimeÎgÔ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebeb¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜ 5°persist_js_state·has_pluto_hook_featuresÂÙ$dbef0e7d-b731-4d83-98e3-104b23f26042Чrunning§runtimeÎ}«¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$dbef0e7d-b731-4d83-98e3-104b23f26042¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ7

n = 16

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؜ÆÇÚ°persist_js_state·has_pluto_hook_featuresÂÙ$a5769449-96cd-477a-bceb-ad9439a37430Чrunning§runtimeÎõP¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a5769449-96cd-477a-bceb-ad9439a37430¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÛè•

What color is your Jacobian ?

Given a sparse matrix $A$, two graphs represent its sparsity:

See Section 3.4 of What color is your Jacobian ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�=qm°persist_js_state·has_pluto_hook_featuresÂÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1Чrunning§runtimeÎ{cîx¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¹depends_on_disabled_cells¦queued¤logs܈¥group¨cpu_info¤lineÿ£msg’Ù|Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU name (from build time).ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_3f604f09§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’ÙRuntime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512ifma.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù„Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vpopcntdq.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù‡Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vp2intersect.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù}Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512cd.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù|Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +evex512.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù|Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avxvnni.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù}Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vl.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’ÙyRuntime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +gfni.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù|Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512f.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’ÙRuntime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512bf16.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’ÙRuntime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vnni.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù}Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512bw.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù�Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512bitalg.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù€Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vbmi2.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’ÙRuntime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512vbmi.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jlˆ¥group¨cpu_info¤lineÿ£msg’Ù}Runtime invalidation was disabled, but the CPU info is out-of-date. Will continue with incorrect CPU feature flag: +avx512dq.ªtext/plain¥level¤Warn¢id¸HostCPUFeatures_42cfbd1b§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1¦kwargs�¤fileÙB/home/runner/.julia/packages/HostCPUFeatures/ZTXz4/src/cpu_info.jl¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؛Š"°persist_js_state·has_pluto_hook_featuresÂÙ$f8e9d672-e6ad-4910-8307-2b56616b11bcЧrunning§runtimeÎ ø¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f8e9d672-e6ad-4910-8307-2b56616b11bc¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAڸ؜ éy°persist_js_state·has_pluto_hook_featuresÂÙ$7fec005c-11b9-4a75-a93c-195d456db190Чrunning§runtimeέɸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7fec005c-11b9-4a75-a93c-195d456db190¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙH

Scalar example

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛ÞÉ:°persist_js_state÷has_pluto_hook_featuresÂÙ$6c174bac-faef-424a-9de7-e4c7be8ddb27Чrunning§runtimeÎÜœ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6c174bac-faef-424a-9de7-e4c7be8ddb27¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ~

Larger example : star vs acyclic coloring

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛áÄë°persist_js_state÷has_pluto_hook_featuresÂÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96Чrunning§runtimeιL¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚK
Is a coloring of the columns is distance-2 in the adjacency graph iff columns of the same color are structurally orthogonal ?

The adjacency graph $G$ is the quotient graph of the bipartite graph, say $B$, under the identification $r_i \sim a_i$ for all $i$. If the diagonal entries of $A$ are nonzero, for distance-1 neighbors $a_u r_v$ of $B$, we have a distance-2 neighbor $a_ua_v$ of $B$ (with the path $a_ur_v, r_v a_v$). So two nodes are distance-2 neighbors in $G$ iff they are distance-2 neighbors in $B$. As a consequence, the statement is true **if the diagonal entries of $A$ are nonzero. If diagonal entries of $A$ are allowed to be zero, there is the following counter example where both columns are structurally orthogonal even though they are distance 1 neighbors (and hence also distance 2 neighbors).

$$\begin{bmatrix}\cdot & 1\\1 & \cdot\end{bmatrix}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؟ʰ§°persist_js_state·has_pluto_hook_featuresÂÙ$70296870-49af-4564-bdb7-bd2d49f9114bЧrunning§runtimeÎÇ ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$70296870-49af-4564-bdb7-bd2d49f9114b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒªattributes‚¥classÀ¥styleÙ#display: flex; flex-direction: row;£tag£div¨children•’È;‰PNG  IHDR°°¯·ä^sRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<¹IDATxíÁÁ­ãVDÁs�N•( f `ŸW3öB„i™àgÛ§*HÅ‚T,HÅ‚T,HÅ‚T,[Ükølq¯á³Å½†Ï÷>[Ükø HÅ‚T,HÅÂIk½¸ÒÌÎ7Ö{q¥Ù†o¬÷âJ³ ßXïÅ•f¾±Þ‹+Í6œ¤bA*¤bA*¤bA*¤bA*¤bA*¤bA*¤bA*¤bA*¤bA*¤bᤙ�'˜mx‚Ù†'˜mx‚Ù†Ÿ¤bA*¤báØð Ã3 Ï0<ÃðA*¤bA*¤bA*Ž-î5|¶¸× A*¤bA*NZëÅ•fv¾±Þ‹+Í6¨W�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š…“fvž`¶Aú%HÅ‚T,Hűáé@�Š©X�Š©X�Š…c‹{ ϶¸× ¿¤bA*¤bᤵ^\if§Ùz/®4Û .HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅ‚T,HÅÂI3;úÓlƒ~^�Š©X�Š…cƒþjÐã©X�Š©X�Š©X8¶¸× 3÷,HÅ‚T,HÅÂIk½¸ÒÌŽþ½õ^\i¶¡I�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š…“fvô<³ ÿgA*¤bA*Ž z¢A¿©X�Š©X�Š©X8¶¸× &‹{ ©X�Š©X8i­WšÙÑÇz/®4ÛpF�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š©X�Š…“fv¤#³ ?!HÅ‚T,HűA:6<@�Š©X�Š©X�ŠýÞ¯<Ì¡±'wIEND®B`‚©image/png’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’Û/ê 1 2 3 4 5 ©text/html’ƒªattributes‚¥classÀ¥style­flex-grow: 1;£tag£div¨children‘’¡ ©text/htmlÙ,application/vnd.pluto.reactdomelement+object’ÈŽ‰PNG  IHDRJ°¨ÙøsRGB®ÎégAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ< IDATxíÁщÃ@Á~Щ*‡¡ .ؽ$Œ�÷cª¤"R©ˆTD*"‘{‹w ×ï.HE¤"R ­õáI3'ßX‹'Í1$¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆ„fNv0Çð R©ˆTDî {6 ‘ŠHE¤"R¹·x×pmñ®á‚TD*"‘ÐZž4sò�õ·xÒCB*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHhæds ¿ ‘ŠHEäÞ°‡aR©ˆTD*"‘{‹w ×ï.HE¤"R ­õáI3'ßX‹'Í1$¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆ„fNv0Çð R©ˆTDî {6 ‘ŠHE¤"R¹·x×pmñ®á‚TD*"‘ÐZž4sò�õ·xÒCB*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHhæds ¿ ‘ŠHEäÞ°‡aR©ˆTD*"‘{‹w ×ï.HE¤"R ­õáI3'ßX‹'Í1$¤"R©ˆTD*"‘ŠHE¤"R©ˆTD*"‘ŠHE¤"R©ˆ„fNv0Çð R©ˆTDî {6 ‘ŠHE¤"R‘ëû/”$K¾‰IEND®B`‚©image/png¤mimeÙ,application/vnd.pluto.reactdomelement+object¬rootassigneeÀ²last_run_timestampËAڸ؟‚ )°persist_js_state·has_pluto_hook_featuresÂÙ$0a91e27f-3cea-415e-aed4-123482da375aЧrunning§runtimeÎCå¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0a91e27f-3cea-415e-aed4-123482da375a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙª¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛Üì[°persist_js_state÷has_pluto_hook_featuresÂÙ$2bd9ea13-362e-47ac-b26d-8e36d33e04eaЧrunning§runtimeÎo¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2bd9ea13-362e-47ac-b26d-8e36d33e04ea¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚH

For each color $c$, we consider the submatrix $B_c = A_{:,I}$ where $I = \{i \mid \phi(i) = c\}$ is the set of columns corresponding to color-$c$ nodes.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAڸ؛á|Ȱpersist_js_state÷has_pluto_hook_featuresÂÙ$cabeb42c-f40b-4549-b9a2-3bda7a988672Чrunning§runtimeÎAƒ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$cabeb42c-f40b-4549-b9a2-3bda7a988672¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÛ½i¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ¸Ø�FYͰpersist_js_state·has_pluto_hook_features±published_objects€¥bonds€´cell_execution_orderÜWÙ$75597493-3e69-437f-9408-b43a89b35559Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1Ù$4f8de444-dcb4-411a-b087-6948699614e0Ù$39e06fde-d734-11f0-a308-89fba7e8abd6Ù$e2eb1894-06ad-47a0-9ee0-c65b24a669b5Ù$2578b84a-365a-47b6-b58f-1696517c5d02Ù$874b6593-7310-4788-beb0-2f18c0ca09a7Ù$aeb8b749-006a-400f-9b7d-05333fd7214fÙ$a7e8569e-2fed-4069-aa84-ced67849ab15Ù$18594f1f-6036-4a95-8682-cf415c998311Ù$0a91e27f-3cea-415e-aed4-123482da375aÙ$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3ddÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebebÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34Ù$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8bÙ$f8e9d672-e6ad-4910-8307-2b56616b11bcÙ$7fec005c-11b9-4a75-a93c-195d456db190Ù$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919Ù$1167ae71-b63d-4ccc-a120-31c8483eca85Ù$45f4edeb-d934-413f-9f45-568465111b6eÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505Ù$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5Ù$76162106-fb90-4883-b2d2-b87e1419c072Ù$5892dfbb-b375-407b-a0a7-da66adb71b67Ù$e882ebee-36ad-43d9-8ab7-20f7e8b2d9feÙ$f29078e8-242a-4b88-881f-781829c16ed5Ù$5a6aec48-54fb-4d88-a8a1-b06a2bb99108Ù$19dd6563-1a4e-479f-881d-9bcbc720ea36Ù$32440932-322a-46ce-911d-5fa6a1136bcaÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6eÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476Ù$e6697119-2801-48e2-b978-facc00af636dÙ$a7b85908-404b-475b-9875-c1190de5ff71Ù$760ef943-e9d9-4cdc-8977-932cf6fcb78aÙ$285d3797-5086-4adc-839c-2204128585e1Ù$0445aae6-2f7e-42b8-b30b-f31298cdeed0Ù$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2Ù$a4ecf92d-6c45-4112-8f0c-06a6d227cd84Ù$29d9f355-26aa-4714-9f9e-3d020016662eÙ$d0ba0c62-c788-4871-959c-fe7044519849Ù$b33bf212-5f88-47ab-ba10-a2815d17f235Ù$e3ae5697-6b0b-4d5f-99a0-d579b6eff655Ù$f2418632-3261-4acb-8cc6-df333b5480a5Ù$2bd9ea13-362e-47ac-b26d-8e36d33e04eaÙ$e3dec4ca-69c0-4955-9303-5f8a239546f2Ù$d5b7f51b-e451-40a7-aa41-a8006decba33Ù$6c174bac-faef-424a-9de7-e4c7be8ddb27Ù$dbef0e7d-b731-4d83-98e3-104b23f26042Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcceÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376Ù$4da92dbb-fcbd-4991-a2f1-f866778a27efÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdfÙ$2728dc2c-ca17-4989-9259-451f95a24bd2Ù$352c92ec-14da-4beb-85c4-f66d77fa42d6Ù$a5769449-96cd-477a-bceb-ad9439a37430Ù$cabeb42c-f40b-4549-b9a2-3bda7a988672Ù$22c1030b-bef5-4af5-9d5f-6afb4a7ae699Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$dc23180e-2b0f-41ae-aebf-0159a8f8677aÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58Ù$a01688ec-8f16-4d39-b39d-6d1acd24d7adÙ$726208c6-e856-42a2-b027-555388bc505eÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5Ù$21898d8d-f822-4128-ad56-d9a10865fb1dÙ$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166Ù$91226321-fc72-4bd9-8d78-9c2bff5c760aÙ$33b368e7-d71e-40ff-8170-a18d11db98fcÙ$70296870-49af-4564-bdb7-bd2d49f9114bÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4Ù$647c372e-c094-4dfc-8a48-7b7f93fb94ddÙ$a413c12c-72c1-4f46-b7f2-0b0118c1b232Ù$9b427766-5290-4dee-8dd5-5aab20080d0aÙ$dfe3dffd-926b-4083-9e66-8536e5df198dÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96Ù$1f02fda8-6b22-429e-9ef4-243e97372526Ù$592510fd-a0e4-42e5-ae5b-cac301e74f0aÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15Ù$60070a94-d9ca-474b-9c6f-37468e3f030dÙ$04ea8b79-63ba-4eb4-938c-98a21668924aÙ$e721600c-1887-4e99-b474-a427b665e591Ù$44a6b427-bd4b-4fa1-95d8-a8ea55719192Ù$15cf368c-cada-4a72-b59b-a0f9dd0115b4Ù$79910840-ec59-4433-bfb3-ae2d8da40d22®process_status¥ready­julia_version§v1.13.3ªcell_orderÜWÙ$39e06fde-d734-11f0-a308-89fba7e8abd6Ù$e2eb1894-06ad-47a0-9ee0-c65b24a669b5Ù$2578b84a-365a-47b6-b58f-1696517c5d02Ù$dc23180e-2b0f-41ae-aebf-0159a8f8677aÙ$874b6593-7310-4788-beb0-2f18c0ca09a7Ù$9e24f674-42af-4fa8-bf3e-42e14d855a58Ù$aeb8b749-006a-400f-9b7d-05333fd7214fÙ$a01688ec-8f16-4d39-b39d-6d1acd24d7adÙ$a7e8569e-2fed-4069-aa84-ced67849ab15Ù$726208c6-e856-42a2-b027-555388bc505eÙ$18594f1f-6036-4a95-8682-cf415c998311Ù$0a91e27f-3cea-415e-aed4-123482da375aÙ$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3ddÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebebÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34Ù$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8bÙ$f8e9d672-e6ad-4910-8307-2b56616b11bcÙ$7fec005c-11b9-4a75-a93c-195d456db190Ù$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919Ù$1167ae71-b63d-4ccc-a120-31c8483eca85Ù$45f4edeb-d934-413f-9f45-568465111b6eÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505Ù$352c92ec-14da-4beb-85c4-f66d77fa42d6Ù$a5769449-96cd-477a-bceb-ad9439a37430Ù$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5Ù$76162106-fb90-4883-b2d2-b87e1419c072Ù$5892dfbb-b375-407b-a0a7-da66adb71b67Ù$e882ebee-36ad-43d9-8ab7-20f7e8b2d9feÙ$f29078e8-242a-4b88-881f-781829c16ed5Ù$5a6aec48-54fb-4d88-a8a1-b06a2bb99108Ù$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5Ù$91226321-fc72-4bd9-8d78-9c2bff5c760aÙ$19dd6563-1a4e-479f-881d-9bcbc720ea36Ù$32440932-322a-46ce-911d-5fa6a1136bcaÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6eÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96Ù$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476Ù$e6697119-2801-48e2-b978-facc00af636dÙ$33b368e7-d71e-40ff-8170-a18d11db98fcÙ$1f02fda8-6b22-429e-9ef4-243e97372526Ù$a7b85908-404b-475b-9875-c1190de5ff71Ù$760ef943-e9d9-4cdc-8977-932cf6fcb78aÙ$70296870-49af-4564-bdb7-bd2d49f9114bÙ$285d3797-5086-4adc-839c-2204128585e1Ù$0445aae6-2f7e-42b8-b30b-f31298cdeed0Ù$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2Ù$a4ecf92d-6c45-4112-8f0c-06a6d227cd84Ù$592510fd-a0e4-42e5-ae5b-cac301e74f0aÙ$29d9f355-26aa-4714-9f9e-3d020016662eÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4Ù$26191290-2b2d-43fe-b2bf-d690fd0bbe15Ù$d0ba0c62-c788-4871-959c-fe7044519849Ù$b33bf212-5f88-47ab-ba10-a2815d17f235Ù$60070a94-d9ca-474b-9c6f-37468e3f030dÙ$647c372e-c094-4dfc-8a48-7b7f93fb94ddÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655Ù$04ea8b79-63ba-4eb4-938c-98a21668924aÙ$f2418632-3261-4acb-8cc6-df333b5480a5Ù$cabeb42c-f40b-4549-b9a2-3bda7a988672Ù$2bd9ea13-362e-47ac-b26d-8e36d33e04eaÙ$e721600c-1887-4e99-b474-a427b665e591Ù$e3dec4ca-69c0-4955-9303-5f8a239546f2Ù$44a6b427-bd4b-4fa1-95d8-a8ea55719192Ù$d5b7f51b-e451-40a7-aa41-a8006decba33Ù$22c1030b-bef5-4af5-9d5f-6afb4a7ae699Ù$15cf368c-cada-4a72-b59b-a0f9dd0115b4Ù$6c174bac-faef-424a-9de7-e4c7be8ddb27Ù$a413c12c-72c1-4f46-b7f2-0b0118c1b232Ù$9b427766-5290-4dee-8dd5-5aab20080d0aÙ$dbef0e7d-b731-4d83-98e3-104b23f26042Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcceÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376Ù$79910840-ec59-4433-bfb3-ae2d8da40d22Ù$4da92dbb-fcbd-4991-a2f1-f866778a27efÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326Ù$75597493-3e69-437f-9408-b43a89b35559Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1Ù$4f8de444-dcb4-411a-b087-6948699614e0Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdfÙ$2728dc2c-ca17-4989-9259-451f95a24bd2Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$21898d8d-f822-4128-ad56-d9a10865fb1dÙ$dfe3dffd-926b-4083-9e66-8536e5df198d«cell_inputsÞWÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655«code_foldedäcodeÚŽmd"""## Acyclic coloring [Definition 6.3](https://epubs.siam.org/doi/10.1137/S0036144504444711) A mapping ``\phi: V \to \{1, \ldots, p\}`` is an *acyclic coloring* if 1. ``\phi`` is a distance-1 coloring 2. every **cycle** uses at least 3 colors [Theorem 4.6](https://epubs.siam.org/doi/10.1137/S0036144504444711) Let ``A`` be a symmetric matrix with **nonzero diagonal elements**, ``G`` be its adjacency matrix. A mapping ``\phi`` is an acyclic coloring of the adjacency graph iff it induces a substitutable partition of the columns of ``A``. Name acyclic coloring comes from the fact that the subgraph induced by any pair of colors is a forest. """Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a546edb2-6a72-4c5f-95f7-cc7709bbb505«code_folded¤codeªF(xtracer)Ù$d5b7f51b-e451-40a7-aa41-a8006decba33„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d5b7f51b-e451-40a7-aa41-a8006decba33«code_foldedäcodeÚXmd"""## Red-Blue subgraph To compute an off-diagonal entry ``A_{ij}``, consider the subgraph induced by the two colors ``\phi(i)`` and ``\phi(j)``. The entry will be computed, from ``B_{\phi(i)}`` and ``B_{\phi(j)}``, possible after substitution. Consider below left ``B_\text{red}`` and right ``B_\text{blue}``. The rows corresponding to diagonal entries have been omitted as we already found how to compute them in the previous slide. The rows corresponding to green nodes are in bold as they will be computed from the subgraph induced by red/green or blue/green so we can ignore them for now. """Ù$5892dfbb-b375-407b-a0a7-da66adb71b67„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$5892dfbb-b375-407b-a0a7-da66adb71b67«code_foldedäcodeÚ2md""" [**Theorem 3.5**](https://epubs.siam.org/doi/10.1137/S0036144504444711) A coloring of the columns is distance-2 in the bipartite graph iff columns of the same color are structurally orthogonal. Let the ``k``-th power ``G^k`` of a graph ``G`` be the graph with same nodes as ``G`` and an edge in ``G^k`` for each distance ``k`` neighbors in ``G``. [**Lemma 3.7**](https://epubs.siam.org/doi/10.1137/S0036144504444711) The column intersection graph is the square of the biparted graph restricted to its column vertices. [**Lemma 2.1**](https://epubs.siam.org/doi/10.1137/S0036144504444711) A coloring is distance-``k`` in ``G`` iff it is distance-1 in ``G^k``. **Corollary** A coloring of the columns is distance-1 in the column intersection graph iff columns of the same color are structurally orthogonal. """Ù$1f02fda8-6b22-429e-9ef4-243e97372526„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1f02fda8-6b22-429e-9ef4-243e97372526«code_foldedäcodeÚÙqa(md"Is this a distance-2 coloring ? Can we deduce all values of the hessian given the values of ``AD``.", md""" It is not a distance-2 coloring because the nodes 2 and 3 are distance 2 neighbors. Because of this, in the first row of the second column of ``AD`` we get ``a_2 + a_3`` which prevents us distinguish ``a_2`` or ``a_3``. However, ``a_2`` and ``a_3`` can be obtained from the first column of ``AD`` so we can retrieve all values of the Hessian from ``AD``. """)Ù$1167ae71-b63d-4ccc-a120-31c8483eca85„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1167ae71-b63d-4ccc-a120-31c8483eca85«code_folded¤code´ytracer = f(xtracer)Ù$45f4edeb-d934-413f-9f45-568465111b6e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$45f4edeb-d934-413f-9f45-568465111b6e«code_foldedäcodeÙ/md"## Sparsity detection with multiple outputs"Ù$a413c12c-72c1-4f46-b7f2-0b0118c1b232„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a413c12c-72c1-4f46-b7f2-0b0118c1b232«code_foldedäcodeÙSviz(large, decompression = :direct, structure = :symmetric, plot_size = (6cm, 6cm))Ù$60070a94-d9ca-474b-9c6f-37468e3f030d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$60070a94-d9ca-474b-9c6f-37468e3f030d«code_foldedäcodeÚµqa(md"How do we get the value of ``a_4`` ?", md""" Two ways: 1) Get the value of ``a_2`` from ``(AD)_{12}`` then get ``a_4`` from ``(AD)_{21} - a_2`` 2) Get the value of ``a_6`` from ``(AD)_{41}`` then get ``a_4`` from ``(AD)_{32} - a_6`` ``a_4`` cannot be read directly from a single entry, it needs **substitutions**. This example shows that enabling substitutions allows us to use less colors to find all entries of the Hessian! """)Ù$15cf368c-cada-4a72-b59b-a0f9dd0115b4„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$15cf368c-cada-4a72-b59b-a0f9dd0115b4«code_foldedäcodeÚ‘qa( md"How to compute the non-bold entries ?", md""" For star graphs, the entry ``a_{uv}`` was the edge of a star with either center ``u`` and leaf ``v`` or center ``v`` and leaf ``u``. It was then obtained from the HVP of the color of the center. We need to generalize this for arbitrary trees. For any edge from a leaf ``u`` to a node ``v``, we can compute ``a_{uv}`` from the ``u``th entry of the HVP of color ``\phi(v)``. Then, we subtract ``a_{uv}`` from the ``v``th row of the HVP of color ``\phi(u)``. So we can do * ``a_{71} \gets (h_\text{red})_7`` then ``(h_\text{blue})_1 \gets (h_\text{blue})_1 - a_{71}`` * ``a_{43} \gets (h_\text{red})_4`` then ``(h_\text{blue})_3 \gets (h_\text{blue})_3 - a_{43}`` * ``a_{52} \gets (h_\text{blue})_5`` then ``(h_\text{red})_2 \gets (h_\text{red})_2 - a_{52}`` Then, we can remove these leaves and edges. Doing so, some of their parents in the tree become leaves and we can apply the same procedure recursively. So we get * ``a_{12} \gets (h_\text{blue})_5`` then ``(h_\text{red})_2 \gets (h_\text{red})_2 - a_{12}`` * ``a_{32} \gets (h_\text{blue})_5`` then ``(h_\text{red})_2 \gets (h_\text{red})_2 - a_{32}`` """, )Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce«code_foldedäcodeÙElarge = sparse(Symmetric(sprand(StableRNG(0), Bool, n, n, 0.2) + I));Ù$a3bf5961-323b-4adc-99a0-9a456a0bfd48„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48«code_folded¤codeÙ2F(x) = [x[1]*x[2]+sign(x[3]), sign(x[3]) * x[4]/2]Ù$44a6b427-bd4b-4fa1-95d8-a8ea55719192„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$44a6b427-bd4b-4fa1-95d8-a8ea55719192«code_foldedäcodeÙÿqa(md"How can the diagonal entries be determined ?", md""" The value of ``(h_{\phi(i)})_i`` is the sum of the entries of the ``i``th row of ``B_{\phi(i)}``. Since the only nonzero entry of this row is ``A_{ii}``, we have ``A_{ii} = (h_{\phi(i)})_i``. """)Ù$9e24f674-42af-4fa8-bf3e-42e14d855a58„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58«code_foldedäcodeÚtwo_columns( md""" * The columns 1, 2 and 5 do not share any rows with nonzero entries. * So their entries can be recovered unambiguously with just one JVP! """, img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_ad.svg", :width => 400), )Ù$39e06fde-d734-11f0-a308-89fba7e8abd6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$39e06fde-d734-11f0-a308-89fba7e8abd6«code_foldedäcodeÙ»@htl("""

Sparse AD

Benoît Legat

$(PlutoTeachingTools.ChooseDisplayMode()) $(PlutoUI.TableOfContents(depth=1)) """)Ù$21898d8d-f822-4128-ad56-d9a10865fb1d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$21898d8d-f822-4128-ad56-d9a10865fb1d«code_foldedäcodeÙ¨three_columns(left, center, right) = hbox([ left, Div(html" ", style = Dict("flex-grow" => "1")), center, Div(html" ", style = Dict("flex-grow" => "1")), right, ])Ù$4f8de444-dcb4-411a-b087-6948699614e0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4f8de444-dcb4-411a-b087-6948699614e0«code_folded¤codeÙ2using Graphs, GraphPlot, LinearAlgebra, StableRNGsÙ$75597493-3e69-437f-9408-b43a89b35559„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$75597493-3e69-437f-9408-b43a89b35559«code_folded¤codeÙOusing PlutoUI, PlutoUI.ExperimentalLayout, HypertextLiteral, PlutoTeachingToolsÙ$9b427766-5290-4dee-8dd5-5aab20080d0a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9b427766-5290-4dee-8dd5-5aab20080d0a«code_foldedäcodeÙYviz(large, decompression = :substitution, structure = :symmetric, plot_size = (6cm, 6cm))Ù$2578b84a-365a-47b6-b58f-1696517c5d02„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2578b84a-365a-47b6-b58f-1696517c5d02«code_foldedäcodeÙÆmd""" # Sparse Jacobian Suppose the Jacobian is **sparse**. * The *sparsity pattern* (rows and columns of nonzeros) is **known** * You want to determine the **value** of these nonzeros with AD """Ù$dfe3dffd-926b-4083-9e66-8536e5df198d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$dfe3dffd-926b-4083-9e66-8536e5df198d«code_foldedäcodeÚñbegin function qa(question, answer) return @htl("
$question$answer
") end function _inline_html(m::Markdown.Paragraph) return sprint(Markdown.htmlinline, m.content) end function qa(question::Markdown.MD, answer) # `html(question)` will create `

` if `question.content[]` is `Markdown.Paragraph` # This will print the question on a new line and we don't want that: h = HTML(_inline_html(question.content[])) return qa(h, answer) end endÙ$18594f1f-6036-4a95-8682-cf415c998311„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$18594f1f-6036-4a95-8682-cf415c998311«code_foldedäcodeÙ$md"# Sparsity detection of Jacobian"Ù$e2eb1894-06ad-47a0-9ee0-c65b24a669b5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e2eb1894-06ad-47a0-9ee0-c65b24a669b5«code_foldedäcodeÚ\md""" * [What color is your Jacobian ? Graph Coloring for Computing Derivatives](https://epubs.siam.org/doi/10.1137/S0036144504444711) * [An Illustrated Guide to Automatic Sparse Differentiation](https://iclr-blogposts.github.io/2025/blog/sparse-autodiff/) * [Revisiting Sparse Matrix Coloring and Bicoloring](https://arxiv.org/abs/2505.07308) """Ù$32440932-322a-46ce-911d-5fa6a1136bca„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$32440932-322a-46ce-911d-5fa6a1136bca«code_foldedäcodeÙ6ijkl = sparse([ 1 2 3 0 2 4 0 5 3 0 6 0 0 5 0 7 ])Ù$c2e4982a-3798-4c45-8831-5a76b3b29f6e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6e«code_foldedäcodeÚmd"[Section 2.4](https://epubs.siam.org/doi/10.1137/S0036144504444711) Consider the *adjacency graph* ``G`` of a matrix ``A`` be the graph whose adjacency matrix has same sparsity pattern as ``A``. So ``i`` and ``j`` are adjacent iff ``a_{ij}`` is nonzero."Ù$79910840-ec59-4433-bfb3-ae2d8da40d22„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$79910840-ec59-4433-bfb3-ae2d8da40d22«code_foldedäcodeÚìqa(md""" What is the 1-chromatic number of planar graphs ? """, md""" The [four color theorem](https://en.wikipedia.org/wiki/Four_color_theorem) shows that the 1-chromatic number of any planar graph ``G`` is ``\xi_1(G) \le 4``. This theorem is related to our context as it applies to the **same** coloring problem but the column intersection graphs of sparse matrices are not necessarily scalar hence the chromatic number can be as large as the number of columns of the matrices here. """)Ù$5a6aec48-54fb-4d88-a8a1-b06a2bb99108„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$5a6aec48-54fb-4d88-a8a1-b06a2bb99108«code_foldedäcodeÙOS = sparse([ 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 ])Ù$726208c6-e856-42a2-b027-555388bc505e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$726208c6-e856-42a2-b027-555388bc505e«code_foldedäcodeÙ÷two_columns( img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_ad_reverse_full.svg"), img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_ad_reverse_decompression.svg"), )Ù$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8b«code_foldedäcodeÙemd"The sign function is constant over ``x > 0`` and ``x < 0`` so its output carries **no** variables"Ù$352c92ec-14da-4beb-85c4-f66d77fa42d6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$352c92ec-14da-4beb-85c4-f66d77fa42d6«code_foldedäcodeÙsimg("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/compute_graph.png", :width => 330)Ù$647c372e-c094-4dfc-8a48-7b7f93fb94dd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$647c372e-c094-4dfc-8a48-7b7f93fb94dd«code_foldedäcodeÙXviz(ijkl, decompression = :substitution, structure = :symmetric, plot_size = (4cm, 4cm))Ù$4da92dbb-fcbd-4991-a2f1-f866778a27ef„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4da92dbb-fcbd-4991-a2f1-f866778a27ef«code_foldedäcode¬md"## Utils"Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e820e135-2df2-4fa3-a09b-8ce7e5a1f745«code_foldedäcodeÙdtwo_columns(left, right) = hbox([ left, Div(html" ", style = Dict("flex-grow" => "1")), right, ])Ù$1efb0f40-fb9e-4e5b-be59-84910afbf376„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376«code_foldedäcodeÙèmd""" ## Comparison of chromatic numbers [Theorem 7.1](https://epubs.siam.org/doi/10.1137/S0036144504444711) For every graph ``G``, ```math \xi_1(G) \le \xi_\text{acyclic}(G) \le \xi_\text{star}(G) \le \xi_2(G) = \xi_1(G^2) ``` """Ù$2728dc2c-ca17-4989-9259-451f95a24bd2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2728dc2c-ca17-4989-9259-451f95a24bd2«code_foldedäcodeÚsbegin struct Path path::String end function imgpath(path::Path) file = path.path if !('.' in file) file = file * ".png" end return joinpath(joinpath(@__DIR__, "images", file)) end function img(path::Path, args...; kws...) return PlutoUI.LocalResource(imgpath(path), args...) end struct URL url::String end function save_image(url::URL, html_attributes...; name = split(url.url, '/')[end], kws...) path = joinpath("cache", name) return PlutoTeachingTools.RobustLocalResource(url.url, path, html_attributes...), path end function img(url::URL, args...; kws...) r, _ = save_image(url, args...; kws...) return @htl("$r") end function img(file::String, args...; kws...) if startswith(file, "http") img(URL(file), args...; kws...) else img(Path(file), args...; kws...) end end endÙ$33b368e7-d71e-40ff-8170-a18d11db98fc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$33b368e7-d71e-40ff-8170-a18d11db98fc«code_foldedäcodeÙRviz(ijkl, decompression = :direct, structure = :symmetric, plot_size = (3cm, 3cm))Ù$29d9f355-26aa-4714-9f9e-3d020016662e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$29d9f355-26aa-4714-9f9e-3d020016662e«code_foldedäcode´md"## Small Example"Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e9135060-75d4-4f5a-9315-2e5fbb493cdf«code_foldedäcodeÚmfunction colored_plots(A; decompression, structure, partition = :column, kws...) problem = ColoringProblem(; structure, partition) algo = GreedyColoringAlgorithm(; decompression) result = coloring(A, problem, algo) background_color = RGBA(0, 0, 0, 0) border_color = RGB(0, 0, 0) colorscheme = distinguishable_colors( ncolors(result), [convert(RGB, background_color), convert(RGB, border_color)]; dropseed=true, ) A_img, B_img = SparseMatrixColorings.show_colors(result; colorscheme, scale, pad, border, background_color, border_color) if structure == :symmetric S = A else if partition == :column S = A' * A else S = A * A' end end adj = SparseMatrixColorings.AdjacencyGraph(A) G = Graphs.SimpleDiGraph(S - Diagonal(diag(S))) gp = gplot(G; nodefillc = colorscheme[result.color], nodelabel=1:Graphs.nv(G), kws...) A_img, gp, B_img endÙ$a4ecf92d-6c45-4112-8f0c-06a6d227cd84„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a4ecf92d-6c45-4112-8f0c-06a6d227cd84«code_foldedäcodeÚ£md"""## Star coloring [Definition 4.5](https://epubs.siam.org/doi/10.1137/S0036144504444711) A mapping ``\phi: V \to \{1, \ldots, p\}`` is a *star coloring* if 1. ``\phi`` is a distance-1 coloring 2. every **path of 4 vertices** uses at least 3 colors [Theorem 4.6](https://epubs.siam.org/doi/10.1137/S0036144504444711) Let ``A`` be a symmetric matrix with **nonzero diagonal elements**, ``G`` be its adjacency matrix. A mapping ``\phi`` is a star coloring of the adjacency graph iff it induces a symmetrically structurally orthogonal partition of the columns of ``A``. Name star coloring comes from the fact that the subgraph induced by any pair of colors is a star. """Ù$592510fd-a0e4-42e5-ae5b-cac301e74f0a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$592510fd-a0e4-42e5-ae5b-cac301e74f0a«code_foldedäcodeÚEqa(md"How is the subgraph induced by a pair of colors ?", md""" It does not contain paths of more than 3 vertices and adjacent vertices have opposite colors. So it is a union of disjoint connected components and each component is a stars with one root node of a given color connected with leaf nodes of the other color. """)Ù$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3«code_folded¤codeÙ$f(x) = x[1] + x[2]*x[3] * sign(x[4])Ù$760ef943-e9d9-4cdc-8977-932cf6fcb78a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$760ef943-e9d9-4cdc-8977-932cf6fcb78a«code_foldedäcode¹md"## Coloring of a star"Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2e3cdd4b-9d04-477c-8c6a-fec6ec846919«code_folded¤codeÙ…xtracer = [ MyGradientTracer(Set(1)), MyGradientTracer(Set(2)), MyGradientTracer(Set(3)), MyGradientTracer(Set(4)), ]Ù$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476«code_foldedäcodeÙjmd"Do we need to aim for distance-2 coloring or does the symmetry of the matrix allows us to relax this ?"Ù$19dd6563-1a4e-479f-881d-9bcbc720ea36„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$19dd6563-1a4e-479f-881d-9bcbc720ea36«code_foldedäcodeÙzmd""" # What color is your Hessian ? How many HVP do we need to find the values of this sparse **symmetric** matrix ? """Ù$26191290-2b2d-43fe-b2bf-d690fd0bbe15„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15«code_foldedäcodeÚúqa(md"From which HVP do we determine the off-diagonal entries ?", md""" * For the edges 34 and 64, respectively between the yellow nodes 3, 6 and the blue nodes 4, they are part of the star centered at the blue node 4 so they are obtained from the entries 3 and 6 blue HVP. * For the edges 12, 32, 52 and 62, respectively between the yellow nodes 1, 3, 5, 6 and the pink node 2, they are part of the star centered at the pink node 2 so they are obtained from the entries 1, 3, 5 and 6 of the pink HVP. """)Ù$04ea8b79-63ba-4eb4-938c-98a21668924a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$04ea8b79-63ba-4eb4-938c-98a21668924a«code_foldedäcodeÚrqa(md"How is the subgraph induced by a pair of colors ?", md""" It does not contain cycles so it is a union of disjoint trees or in other words a forest. The concept of tree generalizes the concept of stars. Indeed, a star is a tree and, when rooted at the center of the star, the depth of the tree is 1. Since the depth is one, every edge is incident to a leaf so no substitutions are needed. With acyclic coloring, the edges incident to a leaf will be obtained directly but the edges that are not incident to any tree leaves will need the entries corresponding to the edges deeper in their tree to be determined first. """)Ù$874b6593-7310-4788-beb0-2f18c0ca09a7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$874b6593-7310-4788-beb0-2f18c0ca09a7«code_foldedäcodeÙ$md"## Three columns in just one JVP"Ù$e3dec4ca-69c0-4955-9303-5f8a239546f2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e3dec4ca-69c0-4955-9303-5f8a239546f2«code_foldedäcodeÙ_md"Let ``h_c`` be the sum of the columns of ``B_c`` hence the result of the corresponding HVP."Ù$e6697119-2801-48e2-b978-facc00af636d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e6697119-2801-48e2-b978-facc00af636d«code_foldedäcodeÚÄmd""" ## What changes with symmetry ? ```math D^\top = \begin{bmatrix} \color{yellow}\mathbf{1} & & & \\ & \color{pink}\mathbf{1} & \color{pink}\mathbf{1} & \\ & & & \color{blue}\mathbf{1} \end{bmatrix} \qquad\qquad\qquad AD = \begin{bmatrix} \color{yellow}a_1 & \color{pink}a_2 + a_3 &\\ \color{yellow}a_2 & \color{pink}a_4 & \color{blue}a_5\\ \color{yellow}a_3 & \color{pink}a_6 &\\ & a_5 & \color{blue}a_7 \end{bmatrix} ``` """Ù$f2418632-3261-4acb-8cc6-df333b5480a5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f2418632-3261-4acb-8cc6-df333b5480a5«code_foldedäcode»md"## Illustrative example"Ù$d23e7238-5edb-42d3-96d9-0dffa9e7f326„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326«code_foldedäcodeÙ²hbox([ md"scale = $(@bind(scale, Slider(1:15, default = 10)))", md"pad = $(@bind(pad, Slider(1:10, default = 3)))", md"border = $(@bind(border, Slider(1:5, default = 2)))", ])Ù$285d3797-5086-4adc-839c-2204128585e1„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$285d3797-5086-4adc-839c-2204128585e1«code_foldedäcodeÙomd""" * For any pink node ``u > 1``, the offdiagonal entry ``a_{u,1}`` can be obtained from the yellow HVP. """Ù$a01688ec-8f16-4d39-b39d-6d1acd24d7ad„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a01688ec-8f16-4d39-b39d-6d1acd24d7ad«code_foldedäcodeÚtwo_columns( img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_ad_forward_full.svg", :width => 300), img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_ad_forward_decompression.svg", :width => 300), )Ù$d0ba0c62-c788-4871-959c-fe7044519849„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d0ba0c62-c788-4871-959c-fe7044519849«code_foldedäcodeÙ3md""" # Less colors but nontrivial substitution """Ù$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5«code_foldedäcodeÚmd""" ## Coloring problems Given a graph ``G(V,E)``, * Nodes ``u, v`` are distance ``k`` neighbors if there exists a path from ``u`` to ``v`` of length at most ``k``. * A *distance-*``k`` coloring : mapping ``\phi:V \to \{1, \ldots, p\}`` such that ``\phi(u) \neq \phi(v)`` whenever ``u, v`` are distance-``k`` neighbors. * ``k``*-chromatic number* ``\xi_k(G)`` : minimum ``p`` such that ``\exists`` distance-``k`` coloring with ``p`` colors. * Distance-``k`` coloring problem : Find distance-``k`` coloring with fewest colors. * For every fixed integer ``k \ge 1``, the distance-``k`` graph coloring problem [is NP-hard](https://doi.org/10.1137/S089548019120016X). See [Section 2.1, 2.2, 3.2 of What color is your Jacobian ?](https://epubs.siam.org/doi/10.1137/S0036144504444711) """Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166«code_foldedäcodeÙGviz(args...; kws...) = three_columns(colored_plots(args...; kws...)...)Ù$dc23180e-2b0f-41ae-aebf-0159a8f8677a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$dc23180e-2b0f-41ae-aebf-0159a8f8677a«code_foldedäcodeÚltwo_columns( md""" Consider the ``4 \times 5`` sparse matrix on the right: * Forward mode would require 5 JVP as there are 5 columns * Reverse mode would require 4 VJP as there are 4 rows Can we do better using the known sparsity pattern ? """, img("https://iclr-blogposts.github.io/2025/assets/img/2025-04-28-sparse-autodiff/sparse_map.svg", :width => 200), )Ù$9df9c76a-48af-4ca6-83f1-b8798d6d4e34„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34«code_folded¤codeÙ+Base.:/(a::MyGradientTracer, b::Number) = aÙ$aeb8b749-006a-400f-9b7d-05333fd7214f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$aeb8b749-006a-400f-9b7d-05333fd7214f«code_foldedäcodeÙ%md"## Whole Jacobian in just two JVP"Ù$f29078e8-242a-4b88-881f-781829c16ed5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f29078e8-242a-4b88-881f-781829c16ed5«code_foldedäcodeÙ’md"Taken from a tutorial of the [SparseMatrixColorings' doc](https://gdalle.github.io/SparseMatrixColorings.jl/stable/tutorial/#Coloring-results)"Ù$b33bf212-5f88-47ab-ba10-a2815d17f235„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b33bf212-5f88-47ab-ba10-a2815d17f235«code_foldedäcodeÚ1md""" With star coloring, we need at least 3 colors. With 2 colors, our two forward tangents are ```math D^\top = \begin{bmatrix} 1 & 0 & 1 & 0\\ 0 & 1 & 0 & 1 \end{bmatrix} \qquad\qquad\qquad AD = \begin{bmatrix} a_1 & a_2\\ a_2 + a_4 & a_3\\ a_5 & a_4 + a_6\\ a_6 & a_7 \end{bmatrix} ``` """Ù$76162106-fb90-4883-b2d2-b87e1419c072„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$76162106-fb90-4883-b2d2-b87e1419c072«code_foldedäcodeÙ,md""" ## Formulation as coloring problem """Ù$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5«code_foldedäcodeÙZtwo_columns( md"Color's columns are structurally orthogonal", md"Jacobian from 3 JVP", )Ù$97c94c5a-fab5-4226-b803-10c85a298f2a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$97c94c5a-fab5-4226-b803-10c85a298f2a«code_folded¤codeÙ2struct MyGradientTracer indexset::Set{Int} endÙ$e882ebee-36ad-43d9-8ab7-20f7e8b2d9fe„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e882ebee-36ad-43d9-8ab7-20f7e8b2d9fe«code_foldedäcodeÙUmd""" ## Example Consider the following sparsity pattern of the Jacobian matrix: """Ù$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4«code_foldedäcodeÙsviz(SparseMatrixColorings.what_fig_41().A, decompression = :direct, structure = :symmetric, plot_size = (5cm, 5cm))Ù$0445aae6-2f7e-42b8-b30b-f31298cdeed0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0445aae6-2f7e-42b8-b30b-f31298cdeed0«code_foldedäcodeÙFmd"`n` = $(@bind star_n Slider(3:10, default = 5, show_value = true))"Ù$e721600c-1887-4e99-b474-a427b665e591„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e721600c-1887-4e99-b474-a427b665e591«code_foldedäcodeÚªqa(md"What are the nonzero entries of ``i``th row of ``B_{\phi(i)}`` ?", md""" It contains ``A_{ii}`` but can it contain other nonzero entries ? Suppose that ``A_{ij}`` is nonzero with ``\phi(j) = \phi(i)``. This would mean that ``i`` and ``j`` are adjacent and of same color which contradicts the fact that ``\phi`` is a distance-1 coloring. So the only nonzero entry of the ``i``th row of ``B_{\phi(i)}`` is ``A_{ii}``. """)Ù$91226321-fc72-4bd9-8d78-9c2bff5c760a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$91226321-fc72-4bd9-8d78-9c2bff5c760a«code_foldedäcodeÙRviz(S, structure = :nonsymmetric, decompression = :direct, plot_size = (3cm, 3cm))Ù$8e2045f3-ee09-4439-b504-d2ca9f58a3dd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3dd«code_folded¤codeÙcBase.:+(a::MyGradientTracer, b::MyGradientTracer) = MyGradientTracer(union(a.indexset, b.indexset))Ù$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2«code_foldedäcodeÙ±star = let I = collect(1:star_n) J = ones(Int, star_n) for i in 2:star_n push!(I, 1) push!(J, i) push!(I, i) push!(J, i) end sparse(I, J, ones(Int, length(I))) end;Ù$a7b85908-404b-475b-9875-c1190de5ff71„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7b85908-404b-475b-9875-c1190de5ff71«code_foldedäcodeÚ}md""" [**Definition 4.2**](https://epubs.siam.org/doi/10.1137/S0036144504444711) A coloring of the columns of a symmetric matrix ``A`` is *symmetrically orthogonal* if for every nonzero element ``a_{uv}``, either (1) there is no other column of color ``\phi(u)`` with a nonzero in row ``r_u``, or (2) there is no other column of color ``\phi(v)`` with a nonzero in row ``r_v``. """Ù$22c1030b-bef5-4af5-9d5f-6afb4a7ae699„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$22c1030b-bef5-4af5-9d5f-6afb4a7ae699«code_foldedäcodeÙ!img("Gebremedhin_Figure_6_1_mat")Ù$a7e8569e-2fed-4069-aa84-ced67849ab15„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7e8569e-2fed-4069-aa84-ced67849ab15«code_foldedäcodeÙ'md"## The same applies to reverse mode"Ù$fa2a8104-2a3f-438c-bc63-4236a9f5ebeb„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebeb«code_folded¤codeÙcBase.:*(a::MyGradientTracer, b::MyGradientTracer) = MyGradientTracer(union(a.indexset, b.indexset))Ù$dbef0e7d-b731-4d83-98e3-104b23f26042„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$dbef0e7d-b731-4d83-98e3-104b23f26042«code_foldedäcodeÙCmd"`n` = $(@bind n Slider(10:20, show_value = true, default = 16))"Ù$a5769449-96cd-477a-bceb-ad9439a37430„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a5769449-96cd-477a-bceb-ad9439a37430«code_foldedäcodeÚmd""" # What color is your Jacobian ? Given a sparse matrix ``A``, two graphs represent its sparsity: * Column intersection graph, used in [Software for estimating sparse Jacobian matrices, 1984](https://dl.acm.org/doi/abs/10.1145/1271.1610) * Bipartite graph, used in [Colpack](https://github.com/CSCsw/ColPack) and [SparseMatrixColoring](https://github.com/gdalle/SparseMatrixColorings.jl) $(img("Gebremedhin_Figure_3_1")) See [Section 3.4 of What color is your Jacobian ?](https://epubs.siam.org/doi/10.1137/S0036144504444711) """Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1«code_folded¤codeÙ1using SparseArrays, Images, SparseMatrixColoringsÙ$f8e9d672-e6ad-4910-8307-2b56616b11bc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f8e9d672-e6ad-4910-8307-2b56616b11bc«code_folded¤codeÙQBase.sign(x::MyGradientTracer) = MyGradientTracer(Set()) # return empty index setÙ$7fec005c-11b9-4a75-a93c-195d456db190„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7fec005c-11b9-4a75-a93c-195d456db190«code_foldedäcodeµmd"## Scalar example"Ù$6c174bac-faef-424a-9de7-e4c7be8ddb27„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6c174bac-faef-424a-9de7-e4c7be8ddb27«code_foldedäcodeÙ0md"## Larger example : star vs acyclic coloring"Ù$b9dc524d-6c0b-4507-842c-b4b6cc90fd96„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96«code_foldedäcodeÚ�qa(md"Is a coloring of the columns is distance-2 in the adjacency graph iff columns of the same color are structurally orthogonal ?", md""" The adjacency graph ``G`` is the quotient graph of the bipartite graph, say ``B``, under the identification ``r_i \sim a_i`` for all ``i``. If the diagonal entries of ``A`` are nonzero, for distance-1 neighbors ``a_u r_v`` of ``B``, we have a distance-2 neighbor ``a_ua_v`` of ``B`` (with the path ``a_ur_v, r_v a_v``). So two nodes are distance-2 neighbors in ``G`` iff they are distance-2 neighbors in ``B``. As a consequence, the statement is true **if the diagonal entries of ``A`` are nonzero. If diagonal entries of ``A`` are allowed to be zero, there is the following counter example where both columns are structurally orthogonal even though they are distance 1 neighbors (and hence also distance 2 neighbors). ```math \begin{bmatrix}\cdot & 1\\1 & \cdot\end{bmatrix} ``` """ )Ù$70296870-49af-4564-bdb7-bd2d49f9114b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$70296870-49af-4564-bdb7-bd2d49f9114b«code_foldedäcodeÙRviz(star, decompression = :direct, structure = :symmetric, plot_size = (5cm, 5cm))Ù$0a91e27f-3cea-415e-aed4-123482da375a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0a91e27f-3cea-415e-aed4-123482da375a«code_foldedäcodeÙmd"Simple [operator overloading implementation](https://adrianhill.de/SparseConnectivityTracer.jl/dev/internals/how_it_works/)"Ù$2bd9ea13-362e-47ac-b26d-8e36d33e04ea„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2bd9ea13-362e-47ac-b26d-8e36d33e04ea«code_foldedäcodeÙ¤md"For each color ``c``, we consider the submatrix ``B_c = A_{:,I}`` where ``I = \{i \mid \phi(i) = c\}`` is the set of columns corresponding to color-``c`` nodes."Ù$cabeb42c-f40b-4549-b9a2-3bda7a988672„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$cabeb42c-f40b-4549-b9a2-3bda7a988672«code_foldedäcode½img("Gebremedhin_Figure_6_1")´last_hot_reload_time˱cell_dependenciesÞWÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655„´precedence_heuristic §cell_idÙ$e3ae5697-6b0b-4d5f-99a0-d579b6eff655´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505„´precedence_heuristic §cell_idÙ$a546edb2-6a72-4c5f-95f7-cc7709bbb505´downstream_cells_map€²upstream_cells_map‚§xtracer‘Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919¡F‘Ù$a3bf5961-323b-4adc-99a0-9a456a0bfd48Ù$d5b7f51b-e451-40a7-aa41-a8006decba33„´precedence_heuristic §cell_idÙ$d5b7f51b-e451-40a7-aa41-a8006decba33´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$5892dfbb-b375-407b-a0a7-da66adb71b67„´precedence_heuristic §cell_idÙ$5892dfbb-b375-407b-a0a7-da66adb71b67´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$1f02fda8-6b22-429e-9ef4-243e97372526„´precedence_heuristic §cell_idÙ$1f02fda8-6b22-429e-9ef4-243e97372526´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$1167ae71-b63d-4ccc-a120-31c8483eca85„´precedence_heuristic §cell_idÙ$1167ae71-b63d-4ccc-a120-31c8483eca85´downstream_cells_map�§ytracer�²upstream_cells_map‚¡f‘Ù$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3§xtracer‘Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919Ù$45f4edeb-d934-413f-9f45-568465111b6e„´precedence_heuristic §cell_idÙ$45f4edeb-d934-413f-9f45-568465111b6e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a413c12c-72c1-4f46-b7f2-0b0118c1b232„´precedence_heuristic §cell_idÙ$a413c12c-72c1-4f46-b7f2-0b0118c1b232´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡*�¥large‘Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcceÙ$60070a94-d9ca-474b-9c6f-37468e3f030d„´precedence_heuristic §cell_idÙ$60070a94-d9ca-474b-9c6f-37468e3f030d´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$15cf368c-cada-4a72-b59b-a0f9dd0115b4„´precedence_heuristic §cell_idÙ$15cf368c-cada-4a72-b59b-a0f9dd0115b4´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce„´precedence_heuristic §cell_idÙ$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce´downstream_cells_map�¥large’Ù$a413c12c-72c1-4f46-b7f2-0b0118c1b232Ù$9b427766-5290-4dee-8dd5-5aab20080d0a²upstream_cells_mapˆ©StableRNG�¡n‘Ù$dbef0e7d-b731-4d83-98e3-104b23f26042¦sparse�¡I�¡+�¤Bool�¦sprand�©Symmetric�Ù$a3bf5961-323b-4adc-99a0-9a456a0bfd48„´precedence_heuristic §cell_idÙ$a3bf5961-323b-4adc-99a0-9a456a0bfd48´downstream_cells_map�¡F‘Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505²upstream_cells_map„¡/�¡+�¤sign�¡*�Ù$44a6b427-bd4b-4fa1-95d8-a8ea55719192„´precedence_heuristic §cell_idÙ$44a6b427-bd4b-4fa1-95d8-a8ea55719192´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$9e24f674-42af-4fa8-bf3e-42e14d855a58„´precedence_heuristic §cell_idÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58´downstream_cells_map€²upstream_cells_map…£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2§@md_str�¨getindex�¢=>�«two_columns‘Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$39e06fde-d734-11f0-a308-89fba7e8abd6„´precedence_heuristic §cell_idÙ$39e06fde-d734-11f0-a308-89fba7e8abd6´downstream_cells_map€²upstream_cells_map‰°HypertextLiteral‘Ù$75597493-3e69-437f-9408-b43a89b35559¸HypertextLiteral.content�Ù$PlutoTeachingTools.ChooseDisplayMode�·HypertextLiteral.Result�¤@htl�·PlutoUI.TableOfContents�§PlutoUI‘Ù$75597493-3e69-437f-9408-b43a89b35559²PlutoTeachingTools‘Ù$75597493-3e69-437f-9408-b43a89b35559·HypertextLiteral.Bypass�Ù$21898d8d-f822-4128-ad56-d9a10865fb1d„´precedence_heuristic §cell_idÙ$21898d8d-f822-4128-ad56-d9a10865fb1d´downstream_cells_map�­three_columns‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166²upstream_cells_map‡¤Base�¤hbox�©@html_str�£Div�¢=>�¤Dict�®Base.Docs.HTML�Ù$4f8de444-dcb4-411a-b087-6948699614e0„´precedence_heuristic§cell_idÙ$4f8de444-dcb4-411a-b087-6948699614e0´downstream_cells_map„­LinearAlgebra�¦Graphs‘Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf©GraphPlot�ªStableRNGs�²upstream_cells_map€Ù$75597493-3e69-437f-9408-b43a89b35559„´precedence_heuristic§cell_idÙ$75597493-3e69-437f-9408-b43a89b35559´downstream_cells_map„°HypertextLiteral“Ù$39e06fde-d734-11f0-a308-89fba7e8abd6Ù$2728dc2c-ca17-4989-9259-451f95a24bd2Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§PlutoUI’Ù$39e06fde-d734-11f0-a308-89fba7e8abd6Ù$2728dc2c-ca17-4989-9259-451f95a24bd2²ExperimentalLayout�²PlutoTeachingTools’Ù$39e06fde-d734-11f0-a308-89fba7e8abd6Ù$2728dc2c-ca17-4989-9259-451f95a24bd2²upstream_cells_map€Ù$9b427766-5290-4dee-8dd5-5aab20080d0a„´precedence_heuristic §cell_idÙ$9b427766-5290-4dee-8dd5-5aab20080d0a´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡*�¥large‘Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcceÙ$2578b84a-365a-47b6-b58f-1696517c5d02„´precedence_heuristic §cell_idÙ$2578b84a-365a-47b6-b58f-1696517c5d02´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$dfe3dffd-926b-4083-9e66-8536e5df198d„´precedence_heuristic §cell_idÙ$dfe3dffd-926b-4083-9e66-8536e5df198d´downstream_cells_map‚¢qašÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96Ù$1f02fda8-6b22-429e-9ef4-243e97372526Ù$592510fd-a0e4-42e5-ae5b-cac301e74f0aÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15Ù$60070a94-d9ca-474b-9c6f-37468e3f030dÙ$04ea8b79-63ba-4eb4-938c-98a21668924aÙ$e721600c-1887-4e99-b474-a427b665e591Ù$44a6b427-bd4b-4fa1-95d8-a8ea55719192Ù$15cf368c-cada-4a72-b59b-a0f9dd0115b4Ù$79910840-ec59-4433-bfb3-ae2d8da40d22¬_inline_html�²upstream_cells_mapˆ°HypertextLiteral‘Ù$75597493-3e69-437f-9408-b43a89b35559¸HypertextLiteral.content�¤@htl�·HypertextLiteral.Result�¨Markdown�¦sprint�¤HTML�·HypertextLiteral.Bypass�Ù$18594f1f-6036-4a95-8682-cf415c998311„´precedence_heuristic §cell_idÙ$18594f1f-6036-4a95-8682-cf415c998311´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e2eb1894-06ad-47a0-9ee0-c65b24a669b5„´precedence_heuristic §cell_idÙ$e2eb1894-06ad-47a0-9ee0-c65b24a669b5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$32440932-322a-46ce-911d-5fa6a1136bca„´precedence_heuristic §cell_idÙ$32440932-322a-46ce-911d-5fa6a1136bca´downstream_cells_map�¤ijkl’Ù$33b368e7-d71e-40ff-8170-a18d11db98fcÙ$647c372e-c094-4dfc-8a48-7b7f93fb94dd²upstream_cells_map�¦sparse�Ù$c2e4982a-3798-4c45-8831-5a76b3b29f6e„´precedence_heuristic §cell_idÙ$c2e4982a-3798-4c45-8831-5a76b3b29f6e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$79910840-ec59-4433-bfb3-ae2d8da40d22„´precedence_heuristic §cell_idÙ$79910840-ec59-4433-bfb3-ae2d8da40d22´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$5a6aec48-54fb-4d88-a8a1-b06a2bb99108„´precedence_heuristic §cell_idÙ$5a6aec48-54fb-4d88-a8a1-b06a2bb99108´downstream_cells_map�¡S‘Ù$91226321-fc72-4bd9-8d78-9c2bff5c760a²upstream_cells_map�¦sparse�Ù$726208c6-e856-42a2-b027-555388bc505e„´precedence_heuristic §cell_idÙ$726208c6-e856-42a2-b027-555388bc505e´downstream_cells_map€²upstream_cells_map‚£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2«two_columns‘Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8b„´precedence_heuristic §cell_idÙ$b18a3bf6-102e-49f5-af8c-f1c35d2e2a8b´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$352c92ec-14da-4beb-85c4-f66d77fa42d6„´precedence_heuristic §cell_idÙ$352c92ec-14da-4beb-85c4-f66d77fa42d6´downstream_cells_map€²upstream_cells_map‚£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2¢=>�Ù$647c372e-c094-4dfc-8a48-7b7f93fb94dd„´precedence_heuristic §cell_idÙ$647c372e-c094-4dfc-8a48-7b7f93fb94dd´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡*�¤ijkl‘Ù$32440932-322a-46ce-911d-5fa6a1136bcaÙ$4da92dbb-fcbd-4991-a2f1-f866778a27ef„´precedence_heuristic §cell_idÙ$4da92dbb-fcbd-4991-a2f1-f866778a27ef´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745„´precedence_heuristic §cell_idÙ$e820e135-2df2-4fa3-a09b-8ce7e5a1f745´downstream_cells_map�«two_columns•Ù$dc23180e-2b0f-41ae-aebf-0159a8f8677aÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58Ù$a01688ec-8f16-4d39-b39d-6d1acd24d7adÙ$726208c6-e856-42a2-b027-555388bc505eÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5²upstream_cells_map‡¤Base�¤hbox�©@html_str�£Div�¢=>�¤Dict�®Base.Docs.HTML�Ù$1efb0f40-fb9e-4e5b-be59-84910afbf376„´precedence_heuristic §cell_idÙ$1efb0f40-fb9e-4e5b-be59-84910afbf376´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$2728dc2c-ca17-4989-9259-451f95a24bd2„´precedence_heuristic §cell_idÙ$2728dc2c-ca17-4989-9259-451f95a24bd2´downstream_cells_map…£img˜Ù$dc23180e-2b0f-41ae-aebf-0159a8f8677aÙ$9e24f674-42af-4fa8-bf3e-42e14d855a58Ù$a01688ec-8f16-4d39-b39d-6d1acd24d7adÙ$726208c6-e856-42a2-b027-555388bc505eÙ$352c92ec-14da-4beb-85c4-f66d77fa42d6Ù$a5769449-96cd-477a-bceb-ad9439a37430Ù$cabeb42c-f40b-4549-b9a2-3bda7a988672Ù$22c1030b-bef5-4af5-9d5f-6afb4a7ae699£URL‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2ªsave_image�§imgpath�¤Path‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2²upstream_cells_mapÞ°HypertextLiteral‘Ù$75597493-3e69-437f-9408-b43a89b35559¸HypertextLiteral.content�¦String�·HypertextLiteral.Result�¤@htl�µPlutoUI.LocalResource�§PlutoUI‘Ù$75597493-3e69-437f-9408-b43a89b35559£URL‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2¨joinpath�¡!�·HypertextLiteral.Bypass�¿HypertextLiteral.attribute_pair�¢in�ªstartswith�Ù&PlutoTeachingTools.RobustLocalResource�¥split�¨@__DIR__�¤Path‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2¡*�²PlutoTeachingTools‘Ù$75597493-3e69-437f-9408-b43a89b35559Ù$33b368e7-d71e-40ff-8170-a18d11db98fc„´precedence_heuristic §cell_idÙ$33b368e7-d71e-40ff-8170-a18d11db98fc´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡*�¤ijkl‘Ù$32440932-322a-46ce-911d-5fa6a1136bcaÙ$29d9f355-26aa-4714-9f9e-3d020016662e„´precedence_heuristic §cell_idÙ$29d9f355-26aa-4714-9f9e-3d020016662e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf„´precedence_heuristic §cell_idÙ$e9135060-75d4-4f5a-9315-2e5fbb493cdf´downstream_cells_map�­colored_plots‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166²upstream_cells_mapÞ¨Diagonal�¥scale‘Ù$d23e7238-5edb-42d3-96d9-0dffa9e7f326¨coloring�Ù$SparseMatrixColorings.AdjacencyGraph�µSparseMatrixColorings‘Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1©Graphs.nv�¡-�¤diag�§adjoint�¤RGBA�£RGB�·GreedyColoringAlgorithm�§ncolors�Ù!SparseMatrixColorings.show_colors�§convert�¡:�¯ColoringProblem�¦border‘Ù$d23e7238-5edb-42d3-96d9-0dffa9e7f326¦Graphs‘Ù$4f8de444-dcb4-411a-b087-6948699614e0¤conj�¢==�´Graphs.SimpleDiGraph�£pad‘Ù$d23e7238-5edb-42d3-96d9-0dffa9e7f326¶distinguishable_colors�¡*�¥gplot�Ù$a4ecf92d-6c45-4112-8f0c-06a6d227cd84„´precedence_heuristic §cell_idÙ$a4ecf92d-6c45-4112-8f0c-06a6d227cd84´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$592510fd-a0e4-42e5-ae5b-cac301e74f0a„´precedence_heuristic §cell_idÙ$592510fd-a0e4-42e5-ae5b-cac301e74f0a´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3„´precedence_heuristic §cell_idÙ$d46dcdb3-ac4c-4ba9-ac48-6d6a693630d3´downstream_cells_map�¡f‘Ù$1167ae71-b63d-4ccc-a120-31c8483eca85²upstream_cells_mapƒ¡+�¤sign�¡*�Ù$760ef943-e9d9-4cdc-8977-932cf6fcb78a„´precedence_heuristic §cell_idÙ$760ef943-e9d9-4cdc-8977-932cf6fcb78a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$2e3cdd4b-9d04-477c-8c6a-fec6ec846919„´precedence_heuristic §cell_idÙ$2e3cdd4b-9d04-477c-8c6a-fec6ec846919´downstream_cells_map�§xtracer’Ù$1167ae71-b63d-4ccc-a120-31c8483eca85Ù$a546edb2-6a72-4c5f-95f7-cc7709bbb505²upstream_cells_map‚£Set�°MyGradientTracer‘Ù$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476„´precedence_heuristic §cell_idÙ$4ab46ef8-0f6e-4e6d-8f6f-ac466977b476´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$19dd6563-1a4e-479f-881d-9bcbc720ea36„´precedence_heuristic §cell_idÙ$19dd6563-1a4e-479f-881d-9bcbc720ea36´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$26191290-2b2d-43fe-b2bf-d690fd0bbe15„´precedence_heuristic §cell_idÙ$26191290-2b2d-43fe-b2bf-d690fd0bbe15´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$04ea8b79-63ba-4eb4-938c-98a21668924a„´precedence_heuristic §cell_idÙ$04ea8b79-63ba-4eb4-938c-98a21668924a´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$874b6593-7310-4788-beb0-2f18c0ca09a7„´precedence_heuristic §cell_idÙ$874b6593-7310-4788-beb0-2f18c0ca09a7´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e3dec4ca-69c0-4955-9303-5f8a239546f2„´precedence_heuristic §cell_idÙ$e3dec4ca-69c0-4955-9303-5f8a239546f2´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e6697119-2801-48e2-b978-facc00af636d„´precedence_heuristic §cell_idÙ$e6697119-2801-48e2-b978-facc00af636d´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$f2418632-3261-4acb-8cc6-df333b5480a5„´precedence_heuristic §cell_idÙ$f2418632-3261-4acb-8cc6-df333b5480a5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$d23e7238-5edb-42d3-96d9-0dffa9e7f326„´precedence_heuristic §cell_idÙ$d23e7238-5edb-42d3-96d9-0dffa9e7f326´downstream_cells_mapƒ¥scale‘Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf£pad‘Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf¦border‘Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf²upstream_cells_mapŒ¡:�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¤hbox�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�·PlutoRunner.create_bond�Ù$285d3797-5086-4adc-839c-2204128585e1„´precedence_heuristic §cell_idÙ$285d3797-5086-4adc-839c-2204128585e1´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a01688ec-8f16-4d39-b39d-6d1acd24d7ad„´precedence_heuristic §cell_idÙ$a01688ec-8f16-4d39-b39d-6d1acd24d7ad´downstream_cells_map€²upstream_cells_mapƒ£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2¢=>�«two_columns‘Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$d0ba0c62-c788-4871-959c-fe7044519849„´precedence_heuristic §cell_idÙ$d0ba0c62-c788-4871-959c-fe7044519849´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5„´precedence_heuristic §cell_idÙ$1617c79d-3abe-4ffc-9ee1-3312f2b28eb5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166„´precedence_heuristic §cell_idÙ$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166´downstream_cells_map�£viz—Ù$91226321-fc72-4bd9-8d78-9c2bff5c760aÙ$33b368e7-d71e-40ff-8170-a18d11db98fcÙ$70296870-49af-4564-bdb7-bd2d49f9114bÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4Ù$647c372e-c094-4dfc-8a48-7b7f93fb94ddÙ$a413c12c-72c1-4f46-b7f2-0b0118c1b232Ù$9b427766-5290-4dee-8dd5-5aab20080d0a²upstream_cells_map‚­colored_plots‘Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf­three_columns‘Ù$21898d8d-f822-4128-ad56-d9a10865fb1dÙ$dc23180e-2b0f-41ae-aebf-0159a8f8677a„´precedence_heuristic §cell_idÙ$dc23180e-2b0f-41ae-aebf-0159a8f8677a´downstream_cells_map€²upstream_cells_map…£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2§@md_str�¨getindex�¢=>�«two_columns‘Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$9df9c76a-48af-4ca6-83f1-b8798d6d4e34„´precedence_heuristic §cell_idÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34´downstream_cells_map�¦Base./�²upstream_cells_mapƒ¤Base�°MyGradientTracer‘Ù$97c94c5a-fab5-4226-b803-10c85a298f2a¦Number�Ù$aeb8b749-006a-400f-9b7d-05333fd7214f„´precedence_heuristic §cell_idÙ$aeb8b749-006a-400f-9b7d-05333fd7214f´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$f29078e8-242a-4b88-881f-781829c16ed5„´precedence_heuristic §cell_idÙ$f29078e8-242a-4b88-881f-781829c16ed5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$b33bf212-5f88-47ab-ba10-a2815d17f235„´precedence_heuristic §cell_idÙ$b33bf212-5f88-47ab-ba10-a2815d17f235´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$76162106-fb90-4883-b2d2-b87e1419c072„´precedence_heuristic §cell_idÙ$76162106-fb90-4883-b2d2-b87e1419c072´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5„´precedence_heuristic §cell_idÙ$12ffe7c2-2bf6-4949-ae28-f3d8e03a5da5´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�«two_columns‘Ù$e820e135-2df2-4fa3-a09b-8ce7e5a1f745Ù$97c94c5a-fab5-4226-b803-10c85a298f2a„´precedence_heuristic §cell_idÙ$97c94c5a-fab5-4226-b803-10c85a298f2a´downstream_cells_map�°MyGradientTracer•Ù$8e2045f3-ee09-4439-b504-d2ca9f58a3ddÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebebÙ$9df9c76a-48af-4ca6-83f1-b8798d6d4e34Ù$f8e9d672-e6ad-4910-8307-2b56616b11bcÙ$2e3cdd4b-9d04-477c-8c6a-fec6ec846919²upstream_cells_map‚£Int�£Set�Ù$e882ebee-36ad-43d9-8ab7-20f7e8b2d9fe„´precedence_heuristic §cell_idÙ$e882ebee-36ad-43d9-8ab7-20f7e8b2d9fe´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4„´precedence_heuristic §cell_idÙ$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4´downstream_cells_map€²upstream_cells_map…Ù!SparseMatrixColorings.what_fig_41�µSparseMatrixColorings‘Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡*�Ù$0445aae6-2f7e-42b8-b30b-f31298cdeed0„´precedence_heuristic §cell_idÙ$0445aae6-2f7e-42b8-b30b-f31298cdeed0´downstream_cells_map�¦star_n‘Ù$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2²upstream_cells_map‹¡:�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�·PlutoRunner.create_bond�Ù$e721600c-1887-4e99-b474-a427b665e591„´precedence_heuristic §cell_idÙ$e721600c-1887-4e99-b474-a427b665e591´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$91226321-fc72-4bd9-8d78-9c2bff5c760a„´precedence_heuristic §cell_idÙ$91226321-fc72-4bd9-8d78-9c2bff5c760a´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¢cm�¡S‘Ù$5a6aec48-54fb-4d88-a8a1-b06a2bb99108¡*�Ù$8e2045f3-ee09-4439-b504-d2ca9f58a3dd„´precedence_heuristic §cell_idÙ$8e2045f3-ee09-4439-b504-d2ca9f58a3dd´downstream_cells_map�¦Base.+�²upstream_cells_mapƒ¤Base�¥union�°MyGradientTracer‘Ù$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2„´precedence_heuristic §cell_idÙ$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2´downstream_cells_map�¤star‘Ù$70296870-49af-4564-bdb7-bd2d49f9114b²upstream_cells_mapˆ¥push!�£Int�§collect�¡:�¦length�¦sparse�¦star_n‘Ù$0445aae6-2f7e-42b8-b30b-f31298cdeed0¤ones�Ù$a7b85908-404b-475b-9875-c1190de5ff71„´precedence_heuristic §cell_idÙ$a7b85908-404b-475b-9875-c1190de5ff71´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$22c1030b-bef5-4af5-9d5f-6afb4a7ae699„´precedence_heuristic §cell_idÙ$22c1030b-bef5-4af5-9d5f-6afb4a7ae699´downstream_cells_map€²upstream_cells_map�£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2Ù$a7e8569e-2fed-4069-aa84-ced67849ab15„´precedence_heuristic §cell_idÙ$a7e8569e-2fed-4069-aa84-ced67849ab15´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$fa2a8104-2a3f-438c-bc63-4236a9f5ebeb„´precedence_heuristic §cell_idÙ$fa2a8104-2a3f-438c-bc63-4236a9f5ebeb´downstream_cells_map�¦Base.*�²upstream_cells_mapƒ¤Base�¥union�°MyGradientTracer‘Ù$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$dbef0e7d-b731-4d83-98e3-104b23f26042„´precedence_heuristic §cell_idÙ$dbef0e7d-b731-4d83-98e3-104b23f26042´downstream_cells_map�¡n‘Ù$2fe7f4eb-ca33-4338-ba8e-29b769b0dcce²upstream_cells_map‹¡:�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�·PlutoRunner.create_bond�Ù$a5769449-96cd-477a-bceb-ad9439a37430„´precedence_heuristic §cell_idÙ$a5769449-96cd-477a-bceb-ad9439a37430´downstream_cells_map€²upstream_cells_mapƒ£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2§@md_str�¨getindex�Ù$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1„´precedence_heuristic§cell_idÙ$6bd04f2f-ed5f-4ecf-91dd-8868ec5b83e1´downstream_cells_mapƒ¬SparseArrays�µSparseMatrixColorings’Ù$3e6fc4af-19f4-4ff9-b9cf-759e831ff2a4Ù$e9135060-75d4-4f5a-9315-2e5fbb493cdf¦Images�²upstream_cells_map€Ù$f8e9d672-e6ad-4910-8307-2b56616b11bc„´precedence_heuristic §cell_idÙ$f8e9d672-e6ad-4910-8307-2b56616b11bc´downstream_cells_map�©Base.sign�²upstream_cells_mapƒ¤Base�£Set�°MyGradientTracer‘Ù$97c94c5a-fab5-4226-b803-10c85a298f2aÙ$7fec005c-11b9-4a75-a93c-195d456db190„´precedence_heuristic §cell_idÙ$7fec005c-11b9-4a75-a93c-195d456db190´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$6c174bac-faef-424a-9de7-e4c7be8ddb27„´precedence_heuristic §cell_idÙ$6c174bac-faef-424a-9de7-e4c7be8ddb27´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$b9dc524d-6c0b-4507-842c-b4b6cc90fd96„´precedence_heuristic §cell_idÙ$b9dc524d-6c0b-4507-842c-b4b6cc90fd96´downstream_cells_map€²upstream_cells_mapƒ¢qa‘Ù$dfe3dffd-926b-4083-9e66-8536e5df198d§@md_str�¨getindex�Ù$70296870-49af-4564-bdb7-bd2d49f9114b„´precedence_heuristic §cell_idÙ$70296870-49af-4564-bdb7-bd2d49f9114b´downstream_cells_map€²upstream_cells_map„£viz‘Ù$dcf92bc9-5e0f-4716-bb07-ca0d9b73b166¤star‘Ù$95d7e9cd-b4a1-4205-b7d4-8c10916be8a2¢cm�¡*�Ù$0a91e27f-3cea-415e-aed4-123482da375a„´precedence_heuristic §cell_idÙ$0a91e27f-3cea-415e-aed4-123482da375a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$2bd9ea13-362e-47ac-b26d-8e36d33e04ea„´precedence_heuristic §cell_idÙ$2bd9ea13-362e-47ac-b26d-8e36d33e04ea´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$cabeb42c-f40b-4549-b9a2-3bda7a988672„´precedence_heuristic §cell_idÙ$cabeb42c-f40b-4549-b9a2-3bda7a988672´downstream_cells_map€²upstream_cells_map�£img‘Ù$2728dc2c-ca17-4989-9259-451f95a24bd2©shortpath©sparse.jl®last_save_timeËAڸؗپ�«notebook_idÙ$276c7d04-d3ab-11f1-88a1-8ff9776f78f0¥nbpkgŠ­busy_packages�Ù,waiting_for_permission_but_probably_disabled§enabledðterminal_outputs‹°HypertextLiteralÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===µSparseMatrixColoringsÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===©GraphPlotÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===ªnbpkg_syncÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===¦ImagesÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===¬SparseArraysÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===§PlutoUIÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===¦GraphsÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===­LinearAlgebraÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===ªStableRNGsÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===²PlutoTeachingToolsÚ• Waiting for other notebooks to finish Pkg operations... === Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Project.toml`  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_kwetrqbojw/Manifest.toml` [deac9b47] ↑ LibCURL_jll v8.18.0+1 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.1+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.103+0 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2026.8.13 ⇒ v2026.10.20 [458c3c95] ↑ OpenSSL_jll v3.5.6+0 ⇒ v3.5.8+0 [efcefdf7] ↑ PCRE2_jll v10.46.0+0 ⇒ v10.47.0+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [8e850ede] ↑ nghttp2_jll v1.67.1+0 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.8.2+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... ===¶waiting_for_permission·restart_recommended_msgÀ´restart_required_msgÀ²installed_versionsŒ°HypertextLiteral¥1.0.0¬SparseArrays¦stdlibµSparseMatrixColorings¦0.4.28§PlutoUI¦0.7.83©GraphPlot¥0.6.2Ù!__internal_julia_manifest_version¦1.13.3ªStableRNGs¥1.0.4­LinearAlgebra¦stdlib¦Graphs¦1.15.0¸__internal_julia_version¦1.13.3²PlutoTeachingTools¥0.4.7¦Images¦0.26.2¯install_time_nsÎ$�[%¬instantiatedípluto_version¦v1.1.0«in_temp_dirÂ