Back to Index

fast.ai APL study session 10


Transcript

Hi. >> Hello. >> Hello. >> How is everyone doing? >> I'm good, how are you? >> I'm doing good. >> Doing good. Got another blog post out so that always feels good. >> All right. Nice job. What's New Year's? >> I see the- >> It's very warm here in Minnesota.

>> Warm in Minnesota, I didn't know that happened. >> Yeah, a little bit in the summer. >> I just moved away from Minnesota about a year ago. What part of Minnesota are you in? >> In the Twin Cities area. >> Okay, I moved- >> The suburb. >> Yeah, I lived there for, I guess, 15 years.

I just moved to DC from there about a year ago. >> Gotcha. >> I was there for seven years and moved last year. >> I went to college in Duluth, actually. >> Oh, yeah. >> Yeah. >> A little colder up there. How's the weather in Australia? >> Not very good today.

Best time in a while, it's, yeah, really not very good. >> Is it raining? >> Yeah, you see it raining? >> It's raining. It's raining, it's windy. Still, I guess that's fine. >> I saw that it looks like the course is coming along in terms of getting it ready.

>> Yeah, it's like, not too terrifying. It's like, good to have things finished, but then, it's like, what if people hate it? So, hopefully, people don't hate it. >> Were those pictures all Dali 2-generated? >> Uh-huh, yeah. >> Did you try with Dali Mini instead? >> No. >> Because I thought it might be more interesting because a lot of, that was developed by a lot of fast AI people, right?

So, it could be interesting too. >> Yeah, it was, but it's also like, much less trained. So, it's not normally very good. >> I mean, it's good for what it is, but. >> Yeah, because I think one of the things, it depends on the, I guess, the sort of what your prompt and stuff, because some people say like, especially with like, I guess more pop culture and stuff, Dali Mini is better because, yeah, in Dali 2, they filter all that stuff out, so.

>> Mm, that's interesting. >> Yeah, a lot of people. >> I didn't spend time on it, honestly, I was just like, it'd be fun to show in some examples. Yeah. >> Oh, just a moment, I've got a message. All right, this picture is sick, so I'm, hopefully you will be okay.

Any APL news? >> I posted a kind of a statistics blog post and APL on the forum a little bit ago. >> We were just talking about that a little bit. It's very interesting going through that. Tell us about it, does it? >> Yeah, so calculating some simple statistics, confidence intervals, and p-values through bootstrapping.

I've got a little monologue on why- >> For those who don't know what bootstrapping is, do you want to mention what that is? >> Yeah, so there's kind of a couple of ways you can calculate most statistics. Kind of like the classical statistical formulas that I think most people are more familiar with as you have a formula that can calculate a p-value and you have kind of assumptions baked in, like you're gonna assume the normal distribution and if these assumptions are true, you can calculate your value.

Bootstrapping does a little bit of a different approach instead of kind of approximating the statistic by kind of assuming normal distribution. It says, well, we're just gonna randomly sample over and over and over again. So rather than creating a kind of an artificial sampling distribution based on what we believe the distribution to be, we'll just create it by randomly sampling a thousand times.

And so there's less assumptions baked in. And then if you calculate a confidence interval, you can say a confidence interval on the mean. You can sample it a thousand times, get the mean of all these small samples. And if you want a 90% confidence interval, you just chop the lowest 5% off, chop the highest 5% off, and 90% of the time, your data will fall in those bounds.

And you know that's the case because you did it a thousand times and you looked at where 90% of them fell. So it's kind of a more elementary, I think more flexible approach that kind of gets the same answer. Yeah, so, you know, when I used to do consulting 25, 30 years ago, this was my, one of my two big tricks was to use this kind of sampling all the time for creating simulations.

I basically almost never used assumed distributions, but yeah, it would always basically get some real data and then randomly pick from a column. Yeah, it made life a lot easier and generally made things more accurate. Well, and I think it's the other trick. My other big trick was using pivot tables all the time.

Back when pivot tables had just come out, it played people's minds. Nice. They still blow people's minds, by the way. It's a little less, a little more surprising, it blows people's minds today, I guess. But yeah, and so, you know, I think the biggest value for me in this bootstrapping is you can kind of think and reason and it's very intuitive, right?

Like where will 90% of my data points fall? Well, I don't know. Let me try it a thousand times and see where 90% of my data points did fall. If you want to do, you know, a hypothesis test, you can sample it a bunch of times and see how many values, how many, how many values were more extreme than what you saw.

