From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Ricardo Wurmus Newsgroups: gmane.lisp.guile.user Subject: Re: Looking for graph library Date: Wed, 12 Oct 2022 18:33:22 +0200 Message-ID: <87bkqhhtif.fsf@elephly.net> References: <87edvibocv.fsf@gmail.com> <20221008212014.16e2a2e5@aicha> <87czb1jmj9.fsf@elephly.net> <20221009154724.507c016f@aicha> <878rlok396.fsf@elephly.net> <87edvdpfps.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="30561"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.8.9; emacs 28.1 Cc: David Pirotte , guile-user@gnu.org To: Dmitry Polyakov Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Wed Oct 12 18:56:34 2022 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oif20-0007j6-Ew for guile-user@m.gmane-mx.org; Wed, 12 Oct 2022 18:56:32 +0200 Original-Received: from localhost ([::1]:60606 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oif1z-0003eu-0z for guile-user@m.gmane-mx.org; Wed, 12 Oct 2022 12:56:31 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:50178) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oif0Y-0003eT-LN for guile-user@gnu.org; Wed, 12 Oct 2022 12:55:02 -0400 Original-Received: from sender4-of-o51.zoho.com ([136.143.188.51]:21192) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oif0U-0004lS-69 for guile-user@gnu.org; Wed, 12 Oct 2022 12:55:02 -0400 ARC-Seal: i=1; a=rsa-sha256; t=1665593693; cv=none; d=zohomail.com; s=zohoarc; b=hfcZ6049HsLp957C38nl5RR/ewghHy1Srhi/2lPO0VlNbS2CxHXcvFUwboKUzuMvVRLyMo8eUGYJTDxoj2yftataQ7ncwZtJP1cisZ0N0o5y1KJakklP9Lhf08jnaZfpyt0afHCshCwABurqXUXCxs/Lk994iXkHVVEoVKr2jVw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1665593693; h=Content-Type:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=eQdoCrtd0POPDGPPd5idYX+YcdEBBMuyY8xFFNdYFA0=; b=YxFriBQgy580yGhMVwWNbiLlORZexfyIwI2NXHI3Z1nihL3YCRQbwmmD3MbUwxKx1KEVCNhWh59cQQ0VpP1iJbhkv6XNIW388hUdGYwq1LixHXSrw+0fmnBDvs99BKVvGHCMHgciujtIEvS3j33kRj3XuHFM4PjiPazDf8aKIyw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=elephly.net; spf=pass smtp.mailfrom=rekado@elephly.net; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1665593693; s=zoho; d=elephly.net; i=rekado@elephly.net; h=References:From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:In-reply-to:Message-ID:MIME-Version:Content-Type:Message-Id:Reply-To; bh=eQdoCrtd0POPDGPPd5idYX+YcdEBBMuyY8xFFNdYFA0=; b=Aq2IXHmHAYYyLKUi9+nzMhBuhAH62wOW1enTGVwW9oSp8dl9Vu9r66xcd1joarQ2 6lqlfh4R+pW7+MwShaoNJ8XdlpNdD+21ziJrd7s9CkiWQs5ovTk0TNEXqetR8ot9PWb X/bce1dZHn462zpsJQJVyHh4AqVRY7NfMiRNt3g4= Original-Received: from localhost (73-110-142-46.pool.kielnet.net [46.142.110.73]) by mx.zohomail.com with SMTPS id 1665593692071409.4176962211268; Wed, 12 Oct 2022 09:54:52 -0700 (PDT) In-reply-to: <87edvdpfps.fsf@gmail.com> X-URL: https://elephly.net X-PGP-Key: https://elephly.net/rekado.pubkey X-PGP-Fingerprint: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC X-Zoho-Virus-Status: 1 X-ZohoMailClient: External Received-SPF: pass client-ip=136.143.188.51; envelope-from=rekado@elephly.net; helo=sender4-of-o51.zoho.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: "guile-user" Xref: news.gmane.io gmane.lisp.guile.user:18621 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Dmitry, > Ricardo Wurmus writes: > > Could you provide examples of graph creation? It's not entirely obvious > to me how they need to be created via graph-cons. > > I tried doing something like this: > > (define test ;name > (graph-cons (context ; making context > "this-is-label" ;context label > (list (link "this-is-label-1" 1)) ;first link > (list (link "this-is-label-2" 1))) ;second link > graph-null)) ;initial graph > > This structure is created without problems, but when I want to draw it > through (draw test) You can=E2=80=99t use (minigrad dot)=E2=80=99s =E2=80=9Cdraw=E2=80=9D becau= se it=E2=80=99s not a generic graph drawing tool. It=E2=80=99s used for minigrad expressions, which have a cer= tain structure. (Minigrad is supposed to be a testbed for neural nets with automatic backpropagation.) Here=E2=80=99s a simple example with a generic =E2=80=9Cdraw=E2=80=9D proce= dure to get you started: --=-=-= Content-Type: application/octet-stream Content-Disposition: inline; filename=graph-example.scm Content-Transfer-Encoding: base64 KHVzZS1tb2R1bGVzIChtaW5pZ3JhZCBncmFwaCkKICAgICAgICAgICAgIChtaW5pZ3JhZCBsaWJn dikKICAgICAgICAgICAgIChzcmZpIHNyZmktMjYpCiAgICAgICAgICAgICAoaWNlLTkgbWF0Y2gp KQoKKGRlZmluZSogKGRyYXcgZ3JhcGggIzpvcHRpb25hbCAocG9ydCAobWtzdGVtcCAiL3RtcC9t aW5pZ3JhZC1YWFhYWFgiKSkpCiAgIlVzZSBHcmFwaHZpeiB0byBkcmF3IHRoZSBHUkFQSCBhcyBh biBTVkcgdG8gRklMRU5BTUUuIgogIChkZWZpbmUgZyAoZGlncmFwaCAid2hhdGV2ZXIiKSkKICAo c2V0diBnICJyYW5rZGlyIiAiTFIiKQogIChsZXQgKChub2RlLWNvbnRleHRzIChtYXAgKGN1dCBm aW5kLWNvbnRleHQgPD4gZ3JhcGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9wby1z b3J0IGdyYXBoKSkpCiAgICAgICAgKGVkZ2VzICh1Zm9sZCAobWF0Y2gtbGFtYmRhKgogICAgICAg ICAgICAgICAgICAgICAgICAoKCgkIDxjb250ZXh0PiBzb3VyY2UgbGFiZWwgaW4gb3V0KSBhY2Mp CiAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChtYXAgKG1hdGNoLWxhbWJkYQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgkIDxsaW5rPiBlZGdlLWxhYmVs IHRhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCBz b3VyY2UgdGFyZ2V0IGVkZ2UtbGFiZWwpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAobWF0Y2gtbGFt YmRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJCA8bGluaz4gZWRnZS1s YWJlbCB0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCB0 YXJnZXQgc291cmNlIGVkZ2UtbGFiZWwpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGluKQogICAgICAgICAgICAgICAgICAgICAgICAgICBhY2MpKSkKICAgICAgICAgICAgICAg ICAgICAgICcoKSBncmFwaCkpKQogICAgOzsgQWRkIGEgbm9kZSBmb3IgZWFjaCB2YWx1ZS4KICAg IChmb3ItZWFjaCAobWF0Y2gtbGFtYmRhCiAgICAgICAgICAgICAgICAoKCQgPGNvbnRleHQ+IHZh bHVlIGxhYmVsIGluIG91dCkKICAgICAgICAgICAgICAgICAobGV0KiAoKHVpZCAob2JqZWN0LT5z dHJpbmcgdmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICAoZzpub2RlIChub2RlIGcgdWlk KSkpCiAgICAgICAgICAgICAgICAgICAoc2V0diBnOm5vZGUgInNoYXBlIiAicmVjb3JkIikKICAg ICAgICAgICAgICAgICAgIChzZXR2IGc6bm9kZSAibGFiZWwiIGxhYmVsKSkpKQogICAgICAgICAg ICAgIG5vZGUtY29udGV4dHMpCgogICAgOzsgQ29ubmVjdCBhbGwgZWRnZXMgYnkgbmFtZQogICAg KGZvci1lYWNoIChtYXRjaC1sYW1iZGEKICAgICAgICAgICAgICAgICgoc291cmNlIHRhcmdldCBl ZGdlLWxhYmVsKQogICAgICAgICAgICAgICAgIChlZGdlIGcKICAgICAgICAgICAgICAgICAgICAg ICAob2JqZWN0LT5zdHJpbmcgc291cmNlKQogICAgICAgICAgICAgICAgICAgICAgIChvYmplY3Qt PnN0cmluZyB0YXJnZXQpKSkpCiAgICAgICAgICAgICAgZWRnZXMpKQoKICAobGF5b3V0IGcgImRv dCIpCgogIChsZXQgKChmaWxlbmFtZSAocG9ydC1maWxlbmFtZSBwb3J0KSkpCiAgICAoY2xvc2Ug cG9ydCkKICAgIChyZW5kZXIgZyAic3ZnIiBmaWxlbmFtZSkKCiAgICA7OyBMZXQgbWUgc2VlIHRo aXMgaW4gRW1hY3MgR2Vpc2VyCiAgICAoZm9ybWF0ICNmYWxzZSAiIzxJbWFnZTogfmE+IiBmaWxl bmFtZSkpKQoKOzsgQ29uc3RydWN0IGEgZ3JhcGggd2l0aCBncmFwaC1jb25zCihkZWZpbmUgbXkt Z3JhcGgvY29ucwogIChsZXQgKChub2RlQSAiQSIpCiAgICAgICAgKG5vZGVCICJCIikKICAgICAg ICAobm9kZUMgIkMiKSkKICAgIChncmFwaC1jb25zIChjb250ZXh0IG5vZGVDICJDIgogICAgICAg ICAgICAgICAgICAgICAgICAgKGxpc3QgKGxpbmsgIkM8LUEiIG5vZGVBKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGxpbmsgIkM8LUIiIG5vZGVCKSkKICAgICAgICAgICAgICAgICAg ICAgICAgIChsaXN0IChsaW5rICJDLT5BIiBub2RlQSkpKQogICAgICAgICAgICAgICAgKGdyYXBo LWNvbnMgKGNvbnRleHQgbm9kZUIgIkIiIChsaXN0IChsaW5rICJCPC1BIiBub2RlQSkpIChsaXN0 KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmFwaC1jb25zIChjb250ZXh0IG5vZGVB ICJBIiAobGlzdCkgKGxpc3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZ3JhcGgtbnVsbCkpKSkpCgo7OyBTYW1lIHRoaW5nIHdpdGggY29udGV4dHMtPmdyYXBoLgoo ZGVmaW5lIG15LWdyYXBoCiAgKGxldCAoKG5vZGVBICJBIikKICAgICAgICAobm9kZUIgIkIiKQog ICAgICAgIChub2RlQyAiQyIpKQogICAgKGNvbnRleHRzLT5ncmFwaAogICAgIChsaXN0IChjb250 ZXh0IG5vZGVBICJBIiAobGlzdCkgKGxpc3QpKQogICAgICAgICAgIChjb250ZXh0IG5vZGVCICJC IiAobGlzdCAobGluayAiQjwtQSIgbm9kZUEpKSAobGlzdCkpCiAgICAgICAgICAgKGNvbnRleHQg bm9kZUMgIkMiCiAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGxpbmsgIkM8LUEiIG5vZGVBKQog ICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5rICJDPC1CIiBub2RlQikpCiAgICAgICAgICAg ICAgICAgICAgKGxpc3QgKGxpbmsgIkMtPkEiIG5vZGVBKSkpKSkpKQoKKGRyYXcgbXktZ3JhcGgp Cg== --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable As you can see every context links only to nodes that already exist in the graph. In the graph-cons example you see that node A cannot have any links to other nodes, because none exist. The edges between A and C and A and B are added later when the contexts of these nodes are cons=E2=80= =99d onto the graph. That=E2=80=99s the big idea behind inductive graphs. To make the graphviz bindings work you need to set GUILE_EXTENSIONS_PATH first. I recommend this: $ guix shell graphviz guile $ [env] export GUILE_EXTENSIONS_PATH=3D$GUIX_ENVIRONMENT/lib/guile/3.0/exte= nsions $ [env] guile --listen Then M-x connect-to-guile in a graphical Emacs and evaluate the code above to see the graph visualization. Hope this helps! --=20 Ricardo --=-=-=--