[00:00.000 --> 00:22.000] Okay, welcome everyone, as you can see from Adam, typical notebooks are a very important [00:22.000 --> 00:32.000] tool in each data scientist, but using graphs, refer to notebook as a challenge, for instance [00:32.000 --> 00:33.000] visualization. [00:33.000 --> 00:41.000] And so Bjornville talked about, I pie Zygma today, which is a tool to use ZygmaJas as [00:41.000 --> 00:43.000] a component in a Jupyter notebook. [00:43.000 --> 00:47.000] So I'm really looking forward to that and without further ado. [00:47.000 --> 00:53.000] Where I'm from this time, I'm actually not Guillaume, I'm sick. [00:53.000 --> 01:01.000] So I apologize in advance, because I'm not the creator of the tool and so I will do as [01:01.000 --> 01:08.000] much as I can to present it, but Guillaume can answer that by email or by Twitter or any [01:08.000 --> 01:13.000] other means if you have more questions than what I can actually answer myself. [01:13.000 --> 01:21.000] And so I will just start by a brief remember of why we sometimes want to use graphs and [01:21.000 --> 01:28.000] actually visualize them and not only do statistics on notebooks and actually visualize graphs. [01:28.000 --> 01:30.000] And so why do we do visual network analysis? [01:30.000 --> 01:37.000] It actually goes back very old to 1736 and the Bridges of Collector, which is a classical [01:37.000 --> 01:44.000] mathematical problem that was solved thanks to visualizing the graph that it was showing. [01:44.000 --> 01:53.000] Later on in France, Moreno did a social graph where he tried to visualize how a connective [01:53.000 --> 01:56.000] where students in a classroom. [01:56.000 --> 02:06.000] And recently, thanks to the community assisting tools, we can do those kind of visualizations [02:06.000 --> 02:15.000] but with massive graphs and we can try to do a computed processing to try and automatically [02:15.000 --> 02:24.000] specialize nodes on the map and on the plane and also identify clusters within it. [02:24.000 --> 02:32.000] So that brings a different mean to actually analyze graphs and actually visualize this [02:32.000 --> 02:34.000] helps a lot understanding. [02:34.000 --> 02:41.000] And we are coming from the field of social sciences and we use a lot of graphs to interpret [02:41.000 --> 02:44.000] social issues in general. [02:44.000 --> 02:47.000] And we use them actually as maps. [02:47.000 --> 02:51.000] So it's not maps in which coordinates make sense. [02:51.000 --> 02:53.000] X and Y don't mean anything. [02:53.000 --> 02:55.000] You can just take the map. [02:55.000 --> 03:03.000] But basically what you see on the plane indicates information on the, I mean the localization [03:03.000 --> 03:07.000] of each node that makes a sense compared to the other nodes. [03:07.000 --> 03:10.000] So, but I guess most of them are not. [03:10.000 --> 03:16.000] That's another example of a map that was made a long time ago. [03:16.000 --> 03:27.000] So to do that, there has been over the past years a lot of tools that have been developed [03:27.000 --> 03:29.000] including the first desktop ones. [03:29.000 --> 03:38.000] So this tool is the direct heritage of this long lineage which started with Gezi. [03:38.000 --> 03:44.000] I believe later today there will be a presentation of Gezi version 1 which finally will go out [03:44.000 --> 03:48.000] soon after so many versions already. [03:48.000 --> 03:50.000] So you probably already know Gezi. [03:50.000 --> 03:58.000] But recently we could switch from the actual desktop analysis to actual web representations [03:58.000 --> 04:01.000] thanks to a variety of libraries. [04:01.000 --> 04:04.000] D3.js proposes to do it. [04:04.000 --> 04:07.000] But there's also a site escape and a bunch of others. [04:07.000 --> 04:11.000] But so our community works with Simba. [04:11.000 --> 04:17.000] And Simba has been developed by people who are actually close to the people of Gezi. [04:17.000 --> 04:19.000] I don't think Alexi is here today. [04:19.000 --> 04:24.000] But Alexi Jacomi is the small brother of Mathieu Jacomi who speaks about Gezi. [04:24.000 --> 04:31.000] He's the one who invented Simba and Guillaume is the co-host of Simba with Alexi. [04:31.000 --> 04:33.000] So please take a look at Simba. [04:33.000 --> 04:39.000] I will put the slides to the conference and you will find links to all the tools around. [04:39.000 --> 04:46.000] And then thanks to Simba, we could build a lot of Gezi-like tools but for the web. [04:46.000 --> 04:51.000] So that we could do all those interactions that we do directly in a web page. [04:51.000 --> 04:57.000] There's been a long history at Miguelab and around of trying to build such tools. [04:57.000 --> 04:59.000] Minivan was one of them. [04:59.000 --> 05:08.000] There's also Nancy which is a very small, very publishing-oriented way of displaying a graph [05:08.000 --> 05:16.000] with very few options so that you can just put your Gezi-like search file or GraphML file [05:16.000 --> 05:21.000] and very easily do what you do on your Gezi. [05:21.000 --> 05:25.000] Retina is the one developed by people at Westware right now and is very rich, [05:25.000 --> 05:27.000] proposing a lot of features. [05:27.000 --> 05:35.000] And soon I think Mathieu and Mathieu will talk about it briefly also in the later talk about Gezi version 1. [05:35.000 --> 05:41.000] There's a Gezi-like version that's currently being developed and that should come in soon. [05:41.000 --> 05:45.000] Which brings me to all of those tools are very nice. [05:45.000 --> 05:51.000] We have all those that are interactive and you can visualize, explore, publish, [05:51.000 --> 05:58.000] manipulate all those graphs but they all require pre-processed graphs. [05:58.000 --> 06:04.000] You cannot just work with your graph while you're visualizing it. [06:04.000 --> 06:11.000] You have to pre-code in your file, usually JSON or JXF or GraphML, [06:11.000 --> 06:14.000] then you load it into the tool and then you can explore it. [06:14.000 --> 06:17.000] But we would like to be able to do that at the same time. [06:17.000 --> 06:21.000] And so that's where the idea of I by Sigma came from, [06:21.000 --> 06:29.000] to try and put within Jupyter a notebook, a widget that would display the graph using SigmaJS. [06:29.000 --> 06:34.000] So it's really easy to install as long as you have Jupyter. [06:34.000 --> 06:39.000] You usually need a tool to work with graphs under Python. [06:39.000 --> 06:43.000] There's two main ones that you might know already about, [06:43.000 --> 06:53.000] I by Sigma is built to handle both formats of graphs from both networks and I by Sigma. [06:53.000 --> 06:56.000] And so you just install I by Sigma in addition, [06:56.000 --> 06:59.000] and then I just switch to the brief demo. [06:59.000 --> 07:02.000] Maybe at the seat. [07:02.000 --> 07:07.000] So we'll do two small explorations of graphs. [07:07.000 --> 07:11.000] There's the first one that we're working on right now, [07:11.000 --> 07:16.000] which is on the, what I call the open source, [07:16.000 --> 07:21.000] I mean, actually larger than that, open access, open world. [07:21.000 --> 07:28.000] It's like for them, but just in France and the French communities working on that. [07:28.000 --> 07:36.000] And so we built this network of websites, links together of those French communities of free software. [07:36.000 --> 07:38.000] And let's take a look at it as well. [07:38.000 --> 07:41.000] So first, I will import the projects. [07:41.000 --> 07:44.000] Then I'm reading the graph that I built already. [07:44.000 --> 07:46.000] So that's all this first example. [07:46.000 --> 07:52.000] So here we have a graph with 621 nodes and 7000 edges. [07:52.000 --> 07:54.000] Let's look at the node. [07:54.000 --> 07:58.000] So the first node, I don't see that information. [07:58.000 --> 07:59.000] It's April.org. [07:59.000 --> 08:02.000] I don't know if the French people are in the room, [08:02.000 --> 08:07.000] but people should know that April is from France. [08:07.000 --> 08:14.000] It's the main NGO in France about open source and just the graph. [08:14.000 --> 08:16.000] So we have this whole page. [08:16.000 --> 08:19.000] That's all the data that was collected while making the graph. [08:19.000 --> 08:25.000] And then let's try to just visualize it by just loading i5 sigma, [08:25.000 --> 08:28.000] importing sigma and applying it to the graph. [08:28.000 --> 08:37.000] Here, just by the widget with the graph, which is randomly specialized. [08:37.000 --> 08:40.000] We have metadata information. [08:46.000 --> 08:49.000] So we can run for FATAS on it. [08:49.000 --> 08:51.000] So very easy. [08:51.000 --> 08:54.000] You see your specialized graph. [08:54.000 --> 09:01.000] Just a few seconds, and then we can also apply some... [09:01.000 --> 09:05.000] The graph is too dense for that. [09:05.000 --> 09:07.000] And suddenly no effect. [09:07.000 --> 09:09.000] So yeah, but right now it's just a graph [09:09.000 --> 09:11.000] and we don't have much information. [09:11.000 --> 09:13.000] It's very complicated readable. [09:13.000 --> 09:18.000] So let's go down and try to add a few other options to the sigma code. [09:18.000 --> 09:21.000] So we can set the outside standards. [09:21.000 --> 09:23.000] Let's use the number of pages for. [09:23.000 --> 09:27.000] So here I can see that for this graph use, [09:27.000 --> 09:31.000] we put a lot of pages on some specific websites. [09:31.000 --> 09:36.000] Let's put a little bit more and try to adjust the sizes of the nodes. [09:36.000 --> 09:39.000] So we can adjust the range of the values for instance. [09:39.000 --> 09:42.000] Here it's really readable. [09:45.000 --> 09:47.000] Okay, so we got sizes. [09:47.000 --> 09:49.000] Let's add some colors. [09:49.000 --> 09:55.000] So iBuySigma proposes some internal metrics that you can compute on the fly. [09:55.000 --> 10:00.000] So for instance, as a result, it generates clusters. [10:00.000 --> 10:03.000] And we will apply colors to the map. [10:03.000 --> 10:07.000] I mean we will apply those color communities as colors. [10:07.000 --> 10:10.000] So here we get a set graph of colors. [10:10.000 --> 10:14.000] Let's see that there are a lot of communities. [10:14.000 --> 10:19.000] As knowing this network and knowing this community, [10:19.000 --> 10:23.000] I can tell you that basically what this is. [10:28.000 --> 10:35.000] Here we got the open data, open command community. [10:35.000 --> 10:41.000] Here we got uphill and basically the NGOs working on the open source. [10:41.000 --> 10:47.000] Here we got GIL and it's mostly a lot of softwares. [10:47.000 --> 10:51.000] Fedora and all the Linux distributions. [10:51.000 --> 10:54.000] Here we got FFDL, MaproductionDenets, [10:54.000 --> 10:59.000] and all those activists working with the open internet. [10:59.000 --> 11:03.000] And I guess here is more the... [11:03.000 --> 11:06.000] Oh, it's also a mobilization. [11:06.000 --> 11:11.000] It's a form of formigated old form of food. [11:11.000 --> 11:14.000] I'll just speak a little bit. [11:14.000 --> 11:19.000] Okay, so now that we got this, let's try to make it a little bit nicer. [11:19.000 --> 11:25.000] We can add, for instance, some border colors. [11:25.000 --> 11:31.000] So it just proposes to see a stronger border of colors. [11:31.000 --> 11:34.000] Graphs are a little bit sexier. [11:34.000 --> 11:39.000] We can also try to do like Gephi, like curled edges. [11:39.000 --> 11:41.000] All of those are in options. [11:41.000 --> 11:45.000] I guess I'll show you briefly later on a list of the different options. [11:45.000 --> 11:49.000] Here we also put the recursive font to the level. [11:49.000 --> 11:52.000] So basically you can do a lot of things. [11:52.000 --> 11:55.000] But all of that so far is mostly like Gephi. [11:55.000 --> 11:58.000] There's no real new thing. [11:58.000 --> 12:03.000] But here's something that actually proposes something else. [12:03.000 --> 12:06.000] So right now we can see one graph. [12:06.000 --> 12:10.000] But let's try and see multiple ones. [12:10.000 --> 12:14.000] So I buy similar properties, what we call a similar grid. [12:14.000 --> 12:19.000] And so I will put the same graph, but it will trickle out. [12:19.000 --> 12:24.000] And those will be common options that I set for all versions of the graph. [12:24.000 --> 12:28.000] But then, within the grid, I will add three different versions of the graph [12:28.000 --> 12:32.000] using different metrics for the size of the load. [12:32.000 --> 12:34.000] So here's one on the left one. [12:34.000 --> 12:37.000] And we see it's on the middle of the degree. [12:37.000 --> 12:41.000] And the right one on the bottom. [12:41.000 --> 12:46.000] Now I'm going to add this. [12:46.000 --> 12:53.000] So here are the three graphs, which are all synchronized. [12:53.000 --> 12:56.000] If I visualize it, it happens at the same time. [12:56.000 --> 13:01.000] If I over-enode, I will see it on the three different versions. [13:01.000 --> 13:07.000] And then if I zoom a little bit, I guess we can see that... [13:07.000 --> 13:09.000] Wow. [13:09.000 --> 13:11.000] What can we see? [13:11.000 --> 13:18.000] We can see that PharmaSoft, for instance, is very connected most globally, [13:18.000 --> 13:24.000] but especially it has a very strong in-degree and not so big out-degree. [13:24.000 --> 13:26.000] Why is that? [13:26.000 --> 13:31.000] PharmaSoft is such a reference in France for open-source tools [13:31.000 --> 13:34.000] that it gets a lot of links from the whole community. [13:34.000 --> 13:37.000] And all websites of the Free Software community point to it, [13:37.000 --> 13:40.000] because it's like a resource. [13:40.000 --> 13:46.000] Whereas, of course, they cannot point to the whole rest of the community. [13:46.000 --> 13:50.000] On another note, I guess we could find... [13:50.000 --> 13:53.000] I think there was Linux... [13:53.000 --> 13:56.000] Linux-affair.org is the opposite. [13:56.000 --> 14:03.000] It's a media that pretty much talks about anything that happens on open-source in France. [14:03.000 --> 14:07.000] And, of course, they're the ones having the most outlinks. [14:07.000 --> 14:10.000] All right, so that's just a small example. [14:10.000 --> 14:16.000] Then I can show you maybe another notebook that will show other things. [14:16.000 --> 14:21.000] So this one is a notebook that was built out of data [14:21.000 --> 14:24.000] collected by Laura Miguel, which is a trainee at Media Lab right now. [14:24.000 --> 14:29.000] And she scraped the first-day website, the agendas, [14:29.000 --> 14:35.000] to try and get all speakers and rooms over the past 15 years. [14:35.000 --> 14:40.000] So here we will have to build the graph progressively. [14:40.000 --> 14:46.000] We just had a CSV that she scraped of the data of one speaker and one room. [14:46.000 --> 14:49.000] Disclaimer, the speakers have been anonymized. [14:49.000 --> 14:53.000] So you won't find a name that you know about, [14:53.000 --> 14:57.000] but they represent actual people. [14:57.000 --> 15:01.000] So let's take a look at, for instance, three examples of the data. [15:01.000 --> 15:04.000] So those are the three first lines. [15:04.000 --> 15:08.000] I mean, that's one line and two other lines that I picked specifically. [15:08.000 --> 15:13.000] This one is one speaker, and she talked about within this track. [15:13.000 --> 15:17.000] Here it was a stock that was shared between two speakers. [15:17.000 --> 15:20.000] So sometimes we get speakers separated by a pipe. [15:20.000 --> 15:25.000] And here is obviously someone that was still anonymized, [15:25.000 --> 15:30.000] but that should be in my seat right now. [15:30.000 --> 15:35.000] And we did many talks in the past, including in this room. [15:35.000 --> 15:38.000] So we will build the graph using NetworkX. [15:38.000 --> 15:41.000] So for those who know NetworkX, it's quite simple. [15:41.000 --> 15:45.000] You just create a new graph, and then for each row in our CSV, [15:45.000 --> 15:49.000] we will, if there's no speaker, we don't take it. [15:49.000 --> 15:51.000] Then we take the track and the year. [15:51.000 --> 15:56.000] We add a node for each track, and for each speaker inside the talk, [15:56.000 --> 15:59.000] we add a node for the speaker. [15:59.000 --> 16:04.000] And then we had an edge in between those two, [16:04.000 --> 16:10.000] and we increment it as a count if it's the second time that we meet him, for instance. [16:10.000 --> 16:15.000] And we also upgrade the year to get, for the edge, [16:15.000 --> 16:18.000] the last year that was used. [16:18.000 --> 16:25.000] So by doing that, I built a new graph that has 5,000 nodes and 6,000 links. [16:25.000 --> 16:31.000] Let's take a look at my alternate speaker here. [16:31.000 --> 16:34.000] It was supposed to be a speaker, and apparently, [16:34.000 --> 16:41.000] so it's linked to, in year 2018, to two talks in the graph room. [16:41.000 --> 16:45.000] Yeah, he spoke twice in the room, back then. [16:45.000 --> 16:52.000] In JavaScript in 2019, and in 2020 in the Open Research Tools and Technology Room. [16:52.000 --> 16:55.000] So let's take a look at this graph now. [16:55.000 --> 16:56.000] Oh, it was broken. [16:56.000 --> 16:59.000] Yes, there's a comma missing here. [16:59.000 --> 17:00.000] Here it is. [17:00.000 --> 17:07.000] Still, I tried to add this earlier, but I'm not expert enough with it, so I'll remove this. [17:07.000 --> 17:09.000] So here it is. [17:09.000 --> 17:14.000] So this time, it's a bipartite graph, since we got two kinds of nodes, [17:14.000 --> 17:16.000] the tracks and the speakers. [17:16.000 --> 17:22.000] So I decided that the node color will be attached to the part type. [17:22.000 --> 17:31.000] And if I take a look at it, we should see all big dots in blue are the rooms at first then, [17:31.000 --> 17:34.000] and all pink ones are actually speakers. [17:34.000 --> 17:39.000] And so we can see that there are a lot of lightning talks, of course, every year, [17:39.000 --> 17:45.000] but there are some rooms that have way more speakers than others, [17:45.000 --> 17:48.000] probably also because they exist for way longer. [17:48.000 --> 17:53.000] So maybe we can try and explore that, and that's the main idea. [17:53.000 --> 17:58.000] So sorry, I don't remember what this one is. [17:58.000 --> 18:00.000] Let's just run it briefly. [18:00.000 --> 18:04.000] I guess it's the same. [18:04.000 --> 18:05.000] Yeah, it's the same. [18:05.000 --> 18:07.000] Sorry, it's a copy-paste. [18:07.000 --> 18:11.000] So what we could do is try and apply other things. [18:11.000 --> 18:13.000] So let's do a grid again. [18:13.000 --> 18:17.000] But this time, we'll try and display for each node a gradient of color. [18:17.000 --> 18:21.000] That will indicate the intensity of the node at this moment. [18:21.000 --> 18:29.000] So to do that, we will, for instance, take a look at the year 2012 and the year 2022, [18:29.000 --> 18:35.000] and use the strength of the ALO, depending on how many talks were associated [18:35.000 --> 18:37.000] to this node for this specific year. [18:37.000 --> 18:44.000] So both graphs should show the intensity of the talks during those two years. [18:44.000 --> 18:52.000] So let's show it again. [18:52.000 --> 18:58.000] And here we can see that in 2012, the main rooms that were filled were actually more [18:58.000 --> 19:01.000] on desktops, Mozilla, Lightning Talks, and Embedded, [19:01.000 --> 19:09.000] whereas in 2022, there are way more rooms that are actually filled and spoken. [19:09.000 --> 19:12.000] Then what we could do is continue working on our graph [19:12.000 --> 19:14.000] and continue exploring while working with it. [19:14.000 --> 19:17.000] So at Medialab, we also have a tool called Pelot, [19:17.000 --> 19:21.000] which allows us to do a bunch of metrics and calculation on a, [19:21.000 --> 19:23.000] so it's already installed, it's going faster. [19:23.000 --> 19:28.000] And for instance, it can do a monopartite projection out of a bipartite graph. [19:28.000 --> 19:33.000] So I'm just running this, and then we can try and display it. [19:33.000 --> 19:40.000] And here, just in a few lines in Python, I can just see the alternate graph [19:40.000 --> 19:43.000] that is the monopartite version of the graph, [19:43.000 --> 19:51.000] and just see the links between the rooms depending on when they are co-spoken by speakers. [19:51.000 --> 19:53.000] Let's continue. [19:53.000 --> 19:59.000] And the problem is that if I look at this graph, I can see there are a bunch of nodes isolated. [19:59.000 --> 20:04.000] And so usually when I want to visualize a graph, those are a bit annoying [20:04.000 --> 20:08.000] because they take a lot of space in the visualization, and I don't want to see that. [20:08.000 --> 20:13.000] So let's just use Pelot's Crop to Largest Component function [20:13.000 --> 20:19.000] that will keep only the biggest component of the graph. [20:19.000 --> 20:30.000] So then I can re-displace this graph without all of those single nodes. [20:30.000 --> 20:34.000] And that's a rough idea of what could be done. [20:34.000 --> 20:39.000] Then we can work with the graph and just visualize on the fly. [20:39.000 --> 20:46.000] And I guess I'll conclude by just showing inside the GitHub page of the tool. [20:46.000 --> 20:50.000] There's all the visual variables that are available. [20:50.000 --> 20:56.000] So I showed you already node color, but you can also play on the saturation of the nodes. [20:56.000 --> 21:04.000] You can play on the size we saw, but you can play with the label size, of course, the label color. [21:04.000 --> 21:10.000] You can adjust the border ratio, how big it is. [21:10.000 --> 21:23.000] So basically all visual ways to better help you interpret your graph can be proposed. [21:23.000 --> 21:29.000] You can also add pictograms, use shapes for each node. [21:29.000 --> 21:35.000] You can use halos like I showed earlier. [21:35.000 --> 21:40.000] And play also a lot of those applied to edges. [21:40.000 --> 21:46.000] So you can play on the colors, the form of them, and so on and so on. [21:46.000 --> 21:50.000] And I guess that will be it for me. [21:50.000 --> 21:53.000] And I will take all of your questions. [22:07.000 --> 22:12.000] Sorry, I'm just scrolling back to things that are nicer. [22:12.000 --> 22:13.000] All of you. [22:13.000 --> 22:14.000] Yes. [22:14.000 --> 22:23.000] Can you preserve the layout between the different steps so you can execute the layout every time you go to a new cell and preserve it? [22:23.000 --> 22:24.000] That's a good question. [22:24.000 --> 22:27.000] I don't think it has been planned yet. [22:27.000 --> 22:29.000] Can you repeat the question? [22:29.000 --> 22:30.000] Yes, sorry. [22:30.000 --> 22:40.000] So the question was can we maintain the layout from one cell to the other and not having to re-click to apply the layout every time? [22:40.000 --> 22:42.000] I don't think so. [22:42.000 --> 22:51.000] And what I know is that the layout, the way Forza class works, has some chaos. [22:51.000 --> 22:55.000] But here it's always instantiated on the same seed. [22:55.000 --> 23:00.000] So whenever you run it, it will always generate the same exact layout. [23:00.000 --> 23:02.000] So that's something. [23:02.000 --> 23:05.000] But it won't reuse the one from the previous cells. [23:05.000 --> 23:06.000] No. [23:06.000 --> 23:08.000] That could be something that could be an idea. [23:08.000 --> 23:09.000] Yes? [23:09.000 --> 23:12.000] Do you have any numbers on the upper limits of this system? [23:12.000 --> 23:15.000] And the size of the graph that you're going to run here? [23:15.000 --> 23:20.000] So can you run the values of noting this one or the limits? [23:20.000 --> 23:28.000] So the question is about volume and amplitude and how big of a graph we can display with this. [23:28.000 --> 23:32.000] So I believe the limit is actually the one of your browser. [23:32.000 --> 23:38.000] So it will depend on your GPU and your CPU and your RAM. [23:38.000 --> 23:51.000] But I know that SigmaJS properly endows graphs with, I would say, 100,000 of nodes and links. [23:51.000 --> 23:58.000] I guess I know I already displayed one with a few million links and 100,000 of nodes. [23:58.000 --> 24:03.000] It takes a bit more time, of course. [24:03.000 --> 24:08.000] Do you support something like collapsing nodes and expanding them? [24:08.000 --> 24:13.000] For instance, in these kind of power graphs where the communities could collapse if you want to put height once, [24:13.000 --> 24:17.000] and they could be selectively expanded as well. [24:17.000 --> 24:27.000] So the question is, can we aggregate and split nodes that have, for instance, the same group? [24:27.000 --> 24:33.000] For me, it would be, I don't think it's built-in within Sigma for sure. [24:33.000 --> 24:38.000] Maybe in Pelot, the library I was showing, like the monopartite projection is pretty much this kind of ID. [24:38.000 --> 24:44.000] And I don't know, but it might be in Pelot. [24:44.000 --> 24:48.000] Yeah. [24:48.000 --> 24:52.000] You might try the GPU. [24:52.000 --> 24:57.000] Yeah, SigmaJS, sorry. [24:57.000 --> 25:01.000] So the question is, does this use the GPU to display the graph? [25:01.000 --> 25:03.000] Yes. [25:03.000 --> 25:07.000] SigmaJS is heavily relying on WebGL. [25:07.000 --> 25:13.000] The previous version of SigmaJS was proposing to choose between Canvas and WebGL. [25:13.000 --> 25:18.000] Right now, it's only WebGL, so it won't work with all browsers. [25:18.000 --> 25:24.000] But nowadays, most browsers know to work with the GPU. [25:24.000 --> 25:28.000] So, yes. [25:28.000 --> 25:30.000] Thank you so much. [25:30.000 --> 25:49.000] Thank you.