And you can you can actually sample it and look. And the nice thing about that is, you know, you can compare your means, but it's very easy to say, not just let me validate that the means are different, but eventually you want to actually say, let me validate. Can I validate to see if the means are different by a certain amount?

So you can start to do statistical tests on magnitude, because just because two things are different doesn't mean it means anything. Normally, as an about, it has to be different before it matters. And you can kind of keep talking. So these when you sample it, I feel it's just a way of doing it just based on kind of intuition and experimentation that I find is just a lot easier to work with and customize and understand what's going on.

And you don't have to be as careful about what assumptions you're making versus not making. So so Isaac, have you used that a lot? I'm sorry, you might have said that I was I might not have been might not have heard it. Yeah, I pretty much exclusively use use bootstrapping.

I don't really see. I mean, I think the situations where I wouldn't would be if I'm completely certain of what the assumptions of a given formula are, I'm completely certain my data set fits those and bootstrapping for whatever reason is not feasible. Like if I if I really needed to calculate the statistic on some enormous, ginormous data set than than maybe these formulas are really just kind of shortcuts.

They're not they're not different. They're not giving different values. They're just a way to do it, you know, more computationally efficient. And so when I'm kind of just testing and developing things, I'd rather have something that I can think about and is a little bit more intuitive. But I mean, I don't really need to I mean, this these these drawing a random sample is usually not, you know, computationally prohibitive.

So I can usually just just do it on my laptop. And it's not a big deal. So I almost never use the traditional formulas. I don't say never, but bootstrapping is on my default. If you can say, what are the applications that you like just a handful or like one or two of what you've used it on?

Yeah, I mean, I mean, really, I mean, what what's the data from? Pretty much anything you would do any normal statistical test or confidence interval on so you know, you you've got some data and you run maybe you're doing an A/B test, you have a control group and you're testing sending fewer emails to another group and you want to know, did it have an impact on revenue or their level of engagement or whatever we do.

Okay, sure. I used it a lot for simulations. So it'd be like, you know, in consulting, it'd be like, okay, what's the possible outcomes of this company under different scenarios, and you would need to make a bunch of assumptions about what might happen. And generally, it's not the idea to do a point assumption because you don't know.

So then, you know, the normal thing might be to say, oh, well, let's assume it's a, you know, standard deviation around our assumption of whatever, right, that kind of often like to find him some historical data of like past results or something like that. And then basically just do a random vocab into that list of values.

There's a really great introductory statistics book that is a bootstrap first approach. I'll put that in the chat if anyone is interested. Yeah, that'd be great. Thank you. It's not APL, but it's a, I think it teaches things in a really intuitive and useful way. And it covers things like just because something is statistically significant doesn't mean it's practically significant, which I think is something that's sometimes missed in statistics, right?

Feels like remembering the author names won't be too hard. Yeah. Yeah, it's a, it's a freak family of, I think like four of them have PhDs in statistics. But it's, yeah, it's interesting. Gotcha. Thank you. I haven't seen this before. Add to cart. Oh my God, $112. What is it about books?

Wait, the A-book's $112 or the print book's $48. That's interesting. Oh, that's a wrench for the book. Well, the rental. Yes. Oh, God, I hate textbooks. And what's this? Yeah. Online access for $10. You need the $30 Dover edition. The what? $30. I'm sorry. What did you say? You know, Dover, Dover Publications, they don't have these kind of pseudo textbooks.

So I have a buddy that I went to college with. He's a physics professor over here in the States. And he was trying to find a Dover publication on physics that he could use for one of his classes because the books only cost like $30. You know, it's not hard bound, but it's an actual physical text or physical book.

But unfortunately, a lot of them, you know, for at least he was saying for the stuff he was looking at, they left out too much detail. Because, you know, they're they're usually at least the ones I've seen are, you know, in that kind of standard 200 to 220 page realm.

But so that that's what I was referencing. I see. But Dover Publications has a lot of technical books. Maybe I'll find their, you know, their their website and put it on the thing. And some of the books are really good. It's just that some of the detail isn't in there.

The Kindle version is $47. That's weird. Is that is that just student solutions or? Oh, was it so solutions manual? Oh, my gosh. Okay. Right. Hardcover $363. I don't know. Yeah, it was more than I wanted, but my work paid for it. So I didn't feel bad for it.

