From 222e445a1e6e3f606e148d25a29580ed4b8ef96e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 21:05:27 +0000 Subject: [PATCH 1/3] Fix data errors in process.py Corrects three data errors in the `process.py` script: - Duplicate pattern ID 73 ('THE FAMILY') is changed to 75. - Duplicate pattern ID 201 ('THICKENING THE OUTER WALLS') is changed to 211. - Incorrect subsection range for 'STRUCTURAL SUBSIDIARIES' is changed from range(26, 233) to range(226, 233). Adds a new test file `test_process.py` with tests to verify that there are no duplicate pattern IDs and no overlapping subsection ranges, preventing similar issues in the future. --- __pycache__/process.cpython-312.pyc | Bin 0 -> 17139 bytes process.py | 6 +++--- test_process.py | 32 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 __pycache__/process.cpython-312.pyc create mode 100644 test_process.py diff --git a/__pycache__/process.cpython-312.pyc b/__pycache__/process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ac2d8f6066e6f277e3eb3a50208d2534debe22a GIT binary patch literal 17139 zcmd6Od3;>gb>5o=vtS0mU|+akNN@p2ag(Tp5=Cj22VjK33^+3&M1qhE;SC{h0iidb zM8bd#T51I@4S~Q3hoziAkyDdaRLg1F&`H`TO&7IJTR;#kXiPV98|ew&V%@Y#IQe9CgfVj^b2d+QOaNg9+C>#v!P6e&e!DQQz|iv4x7Ch3@2 zaR|(=IPha{;4uRgI>?}Zc33R8jy8zuI z(A~=fZi|Ay~+ax=z{`%KzXPD-6zn8l!pt@M+Ew?vcCX*RG|Bn0|n?~ z0zHuLY0%E&0(C0B0$#sBeM+DJ4GJ`%$OUMtKxL(^0Bsj&n-VHOpAcwB=_o+M0_{*b z3($x_JM*Jp#&pCnBpq=o(U+tn#Yz{RF6AJeZY73ii4w=NR7v1jrgY=!Q4Zl*uJqtp zp*)FarE(b0D&+{C)k-g(^zz!I>G*CV%yYkAH)-#cqbCrtsuP^`N}qw6q;n=94Xck; zZ1otdJZ0?Ze(A`XKoTpR01*;&XL!JrF&c38dx|h$SnrG1++BXY4xn8zWZLzVb9R zn3JxU_+RexIa8CgM@pGqFq@>qk_rEvGo7^@mR>NmeBncikF=OFC2eZ|$g`c{u6{L@ zQ~?wTpye-H%pcOaW0j#uQ0|iPh$Or*xh)ip#6jbp#_AL8vNsrtCt@LgcLEe|wAGu4 z_6QCOIjRDo#9?nB+8s&64trZekv2KT;Z{NPwZ%e#?r@?z<_mid`NCoOFo~!h(pYWS z7mz8>7>rqDIYGLO^b!L%=4164E8~iEN<0*l!R;Vk-5HJhLIKK)cl)(DWy*4rS{e`d z5(zmb2faPfSO;Jhxv}z2Uz;{YNX1S-aS3tZXaGx2#C(x>S2ULJ`eL$=;@o0fAllj4 z9pTO~--Ek%?*^rWl*-)XUO$u)^u;K%l(c#*HeBEkA*M4F3GMKA$Au2733*zh-LW0q9)-X0&!g&7)%7l%Ww zu=?RZnD$;nsH9VlczqGt6YqeoC0Z^+06Y=uiFAXzn@U(G_@R5ub=XV&5M58S)E7vE z4iSz-gJKJAYL4S6%)`$D_6FWgI%ErmL6#LAryc$ zk*%aX3RSj8!$EIn=t-cPh*k&XHn@B|XVeIG59;RJ7;hll9oJN`g=lds+T#_{$heh| zn;)?&Z+j>l2G}fQbFMBq+67mW56Q8^J?(IRP+LeX75SI68<(^0C0d^sIbFU)J2noF3;0BayI+j!^kMEc zIBSnjq&Bq7SS{!C24c}T?E+~J5_QFVp*S;;FU$<|5V0zMr~|Q+l^yd1IygP6ByuY( z8jN9Gm?JMkJq%*Tfn~rZKC1ZjcVyM zF2XNLV##6TUatr&Bqj{$BDyIqhg)~FMG=_H>7ulWs1a@&ZEX!9n}YcunH#nB#O2r_ z!rq=x0yDDW2fYbj7lp>iSD}qVjTNfbgCtH;O{b5kNJ#f}b-^(c`V0w@%Mu77UmKJk z4Zstrm2TqYTvKZ-irNqlpxg-+9ugxA2j3b;P7@pJAzp_(gtQ#&hL57e_C&BoBON?R z2AAf32t|>14-0JN+_1Jsm!crpyjH2(z>$|K#KeyjnB zjny+GY|<}=#M?u1I7s)-7R_f!s0f5&=wU=B&|Zv5!%v_Nky)HmLwO;HWt?9 z3$aKKiHYKHr*=eyNE3Q&QgO#gt?7zl3~Gqih}w9URy$6RT-pQ0i9#4=LB*((ge!9i zz}N;Qo+1t92D(nP!w@2LfDaSb6lClM=xL%A@PO7G?V%w00Oac!et|S1CNX%mmI|vB zf%hC~rO2{*p@1PO;ab=&=0lMe4Il~)w61R_MS3-2JC-<%X%J}bp+Gx2ghN#ND5;)+ z5B+FRG{4AQt=!TX63}JHVMG|6hy>uz6L;}LZq+XULpq942FIQiV{=8MEvludbHs~@ zBYLzD9}}#GF1;cuDdLO7EApI3ZgjRaC^fTh3}48aVLI!Q_y5&$!MygOp}!+GNMdXW&_ zxYw5uRS~U0j3d87j*_e~^{Vh9(HfDf!)Ton?P5uyW^fZPkz9)8f*!xi7mp)<5&m0* ztHj=5EZHl19()un-QOnBaRf#`6q0+u{W5_DW>JKoa0#($ktlHjV6~qT^Jpm_c}K)F z;0uI3d1=rfTqL0?n{Ch$a|<|waHp3@EJqx7YDJ?XlnAs7hrUe8x~>=+0|Y2s2@M7O zOlu#sq>1r=hg_9Dp#+9L3eMIP^DJn;Kw3jwKG-cI8Hl76N+f7Y;o(%y6|%VeNL#t) zbefpk4`0)rmlb(N1G~c=BJ*k5`$dA)tw@lfEz!%35k9k|mT8?Sx=^?kp--Vg*dugC0?ls?8Ld#ST;A9 z7BrDD3{`5&1nnAWXz-$);+(=F2=wm~t`mYdmX=#Sx#x?#bF{Bk9KWN{cD4HJR1Ch$v@C)mLaZZTLhP)gU zKK!Z>iTFaNEt)fM{u;632tq-maptSn2)T`vt%uat36|<57>PR=?cs`kop3c*NnPq5 zoAtTBN2;fdM?tJD-W`MeM5p%+L5PQ*+<|(_{uSnnuzcSjp*Git7$O<&?V#Tzy;S#c z6zVXh2K-IJuGUz02 z=pPHgIMIl6Q8owv6T&qCITYqH+IcaOz-njAxKSSTn)?U2-^ zvLD9jPur7rF#iKGl!|~BQKXynpAzD(h0GV|;Ned6xBr4zHC2sbX&g?oJN}oXmT1u@F0;g$_H7|t3v)CAn*IM3K~E2k zjtR6cIG3?UU}x~JNhoDpCw8E`8Ws4vgk7Sdpgq=P{E-kGmvQ5QDyN^>{|&)L#AkOv zoOoKJVH8NT!06tQd9&I6-;%FV=4pZ@8kt-lfi?U)(n{OdCwKC~1_P;(dBPPe>geDx zAk^9_k^)EzBx(Ij*5BSCR@VxfX=e+=6S548WM~iy){_frA$%20wW05K$x;)bogz4h zYMp^*C$8u=$@RFN#CkNQf@@81e2*L+WVi&5XS}#G?g!o@p9(8Dj{`;vF$@X+?Z0<9U&h} zYDF~Y*bj)+M||3qs_;P3X5@VL-;=|^UMH^I2mLVtcM#_mv>k_Vn4s(r2)f8c8MwRv z_CsRztuY^~CpsQo;fP=s4UYN`LX@sR!;$`kV1*9m(lz;iBxccCM6m^6|B+a65MGz< zng5dz%O21N2SY!{EcBlVmIkA-PMSGeW&V_~Qz#|i6Ai$JL`rnabjNT2VQ%{`M61F$ zr(*r^6&A;=xBOQU%j4131X4)><-d_qYorpbch^#ecG>)Aq}Rlw;ZRU$PCH0@+rsD_ zG3$RPxwI8ADK49h=JkINb{Xd>&GgHHRpg{l1SbSsyRm2bG2voHGt{FUx$YA3XeVgV z7Wc%I0mEd~5UBN};T&sRdtz@;CEP>xl2W4GL-E!cCQ)06m1LBeI?YE!6O901kFfvO#RJVAQ7EF@MM>O*h=Q%22bd|+mUod1qBO9Wh;CI> z8g-TgTnyr#Tq~2R=!J{L>fpwmag}{%hRvukZ(RK*N8wH!E+BH0`dj3&Yu!~`eG8vd z7JpTgK-Qg3?JOKuSyVDbqJE6kcHyQq8jp5q2l}klRgpW(jn60^T1`?#V)NwTB5SJ5 zEAV!$1&*sC#B1}o@a+(?O^B^cTxF1D9B9RuvEu4q;Umro`kiJFePSpaSM4S+l^F3O zlso_^`?BMm1wS9%1bc+)EuCH;oq^XDqFFDHh{v(dQ*K@j3FXTP{e*eka@=L$x!>5INzA?aF71Z) za;r2DlXUs}tILFybUT9Q&#YKQTxxMdKKv`Z#x@*1)_XMW+i_&~j(vUGz0JMaTW{a? zmgb||wzV7`7AbM8xc8}TecJ>yX724BGxznWHmtkFmNBczOwpmRJ=Q6cw^3>_)lfg41Cx-_5N0aTE*tezU8{B71P?szJ$I%XW{bvJA`&Mh?WTl73URkXC$J9qy#9(nbV8_&IV z;Ju~?7n&YiY}&W5cHb@e_dCAR@wVxABMWPvcssGM_TZFl>fAey`VT5!ADkT1=`JdcSE=H{h4LiI2^Aq-ZcWy1Eq~GOlAo zXS3dX50Fl>uu8(4vp&3J_s#_u?9EFy_sgfwpPH}Qaoe_Y$=Nu!cfq+e3pU@jwJbRs z(#nE!V;02?QD*Wl^;E}y|;hIn31`T4nw1ButbqP zG!}g*bNwV+{1M-7A-uGC$qo3EffoxA7FyFcmX4r9T*P0e$2 zxzNpXjw(_sx47b!<3Jtu!rfQl8O?^kaaPwAFZ>yo8B+9dc}cQO4-89W%zQMJky@-` zry>l5YBHA8nP=4P+&M>Q-QS~`z317X(PVt2e;}zo1fJ)}7X)8{)$N|?s+Yc;@9ui8 z_^SVE>r88U?_9-PVzFx5ZQJ(cpDhk}en;hrld@8x~ySxsWZx}5HFmO|nD{8@X)&EuxC=Ch(#9k+~?AW>QdwBB(D zmNCP1EfKW=T2&vwqs5YEokjpRwM>;MK8YqKHHtsE>(46;j2IY9cV-?3 zrk|gEWb$~H1GNCQo;tEGK%k!Wx%+=0S~Bj1D>$3zPP2c;opy6j#(ndMtybq@ShD)!D7?6fOe-8G$> zGtT7jnNvv>K_N03vf2h}nLSg+G^FMELLKY*%zv_f_(Yh;4b>0ktN2Mhj#>14cBi}{ zegF5$H=G}w?4PPyvb(0#7ss;B&T!D1ApdP!?Xq2}*!ZdCjP68t{fLhKvIPYVzqJ?C z1y`rKE?U@tua>Tslcae;Bxc^l06Q_&&!2S`tqhB(0z;;)qajCByeqp+R zRH#Tiv_DVJa525|(=VH@nqcEfh&8`qdBKEkjjB_5e-OEeb~t0+xjSP@Wh^kcUZW

-Y2DqS}fTscn3;b8TAT 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 Az5oCK literal 0 HcmV?d00001 diff --git a/process.py b/process.py index 51475d9..b6ee280 100644 --- a/process.py +++ b/process.py @@ -84,7 +84,7 @@ (72, 'LOCAL SPORTS'), (73, 'ADVENTURE PLAYGROUND'), (74, 'ANIMALS'), - (73, 'THE FAMILY'), + (75, 'THE FAMILY'), (76, 'HOUSE FOR A SMALL FAMILY'), (77, 'HOUSE FOR A COUPLE'), (78, 'HOUSE FOR ONE PERSON'), @@ -220,7 +220,7 @@ (208, 'GRADUAL STIFFENING'), (209, 'ROOF LAYOUT'), (210, 'FLOOR AND CEILING LAYOUT'), - (201, 'THICKENING THE OUTER WALLS'), + (211, 'THICKENING THE OUTER WALLS'), (212, 'COLUMNS AT THE CORNERS'), (213, 'FINAL COLUMN DISTRIBUTION'), (214, 'ROOT FOUNDATIONS'), @@ -303,7 +303,7 @@ ('STRUCTURAL LAYOUT', range(209, 214)), ('STRUCTURAL FRAME', range(214, 221)), ('OPENINGS', range(221, 226)), - ('STRUCTURAL SUBSIDIARIES', range(26, 233)), + ('STRUCTURAL SUBSIDIARIES', range(226, 233)), ('SURFACES', range(233, 241)), ('OUTDOOR DETAILS', range(241, 249)), ('ORNAMENTATION', range(249, 254))] diff --git a/test_process.py b/test_process.py new file mode 100644 index 0000000..5dc1f8b --- /dev/null +++ b/test_process.py @@ -0,0 +1,32 @@ +import unittest +import process + +class TestProcessData(unittest.TestCase): + + def test_no_duplicate_pattern_ids(self): + """ + Tests that there are no duplicate pattern IDs in process.patterns. + """ + seen_ids = set() + duplicates = [] + for pattern_id, _ in process.patterns: + if pattern_id in seen_ids: + duplicates.append(pattern_id) + seen_ids.add(pattern_id) + self.assertEqual(len(duplicates), 0, f"Found duplicate pattern IDs: {duplicates}") + + def test_no_overlapping_subsection_ranges(self): + """ + Tests that there are no overlapping ranges in process.subsections. + """ + subsections = process.subsections + for i in range(len(subsections)): + for j in range(i + 1, len(subsections)): + s1_name, s1_range = subsections[i] + s2_name, s2_range = subsections[j] + # Check for overlap + overlap = max(0, min(s1_range.stop, s2_range.stop) - max(s1_range.start, s2_range.start)) + self.assertEqual(overlap, 0, f"Subsection ranges for '{s1_name}' and '{s2_name}' overlap.") + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From a8bde77aba905ba0ac3b06b4ca9e04d6769ed342 Mon Sep 17 00:00:00 2001 From: deerdear Date: Tue, 28 Jul 2026 21:58:21 +0200 Subject: [PATCH 2/3] chore: ignore __pycache__, drop committed bytecode --- .gitignore | 1 + __pycache__/process.cpython-312.pyc | Bin 17139 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 .gitignore delete mode 100644 __pycache__/process.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/__pycache__/process.cpython-312.pyc b/__pycache__/process.cpython-312.pyc deleted file mode 100644 index 9ac2d8f6066e6f277e3eb3a50208d2534debe22a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17139 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

