Live CEOing Ep 744: Language Design Review of Discrete Computation Features for 14.0

Design review for Wolfram Language 14 focused on discrete computation and geometry. Participants (Stephen Wolfram, Roger Germundsson, Charles Pooh, Brad Klee) discuss making geometric primitives computable (moving B-splines/NURBs from graphics into region system), automating discretization/triangulation, handling polygon boolean operations and the practical zero-testing/precision challenges, and UX ideas for progress monitoring and timeouts when attempting exact symbolic computation. Later topics include graph layout improvements (layered/hyperbolic/3D), texture mapping/projections for 3D objects, and remaining implementation loose ends.
Chapters
All right. Hello, everyone. Welcome to another design review in our season of design reviews heading for wolfram language version 14. Today it is discrete computation. And what do we see here? We.
So the backstory is that in this release, it's kind of build up for the next release in a way. So in the next release we hope to have full support for solid CAD. CAD geometry. And that's based on B splines or NURBs. And so this release, these are now becoming geometry primitives. They haven't up until this point been geometric primitives, so you couldn't. So now you can.
Geometric primitives, you mean. You mean. I mean, they've been part of the region system, haven't they?
No, they've not been part of the region system. They've been part of the graphic system. Sorry.
I see. Okay. Only the graphic system.
Yes, because you need to actually know things about them in order to compute with them.
Okay, let me make a general complaint. Okay. I don't understand discretized region, boundary, discretized region, and so on. You know, I made a piece of geometry and I want to do stuff with it. I never understand when do I need to use discretized region. So.
Well, it depends on what you're going to do with it. And so in many cases you don't need to do it yourself because we automatically do it. So in some, if you have some horribly complicated region in order to actually compute with it, you typically need to discretize it. And only in some cases do you need to discretize also the. Let's say you have a solid. Do you also need to discretize the interior. That's often called triangulation and things like that. It's like for finite element, you need that. But if you just want to see the shape of a solid boundary, discretized region is typically sort of what you want to do.
So I'm going to make a complaint here. I mean, we need to make this more automatic because, you know, I'm not completely clueless and like every time I try to do this.
That's what we're working on, Steven, that more of that is getting automated.
So I won't ever need to use discretized region myself. Is that a true statement?
Well, I mean, you still probably have to do it on occasion now, but that's what we are doing now.
Yeah, that's the problem.
Yes, but that's what we're working on to not have to do that.
Right. So we are extending most of the method to actually automatically do that for you And I mean, it's, it's, you know.
Let me show you an example. Okay. This is, this is something I've been working on with Brad. This is where you can see these are polygons that are various kinds of polygon union things. Okay. Actually, one complaint here, which I want to also express is those icons get very expensive when there are lots of them like this. What can we do about that? Because the icon is very low resolution, could we not discretize these things at very low resolution and make the icon. Hello?
Yes. So when you say discretize, what do you mean?
So they really you by the. Charles, it's hard to hear you.
Yeah.
Oh, can you hear me now?
Somewhat. Yeah. Okay. What I mean is this. Okay. This icon is tiny, right? It doesn't need high resolution yet. So I'm asking you, when you generate the icon, are you doing it.
Oh, rasterizing. Not discretizing.
You're talking about probably rasterizing. I don't even know. Or approximating with a small number of lines or something so that the cost of producing all those icons is really low. Am I making sense?
Yes. Yep. We, yeah, we should be able to.
Charles, you are super hard to hear. I'm sorry. The, sometimes zoom seems to set, you know, voice levels. If you change microphones, it will get confused. And I think you maybe have to reset something.
Wait.
I think you're there, but I can barely hear you.
Let's see. Is it better now?
Somewhat, yes, much better. Is it okay?
Yeah, just I think you.
Oh, now you're. Yeah, yeah, right. Yep, I fixed that.
Yes, yes. So we are, we are working on that. We probably will have to find a way. I, I think we tried the rasterization. It doesn't work that great. I mean, there's still the, the cost of running the rasterization for each polygon, but it's, it's something we notice and we are trying to fix.
I wonder if there's a way to do very low resolution rasterization because that can't be that expensive, right?
How important is it for you to have a shape that shows what's underneath it? Probably, Probably. It is important.
It's pretty nice.
Nice.
Yeah, it is pretty nice. I agree.
I mean, this is really, you know, this is a useful picture. If this just said, you know.
Yeah, yeah.
How many blobs? It's not very.
No, no, it's, it's clearly useful. I, I.
Okay, now the other issue here is I think we've got pentagons being put together here and you know, right now, Boolean, you know, region, union, or whatever it is, just returns a symbolic. It doesn't actually do it. I'm gonna make it.
It does it. I mean, that is the representation of the union.
I guess you want a polygon at the end is what you mean.
I want to. I want a single polygon. I don't want a boolean. Whatever. I mean, these are polygons. Look at it. It's a polygon, actually.
Can you see the example? Sorry, Roger, I thought we were doing.
That for, you know, because we have closure within polygons.
Yeah, we should. That's why I say we should probably look at the example. We. We work on it from 13.2 to actually make all that possible. So maybe there is a.
Well, Brad, I mean, in. Isn't it cool that things like that work?
Yes.
Now, there is an issue actually here. I don't know if somebody's able to actually find Brad. We could ask in real time. Could somebody go find him, please?
I can ask to see if Brad can join you.
Okay, I'm gonna come back to your agenda until or unless we get that, because I think I wouldn't mind hearing from you. I mean, so Brad has definite examples where, you know, it just returns Boolean, you know, combination symbolically, without turning it into an. Without resolving it into an actual polygon. He also has examples where, you know, he's got pentagons and so on. And the question of whether they. Whether they.
Hold on.
Can you pull a fresh copy of that from the agenda?
Because I.
Did you pull that from the. From my website. Something is wrong.
The example are missing.
Yeah, the examples are missing.
Well, I. I just pulled it from the. From the Agenda link.
I have the same thing, Roger. Sorry. Mine looks exactly like Steven's. Okay, I'm copying over.
Send it by email. Send. Send it by email. Unless it's too big.
Could you pull it again?
Okay, Look, it says it's 13 kilobytes. I can't believe that's big enough.
No, that doesn't seem right at all.
It's the same size as it was before.
Okay, so let me just take something here one second. Okay. That this. I. There's something is wrong here on my end. I don't know what it is yet. One second.
Okay. Oh, my gosh. Layered graph. That's going to change my life. Sort of the number of times I've had to type graph layout arrow layer digraph embedding is ridiculously large. We're getting that. That's really cool. I Want to see examples of these? What does layered graph 3D do?
So we have the 3D version.
Right.
So the layer graph is 2D. Right. So this is the 3D version.
Okay. Now Stephen, could you pull Was my bad. I actually.
From the same location? Yeah, I'm sorry. It's still the same size, 13 kilobytes. Look, just send it by email, please.
It'll take a while. I'll do it.
Well, send us a link somehow.
I have a copy. Roger. You want me to send that?
Yeah, send it.
Hi, Brad here.
Hi there. We're talking about geometry and region. You had an example of where we couldn't get the actual raw polygon out. All we could get was the, you know, Boolean combination. Symbolically. What is that example?
It's on the function repository page. Planar polygon fragmentation thing.
Okay. I think it's Charles, you. Charles, you were going to say. You say you're not intending to do that. Is that correct, Charles? That it might happen in a corner case or something or what?
Yeah, it's probably a. A corner case and I need to see the example.
Okay, where is it, Brad?
Look under properties and relations.
Okay. See this? Okay, this. I don't get it. Region union. Okay, let's just run it. Okay. Is that what you expect, Charles?
No, should probably give. Can you apply N in front of the polygon? Probably.
In front of which part of the polygon?
Even that one. Any. Any of them. So just to numericize here and coordinate.
Aha.
We'll fix that. It's one of those decision where we try to do exact and maybe the exact method fail and then we don't recover correctly.
So. Okay, so then Brad, if I can.
Just say something that was the purpose of this. WFR is getting about halfway through the whole problem of doing the poly set operations for polygons. And the only part that's really left is like this algorithm here just kind of makes pieces and then for the last.
You're trying to do it. Exactly. Is that right, Brad? Yes. Yeah.
Because if it's just a polygon with linear edges, then, you know, you can always solve those intersection points pretty easily.
Except that you had that problem with max extra precision, didn't you?
Yeah. Ultimately the most difficult part of this whole thing turns out to be the undecidability of zero testing and.
Yeah, go ahead.
And I didn't. I just tried to make this thing run at machine precision, but still be able to. Because what I decided for the zero testing is probably in the end all the zero Testing is going to be have to be numerical to some set.
Okay, but, but, but I just want to know from Charles and Roger, is this is what Brad has done here, Is this a useful extension to what you already have?
No, what I meant is, you know, we do the end here just to check that the result will work. In principle, we should be able to do that. Exactly right.
But that's what Brad just spent a bunch of effort on. So maybe you can make use of what he did.
Or do you think we already have the module internally and we do that in a more clever way by using numerical approximation to zoom down to the number of. I mean, where we actually need to compute the intersections and then from it recover for the exact to preserve the performance.
So wait a second, so is it the case that the fact that this. Okay, let me just understand the flow here. The fact that this didn't work is a bug or it's. Okay, so you claim that absent the bug you will be able to do all the things that Brad is doing here. Is that true?
I don't know what he's doing, but we should be able to do the regional union. Exactly.
Okay, Brad, are you doing things other than region union here?
Well, we're not even quite doing region union here, but what we're aiming for in the end is region union, region intersection, region difference, all of those things. Working on polygons and getting the exact coordinate values whenever they need to.
Okay, but Charles is claiming that he thinks he's doing that except for bugs.
Well, in my playing around with this functionality, I've not seen it. I've not seen very many cases where it goes through.
Okay, fine. All right, well look, so I mean, Charles has a driver for additional things that should work because Brad has managed to get some additional things to work. And I think you guys should talk about it. And you know, it may turn out that what Charles has done is, you know, will kind of COVID everything Brad has done when the bugs are removed or not as the case may be, but let's find out. That seem reasonable. But I just want to understand in. In Charles's case, are you going to run into max extra precision type. Type nonsense when you try and do the exact computations.
Well, I'm not sure where the max extract precision is happening. So I mean, essentially this align line intersection. Right. Pretty much assuming that the polygon is canonicalized. Right. And there is no self intersection in the polygon and all those special cases.
Brad, what was the case where you ran into this?
Yeah, like let's say that you have. Well, in the, in the multi way example that Steven's got in the background there, what happened was that especially with the pentagons is that we were transforming the pentagons through space and trying to get them to line up edge to edge. And then we just want to get the region union combining these two adjacent pentagons like you can see it right there. But that process is going to involve identifying that two of those vertices on two different pentagons are the same thing. But you can get symbolic. As soon as you're doing rotation matrices and translations, you can get symbolic swell pretty easily. And the max extra precision stuff comes out a lot when you have these square root of. Nested square roots, square root of fives, whatever.
Okay. So that's because the rotation matrix and the pentagon coordinates involve algebraic numbers basically. Yeah.
Is the standard zero testing issue, right?
So yeah, it's a standard zero testing issue. Yeah, I know, but that's why I'm asking you, is that something you have seen in your stuff? Because it seems like it's a generic thing that's going to happen.
But it depends on if you use possible 0Q, it doesn't happen.
Well, even there it will still fail, right? I mean there is.
It will fail, but it will not issue the message.
Right?
Yeah. So what I was thinking for the design of the final design is that there would be something like possible 0q, but maybe the user can pass in a working precision goal that tells the function how rigorously it should.
Which is, which Charles could potentially do as well. I mean, you're not doing that for region union at this time, are you?
Well, we are using different order techniques in geometry to resolve those, those kind of cases. Right. It's similar to what we have introduced, you know, you know, positively oriented or negative oriented on left or right of a line to resolve those testing issues in geometry. So there's those different technique we use behind the scene.
But what I'm trying to get at is in the end you're not going to have a zero testing problem or you are going to have a zero testing problem in the end. Do you think that you are going to never need to worry about zero testing.
In the case of a line? I believe we will not have to worry about it.
Okay. I think you and Brad should meet up and you should look at this and maybe, maybe, maybe there's a way to resolve what Brad is doing. Or maybe Brad is looking at a case that hasn't been considered yet. All right.
Because I really think the zero testing issue Is unavoidable.
Okay. But Charles thinks there might be some. I don't understand Charles's claim that it is avoidable. I don't understand how you know whether the polygon closes there or has a seam there. Unless you have some convention that causes you to just say, no, I don't. I just don't understand. How do you, how do you avoid. How do you know that those two points are actually coincident?
Yeah, that's the issue.
So directly in the standard way. Right. Is obviously is a road testing, but usually it depends on how you build the algorithm you run in geometry works, which at the end, to resolve those issues, you pretty much always have to figure out if you have a line and your point is on the left of the line or on the right of the line. So we reformulate the problem completely differently. And in those case, you may avoid it.
I see. But I mean, the case of whether the two points like these pentagons. Right. Is there a gap between these two pentagons or not? Doesn't that require zero testing?
Yes, but you can use the fact that if you build the two line which are parallel, if maybe that gives you an additional information instead of just comparing two points, you pretty much have four points which give you enough information.
Right.
But yet there is always the case that you can build case where, you know, it may happen.
Okay. All right.
These kinds of problems are pervasive and in the 1980s.
Absolutely. Yeah. Geometry. Yes. It's almost humorously bad. I know.
Yes. You know, so there is layers and layers in our geometry engine that deals with this at various levels.
I know, I know, I know, I know, I know. All right, The. Okay, I'm, I'm, I'm also seeing a complaint from Sandra on our live stream that, that this, this stuff is nice but slow. And he gives an example here. I'm going to cut this down to 100 because I'm worried that it's going to take too long. No, no, that's okay. Maybe he's referring to the rendering time. Yeah, I think we go back to the rendering time then. Okay, let's continue with the rest of the agenda. I think, Brad, if you, if you. I don't think you're relevant for the rest of the agenda if you want to depart or not, as the case may be. Let's, let's dig in. We now have examples here. Okay. Bezier curve. Oh, we can compute the arc length of the Bezier curve. That's cool.
It's a piecewise polynomial.
Yeah, I guess that's Right. Okay. Now I'm just, I'm, you know, I'm still attacking the discrete. Let me make another comment. Okay. You know, we know there are these workflows, region union of things, you know, the, the BRAD example here. Right. What are you doing to inventory? You know, in other words, we have certain principles like you should never need to use discretize region. Right. You should never in. Except in corner cases, you know, nobody should need to know about that function.
Right.
So.
So what we've done is that basically we've given up an exact computation. If we insisted on. Like we do in the rest of the system. If you call something. We don't have a parallel set of N functions and S functions.
Yep.
So we have one set of functions. If we insisted, if we always went exact and hung or returned unevaluated, I.
Think nobody would like it.
Exactly. So what we've done is that they all have a working precision option.
Okay.
Which is effectively an auto discretization, you know, option. The setting is automatic.
Is that a new plan or is that.
Well, no, it's a couple of years old, but we've. We haven't we sort of steadily and steadily flowing it in at more and more places because it takes work to get it right. And you can set that working precision to infinity, in which case you will insist, you will basically opt into exact computation. Otherwise, the automatic plan is that it attempts, given exact input, it attempts to do exact computation if we have such algorithms. And then after a certain time it will give up and it will recover.
Exactly what I was going to suggest. Yeah, yeah. Now my only question there is how long is the time? 200 milliseconds or something? Or how long is it? Is it human and perceptible times or not?
Charles, you mean when we attempt to do the exact or not, how long.
Do we give the exact. Before we sort of.
Before we punt and go to approximation?
Well, we build it in different layer, Right. I mean, so we have first sample case where we know, you know, the exact method. So we go with that. As long as we know that everything will work.
Right. Yeah.
So there's a class of problems for which we know we have input completeness, Right?
Yep. And where exact will work? Well, wait a second. Exact will work quickly or exact will work? Okay, I've got a suggestion. Okay, sorry. Do we just know that it will work or we know it will work quickly?
We know that it will work. It will work quickly?
Yes. Yeah. We have lots of cases where we've derived new methods effectively which are Quick and scalable and symbolic.
Okay, so hold on a second. They're different cases. Number one, we know it will work and we know it will work quickly. Number two, is there a case where we know it will work but it might be slow or does that. Is there no such case?
Well, wait, while we, we went a little bit differently.
Right.
So we know that it will work and you work quickly. So we have the method and essentially what we build then is a fallback general method.
What do you mean? A general method that is exact or is inexact.
So when I say general method, so the general method is inexact, which is kind of the discretized now. And also we have a general method where we know, okay, it exact. But let's suppose we know that we call an expensive function as N integral integrate, for example. Then we put a time constraint which roughly in most of the time is about 2 seconds and then we fail and then we default to the numerical method.
Okay, Can I make a suggestion? Okay. In the case where we're trying this exact thing, why not have a progress monitor that comes up saying trying exact computation and it could even say, have some words in it that basically, you know, even by saying trying exact computation, that's a clue to people. If you don't want to take that extra time, go look in the documentation. You could probably avoid this. Do you see what I'm saying?
Yes, we can start to add progress monitor as an option for most of them.
But I would say the very specific thing. I mean, I just had this idea, but I think it's a decent idea and I think it's an idea that we could use in a bunch of other functions. Because putting up a progress monitor, which is going to go away when the computation is finished, is a very low risk thing to do in my view.
Well, but I mean we haven't at least in this case propagated. Because there is also the cost of actually estimating. Right. The progress of the method of what's happening.
Right. A progress monitor doesn't have to show progress. That's what I was just saying. What I was saying, don't worry about assessing amount of progress. All the progress monitor.
Well, some of them just establish steps. You know, I'm doing this and then I'm doing that. Yeah, it doesn't say how much and that accounts for how much time has elapsed.
Yeah, I can do that. Right. But also more important, it would just say attempting symbolic, you know, exact symbolic computation.
Okay, so generic, right? Enough. Just information instead of more Timing done. Okay.
Yeah, Right. Just that, just that. Attempting exact symbolic computation. And you look at that and you see I've got a hundred of these things going on. It's taking five seconds doing each of these. This is crazy. Let me go look at the documentation and find out how to tell it to not even try to do that. See what I'm saying? I, I, I'm kind of thinking that that might be an interesting thing to do in other places, like, I don't know, Eigen values or something where it's trying to do an exact thing and it's just like, takes forever and it know actually, Stephen.
So, so, so we're slowly attempting to migrate. We haven't done it in a, in a big scale, but this is kind of like our, what do you call it, lab, if you like, where we're, because there's no choice for geometry. No, yeah, I get it, I get it.
But what I'm suggesting is a general paradigm. But, yeah, but doing this, which will make it cheaper to decide to do it.
Yes.
Because if, if it says attempting symbolic thing, you know, in fact the way to do it. Here's my suggestion. Okay. This is actually a decent idea. Okay. So attempting symbolic, exact symbolic thing. Okay. Failing over to inexact computation in 5, 4, 3, 2, 1 seconds. You see what I'm saying?
Yeah.
Why is that useful? That's useful because it tells one. It might be possible to do it symbolically. And if you wanted that, go look at the documentation and see how to do that. You see what I'm saying?
Sure.
Rather than, because, because otherwise what's going to happen is it's, it's going to be very obscure. It says it's trying to do the symbolic computation. It's going to give a result, and it's like, well, where the hell did that come from? And, and, and the fact that it says Failing over in 5, 4, 3, 2, 1 seconds already gives you the idea that there is a timeout number. Yeah, I like this idea. I think this idea could be done very generally and it would solve the problem that we've had for, for decades where people say, oh, I was doing eigenvalues and your system is, is, you know, 80,000 times slower than this little, you know, trivial numerical thing that I wrote. Yeah, right. Yeah.
No, I, I, we've had this come up in many areas in, when we do symbolic statistics, for instance, you know, probability.
Well, I think this is a good general solution. I mean, you basically just have a countdown in the progress monitor, you have a countdown saying what's happening? And then you fail over and we, we pick a number and you know, you're able to put, you know, we need some general option name. You know we have one in simplify. Right. And full simplify. We have time constraint, don't we? You remember what that is?
No, but I remember we have one.
Time constraint means.
I haven't used it for a while.
That function, that, that capability. No, I agree. I haven't used that for a while either. I mean basically either full simplified works or it doesn't. And you, you don't, you know, you want the default. So the fact that this default is infinity is interesting. And again, you know, I mean, what I'm suggesting is introduce this time constraint thing or maybe some slightly more refined version of this with its progress monitor. Anyway. Okay, let's continue. I really like this idea. I really like it. I think it's going to solve a bunch of problems. Okay, okay. I don't want to see any of these boundary discretized region things. Why am I seeing that? Why are you even showing that? I don't understand if I just say region of this, why doesn't it just work?
That's actually so if you look at the difference, that's actually the improvement we are adding in this release that we are generating sharp corners with different ridges.
Okay, fine. But whatever is happening, it should happen just with region. I shouldn't have to say boundary discretize region. Right? Right. We agree.
Yes.
Yeah. Okay, fine. Okay. So that's very cool that you can do that. How are you doing that?
Boolean.
Use booleans with bsv3 on more mainstock.
Audience so the thing is that when you're trying to discretize like in like a region plot 3D or something like that, a marching cubes style method will not be able to get sharp bridges.
Right.
Okay. So what you have to do is to discotize the various pieces and then do you know, boolean operations on it and you'll get sharp bridges.
What is this?
Probably an imp. I don't know.
That was the example for import for step. Unfortunately it's not fully plugged in, so the example doesn't run. Yep, thanks.
Okay, what else do we need to look at here? I mean this is. This looks cool, but I don't know.
There is no particular design issues.
Fine.
But it's still feature.
Other than the fact that we all agree that discretized region should never be.
Needed except when you want to convert your region into a mesh.
Yes, fine. I mean it's like six other.
A little bit like saying that N is never needed.
Fine, yeah, I, I get it, I get it. But I mean, in, in what are the related things here? Okay, what is mesh region as compared to discretized region?
Mesh region is a region representation of the.
Is a mesh representation of the region. Okay, that's fine. Yeah.
It's a type of region piecewise linear that is a converter and that had additional goals, not yet fully implemented. Because graphics is a container of a soup.
Yeah.
And you need to be able to search in that soup to find what it is that you want. And so that's not as fully developed yet as it. As it will be next week.
And the issue is what? That there's certain graphics furnishes we can't successfully discretize with discretized graphics or what?
No, but let's say that you only wanted the red parts.
Yeah, okay, that, that's the thing I was imagining. And I also, I don't understand whether you can, you know, whether regions can ever have red annotation. Can regions have annotation like graphs?
Yes.
So you could carry red or texture as an annotation?
Yes, it's a work in progress, but you can pretty much wrap it with, you know, styling and all the stuff.
I see. And then when the region display happens, it will by default use the styling. Is that true?
Yes, you should.
Can I see an example? Like for example, if I do here, if I go here and I say style of the ball red. Whoops. Now I'm very.
I mean, if. I mean, so current. So currently we, you know, we started to add those annotation and information just for the region wrapper. So in principle, if you do region of a disk and you do the disk red, you should get the disk red.
Okay, but, but look, you got to make these things all work. I mean, something like this has got. This is. This is not. Ok, so you're saying region of style of disk red. Okay, that worked. But for some absolutely mysterious reason, the other thing didn't work here.
Well, not per se, Mr. Reason. By default we make sure that the input is a region. Right. So style of a ball is not a region. But those are the enhancement we hope progressively to start to get rapper, you know, in most of the functions.
I understand, I understand. It doesn't matter. Region intersection. Okay. It's very naive of region intersection to insist that the thing is on its face. I mean, it reminds me of these, you know, CD8 positive cells and things in the body on its Face on its boundary, on its, you know, it is visibly a such and such cell, so to speak. Right. That shouldn't be necessary. Maybe that's what you're saying. Region intersection should be able to discover that this is, in fact, a region, even though it was wrapped in something different.
Yeah, definitely. We can. We can do that.
We agree that that's the objective, right?
Sure.
Is there any issue about that? Objective?
No, I mean, we haven't emphasized that first, because region operation. Region intersection is an operation. Right. So usually we assume that the input should be a region, but we can't.
Okay, but we shouldn't assume that. I mean, you know, given that we're dealing with annotations, this is the same mistake we keep on making. Right. Once you introduce an idea like, I would never, you know, after. This doesn't work. I would never bother to try this. See what I'm saying? Oh. Unless it's uniform, people just assume it isn't going to work.
No, no, I definitely agree, but what I meant is, you know, are we expecting somebody to type? You know, area, style, ball, red.
Sorry, my Internet connection.
Sorry about that. Are you back?
Yep.
Okay. Yes, we're expecting them to type. I mean. Okay, we're expecting. Okay, so let me explain why they might type that. They won't type it. It will be the output of something completely different. See what I'm saying?
Yep.
So we can want it to just work in the same way that this just works. Right. I mean, here, I'm sure if I ask for this, it will, you know, tell me. It's. It's PI. Right. Even though it's red, it doesn't make a red pie there. It doesn't care. But it's got to work in general. Not. Not. Okay, we get the point.
Yep.
All right, let's. Let's move on. Let's move on. Let's move on. Wait a minute. Did I get the examples? Yes. This is the one with examples. Okay. Oh, joy. This is great. Okay, let me complain about two things. One is aspect ratios of some of these graphs. What is determining them? Because they were way too high in some of the things I was doing and it didn't care about aspect ratio. If I changed aspect ratio, it didn't pay attention to it. Do you understand what I'm saying?
Do you want an example? Yes. So one is that we, as long as I remember, we don't set up the aspect ratio and just let the graphic, by default use the aspect ratio.
No, I mean the graph determined its aspect ratio. I know that. See if I can find one for you. Well, I don't know if I can find one. They've all been fixed now, so. Oh boy. I mean, there's a lot of complicated code here. I don't even. I can show you what the graph roughly looks like, but, but I don't think, you know, there a graph. Like this where it was just taller than it should have been and, and you know, it had to be manually modified. And when one gave it. Do you think it should pay attention to an aspect ratio specification or not?
Personally, I think it shouldn't because to really get the right aspect ratio, we need to recompute this. You need to actually know the size of the vertices. Right. And the only way is to do a pass to the front end, render them, and then be able to estimate the white aspect ratio.
Yes. So.
As long as we all agree that there is a cost to it, that's fine. But it's just that we want.
I mean, I mean, yes, in. Look, if you have to render, I mean, it's like with performance goal, arrow quality or something, we should do it.
Okay, yeah, probably for performance goals. Performance goal goes to quality. You should probably add that.
Let's do it. Let's do it. Right. See these kinds of things. It drives me crazy because I didn't know this, that we're just ignoring the aspect ratio because we think it's too expensive to do the computation. I had no idea. And it's like, how would I ever know that? You know, to me it's just a bug that doesn't work. Am I making sense?
Yes.
But I don't understand.
If the aspect ratio is just passed along to the corresponding graphic, it would respect it.
No, it doesn't. It does things like it. It makes the, you know, circular nodes of a graph elliptical and weird stuff like that.
Yeah, that's what graphics does.
That's not the right thing. It's not the right thing.
Ah, right.
We want an aspect ratio. That's the whole point. We want. I mean, graphics doesn't. Well, okay, graphics does do that, doesn't it? For. For a disk. Yeah.
This is actually what graphics does.
Okay, so hold on, hold on. So what I'm saying is we want the overall. Okay, so what are other examples of something where we want the aspect ratio not force changed, but it's because a graph doesn't have geometric information in it. We could imagine changing the aspect ratio without sort of, you know, distorting the individual elements. Right. You see what I'm saying? We can Change the aspect of this graph by just doing this. Okay. And that's what I want it to do correctly, automatically. If I say, take this graph, right? If I say this and I say graph of this aspect ratio, arrow 1, for example. Oh, whatever. I mean, this is some more complicated thing. I don't know what that did there. Oh, yeah, it's complaint number one. Complaint number two. Arrows break off their arrowheads when you resize a graph. Are you aware of that issue, Charles?
I saw debugview file.
Go ahead.
I saw the bug view file. But I mean, it's, you know, it's something which I should probably discuss with you. So it's the rendering for the apple head. Such.
Right. The arrow. The arrowhead breaks off. Right. It's clearly wrong. The other thing that happened is, which I. I think we sent in, Nick probably sent in his bug report. We had these very vertical things, but this one may have been an example. And as you resize it, the arrows suddenly. Oh, look. Look at that. The arrows just sort of broke off there. The arrows suddenly get, you know, absolutely huge. Right. So you see that the arrows broke there? See that?
Yep. So that's. That's a random issue.
Yeah, yeah, that's a random issue. Fine. But something is wrong.
And your example from Nick, it's. Is more on the graph side. Why we didn't estimate correctly the size of the arrowhead.
Okay, fine, fine. Okay. So you can fix it. Just a corner case. All right. Well, this is great. So layered graph is. Okay. Now what happens if the graph that has a root node. Right. Graph assumes a root node.
Yes, we.
Which root node does it? You compute a root node. How do you compute a root node for a root node?
The graph center.
So it picks one at random. Is that correct? What did it do? In that case.
We compute the graph center from the graph center.
Is a complete graph. Doesn't have a graph center, does it?
I guess probably pick the first one or such.
Okay, well, you should document what it actually does. Now, I do think, how do I give a different root node here?
I think the second argument should be the root.
Okay, that's what I was assuming. But okay, so let's try taking. I mean, in this graph, I know these are very symmetric. These are very, very symmetrical graphs. But. But I mean, so this will just look the same if I say four. Really? Why does that look different? Isn't this a vertex transitive graph?
Well, it's. We, we cannot guarantee that even for the same graph. When you compute the layout, there won't be some, I won't say numerical error, but some change in the layout. Yeah.
So this is saying dominant vertex at position. Whatever. So if I say four arrow top and if I say four arrow left. Lovely. This will be super useful. Thank you. Needed this a million times now. I mean, if I say layered graph 3D, is that a new algorithm that we've never had before? Layered graph 3D?
No, we added it to layer graph plot 3D, right?
Yes, when we released layer graph 3D couple of release ago.
Why is it so flat? I mean it's one something that happens from time to time. It just sort of punts on being 3D. Maybe there's nothing you can do in this case.
Yes, probably.
I should be using Air Graph 3D to use that. Actually, I think some of the things.
That we looked at like food webs and so on look really nice in these. The 3D layers.
Well, I think I've got a lot of examples. Oh boy. And you've got, you've got hyperbolic as well. Wow. Okay, can I try if I say carry tree. 50 or something now let me try doing graph layout arrow hyperbolic embedding.
And disclaimer. There's still some issue we need to be resolving, so it may not be perfectly what you expect.
Okay, let's go to those.
That looks what I would expect. Well, no, there's a bug.
Yes, those are the case.
We are trying to trace down why it's happening.
Okay. And obviously the, the node sizes are too big. Yes. But when you say hyperbolic layout is, is it. I mean the pine gray disk and things like that have a circular boundary. But is that a necessary feature of rendering hyperbolic space? I. I'm just. I mean, in other words, the mapping onto a. A disk, is that, is that generic somehow? Or could you render hyperbolic space in a different sort of mapping to something different?
It could be different. But essentially what we rely on, this is essentially the spring electrical embedding. But we rely on essentially be able to find the right projection which give you the tangent space on the, you know, distance and angle correctly.
So we could probably do hyperbolic in 3D. It would render into ball.
It could be any. Yeah, it could be even any, you know, manifold surface type thing as long as you have the right tangent information. And then we do the projection every time we do the spring electrical.
I think it'd be nice to do the 3D version of this. Although it might be hard to see because it might be that you'll. That it always has. You Know, coating on the edges, so to speak.
Right. If it's a growing tree. Yeah. It might be nodes all the way around.
Right. I mean, it's worth trying. And then, you know, it might be the. The only thing. I. I don't even know whether it would look reasonable. Sounds like a thing to. Okay. Prototype. All right. Good stuff. Yes, good, because that's something we didn't. Didn't have. Sandra is commenting that layered graph plot, isn't it the same as this? It is more or less the same, except this is just with a graph. I mean, I assume if we say graph plot. Yeah. I mean, we should be retiring graph plot. Wow. It's exactly the same, except that's the graph as we can see, because it's purple. Go ahead. What are you going to say?
Well, but the graph and the graph plot and the family of graph plot function are useful, Right. Because we want the generated graphics, but it's also kind of the way out when you have a really large graph. Right. And in most of the case, we don't want, you know, we generate the blob.
Yeah.
Instead of actually Runway.
I know, I know. Although I'm not totally certain that that's the right design approach. In other words, it's. It's not obvious with our more interactive way of handling things nowadays, it's not obvious that that blob shouldn't just have an attached, you know, tab that allows you just like. Just like the. You know, why isn't it just like a too big output? You see what I'm saying?
Yes.
Yeah. So to force a layer. No, it's not.
Right. Yep. Yeah, we can. We can add that. So you can just press on it and then it force the layout.
Yeah, right, right, right. I mean, but other words, the graphic motif will be similar to the. The too big. I mean, honestly, that would be a good, you know, fallback for many of these things. When the graphic gets, you know, sort of when we think it's going to be too costly to render is you render it as something, you know, because just like, why are we. Why are we doing what we do? If you say, you know, range of a million, you know, we're doing that because we think it's going to be too expensive to, you know, split that out into the notebook. Right. So we turn it instead into this, you know, into our standard, you know. You know, we turn it into this. Right. Because it's too big to split into the notebook, but we should be able to do exactly the same thing with, like, a graph that's too big. Probably with the same graphic design. Am I making sense?
Yes.
The only difference is this is always top level. So if I have a list of two ranges, I'll just get a single one of these blobs. Whereas with graphs you might very well want, you know, if you have a list of graphs, you might want one per graph. Do you understand what I'm saying?
Yes.
Okay, let's just look at other things here. Well, it's not.
Well, it's not yet completed. It's just still in, in progress and we. I don't have any. So you probably want to look at the table of contents. Maybe that's the.
Oh, but I just looked at two random chapters.
I mean, it's listed, but it's not yet fully completed. So.
The heck is a cohesive group.
Social network analysis. So like a clan or a K clan your community. Yeah.
You know, somebody should at least look through the endless uses of graphs that I've had in the last few years. Because this seems a lot like, like, you know, what graphs were used for 10 years ago type thing. Much of which is they're still used for today. I mean these kinds of things are, are useful, are good. I would recommend taking a look and I think you'll find a bunch of. For example, see, I mean there's just tons and tons and tons, which is a tribute to the whole Charles enterprise here. But I mean, you know, you go and look at this. There's tons and tons of graphs here and, and many of which the things one's doing with them are a little different than this kind of story. Am I making sense? It's not social network analysis. You know, these are game graphs in this case, right?
Yep.
And, and there's a lot of stuff here where it's.
But also just, just so you know, we're not attempting to put like a. We want more books rather than like a big encyclopedia type, that's fine.
But I'm telling you, I think you got to modernize what you're talking about with graphs and networks.
Okay, but I mean, so.
Sorry.
Yeah, go ahead.
So what I mean is, so the, the, I mean, the idea is the, you know, is first an introductory, an introductory book for, you know, anybody who want to learn, you know, Kafr network. And probably at the last section is where we try to have social network consult, you know, you know, we can probably add. Add more.
Look, the fact is something like the game graph of Tic tac toe is a pretty easy to understand what it's supposed to be. But it's an example of a graph that gets big. You see what I'm saying?
Yep.
And I mean many of these graphs that I have, it's very easy to understand what they are and they get big and then things happen with big graphs that are not, you know, you can have a big graph that if somebody went out and measured what beetle eats what beetle, wherever it is. Right. But these are graphs that get big, you know, of natural causes, so to speak. Well, the Beatles are probably natural causes too. But again, you know, it's kind of like what do you do with a graph like this? How do you, how do you take subsections out of it? How do you, how do you illustrate, you know, you know, how do you have nodes that have things. How do you deal with flow through graphs like this? Those kinds of questions, right? How do you. I don't know what this is. This is some. Yeah, this is a strategy of, for tic tac toe games. Okay. This is all. And this is all graph, you know, paths and graphs. But it's all the same type of thing. But it's just like, I think there's a. Yeah. Somebody should take a look through. There's tons of graph related things here.
You do?
Okay. I would, I would recommend really just look at the last four years or so. Actually, more than that. I mean, I'll give you another example here of, you know, I'll give you another example that, that's this one. It's another good example of, you know, that's the citation network of Euclid. Okay. It's pretty nice data set because it's quite, you know, it's 465 theorems. It's not that big. But then here, there's a lot of stuff like your Dominator thing is a story here. Right. I mean the whole point is. And then this type of thing, like you can do the same type of analysis that I did here for, I don't know, the US code or endless other things. But it's not social networks, which is kind of a pass kind of analysis. Right. It's like, it's a, it's a new, fresh. Not very hard to understand what the point is. You know, it's not that new. I mean, people have been doing these. As a matter of fact, you know what, in terms of. That's the, that's the theorem network of Euclid. Right. And you can compute all kinds of things from that. But just to prove that there's nothing new under the sun, there a thing that actually Don Knuth pointed me to. This is. Oh, actually he doesn't have a network. This is the dependency graph of the theorems in Euclid written out by a certain Thomas Harriot who also wrote a brief and true report of the Newfoundland of Virginia in 1585. Just to make sure we know there's nothing new under the sun. I just thought that was, that was kind of cute. He made some mistakes, but, but that's, that's the, you know, that he could have drawn that as a graph. He didn't. Okay. In any case, I'm just, I'm telling you there's a lot of stuff here that is, you know, graphs. I mean, that's one that comes, that's another thing you should do. That's one that comes directly from our, From our data. And, and you can also do that from, from a lot of stuff from our built in data. Yeah, this. You need to not be looking backwards to what people wrote in graph and network books 20 years ago. You need to, you know, we've got a lot of good new, more material. Somebody should look through the community as well. There's probably a lot of stuff there as well. You know, modernize. Please, Please.
Yeah, definitely, we'll do that.
The. This is the thing I've been asking for, for a long time. Did you run these or should I run them now?
You can run them.
What on earth is the thing that gets wrapped around the sphere like that? Oh, it's, it's. Really. So what projection is that.
Spherical? The texture.
What?
The texture mapping is a spherical projection.
I understand that, but I'm asking.
Go, go to the page, reference page. And there are illustrations that explain each of the projections, the standard projections.
Okay, but I'm just understanding that doesn't look like the Earth. That looks like the Milky Way. It is, Yep.
You have, you have two texture projections going on. There's a, there's earth and there's a cylindrical equidistant texture. Let's see. And there's also using. There are two spherical projections.
Where's the texture for the earth? Or you didn't give that. Because it's there.
It's there. It's coming from a, an entity.
Entity.
Oh, I see, I see, I see, I see. That was what was confusing me, but I do want to see the page. Okay. That looks much more familiar. Thank you.
Yeah. And that's a cylindrical equidistant. Yeah, whatever.
Yeah, yeah, right, right. I know what that is. I mean that's, that's unsurprising this was the surprising part. Okay. Texture. New. This is very useful. This will be very useful. And how does this relate to what people are doing with 3D cameras and so on? Like if I take my 3D camera and what is it going to produce? Is it going to produce one of these?
What's a 3D camera?
Well, like I have this thing. What's it called? I think it was called. I haven't used it. I have to admit there was a thing. Yeah, here we go. This, this thing, for instance. I have one of these. What does it, what does it take? Right. You hold it up and it, you.
Know, I mean you, you explain it to us.
Well, I don't know. I mean I've had this thing for years.
So one thing that you can go.
Ahead.
I think that, I mean in terms of explaining use cases and so on. There are many use cases now go down the list. The application section should have a long list of them. But for instance, you could take a camera and you just spin around like an axis around you. Right. You basically take a cylinder view of the world.
Yeah. Like Apple has a way of doing that. Right. And it's, it takes a bunch of pictures and stitches them together. Right. Panoramic view or something.
Yes, right.
Or there is, you know, spherical view. Right. Or skybox.
Okay, but what I'm asking is these, these things, what if you extract from an iPhone or something the panoramic view, what is this? What is the, the bag of pixels that it puts into your photo album? Or do we not care because it's doing all the processing? Well, there's my question.
Yeah, but what I try, I mean I had it, you know, I just took a pan mark view of my office and you, you essentially I get an image. Right. So and you know, I try to apply it to our cylindrical projection, this cylinder which actually did work. The only thing I didn't add it here is because the, the roof was not correct and didn't look correctly. So haven't really investigate down, you know, all the data.
Okay.
But that's, that's as far as I know.
So how did it, how did it determine in this, in this version here, this texture.
So right now there's no yet automatic texturing. So the polygon there have a vertex texture coordinate embedded.
But this bunny has many, many polygons in it.
Yeah.
So how did the bunny. I don't understand. How did its ear texture. I mean how does the. How the relative orientation someone or somewhere.
There was texture coordinates. Every vertex has vertex Texture coordinates. There are coordinates into the texture image.
Okay, but. So, so I mean, I don't understand.
This very well, but try a bunch of these. Okay, just. Let's just go through a bunch of them to begin with so we at least get some more context.
That's a big image there. Okay, I think I saw this one before now.
So this is just reproducing the first example in Skyblock Image, the function repository.
That's really hard for me to make the rotation controller work in a useful way here. Why is the rotation controller so I think.
Because if you open that, I think we put it globe the rotation. If you open the.
Yeah, but I mean, what, what rotation controller would be sensible?
No, it is not even.
Yeah, look, I cannot use this thing. This thing is just sort of randomly floating around. I mean, clearly, presumably this should not be a turn upside down rotation controller.
Why it should be a globe one. I can send someone. I don't know where I put that example. Yeah, the controller. Rotation controller here is wrong, so.
Sure, but why did that happen? I mean, is, is that happening because graphics 3D? It's happening because graphics 3D generically has a turn upside down rotation controller, doesn't it?
Yes.
So how would we know? Okay, that's. That's lovely. It's marbled. Cube of vertex texture coordinates. Arrow cubic. What does that mean?
So a lot of our.
I have a dodecahedron there.
But it's still. Look at the illustration on to the right. That just tells you where the texture is used and how it's projected on.
I understand. Okay, so for the dodecahedron, when I use the cubic texture, what is it actually doing here?
Using that cubic texture projection that you see on the right.
So I see. So it's, it's, it's going into the, the dodecahedral faces. Well, let me try tetrahedron here, for example. Actually, let me try sphere. Sphere here. Why didn't that work? Why didn't that work?
Oh, I mean, use this here. We are still implementing several of those.
So. Okay, so that's a bug. But what should it do?
Should just apply.
You see, like it's a big cube outside of your.
I know, I know, I know. Okay, it's, it's, it's. It's projecting in like it just has lights coming in from the sides of a cube, right?
Yep, yep.
And so it should distort in this case. I don't understand why it isn't distorting there. Because the thing is not orthogonal to the incoming light. I mean, is Are there lights in infinity on all the sides? This time I'm saying, are you parallel projecting into the cube?
Yes.
For the cube? Yeah.
For the cubic projection? Yes.
Yes.
Okay, but then why does this not look distorted? Maybe. I can't tell. Can I get some texture? Is there a nice grid texture? What is a grid? What's a good texture that?
If you go to the first. This example doesn't have that. Well, we change that on this page. Normally the latest update should have a good texture.
Well, let's try texture this.
I think that that example there with a cube. And you see the. The pattern shows exactly what it does.
No, but I think we're going to.
So like, let's say that you rotated that cube a little bit. It would start to look weird. See what I'm saying?
Ah, look at this. Okay, so this is this version. So that's orthogonal. Okay.
Yeah.
Now let's try taking that same thing. Oh my God. My, my. What? Something is very broken. This is a Yusuf problem. That was. That was the. The. My mouse got confused. My mouse was captured.
Yes, it was.
It was squeaking. It was.
Mouse trap.
It was. It was a mouse trap. Right. Okay, now let me understand this. Ah, yes, those are distorted. Good. See what I'm saying? Yes, that's what I expected to see. It's orthogonally projected from. And you should use an example like this because this is useful to see this. And if I show a tetrahedron here, There will be probably significant distortion on some of these faces. Surprised there isn't more distortion. Do you see what I'm saying? Yeah. Because there should be a. Yeah, go ahead.
I think that it's. That's a pretty regular tetrahedron. So if it was like super.
Like one random polyhedron. Let's try random polyhedron. What's the argument to random polyhedron? The number of faces. Oops. Why didn't that work?
Because random polyhedron doesn't just support that option.
So it's. But it will, right?
Yep. Yes.
There we go. Where am I supposed to put this?
Don't you have design review somewhere?
I do now. Yeah. I thought I had a more specific place. But anyway. Okay. All right. We're late for another designer view, I think. But what else should I see here, particularly? I mean, this is nice. I think I understand what this is doing. And now this. New vertex texture coordinates is a new option. Or did we already have that?
So we had it for polygons and polyhedra, but those are the ones that are purely defined by vertices. These Other ones are not. So we're using it as a placeholder. And I suspect that maybe we shouldn't call it vertex texture coordinates, just texture coordinates.
I think we should call it texture. Well, why don't we call it texture coordinate system? The.
Or texture.
Should it.
Should it be texture mapping or text?
Well, we have texture coordinate function, right? For plot functions, what do we have? I think we have texture coordinate function, texture coordinate scaling or plot functions.
This is so freaking slow.
But that, that sort of goes away when the plot is done. I'm saying that's to handle the construction of the texture coordinates.
I mean, there's a whole giant sort of set of conventions about how you map random lumps of texture onto random surfaces. And what you're doing here, we talked about this like two or three years ago, is you're providing useful conventions, which is the right thing to do for the different ways that you can map a texture onto something.
Yeah, it's not the end of the story, but it's a very useful step.
Right, but all of these are single slab mappings. As in you're not tiling the thing with this, right? You're just saying, yeah, here's the thing. And you know, so you're saying you've got one. You know what you're showing in these pictures is you've got one slab of texture. What do you do with it? Right? What's the difference in the box and the cubic? Is the box on all sides and the cubic is only on three? I don't understand that.
I don't understand it either.
Charles? Hello, Charles?
Oh, sorry, I was mute. I say, yeah, good point. I don't remember exactly what was the difference? Now I should think about it again. Yuzu, do you remember.
Kind of like.
A one have the.
The other side flipped?
So like a X direction and negative.
X direction, they are flipped or not?
Okay, well, you know what, if that's the case, you need to have a better illustration because with a square grid, you can't tell that anything is flipped.
Right.
You should put a letter or something on the, you know, a T or an A or something on those things to show that even that wouldn't be obvious how it's flipped. But you obviously got to show that it's flipped. If it's flipped. Okay, okay, but now let. Let's talk about what this thing is. This is a texture. I agree. It's a texture mapping. I mean, why isn't it really a texture mapping? And these are just named versions of texture mapping.
That's exactly what it is.
Exactly that.
Then let's call it texture mapping because that's, you know, that's a good branded name and that's what it is. And these are some kind of named versions of that.
Maybe we should call them projections. Like in, in geo we call everything all the mappings projections.
I know, but we don't have a texture there. They're not projections in that sense. I mean the, it's, it's going the other way. Right. A projection is. You have a thing that is a sphere and you're going to render it in. In, you know.
Yeah, flat. So this is inverse projection in that. If you want to follow that.
Right, Just a minute. Yes. Right. But we shouldn't call it inverse projection. I think texture mapping is a much better and understood term for this.
Sure.
So I, you know, I recommend that. I, I think texture mapping is good. I mean one day we might have more. You know, there are. I remember some seeing some catalog of some years siggraph years ago, some. Why was I, I actually watched some talk about this by some character, well known character. I forget which, which of the various graphics characters. It was about all the different ways one can do texture mapping and, and various kinds of mathematical characterizations. We talked about that at that time. And this is basically just the named examples of that. Which is a good place to start. And one day maybe texture mapping could have as a right hand side some other mathematical specification. But it's clear that there is no obvious, completely uniform mathematical specification because, you know, you're mapping onto a triceratops or something and it's, you know, it's just complicated. But I like what you're doing here where you just say this is the shape on which the thing will appear. I don't understand this one, for example, I don't understand spherical. I don't understand. You know, you've got a thing.
That.
Is basically a square, right. And now there are different ways that you can shine lights through your square. Am I making sense? But what is this here? And I understand stereographic, but what is this here?
Is it using spherical coordinates or what?
Well, what, how does it do that? It's got a freaking square. Yeah.
What is it doing?
Is it a, is it I, phi.
And, and theta, you know, for a sphere.
So that's equirectangular coordinates, basically. Is that right? That's a projection. Because in the spherical case, right. It's got to define a projection. It's got to define the analog or GEO projection, which is. Which it is then going to invert, right? It has to. And maybe we should allow that possibility. I mean, I think that would be very cool if we could say, you know, and we will need something like that, maybe for our geographics. 3D, Yusuf. Can you comment on that? I mean, right now the spherical thing doesn't make any sense. Doesn't make sense. I don't know what it is. Can anybody comment on that? I mean, it's presumably equally rectangular, but we don't know. It doesn't say that. You sue or anybody here. Hello? Okay, you got to think about it. Well, let's hear from it another time here. Okay, we got to go to our other meeting, so thanks. And I think there might be a very brief. If we can combine some of the loose ends here with some other meeting that we're doing, some other design review that will be good.
What did you think we have left us? Loose ends.
This thing spherical here.
Okay, Just asking.
Yeah, that. That's one loose end. I'd like to see this actually working. These were just mostly finishing things, so very little in the way of loose ends. Okay. All right, thanks very much. And see. Roger, you're in the next design review, aren't you?
Yep.
Which is about sound and vision. We don't have that long for it, but we'll get what we can do. Done. Okay, thanks a lot. Thanks to folks on the live stream, and we hope to see you in the next thing in just a couple minutes. Okay, bye for now.
More from Guy

Cheryl Strauss Einhorn | The Human Edge: Smarter Decisions in the Age of AI | Talks at Google

Rachel Glennerster | Innovation and the Center for Global Development | Talks at Google

Rebecca Winthrop | Rethinking the Purpose of Education in the Age of AI | Talks at Google

Dr. Robert Wachter | A Giant Leap: How AI Is Transforming Healthcare... | Talks at Google