It's not just wasting somebody else's money. I'm more okay with it. Maybe you can find a used copy. Yeah, it's going to be on Amazon. I hope Molly's able to join because it sounded like she was going to try and actually do some prep for today's chat. She was asking what we're going to cover.

And Serada, whereabouts did you list these things? Was that a previous session or something? No, it's in the how to buy a really short APL code. Yeah, definitely. Okay, so tell us about this APL problem solving competition. Actually, I hear from your interview in AWAYcast and Adam mentioned it at the end.

So I just jump in and have a look under the face one, the left hand side. Oh, left hand side. So they actually give you some very easy to start with a sample and then have a platform for you to do it. And I find it quite easy to use some of the, I have experience in the past in Python, some of them I just don't know how to do the submission, but they're a very good explanation.

And I think I've been hooked is because of the two questions. They actually using the APL and then solving the life science problem. They actually how to turn the different of the DNA and the mutation. So and the second solution actually really, really short. And I really impressed by what they can do.

Oh, cool. So you can actually submit your function and test it here. Yeah. And then it has some edge case. So that's why I started thinking into the documentation and find out the slightly different. I need to do that little diamond thing in it. Yeah. And they cover quite a wide range of the other problem as well.

So you can click through. Yeah, that is a bit more a multi-line question. So maybe in the future we can you can cover it here. Yeah. I think Felix was telling me that a lot of the phase one questions are pretty approachable. So just for me, it's a small exercise.

I, when I learned Python, I remember I tried to find different problem and just try to understand the description, how to do it. So yeah, just kind of fun. And they give us some hints on what solution or symbol we should use and then just start looking at it as well.

But as APO documentation sometimes can be quite hard to understand. So yeah, you can cover it a little bit great. And the mutation actually they point you to the Hamming distance. Actually very interesting when I learning how to write APL and then I also learning other knowledge as well.

So yeah, just find it interesting. Yeah. I mean, this one seems trivially easy, right? Yeah. It's just. But I think that for me is very inspiring is the application. This one's just this, isn't it? Yeah, those are here. Well, I mean, presumably phase one is not. I think there is some prize money associated with phase one.

Oh, you know what it is. So it's plus slash applied to each side. So you've got to do equals on the two sides. It'd be interesting actually to think about how to do this really neatly, right? Because you've got to have. I mean, you can obviously do it with a defund.

But to do it directly. Oh, I guess it's like, yeah, plus slash applied to that. That this one. So that would be. That would give you that. No. OK, so that would give you. It's a slightly different case to any of the binds. I remember saying you want the.

This to be the dyadic one, and then you want to post process it with plus slash. Is there a way to do that? Yep, so that's why you need to think about it. And yeah, they also in the example stage, they. They tell you that as different method in in APL can do it and just see how they actually quite experience it to to to operate actually really, really amazing.

And I saw in the last year competition, they actually compare different solution and they actually can run the performance to compare different, not just the length of the solution, but also the processing time. It's this one. You want X equals Y and then post process with plus equals. So you want.

This is your post processing. And this is your dyadic pre processing. Is there a way to. Like run some examples and see what happens or do you have this? Because your answer is not correct, that's right. Yeah, I was hoping I was hoping to see what it does give.

Oh, actually, the example is all your test case. I see. Yeah. Yeah, let's try it. So you just need to do your function. Okay, F equals plus slash and what's this button? J applied to equals. That's not that. It's this. Okay. That's interesting. It hasn't, it hasn't ended up.

Are you, are you trying to put F? Oh, I'm not going to say equals. I should say F. Sorry. Ten. And is it saying that was wrong? The result should have been seven with that and that. Oh, wait, the number of differences, that's why. So it's, it's the opposite of that.

And I believe not is Tilda. I think I saw that on the news. It is. So that's the post processing. There you go. And would you need the parentheses? I'm not sure. Without the parentheses, it still works. That's interesting. Now, why does it still work? So that's the operator.

That's the right hand side. That's the, oh, I see. That's the left hand side. And then that's what is applied to the whole thing. So I think that's correct. Test. Wow. Yeah. But my solution is only five. So one, one letter's more shorter than you. One, two, three, four, five.

Mine's five. Okay. Yeah. Yeah. Nice. And they, for the, for them, they have the pass. They have a silver trophy for you or a go-go trophy for you. Silver just passed part of the test case and the goal, actually, you pass all the case. And so this is gold?

