File size: 81,252 Bytes
91eaff6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c32bf0b9-1445-4ede-ae49-7dd63ff3b08e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:37.268964Z",
     "iopub.status.busy": "2024-01-17T01:35:37.268658Z",
     "iopub.status.idle": "2024-01-17T01:35:37.284720Z",
     "shell.execute_reply": "2024-01-17T01:35:37.282292Z",
     "shell.execute_reply.started": "2024-01-17T01:35:37.268927Z"
    }
   },
   "outputs": [],
   "source": [
    "# for use in tutorial and development; do not include this `sys.path` change in production:\n",
    "import sys ; sys.path.insert(0, \"../\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8ff5d81-110c-42ae-8aa7-ed4fffea40c6",
   "metadata": {},
   "source": [
    "# reproduce results from the \"InGram\" paper"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e847d0a-bc6c-470a-9fef-620ebbdbbbc3",
   "metadata": {},
   "source": [
    "This is an attempt to reproduce the _graph of relations_ example given in `lee2023ingram`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61d8d39a-23e4-48e7-b8f4-0dd724ccf586",
   "metadata": {},
   "source": [
    "## environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "22489527-2ad5-4e3c-be23-f511e6bcf69f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:37.296455Z",
     "iopub.status.busy": "2024-01-17T01:35:37.295661Z",
     "iopub.status.idle": "2024-01-17T01:35:45.520968Z",
     "shell.execute_reply": "2024-01-17T01:35:45.519870Z",
     "shell.execute_reply.started": "2024-01-17T01:35:37.296419Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import pathlib\n",
    "import typing\n",
    "\n",
    "from icecream import ic\n",
    "from pyinstrument import Profiler\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import pyvis\n",
    "\n",
    "import textgraphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "438f5775-487b-493e-a172-59b652b94955",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.525301Z",
     "iopub.status.busy": "2024-01-17T01:35:45.524842Z",
     "iopub.status.idle": "2024-01-17T01:35:45.547432Z",
     "shell.execute_reply": "2024-01-17T01:35:45.546101Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.525270Z"
    }
   },
   "outputs": [],
   "source": [
    "%load_ext watermark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "adc052dd-5cca-4d11-b543-3f0999f4f883",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.548916Z",
     "iopub.status.busy": "2024-01-17T01:35:45.548691Z",
     "iopub.status.idle": "2024-01-17T01:35:45.592124Z",
     "shell.execute_reply": "2024-01-17T01:35:45.590790Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.548889Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Last updated: 2024-01-16T17:35:45.550539-08:00\n",
      "\n",
      "Python implementation: CPython\n",
      "Python version       : 3.10.11\n",
      "IPython version      : 8.20.0\n",
      "\n",
      "Compiler    : Clang 13.0.0 (clang-1300.0.29.30)\n",
      "OS          : Darwin\n",
      "Release     : 21.6.0\n",
      "Machine     : x86_64\n",
      "Processor   : i386\n",
      "CPU cores   : 8\n",
      "Architecture: 64bit\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%watermark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6e4618da-daf9-44c9-adbb-e5781dba5504",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.597302Z",
     "iopub.status.busy": "2024-01-17T01:35:45.596553Z",
     "iopub.status.idle": "2024-01-17T01:35:45.623704Z",
     "shell.execute_reply": "2024-01-17T01:35:45.621991Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.597251Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "matplotlib: 3.8.2\n",
      "pandas    : 2.1.4\n",
      "pyvis     : 0.3.2\n",
      "textgraphs: 0.5.0\n",
      "sys       : 3.10.11 (v3.10.11:7d4cc5aa85, Apr  4 2023, 19:05:19) [Clang 13.0.0 (clang-1300.0.29.30)]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%watermark --iversions"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a04e3dc-57d8-43a4-a342-cc38b86fc6a6",
   "metadata": {},
   "source": [
    "## load example graph"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c567afd-2f44-4391-899a-da6aba3d222e",
   "metadata": {},
   "source": [
    "load from a JSON file which replicates the data for the \"Figure 3\" example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "630430c5-21dc-4897-9a4b-3b01baf3de17",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.625764Z",
     "iopub.status.busy": "2024-01-17T01:35:45.625341Z",
     "iopub.status.idle": "2024-01-17T01:35:45.633487Z",
     "shell.execute_reply": "2024-01-17T01:35:45.632477Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.625720Z"
    }
   },
   "outputs": [],
   "source": [
    "graph: textgraphs.GraphOfRelations = textgraphs.GraphOfRelations(\n",
    "    textgraphs.SimpleGraph()\n",
    ")\n",
    "\n",
    "ingram_path: pathlib.Path = pathlib.Path(os.getcwd()) / \"ingram.json\"\n",
    "\n",
    "graph.load_ingram(\n",
    "    ingram_path,\n",
    "    debug = False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01152885-f301-49b1-ab61-f5b19d81c036",
   "metadata": {},
   "source": [
    "set up the statistical stack profiling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2a289117-301d-4027-ae1b-200201fb5f93",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.639466Z",
     "iopub.status.busy": "2024-01-17T01:35:45.639216Z",
     "iopub.status.idle": "2024-01-17T01:35:45.646105Z",
     "shell.execute_reply": "2024-01-17T01:35:45.644476Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.639439Z"
    }
   },
   "outputs": [],
   "source": [
    "profiler: Profiler = Profiler()\n",
    "profiler.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf9d4f99-b82b-4d11-a9a4-31d0337f4aa8",
   "metadata": {},
   "source": [
    "## decouple graph edges into \"seeds\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "da6fcb0f-b2ac-4f74-af39-2c129c750cab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:45.648335Z",
     "iopub.status.busy": "2024-01-17T01:35:45.647905Z",
     "iopub.status.idle": "2024-01-17T01:35:46.520730Z",
     "shell.execute_reply": "2024-01-17T01:35:46.518237Z",
     "shell.execute_reply.started": "2024-01-17T01:35:45.648291Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- triples in source graph ---\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| edge.src_node: 0, rel_id: 1, edge.dst_node: 1\n",
      "ic| edge.src_node: 0, rel_id: 0, edge.dst_node: 2\n",
      "ic| edge.src_node: 0, rel_id: 0, edge.dst_node: 3\n",
      "ic| edge.src_node: 4, rel_id: 2, edge.dst_node: 2\n",
      "ic| edge.src_node: 4, rel_id: 2, edge.dst_node: 3\n",
      "ic| edge.src_node: 4, rel_id: 1, edge.dst_node: 5\n",
      "ic| edge.src_node: 6, rel_id: 1, edge.dst_node: 5\n",
      "ic| edge.src_node: 6, rel_id: 2, edge.dst_node: 7\n",
      "ic| edge.src_node: 6, rel_id: 4, edge.dst_node: 8\n",
      "ic| edge.src_node: 9, "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Steven_Spielberg Profession Director\n",
      " Steven_Spielberg Directed Catch_Me_If_Can\n",
      " Steven_Spielberg Directed Saving_Private_Ryan\n",
      " Tom_Hanks ActedIn Catch_Me_If_Can\n",
      " Tom_Hanks ActedIn Saving_Private_Ryan\n",
      " Tom_Hanks Profession Actor\n",
      " Mark_Hamil Profession Actor\n",
      " Mark_Hamil ActedIn Star_Wars\n",
      " Mark_Hamil BornIn California\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "rel_id: 5, edge.dst_node: 10\n",
      "ic| edge.src_node: 9, rel_id: 4, edge.dst_node: 10\n",
      "ic| edge.src_node: 9, rel_id: 3, edge.dst_node: 8\n",
      "ic| edge.src_node: 11, rel_id: 4, edge.dst_node: 12\n",
      "ic| edge.src_node: 11, rel_id: 3, edge.dst_node: 12\n",
      "ic| edge.src_node: 11, rel_id: 3, edge.dst_node: 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Brad_Pitt Nationality USA\n",
      " Brad_Pitt BornIn USA\n",
      " Brad_Pitt LivedIn California\n",
      " Clint_Eastwood BornIn San_Francisco\n",
      " Clint_Eastwood LivedIn San_Francisco\n",
      " Clint_Eastwood LivedIn California\n"
     ]
    }
   ],
   "source": [
    "graph.seeds(\n",
    "    debug = True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a9c0fd41-45e9-4019-94bf-8e2cf5c33454",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:46.524005Z",
     "iopub.status.busy": "2024-01-17T01:35:46.523531Z",
     "iopub.status.idle": "2024-01-17T01:35:46.531929Z",
     "shell.execute_reply": "2024-01-17T01:35:46.530922Z",
     "shell.execute_reply.started": "2024-01-17T01:35:46.523965Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- nodes in source graph ---\n",
      "n:  0, Steven_Spielberg\n",
      " head: []\n",
      " tail: [(0, 'Profession', 1), (0, 'Directed', 2), (0, 'Directed', 3)]\n",
      "n:  1, Director\n",
      " head: [(0, 'Profession', 1)]\n",
      " tail: []\n",
      "n:  2, Catch_Me_If_Can\n",
      " head: [(0, 'Directed', 2), (4, 'ActedIn', 2)]\n",
      " tail: []\n",
      "n:  3, Saving_Private_Ryan\n",
      " head: [(0, 'Directed', 3), (4, 'ActedIn', 3)]\n",
      " tail: []\n",
      "n:  4, Tom_Hanks\n",
      " head: []\n",
      " tail: [(4, 'ActedIn', 2), (4, 'ActedIn', 3), (4, 'Profession', 5)]\n",
      "n:  5, Actor\n",
      " head: [(4, 'Profession', 5), (6, 'Profession', 5)]\n",
      " tail: []\n",
      "n:  6, Mark_Hamil\n",
      " head: []\n",
      " tail: [(6, 'Profession', 5), (6, 'ActedIn', 7), (6, 'BornIn', 8)]\n",
      "n:  7, Star_Wars\n",
      " head: [(6, 'ActedIn', 7)]\n",
      " tail: []\n",
      "n:  8, California\n",
      " head: [(6, 'BornIn', 8), (9, 'LivedIn', 8), (11, 'LivedIn', 8)]\n",
      " tail: []\n",
      "n:  9, Brad_Pitt\n",
      " head: []\n",
      " tail: [(9, 'Nationality', 10), (9, 'BornIn', 10), (9, 'LivedIn', 8)]\n",
      "n: 10, USA\n",
      " head: [(9, 'Nationality', 10), (9, 'BornIn', 10)]\n",
      " tail: []\n",
      "n: 11, Clint_Eastwood\n",
      " head: []\n",
      " tail: [(11, 'BornIn', 12), (11, 'LivedIn', 12), (11, 'LivedIn', 8)]\n",
      "n: 12, San_Francisco\n",
      " head: [(11, 'BornIn', 12), (11, 'LivedIn', 12)]\n",
      " tail: []\n",
      "\n",
      "--- edges in source graph ---\n",
      "e:  0, Directed\n",
      "e:  1, Profession\n",
      "e:  2, ActedIn\n",
      "e:  3, LivedIn\n",
      "e:  4, BornIn\n",
      "e:  5, Nationality\n"
     ]
    }
   ],
   "source": [
    "graph.trace_source_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e7cb5f3-132c-4999-81eb-4f6167a31c9e",
   "metadata": {},
   "source": [
    "## construct a _graph of relations_"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "105702ed-7f9c-42ca-a57b-f1b15a206acf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-02T22:31:57.839227Z",
     "iopub.status.busy": "2024-01-02T22:31:57.838113Z",
     "iopub.status.idle": "2024-01-02T22:31:57.853374Z",
     "shell.execute_reply": "2024-01-02T22:31:57.851669Z",
     "shell.execute_reply.started": "2024-01-02T22:31:57.839155Z"
    }
   },
   "source": [
    "Transform the graph data into _graph of relations_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "eae8da18-f1be-4673-94e7-7b633bab9bd1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:46.534228Z",
     "iopub.status.busy": "2024-01-17T01:35:46.533720Z",
     "iopub.status.idle": "2024-01-17T01:35:48.718340Z",
     "shell.execute_reply": "2024-01-17T01:35:48.715493Z",
     "shell.execute_reply.started": "2024-01-17T01:35:46.534166Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| node_id: 0, len(seeds"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- transformed triples ---\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "): 3\n",
      "ic| trans_arc: TransArc(pair_key=(0, 1),\n",
      "                        a_rel=1,\n",
      "                        b_rel=0,\n",
      "                        node_id=0,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(0, 1),\n",
      "                        a_rel=1,\n",
      "                        b_rel=0,\n",
      "                        node_id=0,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(0, 0),\n",
      "                        a_rel=0,\n",
      "                        b_rel=0,\n",
      "                        node_id=0,\n",
      "                        a_dir=<RelDir"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " (0, 1) Profession.tail Steven_Spielberg Directed.tail\n",
      "\n",
      " (0, 1) Profession.tail Steven_Spielberg Directed.tail\n",
      "\n",
      " (0, 0) Directed.tail Steven_Spielberg Directed.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| node_id: 1, len(seeds"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "): 1\n",
      "ic| node_id: 2, len(seeds): 2\n",
      "ic| trans_arc: TransArc(pair_key=(0, 2),\n",
      "                        a_rel=0,\n",
      "                        b_rel=2,\n",
      "                        node_id=2,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " (0, 2) Directed.head Catch_Me_If_Can ActedIn.head\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RelDir.HEAD: 0>)\n",
      "ic| node_id: 3, len(seeds): 2\n",
      "ic| trans_arc: TransArc(pair_key=(0, 2),\n",
      "                        a_rel=0,\n",
      "                        b_rel=2,\n",
      "                        node_id=3,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n",
      "ic| node_id"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (0, 2) Directed.head Saving_Private_Ryan ActedIn.head\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ": 4, len(seeds): 3\n",
      "ic| trans_arc: TransArc(pair_key=(2, 2),\n",
      "                        a_rel=2,\n",
      "                        b_rel=2,\n",
      "                        node_id=4,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(1, 2),\n",
      "                        a_rel=2,\n",
      "                        b_rel=1,\n",
      "                        node_id=4,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(1, 2)"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " (2, 2) ActedIn.tail Tom_Hanks ActedIn.tail\n",
      "\n",
      " (1, 2) ActedIn.tail Tom_Hanks Profession.tail\n",
      "\n",
      " (1, 2) ActedIn.tail Tom_Hanks Profession.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ",\n",
      "                        a_rel=2,\n",
      "                        b_rel=1,\n",
      "                        node_id=4,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic|"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " node_id: 5, len(seeds): 2\n",
      "ic| trans_arc: TransArc(pair_key=(1, 1),\n",
      "                        a_rel=1,\n",
      "                        b_rel=1,\n",
      "                        "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " (1, 1) Profession.head Actor Profession.head\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "node_id=5,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n",
      "ic| node_id: 6, len(seeds): 3\n",
      "ic| trans_arc: TransArc(pair_key=(1, 2),\n",
      "                        a_rel=1,\n",
      "                        b_rel=2,\n",
      "                        node_id=6,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (1, 2) Profession.tail Mark_Hamil ActedIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "1>)\n",
      "ic| trans_arc: TransArc(pair_key=(1, 4),\n",
      "                        a_rel=1,\n",
      "                        b_rel=4,\n",
      "                        node_id=6,\n",
      "                        a_dir"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (1, 4) Profession.tail Mark_Hamil BornIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(2, 4),\n",
      "                        a_rel=2,\n",
      "                        b_rel=4,\n",
      "                        node_id=6,\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (2, 4) ActedIn.tail Mark_Hamil BornIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| node_id: 7, len(seeds): 1\n",
      "ic| node_id: 8, len(seeds): 3\n",
      "ic| trans_arc: TransArc(pair_key=(3, 4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=8,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD:"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 4) BornIn.head California LivedIn.head\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 0>)\n",
      "ic| trans_arc: TransArc(pair_key=(3, 4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=8,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n",
      "ic| trans_arc: TransArc(pair_key=(3, 3),\n",
      "                        a_rel=3,\n",
      "                        b_rel=3,\n",
      "                        node_id=8,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n",
      "ic| node_id: 9, len(seeds): 3\n",
      "ic"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 4) BornIn.head California LivedIn.head\n",
      "\n",
      " (3, 3) LivedIn.head California LivedIn.head\n",
      "\n",
      " (4, 5) Nationality.tail Brad_Pitt BornIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| trans_arc: TransArc(pair_key=(4, 5),\n",
      "                        a_rel=5,\n",
      "                        b_rel=4,\n",
      "                        node_id=9,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(3, 5),\n",
      "                        a_rel=5,\n",
      "                        b_rel=3,\n",
      "                        node_id=9,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 5) Nationality.tail Brad_Pitt LivedIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(3, 4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=9,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| node_id: 10, len(seeds): 2\n",
      "ic| trans_arc: TransArc(pair_key=(4, 5),\n",
      "                        a_rel=5,\n",
      "                        b_rel=4,\n",
      "                        node_id=10,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n",
      "ic| node_id: 11, len(seeds): 3\n",
      "ic| trans_arc: TransArc(pair_key=(3, "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 4) BornIn.tail Brad_Pitt LivedIn.tail\n",
      "\n",
      " (4, 5) Nationality.head USA BornIn.head\n",
      "\n",
      " (3, 4) BornIn.tail Clint_Eastwood LivedIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=11,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 4) BornIn.tail Clint_Eastwood LivedIn.tail\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| trans_arc: TransArc(pair_key=(3, 4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=11,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| trans_arc: TransArc(pair_key=(3, 3),\n",
      "                        a_rel=3,\n",
      "                        b_rel=3,\n",
      "                        node_id=11,\n",
      "                        a_dir=<RelDir.TAIL: 1>,\n",
      "                        b_dir=<RelDir.TAIL: 1>)\n",
      "ic| node_id: 12, len(seeds"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " (3, 3) LivedIn.tail Clint_Eastwood LivedIn.tail\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "): 2\n",
      "ic| trans_arc: TransArc(pair_key=(3, 4),\n",
      "                        a_rel=4,\n",
      "                        b_rel=3,\n",
      "                        node_id=12,\n",
      "                        a_dir=<RelDir.HEAD: 0>,\n",
      "                        b_dir=<RelDir.HEAD: 0>)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " (3, 4) BornIn.head San_Francisco LivedIn.head\n",
      "\n"
     ]
    }
   ],
   "source": [
    "graph.construct_gor(\n",
    "\tdebug = True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d5a06b72-c19b-440c-83c7-332f28aa9586",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:48.731674Z",
     "iopub.status.busy": "2024-01-17T01:35:48.731142Z",
     "iopub.status.idle": "2024-01-17T01:35:48.745182Z",
     "shell.execute_reply": "2024-01-17T01:35:48.739573Z",
     "shell.execute_reply.started": "2024-01-17T01:35:48.731638Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- collect shared entity tallies ---\n",
      "0 Directed\n",
      " h: 4 dict_items([(2, 4.0)])\n",
      " t: 6 dict_items([(0, 3.0), (1, 3.0)])\n",
      "1 Profession\n",
      " h: 3 dict_items([(1, 3.0)])\n",
      " t: 10 dict_items([(0, 3.0), (2, 5.0), (4, 2.0)])\n",
      "2 ActedIn\n",
      " h: 4 dict_items([(0, 4.0)])\n",
      " t: 10 dict_items([(1, 5.0), (2, 3.0), (4, 2.0)])\n",
      "3 LivedIn\n",
      " h: 8 dict_items([(3, 3.0), (4, 5.0)])\n",
      " t: 10 dict_items([(3, 3.0), (4, 5.0), (5, 2.0)])\n",
      "4 BornIn\n",
      " h: 7 dict_items([(3, 5.0), (5, 2.0)])\n",
      " t: 11 dict_items([(1, 2.0), (2, 2.0), (3, 5.0), (5, 2.0)])\n",
      "5 Nationality\n",
      " h: 2 dict_items([(4, 2.0)])\n",
      " t: 4 dict_items([(3, 2.0), (4, 2.0)])\n"
     ]
    }
   ],
   "source": [
    "scores: typing.Dict[ tuple, float ] = graph.get_affinity_scores(\n",
    "    debug = True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a3d2310b-11c1-476d-82ab-1e34bc496cb1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:48.749266Z",
     "iopub.status.busy": "2024-01-17T01:35:48.748905Z",
     "iopub.status.idle": "2024-01-17T01:35:48.964799Z",
     "shell.execute_reply": "2024-01-17T01:35:48.957975Z",
     "shell.execute_reply.started": "2024-01-17T01:35:48.749231Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| scores: {(0, 0): 0.3,\n",
      "             (0, 1): 0.2653846153846154,\n",
      "             (0, 2): 0.34285714285714286,\n",
      "             (1, 1): 0.23076923076923078,\n",
      "             (1, 2): 0.3708791208791209,\n",
      "             (1, 4): 0.13247863247863248,\n",
      "             (2, 2): 0.21428571428571427,\n",
      "             (2, 4): 0.12698412698412698,\n",
      "             (3, 3): 0.3333333333333333,\n",
      "             (3, 4): 0.5555555555555556,\n",
      "             (3, 5): 0.2222222222222222,\n",
      "             (4, 5): 0.4444444444444444}\n"
     ]
    }
   ],
   "source": [
    "ic(scores);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b71b841-0cf5-4cc6-af4c-c85344b8f6c5",
   "metadata": {},
   "source": [
    "## visualize the transform results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5901a49e-3f90-4061-9c3a-e9d1f05b40f3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:48.973661Z",
     "iopub.status.busy": "2024-01-17T01:35:48.973146Z",
     "iopub.status.idle": "2024-01-17T01:35:49.339291Z",
     "shell.execute_reply": "2024-01-17T01:35:49.337857Z",
     "shell.execute_reply.started": "2024-01-17T01:35:48.973607Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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DdpOp5OoqCjCw8Npbm5WVwH1/C15Zt08+eSTnH322eoSvEKcKK1Wq57g21IUBZvN1qE1obS0FLvdrt4uICCg09aEE9nL4e677+a9997DbDazZMkSbrrpph55jk6nk88++4zly5dz8OBBli9f3mEtCl/g9TCwZ88eHnnkERoaGrjzzjvZvXt3u+sP/4HGx8dz3nnnce+997J06VKio6OprKxk/fr1TJ8+nbPPPpsHH3yQxx9/nIULF6pjBqZMmUJ0dDRarZb8/Hy1ZWHOnDm88MILrF69mpkzZwKwc+dOHA4HEyZM4PLLL+eRRx5h5syZpKWlcf/996tv6gNhtOzx6G6Y6E6gOd7r2wah7hz/eBQUFFBQUHBc9zmRsBIUFEROTk6HY9lsNlpbW0lOTm53eVJSEuvWrTvq83G5XOj1et5//32qqqo4++yz1d9vz9+gTqdj/fr17Nq1i5dffvmoYwU8y+UOpNYf0Xc0Gg0BAQEEBAR0mALo6XLwjA/bvHmzOgts0KBB3HTTTYwcObJdQAgPD++wQFNbnoWgbrvtNu65554efS56vZ4pU6bw008/sX79eiZOnNijx+8pXgkDixYt4oEHHkCr1ZKcnMy5557Lhg0biIuL6xAGoGMgWLFiBU8++SRnnnkmZrOZuLg4Zs2axfTp0wkJCWHVqlUsXryY0aNHAzB58mSmTJlCYGAg9957L3PmzMFut/P0009z8cUX88EHH/Doo4+yYMEC3G432dnZPPzwwwBce+215OfnM2XKFHQ6HYsXL+aDDz7o/RfJB/nbm/mxgownTOTn51NXV8eYMWP6JPAc6STscrlwu90dPv177nekZkrPOu3fffcdCxYs4Mknn1T/dg733HPPMW7cOMaOHXvU127Dhg20tLR0ep23WnB6skurq/WB700h6+/adjkEBgbyxz/+kYULF2KxWLj33nt59NFH+f7772lpaaGpqYnKykpMJhOTJk064jGfffZZQkNDe3SlwcPde++9PPHEE2zbtk3d7MqXaJQufPxpbGwkPDychoaGds2PfcVisfTqNA3PghpCnIgff/yRiIgIsrOzvV0KwcHBvPzyy8ybN0+9bOHChezcuZNPP/0Uk8mkNvsDalfAf//7Xy699FLuuOMO7rrrrk67zOrr60lNTeXPf/4z11577VFPcmazGafT2aXA0xctTEe7TW/z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Cm644QYqKyt577332nXZeDgcDq666io2b97M559/ftS553q9vt0YEJfLhd1uP2JryPEshuMJQifSvTIQgsezzz7bJ2tuNDU1sW3bNs4888xefyzRnoQB0ad0Oh16vf64pyN1RXf6Hd966y0WLFjAb37zG66++uoermzgu/XWW7n00ks544wzuPDCC3nrrbf49ttv+frrrwkODubNN98kMDCQWbNmodfryc/P56677kKn0/Htt9922prT3NzM1VdfzcGDB/n666+POrBUo9EQHh7epS4mD8/Yi+PpTjnSv06n86jXH2/w6InBo10ZWHqs4JGRkcFTTz3Fhg0bmDdvHm+99RaTJk1Srz/55JO55557mD17NtXV1SxevJjvvvsOjUbDzJkzeeihh9SA/vHHH7N06VJqamq48MILO30PCAsLY8yYMcyfPx+DwUBTUxOfffYZSUlJvPzyy0ybNq3Lr6M4PhIGRJ8LCgpqt7BQTx73RF155ZVceeWVPViNf5kxYwaPPPIIixcv5ne/+x1xcXG88MIL6tTR5cuXExkZycyZMwG45pprWLt2LXPnzmXZsmUEBAQQHBzMpEmTGDduHIqicM4557B161Y+/vhjrFYrpaWlmEwmIiMje2RchueE2BP938fSNnh0Z4yHJ3jY7fYjhpbj4QkHnhUCO9PU1ERQUBAXXXQR7777rhoGNm/eTHl5Oeeddx6KojB37lwmTpzIxo0bsVqtzJ8/n6effprFixezf/9+brzxRl5//XV+85vf8NZbb3HvvfeSm5vb7rFWr16tzgR69913+fjjj3n77bd54oknmD9/fpf2RBEnRsKA6HM6nY6goKAeHZUcFBQko5G9bOHChVx55ZXU19djMBjIyMhQP3k+99xzaDQadTDh9OnTOeWUU8jPz+fnn3+mtbVVXUNi/PjxVFVVUVlZSVhYGOedd566xr3b7ebLL7/kN7/5jdee54noq+ChKMoJDS41Go1HrS0jI4PLLruM2bNnq+Ht3Xff5YILLiAwMJBNmzZx8OBB/vWvf6HVagkKCuKOO+7grrvuYvHixaxatYrTTjuNc845BzgUBl966aUOj/PII4+oY0LOO+88tSXgmmuu4YEHHqC2trbT5ZBF90kYEF5hMplwu909Ml85ICBA5in7AJ1OR1xcXKcbzJx66qntvr/77ruPeqz4+Hj27dvX4XKXy+WTfeq+wjOb5niDR2BgYKezPgBCQ0MJDAxk3LhxxMfH8/nnnzNjxgw+/PBD/vrXvwJQVFREQ0MDmZmZ6v08oQSgoqKC1NTUdsc9/HtPHStXrgQgISFBvdwzU6WpqUnCQC+RMCC8JjAwEK1W260WgqCgIAkCfkRaf/qewWAgKysLOLQ2yHvvvUdQUBCBgYFql0FycjKxsbHs3r2702MkJCSwfv36dpeVlJQwfvz4dpfZbDZZpthLBtaaqKLfMZlMhIWFHXfzqV6vJywsTIKAED3E6XRitVrVr7Yn5dmzZ+N2u7n00kv55ptvePHFF5kzZ47aSjN27FiSk5N57LHHaGpqQlEUiouL+eqrrwC48MILWbt2LV9++SVOp5M33nij3YJkHhs2bGi31oToOxIGhNfpdDp1JUOTyXTEueyeZUvDwsIIDQ2VT4lC9KB77rmHwMBA9WvYsGHqdRdffDEtLS2kpKRw0kknsXbtWi699FL1ep1Ox9///nfKyso4+eSTSU9P59JLL1U3/hoyZAgvvvgi9913H1lZWWzcuLHT6YMffvhhp+tIiN4niw4Jn+RZ6MZDp9NJX7EQXuTrC4aJzsmiQ6Jf68pCN0KIvuPLC4aJ7pNuAiGEEMfkWTCsN8hGRd4nYUAIIUSX9FYzvnQPeJ+EASGEEF3iWTCsJ8mCYb5BwoAQQoguM5lMR9zK+njJgmG+Q8KAEEKI4xIYGNjtFgLPwkXCN8hwbSGEEMfNZDKh1+uxWCzHtQupXq+XrgEfJGFACCHECfEsGOZyubDZbDgcDnU/gra0Wi0GgwGTySQhwEdJGBBCCNEtbQcWyoJh/ZOEASGEED1GFgzrn2QAoRBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnJAwIIYQQfk7CgBBCCOHnurTptKIoADQ2NvZqMUIIIYToOZ7ztuc8fiRdCgNNTU0ApKamdrMsIYQQQvS1pqYmwsPDj3i9RjlWXADcbjdlZWWEhoai0Wh6tEAhhBBC9A5FUWhqaiIpKQmt9sgjA7oUBoQQQggxcMkAQiGEEMLPSRgQQggh/JyEASGEEMLPSRgQQggh/JyEASGEEMLPSRgQQggh/JyEASGEEMLP/f+Pu7DOLdgI9AAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "graph.render_gor_plt(scores)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8fa85274-6d16-48eb-b875-01108a9575b8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:49.341965Z",
     "iopub.status.busy": "2024-01-17T01:35:49.341537Z",
     "iopub.status.idle": "2024-01-17T01:35:49.383683Z",
     "shell.execute_reply": "2024-01-17T01:35:49.382725Z",
     "shell.execute_reply.started": "2024-01-17T01:35:49.341916Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tmp.fig03.html\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"100%\"\n",
       "            height=\"600px\"\n",
       "            src=\"tmp.fig03.html\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "            \n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.IFrame at 0x15cb33010>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pv_graph: pyvis.network.Network = graph.render_gor_pyvis(scores)\n",
    "\n",
    "pv_graph.force_atlas_2based(\n",
    "    gravity = -38,\n",
    "    central_gravity = 0.01,\n",
    "    spring_length = 231,\n",
    "    spring_strength = 0.7,\n",
    "    damping = 0.8,\n",
    "    overlap = 0,\n",
    ")\n",
    "\n",
    "pv_graph.show_buttons(filter_ = [ \"physics\" ])\n",
    "pv_graph.toggle_physics(True)\n",
    "\n",
    "pv_graph.prep_notebook()\n",
    "pv_graph.show(\"tmp.fig03.html\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07cf6fca-af95-4cf0-9e3b-247521bafbff",
   "metadata": {},
   "source": [
    "## analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97af44dc-4e56-4986-9f54-cbfaff67e3d4",
   "metadata": {},
   "source": [
    "As the results below above illustrate, the computed _affinity scores_ differ from what is published in `lee2023ingram`. After trying several different variations of interpretation for the paper's descriptions, the current approach provides the closest approximation that we have obtained."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f64462b4-654a-4e2e-bea2-a36bdc5ec967",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:49.387402Z",
     "iopub.status.busy": "2024-01-17T01:35:49.386218Z",
     "iopub.status.idle": "2024-01-17T01:35:49.434520Z",
     "shell.execute_reply": "2024-01-17T01:35:49.432123Z",
     "shell.execute_reply.started": "2024-01-17T01:35:49.387333Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pair</th>\n",
       "      <th>rel_a</th>\n",
       "      <th>rel_b</th>\n",
       "      <th>affinity</th>\n",
       "      <th>expected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(0, 0)</td>\n",
       "      <td>Directed</td>\n",
       "      <td>Directed</td>\n",
       "      <td>0.30</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(0, 1)</td>\n",
       "      <td>Directed</td>\n",
       "      <td>Profession</td>\n",
       "      <td>0.27</td>\n",
       "      <td>0.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(0, 2)</td>\n",
       "      <td>Directed</td>\n",
       "      <td>ActedIn</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(1, 1)</td>\n",
       "      <td>Profession</td>\n",
       "      <td>Profession</td>\n",
       "      <td>0.23</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(1, 2)</td>\n",
       "      <td>Profession</td>\n",
       "      <td>ActedIn</td>\n",
       "      <td>0.37</td>\n",
       "      <td>0.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>(1, 4)</td>\n",
       "      <td>Profession</td>\n",
       "      <td>BornIn</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>(2, 2)</td>\n",
       "      <td>ActedIn</td>\n",
       "      <td>ActedIn</td>\n",
       "      <td>0.21</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>(2, 4)</td>\n",
       "      <td>ActedIn</td>\n",
       "      <td>BornIn</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>(3, 3)</td>\n",
       "      <td>LivedIn</td>\n",
       "      <td>LivedIn</td>\n",
       "      <td>0.33</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>(3, 4)</td>\n",
       "      <td>LivedIn</td>\n",
       "      <td>BornIn</td>\n",
       "      <td>0.56</td>\n",
       "      <td>0.81</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>(3, 5)</td>\n",
       "      <td>LivedIn</td>\n",
       "      <td>Nationality</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>(4, 5)</td>\n",
       "      <td>BornIn</td>\n",
       "      <td>Nationality</td>\n",
       "      <td>0.44</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      pair       rel_a        rel_b  affinity  expected\n",
       "0   (0, 0)    Directed     Directed      0.30       NaN\n",
       "1   (0, 1)    Directed   Profession      0.27      0.22\n",
       "2   (0, 2)    Directed      ActedIn      0.34      0.50\n",
       "3   (1, 1)  Profession   Profession      0.23       NaN\n",
       "4   (1, 2)  Profession      ActedIn      0.37      0.33\n",
       "5   (1, 4)  Profession       BornIn      0.13      0.11\n",
       "6   (2, 2)     ActedIn      ActedIn      0.21       NaN\n",
       "7   (2, 4)     ActedIn       BornIn      0.13      0.11\n",
       "8   (3, 3)     LivedIn      LivedIn      0.33       NaN\n",
       "9   (3, 4)     LivedIn       BornIn      0.56      0.81\n",
       "10  (3, 5)     LivedIn  Nationality      0.22      0.11\n",
       "11  (4, 5)      BornIn  Nationality      0.44      0.36"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df: pd.DataFrame = graph.trace_metrics(scores)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff49fe28-e75f-4590-8b87-0d8962928cba",
   "metadata": {},
   "source": [
    "## statistical stack profile instrumentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "af4ecb06-370f-4077-9899-29a1673e4768",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:49.437344Z",
     "iopub.status.busy": "2024-01-17T01:35:49.436840Z",
     "iopub.status.idle": "2024-01-17T01:35:49.444892Z",
     "shell.execute_reply": "2024-01-17T01:35:49.444135Z",
     "shell.execute_reply.started": "2024-01-17T01:35:49.437293Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pyinstrument.session.Session at 0x1416bc7f0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "profiler.stop()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d5ac2ce6-15b1-41ad-8215-8a5f76036cf1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-17T01:35:49.446514Z",
     "iopub.status.busy": "2024-01-17T01:35:49.446199Z",
     "iopub.status.idle": "2024-01-17T01:35:49.728817Z",
     "shell.execute_reply": "2024-01-17T01:35:49.728098Z",
     "shell.execute_reply.started": "2024-01-17T01:35:49.446483Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "  _     ._   __/__   _ _  _  _ _/_   Recorded: 17:35:45  Samples:  2526\n",
      " /_//_/// /_\\ / //_// / //_'/ //     Duration: 3.799     CPU time: 4.060\n",
      "/   _/                      v4.6.1\n",
      "\n",
      "Program: /Users/paco/src/textgraphs/venv/lib/python3.10/site-packages/ipykernel_launcher.py -f /Users/paco/Library/Jupyter/runtime/kernel-27f0c564-73f8-45ab-9f64-8b064ae1de10.json\n",
      "\n",
      "3.799 IPythonKernel.dispatch_queue  ipykernel/kernelbase.py:525\n",
      "└─ 3.791 IPythonKernel.process_one  ipykernel/kernelbase.py:511\n",
      "      [10 frames hidden]  ipykernel, IPython\n",
      "         3.680 ZMQInteractiveShell.run_ast_nodes  IPython/core/interactiveshell.py:3394\n",
      "         ├─ 2.176 <module>  ../ipykernel_4421/3358887201.py:1\n",
      "         │  └─ 2.176 GraphOfRelations.construct_gor  textgraphs/gor.py:311\n",
      "         │     ├─ 1.607 IceCreamDebugger.__call__  icecream/icecream.py:204\n",
      "         │     │     [17 frames hidden]  icecream, colorama, ipykernel, thread...\n",
      "         │     │        1.078 lock.acquire  <built-in>\n",
      "         │     └─ 0.566 GraphOfRelations._transformed_triples  textgraphs/gor.py:275\n",
      "         │        └─ 0.563 IceCreamDebugger.__call__  icecream/icecream.py:204\n",
      "         │              [13 frames hidden]  icecream, colorama, ipykernel, zmq, t...\n",
      "         ├─ 0.866 <module>  ../ipykernel_4421/4061275008.py:1\n",
      "         │  └─ 0.866 GraphOfRelations.seeds  textgraphs/gor.py:197\n",
      "         │     └─ 0.865 IceCreamDebugger.__call__  icecream/icecream.py:204\n",
      "         │           [42 frames hidden]  icecream, inspect, posixpath, <built-...\n",
      "         ├─ 0.362 <module>  ../ipykernel_4421/559531165.py:1\n",
      "         │  ├─ 0.234 show  matplotlib/pyplot.py:482\n",
      "         │  │     [32 frames hidden]  matplotlib, matplotlib_inline, IPytho...\n",
      "         │  └─ 0.128 GraphOfRelations.render_gor_plt  textgraphs/gor.py:522\n",
      "         │     └─ 0.104 draw_networkx  networkx/drawing/nx_pylab.py:127\n",
      "         │           [6 frames hidden]  networkx, matplotlib\n",
      "         ├─ 0.197 <module>  ../ipykernel_4421/1169542473.py:1\n",
      "         │  └─ 0.197 IceCreamDebugger.__call__  icecream/icecream.py:204\n",
      "         │        [14 frames hidden]  icecream, colorama, ipykernel, thread...\n",
      "         └─ 0.041 <module>  ../ipykernel_4421/2247466716.py:1\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "profiler.print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c47bcfd2-2bd6-49a5-8f1a-102d90edde39",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## outro"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68bea4f9-aec2-4b28-8f08-a4034851d066",
   "metadata": {},
   "source": [
    "_\\[ more parts are in progress, getting added to this demo \\]_"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}