-Y2DqS}fTscn3;b8TAT z)i$Mufqdq6zRn?e+gaa!v-gJSR^Y8YZyo%Dy}#3uer~S(Yoj-Nf2#6mkSRue*LQ*= zxnrb%6hSkb$~d60r-z|37&3WwG~>{jQW;lnL@MJXODZ@tFxq0xmUHN&Os1xSOD^}7hc7%lJ#gu<$>36D?PPGO=6v{0 zO~c|E{~OJCycJxm2?4D?AH7q*ZgGA48@+hEy=k#N3Uuv)wPvZh{-w~=z*izac1bns zKiQZuBt+=_0v7PHtuXYimS`X>P7C1e9<<_3kva?vLRG02ss15HQFabl^12WBx8$Gmb(~ItQTz8rLSe{8X_e+ zn!O(SlvNZNxzqSP%4=xx!W<&%7M=m36-!+XU_X&j58!+9kZ-?NM)ta z6=dYkk&}Me!*nr#e@`#~-M%2T*drpcMU1Z=S@&YvyyQXgt0WISZBV>Pqz$tW84+QH z91?=*Go}%B9er?>081rD&C11ROAs?;9D)f9&{m83zY2S_RH~VjyzO8(-@2mZ< z))~2?)--LeHI1zaoIZ0>@eZFJ^&T4*+JYiYRW{O_*JuM%yI)4b324Mlc$CRC!qY z27Xe1$X!iJKUlkIv1IeL_UY%Q`ln5olyv)K^L)u>{ranVTDcU(;SJYbrIlAsTsV>5 zaA|lldB;<=SpCSa*Wqz1vFPzn4(hjJcN``2p6xf}8xPKx-gn!v_eU-F-01#R@6Fy@ z<*z@r*s}k!b9!rf!_2k?$GY_3f@8~)t73Z3g@@C1@3=NB6<1u@bzxU}>)eKG+in+c z7R}>FHBvO+Pwx|P*>N3b$_}7-kF>}I!+d7BhU>3Q2z$*QWt42fd^Ii40?eo`Nuxe-is;5oN{Ag*4 zBR}_~r1GvvEA)K~zg6-O3Z|?KuG+W!9tS_o#~1jZr;j<0HaFwGrsZghNGl2LHheT= zJFN~44h?54yiqS!ALjsGX^7My(u|gRm|wJWznzH+M~;jI$w%u3l2`}^_mF1;A3i>K zX`O(GJH_A=6su{CuBLw*}Ssk>l9`Vn3Bdq$Ui$Nm48 za4t38DXUA@&Xr$lSSZ^xWxZ2VclG$p@wv4(&b)c>R{6KPZ;pSjX8%;{of6M<&86N~ zLhqDpUhw%U0Ac{&Aqp(7Ci^1d`k@*rhHS+UhF_SU;F5vJEYqB zpH*CX@7L>p&!iPD+*f6_ zpW=w@;eO;aj{n*h9O9qbsVWruHkHa;I4ON#wuyOEmVvQN^4Sq|uSvx_G(2)<)Z34m zbo$IF-yRz}ne?)CPi0K1_D#(O<0j}F`n{2J;`ZRwNtNEJa)rWmGDT|t@L*C+U{1B0 z58+GvLPh00w744;SA&}4@w!OdK&U*)iqn>83PmvzE+Muc%3j9WuMR%1_Jc8FJ&kXL zGNxl0r;0Ca#J4}1Gg2`b+lcsAhnb=mR9sAHp~d@Wz5U#O>a=p^Wb%MI0Sy03DI8a% zWsAvV`p7MrioY)v|3GT`fwbnXZNlQ-IO$mSJ0z>?f;_!pI(8{MZ?0dml+F}QKa*~n zEuA+vE?LTF?oU^y2WB6eH#aTYE$+=2<8CV3vSe{zNKX5vpSyHo-rTTk0rY{T;hH?R zVJ>zZf?Ae~04>`jYs0nsasL&&{wP5^K}@*@oEzt!x!yT%-nQ%{SS(rVuWg<)&-t(K zm^U{sy9l}^Yvqib-k5%77MvTGO9+-q)~cEA^u1|ywvVeSBj}N=H8W?@vAK%biFxzp z<#K`*lC^p!nfA|_XHU(WH!W8ZtdgwdGn>=qw0{;8d6%mR)=1XcYeng2<~Ck0nKy4) zt|eF}Sv@n=(`x$O*>zCHay`L@6~osMT)P5XM{vEd_xSY#+-4&|uQt)Z+qB=)8ID@@9ftBx~KZ>U3%@aJ`ZG+)A)no86L*&+ej@ zS_p2_7N1H7X2H2(c{{;-Bx^;!L3a?`xq@>S!QGOz1O^VID=(d%H?LpbL-5`e;C%%5 zu9*FPf)A`%{DTA^lC0~lCFcS+Dz8K4&gFdsA6}u5M+olMtQntcn*H*;dF%3{1P@5o z(hFy%njLVHe=74~4dJ`TIn5&${61FVM0>*h%_*qjrH5;X) zv=N?kE#oj+Qa0(lYxS5scej+_vEGhHg^drBY0q7o_*jaMUKbt>BzSD5HFrIwrcHOf zWhU?4jb@Ym$MA0ZWa{O!=g+?Q==7dM{SQkTE*sQ%>@Ar0?E#Ea4b-3*R54=93 Az5oCK From 4f4d81c5f1d390d7a8a75832ac08329adaacec9d Mon Sep 17 00:00:00 2001 From: deerdear Date: Tue, 28 Jul 2026 22:01:04 +0200 Subject: [PATCH 3/3] Fix end-edge attribution, node-id collisions, and stars The paragraph before each pattern's heading is the PREVIOUS pattern's closing links; addEdges attributed it to the current pattern, shifting every 'end' edge one pattern forward and creating 66 self-edges. Validated against two independent transcriptions of the book: as attributed, only 141/1053 end edges matched; shifted to the previous pattern, 1008/1053 match. Whole-graph agreement (undirected Jaccard vs the apl-md transcription) goes 0.34 -> 0.81. Also: fix the 'A ROOM OF ONE'S OWN' case typo (pattern 141's heading never matched, dropping its links and stars), add a self/duplicate edge guard, and repair the committed patterns.graphml (node renames 73->75, 201->211 from the fix-data-errors branch, end-edge shift, dedupe, and 64 star corrections cross-checked against the book). The committed graphml was repaired by transforming the previous file (the pipeline needs a book .txt we don't have); links for the four patterns affected by the id collisions were restored from the apl-md transcription's link metadata. --- patterns.graphml | 3248 +++++++++++++++------------------------------- process.py | 34 +- 2 files changed, 1076 insertions(+), 2206 deletions(-) diff --git a/patterns.graphml b/patterns.graphml index d053c88..d269db1 100644 --- a/patterns.graphml +++ b/patterns.graphml @@ -11,7 +11,7 @@ INDEPENDENT REGIONS TOWNS REGIONS - 0 + 2 THE DISTRIBUTION OF TOWNS @@ -89,7 +89,7 @@ IDENTIFIABLE NEIGHBORHOOD TOWNS COMMUNITY BOUNDARIES - 0 + 2 NEIGHBORHOOD BOUNDARY @@ -101,7 +101,7 @@ WEB OF PUBLIC TRANSPORTATION TOWNS COMMUNITY CONNECTIONS - 0 + 1 RING ROADS @@ -125,19 +125,19 @@ MINI-BUSES TOWNS COMMUNITY CONNECTIONS - 0 + 1 FOUR-STORY LIMIT TOWNS COMMUNITY CHARACTER - 0 + 2 NINE PER CENT PARKING TOWNS COMMUNITY CHARACTER - 0 + 2 PARALLEL ROADS @@ -191,7 +191,7 @@ PROMENADE TOWNS LOCAL CENTERS - 0 + 2 SHOPPING STREET @@ -227,7 +227,7 @@ HOUSE CLUSTER TOWNS HOUSE CLUSTERS - 0 + 2 ROW HOUSES @@ -245,13 +245,13 @@ OLD PEOPLE EVERYWHERE TOWNS HOUSE CLUSTERS - 0 + 2 WORK COMMUNITY TOWNS WORK COMMUNITIES - 0 + 2 INDUSTRIAL RIBBON @@ -281,7 +281,7 @@ MARKET OF MANY SHOPS TOWNS WORK COMMUNITIES - 0 + 2 HEALTH CENTER @@ -317,13 +317,13 @@ NETWORK OF PATHS AND CARS TOWNS ROADS AND PATHS - 0 + 2 MAIN GATEWAYS TOWNS ROADS AND PATHS - 1 + 2 ROAD CROSSING @@ -443,6 +443,7 @@ ADVENTURE PLAYGROUND TOWNS LOCAL COMMON LAND + 0 ANIMALS @@ -450,17 +451,17 @@ LOCAL COMMON LAND 0 - + THE FAMILY TOWNS - LOCAL COMMON LAND + THE FAMILY 1 HOUSE FOR A SMALL FAMILY TOWNS THE FAMILY - 0 + 1 HOUSE FOR A COUPLE @@ -478,19 +479,19 @@ YOUR OWN HOME TOWNS THE FAMILY - 0 + 2 SELF-GOVERNING WORKSHOPS AND OFFICES TOWNS WORK GROUPS - 0 + 2 SMALL SERVICES WITHOUT RED TAPE TOWNS WORK GROUPS - 0 + 1 OFFICE CONNECTIONS @@ -502,7 +503,7 @@ MASTER AND APPRENTICES TOWNS WORK GROUPS - 0 + 1 TEENAGE SOCIETY @@ -520,13 +521,13 @@ CHILDREN'S HOME TOWNS WORK GROUPS - 0 + 1 INDIVIDUALLY OWNED SHOPS TOWNS LOCAL SHOPS - 0 + 2 STREET CAFE @@ -550,7 +551,7 @@ TRAVELER'S INN TOWNS LOCAL SHOPS - 0 + 1 BUS STOP @@ -592,7 +593,7 @@ CIRCULATION REALMS BUILDINGS BUILDING ARRANGEMENT - 2 + 1 MAIN BUILDING @@ -634,13 +635,13 @@ SOUTH FACING OUTDOORS BUILDINGS BUILDING LOCATION - 0 + 2 POSITIVE OUTDOOR SPACE BUILDINGS BUILDING LOCATION - 0 + 2 WINGS OF LIGHT @@ -664,13 +665,13 @@ MAIN ENTRANCE BUILDINGS BUILDING SHAPE - 0 + 2 HALF-HIDDEN GARDEN BUILDINGS BUILDING SHAPE - 0 + 1 ENTRANCE TRANSITION @@ -688,13 +689,13 @@ HIERARCHY OF OPEN SPACE BUILDINGS BUILDING SHAPE - 0 + 1 COURTYARDS WHICH LIVE BUILDINGS BUILDING SHAPE - 0 + 2 CASCADE OF ROOFS @@ -766,7 +767,7 @@ INTIMACY GRADIENT BUILDINGS GRADIENTS OF SPACE - 0 + 2 INDOOR SUNLIGHT @@ -778,7 +779,7 @@ COMMON AREAS AT THE HEART BUILDINGS GRADIENTS OF SPACE - 0 + 2 ENTRANCE ROOM @@ -814,19 +815,19 @@ TAPESTRY OF LIGHT AND DARK BUILDINGS GRADIENTS OF SPACE - 0 + 1 COUPLE'S REALM BUILDINGS HOUSE ROOMS - 0 + 1 CHILDREN'S REALM BUILDINGS HOUSE ROOMS - 0 + 1 SLEEPING TO THE EAST @@ -838,25 +839,25 @@ FARMHOUSE KITCHEN BUILDINGS HOUSE ROOMS - 0 + 2 PRIVATE TERRACE ON THE STREET BUILDINGS HOUSE ROOMS - 0 + 2 A ROOM OF ONE's OWN BUILDINGS HOUSE ROOMS - 0 + 2 SEQUENCE OF SITTING SPACES BUILDINGS HOUSE ROOMS - 0 + 1 BED CLUSTER @@ -928,7 +929,7 @@ TEENAGER'S COTTAGE BUILDINGS OUTBUILDINGS - 0 + 1 OLD AGE COTTAGE @@ -958,7 +959,7 @@ LIGHT ON TWO SIDES OF EVERY ROOM BUILDINGS ROOM EDGES - 0 + 2 BUILDING EDGE @@ -982,7 +983,7 @@ OUTDOOR ROOM BUILDINGS ROOM EDGES - 0 + 2 STREET WINDOWS @@ -1006,13 +1007,13 @@ SIX-FOOT BALCONY BUILDINGS ROOM EDGES - 0 + 2 CONNECTION TO THE EARTH BUILDINGS ROOM EDGES - 0 + 2 TERRACED SLOPE @@ -1144,25 +1145,25 @@ CEILING HEIGHT VARIETY BUILDINGS ROOM SHAPES - 0 + 2 THE SHAPE OF INDOOR SPACE BUILDINGS ROOM SHAPES - 0 + 2 WINDOWS OVERLOOKING LIFE BUILDINGS ROOM SHAPES - 0 + 1 HALF-OPEN WALL BUILDINGS ROOM SHAPES - 0 + 1 INTERIOR WINDOWS @@ -1186,13 +1187,13 @@ THICK WALLS BUILDINGS WALLS - 0 + 2 CLOSETS BETWEEN ROOMS BUILDINGS WALLS - 0 + 1 SUNNY COUNTER @@ -1210,12 +1211,13 @@ WAIST-HIGH SHELF BUILDINGS WALLS + 0 BUILT-IN SEATS BUILDINGS WALLS - 0 + 1 CHILD CAVES @@ -1233,7 +1235,7 @@ STRUCTURE FOLLOWS SOCIAL SPACES CONSTRUCTION PHILOSOPHY OF STRUCTURE - 0 + 2 EFFICIENT STRUCTURE @@ -1265,23 +1267,23 @@ STRUCTURAL LAYOUT 0 - + THICKENING THE OUTER WALLS - BUILDINGS - WALLS - 0 + CONSTRUCTION + STRUCTURAL LAYOUT + 1 COLUMNS AT THE CORNERS CONSTRUCTION STRUCTURAL LAYOUT - 0 + 2 FINAL COLUMN DISTRIBUTION CONSTRUCTION STRUCTURAL LAYOUT - 0 + 2 ROOT FOUNDATIONS @@ -1317,19 +1319,19 @@ FLOOR-CEILING VAULTS CONSTRUCTION STRUCTURAL FRAME - 0 + 2 ROOF VAULTS CONSTRUCTION STRUCTURAL FRAME - 0 + 1 NATURAL DOORS AND WINDOWS CONSTRUCTION OPENINGS - 0 + 2 LOW SILL @@ -1353,7 +1355,7 @@ FRAMES AS THICKENED EDGES CONSTRUCTION OPENINGS - 0 + 2 COLUMN PLACE @@ -1419,7 +1421,7 @@ WINDOWS WHICH OPEN WIDE CONSTRUCTION SURFACES - 0 + 1 SOLID DOORS WITH GLASS @@ -1443,7 +1445,7 @@ HALF-INCH TRIM CONSTRUCTION SURFACES - 0 + 2 SEAT SPOTS @@ -1461,7 +1463,7 @@ SITTING WALL CONSTRUCTION OUTDOOR DETAILS - 1 + 2 CANVAS ROOFS @@ -1485,7 +1487,7 @@ PAVING WITH CRACKS BETWEEN THE STONES CONSTRUCTION OUTDOOR DETAILS - 0 + 2 SOFT TILE AND BRICK @@ -1521,7 +1523,7 @@ THINGS FROM YOUR LIFE CONSTRUCTION ORNAMENTATION - 0 + 1 start @@ -1529,13 +1531,10 @@ start - - end - - + end - + end @@ -1544,37 +1543,28 @@ start - - end - - + end - + end - + end start - + end end - - start - - - end - - + end - + end @@ -1583,40 +1573,28 @@ start - - start - - - start - start - - end - - + end - + end - - start - start - + end - + end - + end - + end @@ -1625,22 +1603,22 @@ start - + end - + end - + end - + end - + end - + end @@ -1652,85 +1630,67 @@ start - - end - - + end - + end - + end - + end - + end - - start - - - start - - - start - start - - start - - - end - - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end @@ -1742,27 +1702,21 @@ start - - end - - + end - + end - + end - + end - + end - - start - start @@ -1775,19 +1729,16 @@ start - - end - - + end - + end - + end - + end @@ -1802,22 +1753,22 @@ start - + end - + end - + end - + end - + end - + end @@ -1829,22 +1780,22 @@ start - + end - + end - + end - + end - + end - + end @@ -1853,58 +1804,49 @@ start - - start - start - - start - - - end - - + end - + end - + end - + end - + end - + end - + end - + end start - + end - + end - + end - + end - + end @@ -1913,16 +1855,16 @@ start - + end - + end - + end - + end @@ -1934,58 +1876,58 @@ start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end @@ -1997,9 +1939,6 @@ start - - start - start @@ -2012,28 +1951,22 @@ start - - start - - - end - - + end - + end - + end - + end - + end - + end @@ -2048,37 +1981,25 @@ start - - start - - - start - - - start - start - + end - - end - - + end - + end - + end - + end - + end @@ -2090,88 +2011,73 @@ start - - end - - - end - - + end - + end - + end - + end - + end - + end - - start - start - - start - - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start - + end - + end - + end - + end - + end - + end @@ -2183,9 +2089,6 @@ start - - start - start @@ -2195,190 +2098,154 @@ start - + end - + end - + end - + end - + end start - - start - start - + end - - end - - - end - - + end - + end - + end - + end - + end - + end - + end - + end - - start - - - start - - + end - + end - + end - + end - + end - + end - + end - + end - + end start - - start - - - start - - + end - + end - + end - + end - + end - + end - - start - start - - start - - - end - - - end - - + end - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end start - + end - + end - + end - + end - + end - + end @@ -2390,58 +2257,52 @@ start - - end - - + end - + end - + end - + end start - - start - - + end - + end - + end - + end - + end start - + end - + end - + end - + end - + end @@ -2459,28 +2320,28 @@ start - + end - + end - + end - + end - + end - + end - + end - + end @@ -2489,82 +2350,55 @@ start - - start - start start - - start - start - - end - - + end - + end - + end - + end - - start - start start - + end - - start - - - start - start - - start - start start - - end - - - end - - + end - + end - + end - + end @@ -2582,64 +2416,40 @@ start - - end - - - end - - - end - - + end - + end - - start - - start - - end - + end - + end - - start - start - - start - - - end - - + end - + end - + end - + end - + end - + end @@ -2651,13 +2461,13 @@ start - + end - + end - + end @@ -2678,76 +2488,55 @@ start - - start - - + end - + end - + end - - start - - - start - start start - + end - + end - + end - + end - + end - + end - - start - - - start - - - start - start start - - end - - + end - + end - + end - + end @@ -2756,30 +2545,21 @@ start - - start - - - start - - + end - + end - + end - + end - + end - - start - start @@ -2789,52 +2569,37 @@ start - + end - + end - + end - + end - + end - + end - + end - - start - - - start - - - start - - - start - start - - end - - + end - + end - + end @@ -2846,22 +2611,19 @@ start - - start - start - + end - + end - + end - + end @@ -2870,85 +2632,64 @@ start - - start - - + end - + end - + end - + end - - start - - - start - - + end - + end - + end - + end - + end - + end start - - start - start - - start - start start - - end - - + end - + end - + end - - end - - + end - + end - + end @@ -2960,36 +2701,30 @@ start - - start - start start - + end - + end - + end - + end - + end - + end - - start - start @@ -2999,42 +2734,39 @@ start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end start - - start - start @@ -3047,61 +2779,25 @@ start - + end - + end - + end - - start + + end - - start - - - end - - - end - - - end - - - end - - - end - - - start - - - start - - - end - - - end - - - end - - - end - - + end - + end - + end @@ -3113,85 +2809,58 @@ start - - start - - + end - + end - + end - + end - + end - + end - - start - - - start - - - start - - - start - - - start - - - start - - - start - - + end - + end - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end - + end @@ -3200,52 +2869,40 @@ start - + end - + end - - start - - - start - start start - - start - - + end - + end - + end - + end - + end - + end - + end - - end - - + end @@ -3254,79 +2911,61 @@ start - - start - - - start - start - + end - + end - + end - + end - + end start - - start - start - - end - - + end - + end - + end - + end - + end - + end start - - start - - + end - + end - + end - - end - - + end @@ -3335,12 +2974,6 @@ start - - start - - - start - start @@ -3350,19 +2983,19 @@ start - + end - + end - + end - + end - + end @@ -3371,25 +3004,25 @@ start - + end - + end - + end - + end - + end - + end - + end @@ -3398,60 +3031,51 @@ start - - start - - - end - - + end - + end - + end - + end - + end - + end start - + end - + end - + end - + end - + end - + end - + end start - - start - start @@ -3461,19 +3085,16 @@ start - + end - + end - + end - - end - - + end @@ -3497,126 +3118,108 @@ start - + end - + end - + end start - - start - - + end - + end - + end - + end - + end - + end - - start - start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start start - - end - - - end - - + end - + end - + end - + end - + end - + end - + end - + end - - start - start @@ -3629,123 +3232,93 @@ start - - start - - - start - start - - start - - - start - start - - start - - + end - + end - + end start - - start - start - - end - - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end start - - start - start - - start - start @@ -3755,55 +3328,43 @@ start - - start - - + end - + end - + end - + end - - start - start start - - start - start - - end - - + end - + end - + end - + end - + end - + end @@ -3812,30 +3373,21 @@ start - + end - - end - - + end - + end - + end - + end - - start - - - start - start @@ -3860,37 +3412,37 @@ start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end @@ -3899,34 +3451,28 @@ start - - start - start start - - end - - + end - + end - + end - + end - + end - + end @@ -3935,22 +3481,22 @@ start - + end - + end - + end - + end - + end - + end @@ -3959,70 +3505,52 @@ start - - start + + end - + end - + end - + end - + end - + end - + end - + end - + + start + + end - + end - - start - - - start - - - end - - - end - - - end - - - end - - - end - - + end - + end - + end - + end - + end @@ -4034,34 +3562,31 @@ start - - end - - + end - + end - + end - + end - + end - + end - + end - + end - + end @@ -4070,19 +3595,16 @@ start - - end - - + end - + end - + end - + end @@ -4091,36 +3613,27 @@ start - - start - - - end - - + end - + end - + end - + end - + end - + end start - - start - start @@ -4142,76 +3655,55 @@ start - - start - - - start - - - end - - + end - + end - + end - + end - + end - + end - + end - - start - start - - start - start - - start - start - - end - - + end - + end - + end - + end - + end - + end - + end @@ -4220,9 +3712,6 @@ start - - start - start @@ -4232,114 +3721,78 @@ start - - end - - - end - - + end - + end - + end - + end - + end - - start - - - start - - - start - - - start - - - start - - + end - + end - + end - + end - + end - + end - + end - + end start - - start - - - start - start - - start - - + end - + end - + end - + end - + end - + end - + end - + end - - start - start - - start - start @@ -4349,48 +3802,36 @@ start - - end - - + end - + end - + end - - end - - + end - + end - + end - + end - + end - + end - - start - start - - start - start @@ -4400,151 +3841,133 @@ start - + end - + end - + end - - start - start - + end - + end - + end - + end - + end - + end - + end - - start - start start - + end - + end - + end - + end - + end - + end - + end - + end - - start - start - - start - start start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end start - - start - - - end - - + end - + end - + end - + end - + end - + end - + end - + end @@ -4556,72 +3979,60 @@ start - - start - - + end - - end - - + end - + end - + end - + end - + end start - - start - start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start @@ -4634,40 +4045,28 @@ start - - end - - + end - + end - + end - + end - - start - start - - start - start - - end - - + end - + end @@ -4679,25 +4078,22 @@ start - - start - - + end - + end - + end - + end - + end - + end @@ -4706,169 +4102,133 @@ start - - start - start - - start - - + end - + end - + end - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end start - - start - start - - end - - - end - - - end - - - end - - - end - - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start start - - start - start start - + end - + end - + end - - end - - + end - + end - + end - + end @@ -4883,19 +4243,19 @@ start - + end - + end - + end - + end - + end @@ -4910,40 +4270,31 @@ start - - start - start - + end - + end - + end - + end - - start - - - start - - + end - + end - + end - + end @@ -4955,31 +4306,25 @@ start - - start - start - + end - + end - + end - - end - - + end - + end - + end @@ -4994,28 +4339,28 @@ start - + end - + end - + end - + end - + end - + end - + end - + end @@ -5033,28 +4378,22 @@ start - + end - - end - - - end - - + end - + end - + end - + end - + end @@ -5081,31 +4420,25 @@ start - - start - start - + end - + end - - end - - + end - + end - + end - + end @@ -5114,54 +4447,39 @@ start - - end - - - end - - + end - + end - + end - + end - + end - - start - start - - start - start start - + end - + end start - - start - start @@ -5174,9 +4492,6 @@ start - - start - start @@ -5186,25 +4501,22 @@ start - - start - - + end - + end - + end - + end - + end - + end @@ -5219,117 +4531,87 @@ start - - start - start start - - start - - + end - + end - + end - + end - + end - - start - start start - - end - - - end - - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - - - start - start - - end - - + end - + end - + end - + end - + end - + end - - start - start start - - start - start @@ -5339,25 +4621,25 @@ start - + end - + end - + end - + end - + end - + end - + end @@ -5366,34 +4648,31 @@ start - - start - start - + end - + end - + end - + end - + end - + end - + end - + end @@ -5405,57 +4684,39 @@ start - - start - start start - - start - - + end - + end - + end - + end - - start - start start - - start - - - start - - + end - + end - + end - - start - start @@ -5468,27 +4729,21 @@ start - - end - - + end - + end - + end - + end - + end - - start - start @@ -5501,31 +4756,25 @@ start - + end - + end - + end - + end - - start - start - - end - - + end - + end @@ -5537,51 +4786,39 @@ start - + end - + end - + end - + end - + end - - start - start - - start - start - + end - + end - + end - + end - - start - - - start - start @@ -5594,25 +4831,19 @@ start - - start - - - end - - + end - + end - + end - + end - + end @@ -5624,40 +4855,34 @@ start - + end - + end - + end - + end - - start - start - + end - + end start - - start - - + end - + end @@ -5672,18 +4897,12 @@ start - - end - - + end start - - start - start @@ -5699,67 +4918,46 @@ start - - start - - - start - - - start - - - end - - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end - + end - + end - - start - - - start - - + end - + end - + end @@ -5768,70 +4966,61 @@ start - - start - start - + end - + end - + end - + end - + end - + end - - start - - + end - + end - + end - + end - + end - + end - + end - + end - - start - start - + end - + end - + end @@ -5843,177 +5032,129 @@ start - - start - start start - - end - - + end - + end - + end - - end - - + end - + end - + end start - + end - + end - end + start end - + end - - start + + end - + start - + start - - start + + end - - end - - + end - + end - + end - - start - - - start - - - start - - + end - - end - - - end - - - end - - - end - - - end - - + end start - - end - - + end - + end - + end - + end - - start - start start - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start start - - start - start @@ -6023,55 +5164,43 @@ start - - end - - + end - + end - + end - + end - + end end - - end - - - end - - + end - - start - start start - + end - + end - + end - + end @@ -6083,210 +5212,120 @@ start - - end - - + end - + end - + end - + end - + end - + end - + end - + end - - start - - - start - - - start - - + end - - start - - - start - - - start - - + end - + end - + end - - start - start start - - start - - - end - - - start - start - + end start - - end - - + end - + end - - start - start - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - + end - - start - start start - + end - + end - - end - - - end - - - end - - - start - - - start - start - - start - start start - - start - - - start - - - start - - - start - - - start - - - start - - - start - - - end - - - end - - - end - start @@ -6299,39 +5338,27 @@ start - + end - + end start - - start - - - start - - - start - - + end - + end - + end - + end - - start - start @@ -6353,25 +5380,16 @@ start - - end - - - end - - start + end start - + end - - end - - + end @@ -6383,34 +5401,22 @@ start - - end - - - end - - + end - + end - + end - - start - start start - - end - - + end @@ -6419,13 +5425,10 @@ start - - start - - + end - + end @@ -6434,15 +5437,9 @@ start - - start - start - - start - start @@ -6455,37 +5452,28 @@ start - - start - start - + end - - end - - + end - - start - start - + end - + end - + end - + end @@ -6509,75 +5497,39 @@ start - - end - - + end - + end - + end - + end start - - start - start - - end - - + end - + end - + end - - start - start - - start - - - start - start - - start - - - start - - - start - - - start - - - start - - - start - start @@ -6590,37 +5542,25 @@ start - + end - + end - - end - - - end - - + end start - - start - start start - - end - - + end @@ -6629,16 +5569,16 @@ start - + end - + end - + end - + end @@ -6650,25 +5590,13 @@ start - - end - - - end - - + end - - start - - - start - start - + end @@ -6677,18 +5605,15 @@ start - + end - + end start - - start - start @@ -6698,21 +5623,18 @@ start - + end - + end - + end start - - start - start @@ -6722,81 +5644,48 @@ start - - end - - - end - - + end start - - start - start - - start - - + end start - - start - - + end - - start - - - start - - - start - start start - + end - + end - + end - + end start - - start - start - - start - - - start - start @@ -6806,9 +5695,6 @@ start - - start - start @@ -6821,22 +5707,7 @@ start - - start - - - start - - - start - - - end - - - end - - + end @@ -6854,34 +5725,22 @@ start - - start - start - - start - - - start - start start - + end - - end - - + end - + end @@ -6893,9 +5752,6 @@ start - - start - start @@ -6908,20 +5764,8 @@ start - - start - - - end - - start - - - start - - - start + end start @@ -6932,24 +5776,12 @@ start - + end - + end - - end - - - start - - - start - - - start - start @@ -6971,21 +5803,12 @@ start - - start - start start - - end - - - end - start @@ -7010,9 +5833,6 @@ start - - start - start @@ -7025,51 +5845,36 @@ start - - start - start - + end - + end start - - start - start - - end - - - end - - + end - + end - + end - + end start - - start - start @@ -7079,22 +5884,67 @@ start - + start - + start - + start - + + start + + + start + + start - + + start + + + start + + + start + + + end + + + end + + + start + + + start + + + start + + + start + + + start + + + start + + + start + + + end + + end - + end diff --git a/process.py b/process.py index b6ee280..7d21800 100644 --- a/process.py +++ b/process.py @@ -150,7 +150,7 @@ (138, 'SLEEPING TO THE EAST'), (139, 'FARMHOUSE KITCHEN'), (140, 'PRIVATE TERRACE ON THE STREET'), - (141, "A ROOM OF ONE's OWN"), + (141, "A ROOM OF ONE'S OWN"), (142, 'SEQUENCE OF SITTING SPACES'), (143, 'BED CLUSTER'), (144, 'BATHING ROOM'), @@ -436,7 +436,20 @@ def setStars(lines): for pattern in notFound: nodesDict[pattern]['stars'] = 0 +def addEdge(g, seen, parent, child, origin): + # Skip self-references and edges we've already recorded (the book declares + # most links in both patterns' texts). + if parent is child: + return + if (parent.id, child.id) in seen or (child.id, parent.id) in seen: + return + seen.add((parent.id, child.id)) + e = g.add_edge(parent, child, True) + e['origin'] = origin + def addEdges(g, lines): + seen = set() + prevNode = None for i, line in enumerate(lines): match = isHeading(line) if match: @@ -444,14 +457,21 @@ def addEdges(g, lines): pattern = next((p for p in patterns if group in p[1]), None) if pattern != None: node = nodesDict[pattern[0]] + # The paragraph after this heading is this pattern's preamble: it + # names the LARGER patterns this one helps complete. for string in re.findall(r'\((\d+)\)', lines[i + 2]): if int(string) in nodesDict: - e = g.add_edge(nodesDict[int(string)], node, True) - e['origin'] = 'start' - for string in re.findall(r'\((\d+)\)', lines[i - 2]): - if int(string) in nodesDict: - e = g.add_edge(node, nodesDict[int(string)], True) - e['origin'] = 'end' + addEdge(g, seen, nodesDict[int(string)], node, 'start') + # The paragraph before this heading is the PREVIOUS pattern's + # closing: it names the smaller patterns that complete IT. It must + # be attributed to prevNode, not to this pattern - attributing it + # here shifted every 'end' edge one pattern forward and produced + # 66 self-edges. + if prevNode is not None: + for string in re.findall(r'\((\d+)\)', lines[i - 2]): + if int(string) in nodesDict: + addEdge(g, seen, prevNode, nodesDict[int(string)], 'end') + prevNode = node def postProcessGraph(g, lines): # Add manual fixes here.