Yeah. I see. I think you said you have to log in for you to save your correct answer if you. Oh, good point. You can submit now and then you can put the trophy. All right. Yeah, I just found very fun and busy and I can learn and practice.

That's great. All right. So, so your list of things were the things that they were saying would be needed. Okay. So we've done this one. So let's do these ones. And this competition's called 2022 APL. Okay. So let's create a, section. Okay. So should we just go in order?

Oops. This is called Key. I feel like I've heard people talk about Key a few times. And what is this cliff called? You can see it. This one. Is it an improvement of operators? Yeah. Quad equal. Okay. Quad equal. And it's spelt here. Okay. It's a monadic operator. I really wish this bookmarklet gave the whole hover over that the dialogue editor gave you, but oh well.

Sorry about that. So I really wish this bookmarklet gave you the full hover over that hover effect that the dialogue editor gave with everything, but... It'd be easy enough to fork it and add that, I guess. Yeah, that's true. Yeah, maybe somebody can give that a go. That's a shame they're not using a nice font in here.

Oh, we should add our boxing style equals max. Oh, boxing on style equals max. Oh, dash style equals max. Okay. Okay. Means key. It's okay. So the left-hand side's optional, so we know to look out for that. And we're going to give it a dyadic function. It applies the function to each unique key in X and the major cells.

Okay, well maybe the best way to look at this is to look at that competition because it had an example. I think it's okay if we look at how to do some of the phase one stuff together. If that sounds reasonable. Yeah, I can say it's okay if we just walk through.

Oh, don't press that button. So, right argument that's a character vector representing DNA string and we want to count each symbol. So, all right. So maybe we should start with like banana and count each symbol banana. Okay. It applies the function to each unique key in X and the major cells of Y having that key.

I see, and here they've got a function which is just inserting colon between things. Each unique key in the major cell of Y having that key. So, if we did like, let me know if anybody's got a thought about what we could try this for. This is shift K, A, I don't know, what if we just did like comma, A, rank there, okay.

Flies the function. Keys similar to group by. Maybe we should try their example. So, this banana example might be an even simpler one, that one potentially. Put it in the chat. I guess it's basically the same thing, but... Okay. Cool. Easier to see what the mapping is doing. So, what is it doing as X?

So, the B, the banana goes with the three. Why is the A appearing with one, one, nine? Oh, it's selecting from like where the A's are, it's selecting these. Oh, and then where the N's are, it's selecting those. Wait, is that right? The banana. No. B, A, N, A, N, oh yeah.

Oh, I see. These are the positions of, it's kind of slightly backwards to what I expect. There's three A's. Oh, and they're in, maybe it would be easier actually if we did... I6, O to 6. There's the positions of them. Which means, can we just say comma? Yes. A, comma, two, four, six.

Yeah, that just concatenates things. And it's a bit like root by... Another example that shows actually applying a function other than kind of a custom function in there as well that I think is another functionality we might want to show. Okay. Though the I in mine is not an iota, so it should be.

Oh, I see. So we basically are saying like this is column one and this is column two, and you find all the unique things that are in column one, and then you find the corresponding things in column two and do something to them. And what if it's monadic? I think it will pass the iota six on both sides of it and treat it as...

I think the iota six will be alpha and omega. There you go. If it's monadic, it just does the results. Gosh, I thought you meant only something on the right side of the quad equals, like no A, no left side. So like... I wonder how you can do this without the D funds.

No. So in that cell 22 where you have the A with the plus some... I mean, you can also remove the A from the left, or not the alpha. Oh, remove the A? That holds. You can move that and it'll pass that iota six as both alpha and omega to that function.

Okay, so that's not going to be very interesting presumably. Ah, what's that doing? So that is, I guess B is the first slot, A is second and fourth, but where is... Okay, so I guess that just gave you the index locations for each character. The K operator applies the function to each unique key.

Oh, here we are. It's the same as this, but we haven't done this yet, have we? Maybe we should do that because it actually comes up quite a lot. So let's just step back for a moment and... Put it underneath this. Presumably the dyadic form of this is not match, it is, so that's easy.

That way we want the monadic version. So this is... A double quote and we can look at that. Okay. Okay, dyadic is not match, so I can just... Move this. Copy that from match, I guess. Oh, we don't have anything for match. Oh, we haven't done equal underbar yet either.

All right, okay. Okay. This one should be pretty easy. So this... That's interesting, now why are these different? Oh, I guess I'm confused. They look the same. And so... Oh, because they do match, yeah, of course. Sorry, so yeah, so not match is false. I wish they had the simplest possible examples first.

