 That's right. I'm not hearing anybody is anybody hearing me. Yes, we can hear you. Oh, good. Good. Good day. I'm here. Hi, Marty. Right. What's that? I think you're a new face, right? I am new. Yeah. I've been on actually all the. All of them, but I just don't speak a whole lot. I see. Nice to see you. Thanks for joining. Thank you. Right. Close this. Is it raining there, Jeremy? Nope. It's nice and sunny. No. It's normally pretty much always sunny here and during winter. Nearly always. It's the best season. My windows organized. I read it. How are you? Hey, I'm good. How about yourself? Very good. I read the blog post yesterday by. You know, Isaac. The one about the dot operator. Yeah. Wow. What a mind bender. That was. Pretty cool. Very cool. I guess I should share that. So people can see what you're talking about. And so I read it yesterday before going to sleep. And today I took another look. It would take me a few more. Attempts probably to fully like. Understand what's going on there. I probably need to play with the dot operator. Because it's. Yeah. It is so interesting. It's like. How does it know. Until I finished writing the post myself. So. You know, how does it know to broadcast the. Because that's what it essentially does. I guess it broke broadcasts. Here it's just a vector, right? The second. I'm not sure what works to use because it's, I guess the first thing is. Is an. A make matrix, right? Maybe go up a level. I mean, I think maybe you can give us a quick. Overview, like maybe share your screen or something and just a quick picture of. What you found. And then. See if we can answer. Radix question. Because I really like the inner product. Operator in APL because I think it's a great example of the difference in which. APL has a tendency to generalize things beyond the original math notation to make them. More expressive in my opinion. Well, and you're doing the course by Gilbert's truck. That's. Quite, quite an awesome choice. Yeah, I love that course. It's, it's really good. You know, another cause is great is fast. It's a numerical linear algebra course. Well, yeah, I was even. I was even thinking like yesterday that it might be fun to do the course, but do the sizes in APL. Oh yeah. You know, for that course. Yep. So, let's skip ahead a little bit, but talk about really what the dot does. I think this was the clearest. So here we have this matrix and this matrix to 513 times. One, two, three, four. And so we're going to multiply these together. And you can't use the dot by itself because it has to have functions on either side of them. But if you could use the dot by itself. This is what it would do. It gives you the structure of this problem. So that it's going to kind of lay it out in this way. It's going to lay your problem out here and you can see, you know, you're one, two, three, four, and you're one, two, three, four. It's all multiplying it. And it's going to take these. I guess that he's called double alpha and double Omega. I don't know. But it's going to take whatever is on the left and the right of it and apply those functions in this way. So I kind of think of the inner product operator is it just sets the framework for the problem and then drops in this case, the plus and the times functions into these particular spots. So for example, double Omega will often be times and double alpha will often be plus. And if you do it in that way, then it's matrix multiplication. I could swear that yesterday, it was a different example of a matrix and a vector. And now it's a matrix times a matrix. Oh yeah. I got a question. So I added, I added a second. Sorry about that. Yeah, I got a question. So I added a second. And it's the same, it's the same idea here. We do, in this case, when we're doing a matrix, this matrix times the vector, we get the exact same structure of the problem. But they're all scalars because we only have one number multiplied by another. In this case, it's the double Omega multiplication. It's one times two plus two times five, one times one plus two times three. And so we get, we get it in that way. If we were to do the same thing, right, if one of these, the second one was a matrix, if instead of, you know, one, two vector, we had a one, two, three, four matrix. Instead of this one, two being just numbers, these could be vectors, but we'd see the same thing. This one could be a vector one, two, three, four, which would use whatever this double Omega operator is. In this case, times and multiply it by this two. So this could be a scalar in the, in this example, in a matrix example, it's a vector. I haven't tried it, but I suspect kind of getting the more and more dimension that could be, you know, higher dimensional arrays as well. Oh, that's, yeah. So actually, you know, I think what we should do maybe today is learn about operators because dot is not a function. It's an operator. And this is a PL terminology for what in some languages we would call higher order functions. They're functions that take a function and return a function. So in Python, we don't give them a special name. You can have functions that take a function and return a function, although there is special syntax for doing it more conveniently in that syntax is called decorator syntax, which is where you can pop an at sign before a function, before a decorator name and put that at the top of a function and that will cause a function to get passed in. In fact, shall we look at that first? Maybe that might be interesting and then talk about operators. Yeah, I'm good. Okay, let's try it. So I know as Zach Biola did a thing about decorators the other day, which I think people found interesting. So I guess I should do a get pool first. And while we're there, I guess we should also just talk about other things that have been happening on the forum. Actually, it's getting quite active, which is amazing. So one particularly interesting thing, which was also Isaac, is a way to create flashcards more conveniently. So if you look for Anki Deck Generator, you will find that. By the way, these these ugly spaces are caused by this. You're not sharing your screen. Oh, I'm not sharing my screen. Of course I'm not sharing my screen. I don't remember to share my screen. There we go. Okay, let's try that again. So all right, so this is the Anki Deck Generator thread from Isaac. And so I think now there's what three different decks you can import, Isaac? Yes. So here's some of those examples. But there will be more. I'm going to be after each session because I don't want to have to, you know, recreate the decks after each session. I'm going to create a new deck for that day. So you might not have to import that. Because I'm sorry if you already know this, but if you import a deck with a name of a deck you already have, then any cards you already have will not be duplicated. So you can just keep exporting your updated deck and people can keep importing that and it won't. And as long as you make sure you don't include scheduling information in the exported deck, then it'll work fine. Oh, even better. Do you think it would be useful for, I didn't know that, but do you think it would be useful for people who maybe aren't in the group and are either trying to catch up or are going to watch this in the future to have kind of wanted each day? Not really because there'll be an order, right? I mean, at most I'd say like add a tag to each card to say what session it's from. But otherwise people will just like, they'll be like, oh, I can't do this yet. So stop. Yeah, if you just go file, export in Anki, and then you choose deck package, and you choose the package, remove scheduling information, and then you say export. This is what I do for the kids. And so that will export the deck. And then when they import it, it'll say these ones are already existed and these ones are new and it'll bring in the new ones. Awesome. So I was just saying earlier that... Mark, that's such a cognitive dissonance for me to see Jeremy use a Mark. Yeah, I've been using Windows largely since 1995. And before that I used quite a mixture. I used Windows 3.0, 3.1, 3.1 for work groups, but I also used Mac from like 1990 or so. But I've got to say Windows 11 is really getting a lot worse. It's the first time I've really felt like it's getting worse. So for the first time in my life I'm actually thinking of switching to Mac. And I actually ordered a MacBook Air M2 yesterday. Yeah, you might have to get used to it. So yeah, I do like being able to write on the screen of the Surface Pros and stuff. But what I do instead now is I've got a Wacom tablet, which is Bluetooth. And it's actually in some ways like it's not strictly worse than writing on a screen because I can just write with it in front of me or else with a screen based approach I kind of have to move the whole thing. Yes, yes. And how are you finding the UI of a market? Is it easy to get used to it? It's all right. I don't love it. Like it's definitely much worse than Windows used to be, but Windows is getting, you know, apparently everybody in the UX team in Windows or uses Macs. So they seem to be trying to make it more like a Mac. But of course they don't really get it, right? So that's the worst of both worlds. So I would say, yeah, I kind of like it better than Windows 11. I've realized what I really like actually is Ubuntu's default desktop environment because that's modeled much more closely on Windows, you know. Like, yeah, Windows keyboard shortcuts just so ubiquitous, for example, which I really like. And they are on Ubuntu as well, which I think uses GNOME nowadays. I kind of remember. I just use whatever's there. Yeah, so there are things like, for example, to move a window in Mac to the other screen. You know, you have to either download an extension to use a keyboard for it or, you know, like it's all very much assumes mouse stuff. And specifically a lot of things really assume trackpads. You know, it's a lot of instructions you get. We'll say what to do on a trackpad. Anyway, it's okay. You know, like I can, like I can hit control left and right to jump to my different virtual desktops, even if I can't move things to different virtual desktops. To do it like, if I want to move this to different virtual desktop, I can press control up to get, oh, it's on the wrong screen. Honestly, it works. I can press control up to bring up mission control and then I can like drag it to the other desktop, which is a bit clunky, but yeah, it's all right. How do you figure out how the UI works? That's a great question. It's not easy, right? So part of me kind of thinking maybe I'm giving up on Windows was thinking, okay, well, maybe I should act like this. Literally last weekend I was like, okay, I should probably learn to use the Ubuntu desktop environment rather than just doing everything in the terminal. So partly it's knowing like what kind of features ought to exist and what they generally get called. So, you know, things like what Mac calls mission control is generally called virtual desktops. You know, so learning how to use virtual desktops properly, I just googled for Ubuntu virtual desktop and then start, you know, keyboard shortcuts. And I mean, they've got some pretty decent documentation I found, so it tells you here. So it means the Windows key. So yeah, Windows page up and Windows page down, which is slightly like not particularly well chosen because a lot of keyboards don't have a page up and page down keyboard on laptops, but generally on laptops if you press function up and down you get the same things. This is basically Windows function up and down. And then, you know, there's movement window to a different workspace. It's, you know, quite good. And so if you just add shift to it, it moves the window. So yeah, it's a case of like knowing what the things are called and that they exist, then you can search for them. I haven't found a lot of good like here's how to productively work in a graphical windowing environment into E22 kind of material. That's, it probably must exist somewhere, but I haven't found it. That's what defeated me when I got a marker myself. I just couldn't figure out how to use it in a way that felt comfortable to me and I couldn't find the information in an easy to follow away. And I guess one observation that I have here is when you talk to somebody who's just starting to learn to program or starting to do machine learning, they always ask that question, which is the one programming language I should learn? And, you know, which is the one library that I should learn and people spend two weeks trying to answer this question where, you know, in reality, it is just start with something, anything, ideally something that is geared towards people starting out. But, you know, if you do hang around that field, you will learn a lot of libraries. That's just the nature of it. You might have one that you prefer, but, you know, you will try various things out and maybe it's the same thing with operating systems. You know, for part of my life, I have been thinking, I have to, you know, just focus on this single operating system and make it my home. And at first it was Ubuntu, then it was Windows through no small influence of Jeremy, but maybe it is sort of, yeah, you know, if you are a computer user and you will become a computer user for next X amount of years, maybe it makes sense to invest some time actually to, you know, try different things. And it's also that if you probably attempt to use a Mac, you might become a better Windows user or Ubuntu desktop user. I think that's true. Yeah, yeah, absolutely. Yeah, I mean, it's like using multiple programming languages, I think it's a good idea. And just trying to be good at each of them. Yeah, I think that's fair. Okay. Oh, I see people putting stuff in the chat. All right. Well, Simon, Marty, I know you guys can both talk, so you can actually, so yes. Marty asked what Mac I got. I just got a... Well, the one I'm on right now is a Mac Mini M1. I just bought it a couple of months ago for testing fast AI releases, honestly. But then once I plugged it in, I figured I should try using it. And then the laptop I got was just the MacBook Air M2 512 gig drive. Yeah, sorry. Oh, I was just changing topics. Sorry, I put a little link to a, and the vocabulary dialogue things that I've been using over the weekend that I found helpful as well. Yeah, I will. This one? Yeah, so it kind of gives you your monadic versus didactic names, those links to the documentations, tells you kind of what they are too. So I found it helpful. Great. That's sweet. Some of these I don't recognize. And that's where the double alphas and double omegas come from. Yeah, so we're talking about this in a moment. And then Wacin also shared this one. Oh, so I also use Windows for a long time and I don't, now I use Mac. I don't use most of the like gestures and the way that they expect you to do things, I think. I just keep like one window with lots of, or one virtual desktop with lots of windows. And then I'll tab between them and use rectangle to like send windows to like the top left or the left or whatever. That's quite cool. Thanks for the tip. One which I didn't immediately. Find, but once I found it, it helped was command tab or windows tab switches between applications. But to switch between windows within applications, it's command back tick, which is not something you would necessarily find by mistake. That's quite helpful. I'm using a Microsoft keyboard so I still have a Windows key. I'll try to remember to call it command. Yeah, I always try and have my screen to maximize so I can switch between windows and terrible at sticking to that rule. Yeah. Oh, then other news. Oh, yeah. So these are ugly blank lines we have in our page caused by this, which is actually added by the APL dialogue kernel. So I contacted them and told them that they shouldn't be adding forced styling into elements because it's impossible for us to make it look good. So then I made it worse by accidentally putting line breaks in the middle of them too. Yeah, that's why they looked even bigger. Yeah. So yeah, they're going to try and fix it. If they can't, then we could use MP process, create a processor to delete this, but he said he's going to check it out next week. So that was nice of him. And then the other weird thing that happened was our actual study group got on the front page of Hacker News. So that was weird. A lot of APL stuff seems to get on the front page of Hacker News for reasons I don't understand. So is anybody here actually from the Hacker News thread? Not mainly people I recognize, I think. Yeah, a lot of FASIA stuff also often gets on Hacker News, which is good, I guess. That's fine. Start reading it. Terrible comments, but it's nice for people to know what we're doing. Yeah, I thought this was an interesting question of like how the hell do you actually do multi-line editing? So I sat kindly like to the section of the book, which is in the GUI, there's basically, you can use this closed parenthesis, ED to open up the editor. And then something I haven't tried, apparently, is you can use grab record the input, which I guess lets you put a multi-line. Is that what this does? I think so. Yeah, I don't know if that's the only thing it does. I haven't really looked at the documentation, but you can copy that directly in your dialogue repo. Because it's weird that they say we define it in the notebook. But anyway, yeah, OK. Put that directly in the repo and it'll work. And then the other thing I just wanted to kind of show off about is we now have hyperlinks in our APL notebook, which goes to the documentation. And we actually get those for free. Thanks to Isaac, I'm porting this over to be an NB process repo, which is what NB Dev's going to be called very soon. And then, now who did it? Somebody then added the NB Dev index to it. Where would I find that? I don't have to search. Should be from the last lesson. Ah, OK. That's weird. I thought I... Very programming. Yes, last lesson. Quite right, Serada. Thank you. So NB process slash NB Dev has... uses this thing called NB Dev dash index, which basically creates PyPy modules, such as NB Dev NumPy, for example, which if you pip install this, basically you automatically... it will automatically hyperlink every NumPy keyword to its documentation. And so... So Johan kindly added an APL index, which he manually created... well, semi-manually, just using Python requests. So yeah, so now thanks to the magic of nicely decoupled APIs, it automatically just worked. So we now have hyperlinked study notes, which I think is very fun. All right. Let's talk about operators. Ah, yes. We were first going to talk about decorators. So let's create a function. Okay. And so we've got to pass it of something to add one to. Okay. So there's our function. Now, let's create another function, which we're called log arcs. And this is a function, which is going to take a function. And it's going to return another function. And the function it returns will be one that calls this function, but prints the arguments it gets first. So to start with, let's do something really ridiculously easy, which is just to return the function that's passed. So we could create something for g, which equals log arcs of add one. And so log arcs is going to be passed this function and let's return it. And so g will be exactly the same thing as add one. Makes sense so far? Okay. So we could define a function inside a function, which is going to take some arguments and some keyword arguments, and it will simply pass them along to f. So now, when I call log arcs, I'm going to create a new function called underscore inner or actually called like, well, yeah, we'll call it underscore inner. And that function will return f. So it depends what we pass to it. So this is going to do exactly the same thing as before. Okay. But then what we could do is say print received arcs, arcs, arcs. But now we could do things other than just running the function. I didn't actually say g. That was my mistake. Okay. And so you can see now it's done the same thing that the function did before, but it's doing something else as well. Does that make sense so far? So this is a function which takes a function and returns a function. And so people often seem to call these higher order functions, which I find confusing or not particularly helpful because it has functions, but there you go. So there's a special way of doing this. So if I wanted to create a logged version of add one, I would have to do two steps. I'd have to first create add one and then say, you know, create this new version of it and then call that new version. So Python has a special syntax for doing these two steps. And that special syntax is to, oopsie-dozie, is to put at. This is a special syntax. And so this syntax, when you put at and a function before the definition of a function, is going to take the function that's called, which is defined here. It's going to pass it to this function and it's going to replace this with whatever gets returned from it. So this is exactly the same as what I did before. So if I now go add one, makes sense. So I can now add logging to any function I want to, such as my world-changing mult2 function. So it makes sense. This is slightly by the by, but something that you can do is you don't have to use a function. It just has to be something that's callable. Something that's callable is something that you can put around brackets after. So let's say we wanted to change this to with, that we wanted to be able to change this here to some other prefix. So you can do that with a function, but you can actually just do a class. So we could create refaces for the class, right? And then we could. So not many people seem to know this is possible. I put something in the, this is somewhat related, but I put something in the chat that I learned something about S-strings that allow you to actually shorten the S-string a little bit and get the same thing that I found about today. This was only added in a somewhat recent Python, but I don't remember which version it was. Maybe you can try and figure it out. 3.7. Okay, well 3.7 is 3.6 is AOL. So that means you can safely use this now. I had not been using it because I knew that until, at least until recently, there were in supported versions that didn't support this, but yeah, okay, that's great. So that now exists. So let's use it here. And then there's a question from Aleve, I think. Hang on, let me do this and then I'll take a look. Thanks for letting me know. Okay, so we should be able to do this. Oh, that's right. I was halfway through fixing this. Okay, let's try that. Okay, yep, so that works. And there's a question from somebody. I can read it out. What does the convention of starting function name with underscore signify? Oh, yeah. When we start a function name with an underscore, it generally means it's private. It generally means it's not something we expect people to be calling from outside of this place. In NB Dev, things that start with underscore by default are not exported so they don't appear and done to all. Starting and ending with two underscores is a special Python thing, which means it's a magic method. It's a magic that will automatically be called at some time by Python. So for example, done to N, it is automatically called when it's created. So I was going to turn this into a class. So we're going to call it the prefix, which we could default to received, like so. And so then we could go self.prefix equals prefix. So this is now a class which knows what prefix it is. Okay, and then when you call it, so to explain, if you have, there's a very interesting magic method called done to call, which does this. It basically makes your class callable. So if I create an instance of it, then I can call it x in here. So you see I'm treating it as a function. And so when you treat it class as a function, this is what it calls. So then we could use this instead of passing x, we're going to pass some function and keep all that stuff. And so now rather than putting received here, we would put self.prefix. Okay, so when you call this now as a function, you're going to pass it a function, and it's going to return a function, which means we would now write, for example, okay, so this is calling the function or the callable log args, which is a function, sorry, which is a class. So this instantiates the class passing in this prefix. And so this gets replaced with an object of this class. So if we have a look at add one, this class then gets called, being passed the function add one. And so it then gets replaced with this. And that's why we end up with a log args dot underscore dot underscore, you know. Anyhow, so yeah, so higher order functions are functions that take functions and return functions. And Python has some tricky fun stuff. Hi Jeremy. Yes. Okay. So I just wanted to say something for people who are seeing this for the very first time decorators. So I have a tip. The tip is to just use them anywhere. So when you start thinking about these inner things, when you're first introduced to it, you would be confused, but if you just use it, you can use it on, there are a lot of days in the flash framework. So in the Python class, there are a lot of decorators being used. And you can also see this in like Python as LRU cache, LRU cache for caching older variables. So if you just start using it, then you'll not be confused very much. So always whenever you see a decorator, don't start thinking what is going on inside. Just use it. So here's the long-handed way of doing this. Well, I guess the long-handed way actually would be to define, would be to call this something else like underscore add one. And then this could be called add one. And so here's a version which doesn't use decorators, but it behaves the same way. Oops, this should be underscore add one. There we go. Okay. So in APL functions that take a function and return a function aren't called functions. They're called operators. And you will find therefore, if we look up the language elements, oh, I should have looked at dialogue, dialogue language elements, they're separated out. Okay. There's a table of functions and that's a table of operators. So as you can see dot, which Isaac told us about, means in a product, it's an operator because that returns a function which does matrix model play. So I think we should start with some simpler versions. But first of all, let's clean this up a little bit. We've got this version, okay. And then we've got this version and this version. And I guess we should have the manual version of this one as well, which would be to say define underscore add one x, x plus one. So define underscore malt two, define x times two, and then we'd say malt two equals log args of underscore malt two. So here's the version without a decorator and it does the same thing. Okay. So now let's look at APL and show you everybody's favorite operator, which is slash. And this one here appears to be in the wrong spot. Why is it over here? I guess we didn't know where to put it, maybe. I don't know why it's here. Let's move it there. Oh, I see why it's because we had strings. So maybe we should move strings before all that. Oh, no, that's got row it out. Man, this stuff's so complicated, isn't it? We would hear now. So operators. We do have a few more Boolean things to go but we can always come back to them later. Operators slash. All right. So let's do slash. It's called. This is an operator. Reduce. It's called slash. So we've got to have monadic slash. Reduce. All right. So here is... Oh, and we need to turn on our APL thing. Okay. So let's say A is A to 5. I wonder if I can do this. Quad is... Oh, it's an L. Okay. Plus slash. All right. So here's A. And here's plus slash A. Now notice here that slash is not a function. It's an operator. And therefore it has different rules. The first rule to know about operators is that they bind more tightly than functions. So normally if slash was behaving as a function here, then this would happen first. But because slash can behave as an operator and there's a function on its left, this happens first. So operators bind more tightly than functions. So this is parsed as plus slash first. Okay. So then what does plus slash do? Well, slash is an operator. And so therefore it returns plus slash returns a function. And what does that function do? It takes a function. So it's going to... Here it is here. F slash. So it takes a function. The function has to be dyadic. And what it does is it applies the function between items of the vectors that it has parsed. And so literally what this does is it inserts the symbol plus between one and two and between two and three and between three and four and between four and five. So you get one plus two plus three plus four plus five. So therefore plus slash means sum. And here is the sum of the numbers from one to five. So this is the same as capital Sigma in math. Now when you say it does it one plus two plus three plus four plus five, but isn't the order from right to left? It is. Or how does that work? It is. Yep. So it inserts a between... It inserts in between these pairs. So it becomes one plus two plus three plus four plus five. And then to evaluate it, it would do this first four plus five and then this three plus nine. Okay. This two plus 12. Yep. So we could do the same thing with times. And this is now the same as capital Pi in math. It's the product. So yeah, this is called a reduction in computer science. Reduction is something that basically reduces the number of dimensions, not necessarily down to a scalar, but if you start with a vector or reduce it down to a scalar, as is happening here. And there's a very similar one, which does exactly the same thing, but it shows you everything that it does along the way from left to right. So now that I think about this backslash version, I wonder if maybe it doesn't work the way I just said it to Tanishk. Maybe it always... Maybe Slash is doing it left to right as well. The left to right thing is about how it pauses a statement like this or an expression. But I guess evaluating a reduction, maybe it is actually evaluating it left to right. I mean, in other of these cases, does it matter? Hey, let's test. Let's do divide. It's a bit of a weird one, but why not? Let's just make this three. Slash to the slash. Oh, whoops. That's strange. Divide slash. Thank you. Let's see. One divided by two is a half and a half divided by three. Okay. No, it is to right to left. So two divided by three is two thirds and then the reciprocal of that is one half. Okay. So it's definitely going right to left. So backslash must just reverse the order as well. Oh, wait, what? What if not three divided by two and then divided by one to get 1.5? It's doing two divided by three to get two over three and then one divided by that to get three over two. Because this is the same as one divided by two divided by three. The same as one divided by two divided by three. Which is the same as one divided by two divided by three. Okay. So I guess backslash is not quite working in either of the ways I thought. I think what it's doing is it's printing out all these spaces. I just I think it's just printing out each of these. It's doing that. It's kind of like a cumulative function. It's kind of cumulative, but it's not, right? Because this last one actually is doing it right to left. So it's not really cumulative at all. So I think it is doing every line. So every two numbers and one more and they've printed. Yeah, it's doing it's doing every line independently. So it's not necessarily going to be as efficient as I thought. So we could see that hopefully in the docs. Okay. It's called scan, which is a common computer science term for this idea. It's formed by success successive reductions. It doesn't really explain exactly how it's done it. But we can see from the divide example how it's must be doing it. So there's this reduce thing happening. But I also recall from functional programming reduce with memo. Is there such a thing? Is it just memoization reduce? So no, like when you start with an initial value. Oh, an initial value. So there's not really any need for that here because you can always just insert the initial value. This is the first element right. Yeah. Yeah. I think we haven't covered this yet, but I think we might be able to use like comma. Yeah, so comma concatenates. So you could always just put like comma with your first value here. Thank you. I think one way I've seen these, this reduce work as well as if you combine it with equals or. Eventually by the end or max or whatever you can kind of look for is a minimum or the maximum or or CF the entire array is. Yes. Absolutely. Not a unique value. So we actually haven't done it in max yet, but I think that's a great idea to put them before this. In and max one addict versions. They do actually I'm pretty sure. Okay. So I never really remember which way around they are, but there's S and there's D. Okay. So S is this one. And it's called something's dial up style. Yep. Up style. Okay. So up style. Okay. So the magnetic version is slightly less relevant. It's called ceiling. So it's just a round up thing. Yep. Just a round up thing. So it's normally called ceiling and floor and both programming languages. It's finding the nearest integer that's greater than or equal to the number. I assume it's called down style for this one. I assume. And so there's a good, you know, kind of mnemonic for these right. This is, you can see, this is going up to the ceiling. This is going down to the floor. So you can see this one's being rounded down. The nearest integer. Okay. So apropos of Isaac's point, the dyadic ones are interesting when we reduce them. Because dyadic students because men and max returns the greater than of two things. Now notice here that even though I don't have a space. This is the list of the array 32 maximum, the array 23. So it'll be element wise, always element wise. That's the maximum of three and two will be the first element and the maximum of two and three will be the second element. And then yeah, where it gets pretty interesting is what if we create a random numbers yet something like that. Actually, let's just do a few of them or six to four, six, two. So that's going to pass that first of all is maximum of six and two, which is six. And then maximum of six and four, which is six. And so where that gets interesting is we can then reduce slash like so reduce slash and get the same thing. Does that make sense because that's literally going to insert the operator between each pair of elements. So that is the same as that. So it makes sense. So I think that's really quite great. Another thing that I found helpful with the up still down style is you can do like for and then one of the styles and then an array and it will kind of set your own custom minimal or maximum value kind of a cut off an array. Right, right, right. So we could do or style 345. We could do a value operator right so we could do. Yeah, let's do that. Okay, so let's do negative four, negative four, six, two. And so then we could do that. And that's going to do a value operator because it's truncating negative zero is that what you meant Isaac. Yeah, that's exactly what I meant. Excellent. One glyph activation. Yes, exactly. That should be expressed there. There's actually a paper I found somewhere which was a PL. And then convolutional. I think they actually have a GitHub repository with their code as well. Didn't make all what sense to me so hopefully one day well. Yeah, yeah. This is all of the from scratch. There's a lot of recommendations of layers of a confnet, at least the types that were common in 2019. Just need the backwards. I think that backwards is here. And so for convolutions, they actually had this version here, although when I read a bit further, they said that there are. They said to do convolutions. CNM building blocks convolution. This is they said you can do this. Anyway, I guess we'll get there. I'll put this in the chat if anybody wants to add it to our session notes chat, chat, chat, where's my chat button. Oh, I've got it popped out. Oh, and I can put the link in the GitHub repository if you want to look at. Great. Oh, and Kerry and mentioned that the that the little that that f string trick with equals in it is actually only from Python 3.8. So probably best not to use it just yet. I see CNN. They're on networks. And this is the Rodrigo who I was chatting to about dialogue kernel. Actually, I'm looking at that. And we realized that we covered the lamp. Yeah. I don't think so. It wouldn't be a bad thing to include quite early on because otherwise it's just going to be confusing, isn't it? Actually, first of all, let me fix, just get this sorted out. In terms of getting the D and the s that the minimum the maximum the right way around the fact that this is D for down style is actually quite helpful. That's a character for that one. Wait, what happened to the, oh, this value thing. Okay, we've got it in the wrong spot because this is not a slash. So she put this up here. Okay. So what character what what keyboard is the comment lamp thing. This is a comment. All right. Seems like a good place to stop. So we now know about operators and I guess maybe next time we can try making our own operators. I will try doing a derivative operator. Which means we're going to have to do alpha alpha and omega omega. Cool. All right. Thanks all. Thank you. Bye. Bye.