One doesn't match one is false. One doesn't match zero is true. Okay, now the point though is that it doesn't kind of like... Normally equals or not equals is element wise. So this would broadcast over this and the answer would be zero zero because one, it's not true that it doesn't match one.

But this version with the extra line in it checks whether the ranks are the same. So it's operating on the whole thing. Which presumably there might be one somewhere to get that using the rank operator and not equals. Um, I don't know if that's true or not. So not equals is eight.

So yeah, so my point is that normally... Well, let's just use equals, right? Just two examples. So one is equal to one and one is equal to one. Or we could do it like this. And then I'm wondering is there some way... Rank operator, was it this one? Over.

Rank. Okay, shift J. Um, is there somewhere to say, okay, we want to take the... Left hand side is a scalar and the right hand side is a vector. Nope. Okay, I guess I don't know how to do that then. Um, okay. Anyways, so I guess I think this is fair enough.

And so we could copy that up to match. Which is colon. Okay. Okay. Mononik. So, interestingly, I think the, um, I think the, uh, rank operator you have to put in parentheses. Because otherwise it interprets that right scalar as part of the vector on the right. At least doing that at least gets it not to error.

It didn't give me a useful answer, but it got closer. Well, I didn't get an error. I got one, one, which is this, yeah. Oh, gosh, okay. Zero, one. I was trying to get a single result to say this is not equal to this. This whole thing is not equal to this whole thing.

Oh, using just the single equals. Okay, I misunderstood. Yeah, I was trying to get that to be the same as the command. I wonder, do they say whether it's, uh, some equivalent match. Doesn't. Doesn't mention it. All right. Okay, so tally is how you get counts. I've come across this before.

And the mnemonic I heard on ArrayCast, who are remembering that this is how you get counts, is imagine rotating it by 90 degrees. It looks like tallying stuff on a whiteboard or a chalkboard or whatever. So, tally. So that should be, that's three, got three things. What about tallying up a matrix?

Okay, it's the number of major cells. There are two rows in a matrix. Yeah, so imagine rotating that by 90 degrees. It looks like you're tallying something. There we go. Yeah, number of major cells. Great. Ah, that's interesting. It points out that row V is a white element vector, where else tally V is the same thing, but it's a scalar.

Minor difference. Might be worth pointing that out. Like so. Okay. And then depth. Is the, how much nesting there is, I guess. So this is an array of arrays, so its depth is two. This is an array, so its depth is one. This is a scalar, so its depth is zero.

And in the case where it's not always two, then it makes it negative. Okay, so if all the items, the scalars, it's a simple array. It has a depth of one, a scalar depth of zero. And if they're not all scalars, it's nested. Uniform depth, if all its items are the same depth.

Okay, and it's not uniform depth. It's negative. Okay, I don't know what quadML is. Okay, so I guess that's, hopefully gets us back to where we were, which I don't remember what that is. Oh, we were doing quad equal, and I guess that mentions, here. Okay, so that is the number of elements in Y.

Okay, so iota of that. Yeah, okay, that's exactly what we just saw. So this is iota of the number of elements of A. Yes, iota six is iota of the number of elements of A. So that's the same as iota of tally of A. And that's why these two are the same.

Cool. Did we want to have a go at trying to do this thing? Anybody have any ideas? So to jump back, I just looked at what that quadML does. Okay. Kind of cool, kind of don't think I'll ever use it. Okay. But I guess different versions of APL define partitions differently, particularly when you're doing like partitioned enclosures and stuff like that.

And apparently you can change which definition you're using. Sorry, what do you mean by partitioned? I set that variable. What does partition mean in this case? Like the backtick Z or backtick capital Z. It's the little C, I think it's called left shoe. Oh, okay. We haven't learned that yet.

Yeah. Left shoe underbar. So it... All right. I guess we'll come back to that, then we look at that cliff then. Okay. So if we did this quady thingy, what's it called? Quad equal? She's the key. That tells us the locations of each of these things. And what did it ask us?

Accounts. Oh, okay. So would that just be... Hallie? No. Okay. Why didn't that work? So do we need to have a function and apply tally only to the Omega argument? Or... Yeah. Was it doing something? Was it like doing it diatically or something like... So key... oh, it's a dyadic function.

Right, right, right. It's a dyadic function. So we want a way to say we want to use it monetically, which obviously we can do in a rather ugly way by doing it like this. So we need the tally to apply to the Omega, but not the Alpha, right? That's still wrong.

Are you trying to do tally? Isn't the tally the one with the... Oh, yes. Yeah, yeah. Just the other one. Thanks. Right. And then... Thank you, Tanish. Okay. Is there a better way to say we want the monadic version? Did you come across a shorter answer to this, Serato?

Or did you have something like this? We can't hear you. You're muted. I think I have a longer version. Oh, okay. Let's see if it works. Well, this is an interesting thing maybe to see if anybody can figure out is how to do this without the D funds, because it seems like it should be unnecessary.

Okay. This 2012-1721. 20... Oh. Oh, it's got to be in a particular order. Right, right, right. Which I think is easily fixed by telling it what order we want it in. Is that true? So we want it for AGCT. ACGT. ACGT. Is that? That's not quite how it works, is it?

It's going to... It's going to go through each of the unique things on the left. And the right-hand side is... Yeah, the problem has been entered in that order, right? That's why I actually quite long my answer. So actually, it really makes you think about how to approach the problem.

I think it achieved the purpose of how to use the patient as a tool so forth. And I've got a bad solution. If we do both arguments, we could use that rank up and rank down the... I don't know, the Christmas tree looking ones to sort it. And then just select the last column of that.

We haven't actually used those yet, but yeah, okay. There should be an easier way, I would think. All right, well, we can get it in the wrong order. Fine. And so the particular order that's going to be in is going to be... AGCT and the order we want is...

Wait, what do we want is ACGT. Oh, AGCT, slightly wrong. Yes, we could sort that list before we send it in. So if we did... Oh, because that's just sorted. Yeah, so we could just sort that. That's true. And the way we sort things, it's like a grade thing, right?

Yeah, it's to the left of Iota. Looks like a Christmas tree, yeah, there. Oh, I see. This is how you sort things, is it? Yeah, now it returns the index locations that you should... You have to index in. It doesn't actually sort the list, it returns the... And so then you need to use the squash quad to get back to the correct values.

So it's not... Is there something like... Uh-huh. This is, this only vaguely rings a bell. But when we did Iota... dyadic, yeah, tells you index of... So this is the location of each of these things. I don't know if that helps. So, I mean, I guess what would we do with this?

We could somehow get a sum by each unique number, and then use the quad equals to pair that up with a CGT. Maybe, kind of making stuff up. I don't know if that'll work, but... That's the order we want. All right. Well, I might leave it for now. I think it's an interesting question again to think about.

I mean, that's why we're trying to do all the glyphs. Is it until you know all the glyphs? We don't have the, yeah, the raw stuff we want. Why can't we just sort the... Yeah, go on. Sorry, Tanishka. Why can't we just sort the array, and then do it on the sorted array?

We can. We just haven't learned the glyphs to sort with yet. Oh, okay, okay. They suggest using outer product. Well, maybe that's worth thinking about too. So outer product. So we would have AGCT down the left. And so if we did like outer product of... Oh, I can see how they're going to do that.

So outer product is jot dot, so if I do jot dot comma... Right, there's that. Oh, okay. So if instead I use equals, there's that, right? There's that. Awesome. Okay. Now, again, it'd be nice to do this tacitly, but I don't know how. So this is going to be ACGT, and then we're going to have the thing that they're passing in.

Let me say it'd be nice to do it tacitly. Do you know of any reason why the tacit stuff is better? Okay, so that's like asking, "Is wildcard import in Python better?" That's like a can of worms. Yeah, I asked that on the APL Discord, and I realized... Oh, there you go.

Okay. Not a helpful question for me to ask. I was hoping I could get a better answer here. Hello, Americans. What do you guys think of gun control? Yeah, that was about the reaction I got. Yeah. Okay. So there was an early array cast with Henry Rich, who's the guy who mainly implements or almost entirely implements J nowadays.

And he said he basically never... Not never, but he very rarely uses tacit programming. The tacit meaning without the curly braces and omegas and whatnot. So that's one point of view. Aaron Hsu, who is the creator of Code Defunds, the GPL compiler written in /4APL, uses a lot of tacit programming.

So Henry Rich's view was like, "Oh, it's too hard, and it gets just too complicated, and so I don't want to do that." Or else Aaron's view was like, "Well, you know, I want my APL to look like APL, and I can kind of create nice, small, neat idioms, and I can combine them together." The kind of overall sense I get from listening to array cast is a lot of people seem to feel like stringing together four or five functions and operators is perfectly reasonable and normal.

And if you go too much past that, it starts to get confusing. So I don't know. I mean, Aaron seems like a particularly smart guy who's particularly good at APL and writes a lot of it, and so might be just one of these comfort things that at some point at which tacit functions are easy.

One of the benefits of tacit functions is that they're invertible. So you can use the negative power operator to get the inverse. Roger Hui, who implemented a lot of dialogue, apparently he preferred defunds, and a lot of the faster idiomatic versions in APL are only faster if you use defunds.

For me, it's more like... Reference, I guess, mostly. But the reason I wanted to do it was just to test my understanding of APL. Gotcha. Like, I think it's a useful exercise to try it, particularly because I'm really bad at understanding how these things are kind of passed and strung together.

I'm just looking at this now where we're post-processing something, and then this is applied diatically. Yeah, yeah, I don't know. Submit. Oh, consider cases like A as a right argument. Oh. Ah, yeah. That's a problem. So if you think about the outer product, well, you can see it. Why doesn't that work?

Oh, can't plus/slash that, of course. You don't have each of the rows represented there. So, yeah, edge cases don't work. Anyway, I feel like we've had a good go at it. Interesting to hear what you folks find. That would also probably be an issue with the other approach of using the key.

Right? Like if we were to sort the array and then use key on it, it would probably have a same issue. Well, you kind of want the left-hand side to be ACGT or something, and then... I guess you could look at ACGT, check if it's a member of your in your string, and if it is not, then it'll give, or I guess I don't know.

Okay, so there's slash, right, which is... Or was it backslash something? Where was that thing that was like... Or was it iota? Oh, where? iota underbar is where. iota underbar. If you had just A... Yeah, no, it still doesn't work. So you want to go through each of A, C, G, T.

Is it possible to use it just with equals? So A equals, well, C equals A, and I want to do that... Is this rank? Yeah, I want to do that for each thing... No, for the whole thing on the right, left, and for each thing on the right. Can you do something like that?

Oh, that looks interesting, doesn't it? Can we use epsilon for membership, kind of A, epsilon C? I don't remember if we've covered epsilon or not. Well, Iris is thinking, can we just sum this up now? Oh. Now, why did that not work? I thought it would. We've got to be a bit careful when we sum it up, but I think...

Gave us the wrong rank. It's very close to correct, right? But I think if we do this, it's correct. So I think what we need to make sure is just that the rank... Okay, so... Consider these. Here's the problem. This is a vector. It's not a matrix with one row.

So that's interesting. Oh, because that's not a list of characters, right? That's a character scalar. But that's okay, because I would guess that they would actually make it a list containing the single letter A. I guess ideally we'd be able to use... I guess I don't think row works this way, but we would use row to reshape to four columns.

And in terms of rows, kind of do like the numpy negative one. I actually think we've already solved it. I actually think, you know, I need to write this to say a list containing the letter A. Oh, that'd be the left... The problem is that this is a scalar.

Gotcha. So I think actually my test was wrong. So actually, I think we've got the answer. So I think that... And then I think it should be a case of making that into a function. Okay. So we've actually ended up not using any of their suggestions, which makes me think that there's a better way to do this.

But that's okay. Okay. Test. So it looks like that last example... I would say it is this. I think they are pasting in a... Yeah. And that last example, we can see that. Can you put... Can we do like an enclosed left shoe? Is that how you do it?

Can we just also just... You could just make it a list by... Could you just do like comma and then again empty string? Oh, just direct comma before it. Look at you. All right. Nice. Yeah, yeah, yeah. Look at you. So yeah, comma is in list, isn't it? Or ravel?

Is that ravel? Ravel, I think, yeah. Ravel. Nice one, Tanish. I need a bit better at using comma. I think I end up like using the enclosure too much and then having to like do a bunch of reshapes and then so that's good for me to keep in mind.

All right. Perfect. That was fun. That was actually fun. It was. Um, the only other thing I'm thinking is like maybe we'll split this. I think this notebook's getting too long, particularly because the kernel's so slow for dialogue. So I might split it into three. Being like operators. The first stuff and then operators and then we'll do an APL competition one.

So anyway, look out for that when I send it in. Won't necessarily do that in the hierarchy though because I have a course to release. All right. Thanks all. Bye. Have a good one. Bye.