00:00 Michael Kennedy: Game theory is the study of competing interests. Be it individual actors within an economy or healthy versus cancer cells within a body. Our guests this week, Vince Knight, Marc Harper, and Owen Campbell are here to discuss their Python project built to study and simulate one of the central problems in game theory, "The Prisoner's Dilemma". This is Talk Python to Me, episode 104, recorded March 8th, 2017. Welcome to Talk Python To Me a weekly podcast on Python, the language of the libraries, the ecosystem and the personalities. This is your host, Michael Kennedy. Follow me on Twitter where I'm @MKennedy. Keep up with the show and listen to past episodes at TalkPython.fm and follow the show on Twitter via @TalkPython. This episode is brought to you interruption free by Talk Python Training. That's right, I'm talking about my courses. Whether you want to get started learning Python with the jump start course, learn over 50 Pythonic coding techniques, or consume a bunch of http services. I've got a course for you. If you're not already subscribed, be sure to be a friend of the show at TalkPython.fm/friends. I have two new courses I'll be announcing in just the next couple of weeks as well as a major feature, so you probably don't want to miss out on that. And finally, if you work for a company with 200 developers or more, we should talk. I have a very special first time offer for enterprises. All right, now let's get on to learning how we can minimize our prison sentence, by studying the prisoner's dilemma. Owen, Vincent, Marc, welcome to TalkPython.
01:56 Vince Knight: Thanks for having us, thanks for having us.
01:57 Owen Campbell: Yeah, a pleasure to be here.
01:59 Michael Kennedy: It's great to make your acquaintance and I'm really excited to talk about game theory and trade offs and solving all these sort of standoff problems. It's gonna be so much fun. But before we actually get into what is game theory, the library that you guys are working on, and things like that, let's start with your story. Vincent, how'd you get into programming and Python?
02:18 Vince Knight: I'm a mathematician, and so I used various bits of commercial software during my PhD, so Mathmatica, the main one, and then I started looking for a free alternative, and that's how I stumbled on Sage Math and from Sage Math, kind of fell into Python and slowly slowly grew from there and now I teach Python.
02:39 Michael Kennedy: That's really awesome. It's great that you started with Sage Math. I've had William Stein on the show and I think Sage Math is quite the cool project. It's really generated a lot of neat things, like Cython, that people are doing totally different stuff with today. Do you teach classes with Sage Math? Or do you just teach Python?
02:58 Vince Knight: We used to. I used to teach all our first years a combination of Python and Sage Math, but, actually, for a number of reasons, changed that over to just teaching with Python now. The Python scipy library kind of does a lot of what our first years need to do. There are various things about the installation. That's getting better, especially with cloud.sagemath, but we've just moved to just teaching Python now.
03:19 Michael Kennedy: Sure, okay, great. Owen, how about you? What's your story?
03:24 Owen Campbell: I'm a ZX81 generation, so I was bought one of those things as a small child and I've never really looked back. Once I realized that people were prepared to pay me to do this stuff, that was the career for me.
03:37 Michael Kennedy: You know, I can play with this toy every day and I get paid for it. Oh my gosh, I'm in! Count me in.
03:42 Owen Campbell: Exactly. I don't think I've ever quite reached the level of joy of the day I made it draw a Space Invader, but once or twice I get close, and one day I hope to get there.
03:51 Michael Kennedy: Nice, nice.
03:52 Owen Campbell: I'm relatively new to Python. My eldest son is one of Vince's students and when he started at Cardiff and said, "Hey, it's Python they're teaching us here." He's got a younger brother, and I thought, right, well we'll get a head start. I'd better learn this stuff so that I can teach him. I must've used ever language under the sun until then, but it's only in the last three, four years or so that I've done any Python work.
04:21 Michael Kennedy: Oh, that's a really cool coincidence. I think that's a great service you're doing for your son to get him ready for all those things. If you go into almost any kind of university with programming skills of some sort, you're at such an advantage, I think.
04:38 Owen Campbell: Well, I'm sure he'll think so too now that he hears you saying it on this podcast.
04:45 Michael Kennedy: I've seen it work out well for a lot of people. All right, Marc, how about you?
04:49 Marc Harper: Sure, I'm a data scientist. I currently work at Google and before that I was an academic in bioinformatics, which we used a lot of Python in and I started with Python before that, when I was a graduate student in mathematics. I started writing C++ way back in high school, and that was okay for a while, but then I looked for languages that were maybe more efficient with my time and less efficient with the machine's time, you know. I had a very brief stint with Perl before I found Python and then I never looked back.
05:20 Michael Kennedy: Oh, that's awesome. And you're using Python day to day at Google?
05:23 Marc Harper: Yeah, among other languages, yes.
05:25 Michael Kennedy: Yeah, okay, cool. Yeah, you know you said you started with C++. I remember when I was at university, they told me I had to start with Fortran and I pleaded with them to let me do C++ instead. I'm like, this will be so much more useful, I'm sure. No, no, Fortran is the most important language you'll ever learn. I'm not sure I still agree with them.
05:43 Owen Campbell: I was told it was a high level language.
05:45 Marc Harper: Yeah, there was a two year period, where C++ was the language of the future, before they decided that that was Java.
05:53 Michael Kennedy: You guys all worked together on this project. How did you come to meet each other? One, I think the university connection there. But how'd you end up working on this project together?
06:02 Vince Knight: I don't know if it's worth Marc starting, because I think the link, I can't actually remember exactly how Marc kind of got started with it. But, yeah, the link between Owen and I was through Owen's son.
06:13 Marc Harper: I think I found your GitHub page because it was shared on an EGT blog on Google+.
06:19 Vince Knight: Ahh, yeah, yeah, yeah.
06:21 Marc Harper: And then I went over and I poked around a little bit and realized I could add a couple strategies right away. I did that, and then I came back a couple months later and started working more on it.
06:31 Vince Knight: Yeah.
06:31 Marc Harper: It just kind of snowballed from there.
06:32 Michael Kennedy: Okay, yeah, really interesting. I think GitHub has, their slogan is Social Coding, or something like that, but I really do think it's connected people in some pretty powerful ways. It's amazing.
06:43 Vince Knight: For me, this whole product's just been such an amazing learning experience, because as you could tell from Marc and Owen, they've got far greater experience, knowledge of software engineering and coding and things like that, and so everything I've learnt is from coding with these two guys. It's just kind of sky rocketed my own knowledge of writing code. And that's thanks to GitHub in a way.
07:06 Michael Kennedy: Yeah, absolutely, thanks to GitHub. Very cool. So let's start with what is game theory. So the thing that we're gonna talk about is your library that solves or simulates, I guess, is really the way to think of it, a certain problem in game theory. But let's start at a high level. What's game theory?
07:22 Vince Knight: Okay, so it's loosely kind of the study of interactions between different individuals or agents in some shape or form and so it's kind of the study of how strategic interactions form, you know, like if I know what you know, what should I do? At a very loose level. Hard to say when it really began. There's kind of different people tell you different things, about when it started, but the famous game theorist is John Nash. He found a particular solution concept to game theory.
07:58 Michael Kennedy: So, yeah, John Nash won the Nobel Prize for his work in economics, right. I originally thought it was the Fields Medal, you guys said, no, no, the Nobel Prize. Very cool. He's also the subject of that movie "A Beautiful Mind", which was a great movie. Maybe tell us, what example was he working with? Do you remember what his work was on?
08:18 Vince Knight: Yeah, so he worked on Nash equilibria, which is a solution concept for in a strategic situation. There'll be a set of actions that all the players can take from which no one has a reason to do anything different. So there will be a point at which we can't really improve and his work was to show using a really clever proof, that that point always exists, so it was an existence proof. And that's kind of snowballed as a solution concept for these strategic interactions. And so, yeah, in the movie he has this kind of moment in the bar where he sees everything, and that's kind of the notion that if we all do what's best for ourselves, we'll actually not necessarily do what's best for everyone, which is a big theme in game theory.
09:06 Michael Kennedy: Economics as well, and we can get into these local minima, right, where nobody is benefiting from what is happening, as much as they could be, but somebody has to move first. Game theory kind of explores that space and finds these minimas. If you consider these strategies or those strategies, you'll end up in this situation. It's interesting in economics, it's interesting in public policy, all sorts of places. Marc, did you want to add something to the game theory thing?
09:36 Marc Harper: I think it's a good summary. The paper that Nash wrote is really famous because it's only one page long.
09:41 Michael Kennedy: Oh, really, wow.
09:42 Marc Harper: It has a huge number of citations. The story goes pretty deep. Just adding on to what you guys said. It's really fascinating to me that there can be two stable equilibria to gain, one which is really bad for everyone and one is really good for everyone, and whether or not those positions are stable or not is another big part of it. It's one thing to be at that equilibrium, it's another thing if you can be easily nudged off of it. And that's the quest.
10:09 Michael Kennedy: Yeah, yeah, how hard is it? And how seated are people in their ways. You know, you could see that looking at society sometimes. Well, why are things structured this way? If people just did this, right. So I think this is really interesting to explore that. One of the classical problems in this space, and what is the focus of your library. So, remind me, what's the exact name of your library? Axelrod?
10:32 Vince Knight: Yeah, Axelrod library.
10:32 Michael Kennedy: Just Axelrod, okay. I wasn't sure if there was like a dash or something. So Axelrod library. Let's start out with what's the origin of that name?
10:40 Marc Harper: Axelrod is the name of a researcher who did an influential tournament several decades ago around the iterated prisoner's dilemma. Where some of the classic strategies like ...
10:51 Michael Kennedy: So what's the prisoner's dilemma?
10:53 Marc Harper: So it's named after Robert Axelrod, that's his full name and the prisoner's dilemma is a particular situation in game theory where ...
11:01 Michael Kennedy: A lot of academics run into this problem, right? They find themselves. Just kidding.
11:05 Marc Harper: Right, no, so the story behind the prisoner's dilemma is you've got two prisoners and I guess you've arrested both of them and they both have to decide whether they're gonna rat on the other guy.
11:15 Michael Kennedy: Right, some kind of co-conspirator, co-criminal sort of thing, right?
11:19 Marc Harper: Right. And if you both just ...
11:21 Owen Campbell: Again.
11:22 Marc Harper: And if you both just don't say anything, then they have some evidence and they can maybe get you with a low level crime. But if one of you rats out on the other one, then they'll use that confession against you. It's in the prosecution's, or the police's best interest to get you both to confess. And it's in both of your own individual best interests to say nothing, but they provide you with a big incentive. To confess on the other person. They say, we'll let you go without any penalty, if you'll just confess on the other person. It's in your rational, it's in your own personal interest now to confess on the other person. But the problem is it's in their best interest to confess to testify against you as well.
12:00 Michael Kennedy: And if you both confess, then it's bad for both of you. This is one of the local minimums that you can get stuck in that's really bad. You're both going to jail, because you both told on each other. The Axelrod library, or the Axelrod project was around modeling the prisoner's dilemma, correct?
12:17 Marc Harper: Yeah, so one of the things is how people end up cooperating. If we're all incentivized not to cooperate with each other yet we look around, we see all these situations where people are cooperating, so can we devise strategies that when we play this game repeatedly that coerce or convince our partners that they're better off cooperating with us than defecting against us.
12:37 Michael Kennedy: Yeah, okay. So let's think about some of the things that you can do with this library. The Axelrod competition was held, you said, in the 80s. You said the algorithms were lost or those strategies were lost to time. Is that true?
12:50 Vince Knight: There's some that can still be found, but I actually exchanged a very brief, when we started this library, I exchanged a very brief email conversation with Robert Axelrod saying, "I don't suppose you happen to have any of these strategies kicking about." And from his very first tournament he simply said "No, they're not around." Some of the others are written in Fortran, I believe.
13:08 Marc Harper: Yes, and they're not very well documented or anything like that, so they're quite difficult to follow. Some have published descriptions in various books and papers but again, they're not usually sufficiently detailed, to allow you to completely reproduce the strategy.
13:25 Michael Kennedy: Yeah, it's one thing to describe the concept, it's another to implement it.
13:29 Vince Knight: Yeah.
13:29 Marc Harper: Exactly.
13:30 Owen Campbell: We had one poor individual at the PyCon UK sprint last year who came to work on the project and spent the entire day wading through the Fortran code for some strategy that he was trying to reimplement. I don't think he was expecting to spend the day working on Fortran at PyCon.
13:49 Michael Kennedy: Well, how was your PyCon experience? Well, people were nice, but all I did was Fortran. It was dreadful. Let's talk a little bit about what this library does. You can set up these things called strategies, right? And you can have players and tournaments. Give us a sense of what the whole thing does.
14:07 Owen Campbell: In the end, each player that's participating has a very simple choice to make, which is either to cooperate with their fellow prisoner or to rat on them. A simple choice between two options. What we do in the library is to say all of the different strategies that we know about, we play them against one another. First of all, we do that in pairs. We'll put a pair of players against one another and they'll play the game repeatedly, over and over and over again. And then we'll just match up all the different combinations of pairs for however many players we're interested in. We'll total up all the scores and see who comes out on top.
14:50 Michael Kennedy: Okay, excellent. Give us a sense for some of the, you have some clever names for the different strategies or players, right? Strategy and player is kind of the same thing. You've got the basic ones. The cooperator and the defector, but what else?
15:03 Owen Campbell: Probably the most famous one is the tit for tat strategy. Because in Axelrod's original tournament, one of the interesting results that came out with his work was that this strategy was one of the most successful. I'm sure the other two will correct me, but possibly even the most successful of the lot.
15:20 Vince Knight: Yep, yep, yep.
15:21 Michael Kennedy: All right, so what's tit for tat? If you rat on me, next time. I'm ratting on you.
15:26 Owen Campbell: I'm gonna rat on you. And if you're nice to me, I'll be nice to you. It looks at what its opponent did the last time they played and simply plays exactly the same choice that they made, when it comes round to the next turn. So, of course, if the opponent is being cooperative with it, then it will cooperate. It is quite the cooperative strategy, and it did very well in Axelrod's original tournament.
15:53 Michael Kennedy: Interesting. And then you've got the grudger. Which if you ever turn on the grudger, you're gonna regret it, right? Well, what else? There was a few other interesting ones.
16:03 Marc Harper: Yeah, there's a lot of variants of strategies where if you cross them once, they'll never cooperate with you again or maybe they'll forgive you once, but if you cross them twice, then they're like, okay.
16:13 Michael Kennedy: Interesting, so implementing these strategies is actually pretty straightforward. You could reasonably write a strategy in like five lines of Python, yeah?
16:21 Vince Knight: Absolutely.
16:22 Owen Campbell: And that's been one of the main aims of the library is to make that as simple and straightforward as we possibly can. It's a great way for somebody who's new to programming or new to Python or new to making contributions to Open Source projects to get involved with something and to see an effect very quickly. You can invent a strategy that's not been thought of before very easily, you can code it up in a few lines and you can get it into the library and get it participating in the tournament.
16:52 Vince Knight: And it has been a first contribution for many people to Open Source. I gave a class on repeated games one morning and that afternoon one of my students had written their first Open Source contribution with a little bit of help, but not much so.
17:06 Michael Kennedy: I think that's really great. A lot of people are super interested in contributing to Open Source, but I think it feels super daunting, because they see all the things, they're like Django, I'd love to, oh my gosh, this is a big project, and if I break it, oh boy, pinterest will be mad at me, or whatever, right.
17:23 Vince Knight: Whereas here, really, at it's core, to contribute a strategy, all you're doing is writing a relatively simple, well, can be simple or complicated class method, just one method is kind of all you need to do.
17:35 Michael Kennedy: Yeah, you know if people are out there listening, they're like, "Hey, I'd love to get started on this. You've got some interesting game theory." Definitely check this out. I'll be linking to the GitHub repo in the show notes.
17:44 Vince Knight: That'd be awesome.
17:45 Michael Kennedy: Cool, so.
17:45 Owen Campbell: We'd love to have them. We look forward to seeing them.
17:48 Michael Kennedy: It's awesome. You guys are gonna be busy with pull requests, I think.
17:52 Vince Knight: Fantastic.
17:53 Michael Kennedy: How many strategies do you have so far?
17:55 Vince Knight: In the current release, which is 2.6, we've got 184 strategies.
18:01 Michael Kennedy: Wow.
18:02 Vince Knight: But a lot of those are parameterized. For example, a random strategy, we have a strategy that acts completely randomly. You can also pass a parameter of making it random where they select to cooperate with a given probability. So in a way, we have pretty much an infinite number of strategies.
18:19 Michael Kennedy: So you have a 2/3s cooperator, 1/3 defector.
18:22 Vince Knight: Yeah.
18:23 Owen Campbell: And much more complicated ones as well.
18:25 Michael Kennedy: Of course. So what are some of the more, not convoluted, but involved ones, I guess?
18:30 Marc Harper: That's a good question. There's several that we've implemented from the literature that tried to break deadlocking situations. One of the weaknesses of tit for tat is it can get in these cooperate/defect cycles, with an opponent that accidentally defects or if the tournament is noisy or something like that. And so if you can give it a small probability that it will forgive a defection, they can get back to cooperating again. So there's a lot of strategies that implement little things like that that attempt to get the players back on track.
19:01 Michael Kennedy: I see. If you just go really clearly down the cooperate/defect grudge you end up in these equilibrium really quickly. As you make concessions over time or take more of it into account, it can probably be more addressing huh?
19:16 Vince Knight: I was gonna say, Marc, if you wanted to talk about even some of the more complex ones where we're using neural networks and we're training the strategies using genetic algorithms and things like that.
19:25 Michael Kennedy: Now that is cool.
19:26 Vince Knight: You're probably best place to talk about those.
19:28 Marc Harper: Sure, yeah, so one of the great things about the library is that we have so many strategies already and you can use these to train new strategies, using typical machine learning methods. So we had a couple really interesting contributions, I guess almost a year ago, from Martin Jones, who's I guess somewhat well known in the Python community and he submitted a strategy that used the lookup table that he had trained to find the optimal response against all the other strategies in the library. And he also submitted the first one that used the neural networks. We've extended that method of taking a strategy based on some kind of machine learning algorithm, training it against the other strategies and then adding the fact of the tournaments to see about those. Right now, those are amongst the best players in the library, in terms of performance.
20:13 Michael Kennedy: Oh wow, okay, how interesting. And is it adaptive? Or does it somehow identify, like, okay, I think that thing I'm playing against, that's a grudger, so I'm gonna do a grudging thing.
20:23 Marc Harper: That's a great question. So some of the strategies that try to adapt on the fly don't always do so well, but what you'll see is the train strategies typically learn things, like if you defect too many times in a row, then they'll just decide that they're gonna give up on you, that you're one of these strategies that is never going to cooperate with them, so they'll just defect with you for the rest of the time. We've got some population dynamics based ones as well, which we can talk about a little bit more, but they have to learn to play against themselves and the other players. They end up evolving a handshake so they can recognize other variants of themselves, but exclude opponents that aren't like them.
21:00 Michael Kennedy: Really? Wow, that is so interesting.
21:03 Vince Knight: What's really cool is that that kind of comes out of the training so we just train them. So we're not kind of designing that handshake, but we're seeing that handshake evolve, which is kind of cool.
21:13 Marc Harper: For sure.
21:14 Michael Kennedy: Okay, yeah, that's incredible. I didn't really expect that. At Google last year, they came up with those two neural networks that would exchange encrypted data and a third one that tried to break it, the Adam, Eve, the Alice, Bob and Eve one, that one, that basically invented a way to talk to each other to do encryption and it sounds like this is kind of like that a little bit in the sense that they know how to play against each other. I mean, I'm not saying it's necessarily the same thing, but.
21:45 Marc Harper: I think it's in a similar vein. It's the result of the same kinds of reinforcement training strategies.
21:51 Michael Kennedy: Okay, interesting.
21:52 Owen Campbell: But each of our matches is typically only 200 turns long, so they've only got 200 bits of information to do this in. Not quite in the same league as what Google are doing.
22:03 Michael Kennedy: That's right.
22:04 Vince Knight: And the worse thing that'll happen is they'll win a tournament. We're not letting them just get the computers and talk to each other without us knowing what's going on. So we're okay.
22:10 Michael Kennedy: Yeah. But singularity probably won't come from these strategies.
22:15 Owen Campbell: Who knows?
22:16 Marc Harper: I mean, maybe.
22:19 Michael Kennedy: But if it's ever found on GitHub, by one of these other AIs, it's gonna bring it back in and it's gonna be trouble. I don't know, if we can just get society into this local minimum, we have them. All right, so the idea is you have these strategies which are really interesting, and then you kind of do a survival technique, right. You have them compete against each other over and over and over, 200 times you say. Then you can draw really interesting conclusions, like, well, we had this even distribution at the beginning of each type, but at the end we had way more grudgers, or whatever. Maybe talk about that a little bit.
22:54 Owen Campbell: Yeah, there were a couple of variations of tournaments that you can play and some of them play these population dynamics. So, in various different ways, at the end of each round, your score determines the size of your population going into the following round. And at the end of it, we looked to see, well, who's died out, who's survived through to the end, has one strategy dominated the final population or have we ended up in an equilibrium of three equal populations with three different strategies. And that's actually, if you've seen the logo for the library that sort of multicolored plot. That's a plot that comes out of one of these population dynamic tournaments. And it's showing one or two of those strategies as surviving very nicely through to the end and dominating, and a couple of them have died out and don't have very much population left at all.
23:49 Michael Kennedy: Yeah and you have really nice visualizations of the results. I really like those. So some of the tournaments you have, you say round robin, you have spatial ones and probabilistic endings. What are those?
23:49 Vince Knight: I said earlier, the first thing that we do is to pitch two players against one another and then they compete for a certain number of rounds. Well, in most of the tournaments, that number of rounds is fixed and it's the same for each pair that plays. But in the probabilistic ending, you set a probability, so that in any given round, there's a probability that that might be the last one in this match. So the length of matches between different pairs varies whereas in all the other tournaments, they're all playing for exactly the same number of rounds.
23:49 Michael Kennedy: Okay, cool. Have you guys ever done anything, like trying to study career criminals? So ones that go back to jail and back to jail. If you lose a round, you have to sit out a round. Or something. Or only the ones that win, or they somehow get released back into the population based on how long they were sent to jail for.
23:49 Owen Campbell: I think you need to put a PR through.
23:49 Vince Knight: I was gonna say, yeah. PR's very welcome. We don't have that. But actually a library would allow for that to be implemented because we have these structures for how the tournaments are in these different tournaments. You could theoretically build a tournament that has some sort of dropping out phase or things like that you could do that.
23:49 Michael Kennedy: Oh, yeah, it sounds interesting.
23:49 Marc Harper: Yeah, and there's lots of variants to the game that I've been studying in the literature, where other than cooperate and defect, you can also intentionally punish your opponent by taking some of their points away or some of their money away. These are usually done with small studies of undergraduate students to see if that improves the equilibrium. We haven't gone down that. It's something we talked about before. Like they said, it would be relatively easy to add to the library. I think we've had so much fun with just the regular prisoner's dilemma that we haven't messed with that part of the question.
23:49 Michael Kennedy: You haven't had to go out there because it's still interesting to study.
23:49 Vince Knight: I do have access to students.
23:49 Marc Harper: That's true.
23:49 Owen Campbell: We also have a whole set of strategies that we sort of collectively refer to as the cheaters. They don't conform to the rules of the tournament that Axelrod originally did. They do all sorts of things within the code. They'll try to manipulate their opponent's code. They'll try to manipulate the history of the scores and so we allow those strategies in. There's quite an interesting little tournament that just plays those and sees, well, which is the best cheating strategy. Who's best at writing strategies that manipulate the internals of Python and mess about with their opponent's class methods.
23:49 Michael Kennedy: Yeah, so that's really interesting. The normal ones, they're provided. I mean, everybody's provided. The normal ones look at what did my opponent do last time? Did they defect or did they cooperate? I'll do something. But the sneaky ones, the insider trading ones, if you will, they say, you know what, I actually have a self pointer and my self pointer has the opponent. My opponent has a method that's called Respond and you can just overwrite that method to say, Return C.
23:49 Vince Knight: Exactly, exactly. It was a bit of a headache at one point, because as the library matured and became quite a good research tool, well, a very good research tool. We had these cheater strategies that were kind of all good fun and games at the start, but I think we made a good decision earlier on to bring in this classification of strategies. You can't stumble on the cheaters by accident, but if you want to go get them, you can. And at the same time, there's loads of other things that we can classify strategies on. So for example, how long is their memory? Do they only look at what they did in the previous round or do they look all the way back to the beginning of the game and you can kind of go and get strategies based on that.
23:49 Michael Kennedy: Oh, interesting. So basically the provided list of opponent responses. And you could say, like, always trim that list to like 10 or five or one types of responses, right.
23:49 Vince Knight: Only consider strategies that only look at that much memory, so to speak, yeah.
23:49 Michael Kennedy: Okay.
23:49 Vince Knight: Because that's another interesting thing. Talking about these sophisticated strategies, and neural nets and stuff there's a lot of talk in the literature, in the research literature about whether or not memory matters. There's a particular paper that made a lot of noise recently well, in 2012, was it? Where they were like, actually, any strategy can be beaten by a strategy that has very little memory. And we're seeing with the vast amount of strategies we've got that we can train strategies that can adapt and can learn and can be very powerful and very sophisticated.
23:49 Michael Kennedy: I see. So maybe like if you're gonna write a strategy yourself, where it's procedural and you write the code. Maybe it doesn't make sense to remember 200 steps and how do I fit that in? But if you give it to a deep learning neural network and go, here, this is what they did, what does that mean? Maybe it can actually find, within that, the patterns that we don't see.
23:49 Vince Knight: That's right. Marc wrote a paper on that with the coolest title ever. It's called The Art oF War.
23:49 Michael Kennedy: That's awesome.
23:49 Marc Harper: We came up with a strategy that used a lot of memory that was very effective. I think there's been this kind of longstanding folk idea in the game theory community that complicated strategies are more trouble than they're worth. That's because, in the beginning, tit for tat was winning all these tournaments, and it's a really simple strategy that only looks at their previous round. And people try to do all these complicated heuristics and stuff like that and it just didn't work. Because the other strategies were like, I don't know what this other guy's doing, but it's complicated, so I'm just gonna defect against him and call it good.
23:49 Michael Kennedy: I'm just a human, come on, I can be dumb.
23:49 Marc Harper: Right, right, but yeah, we've definitely seen some success with these strategies that can be trained to do something sophisticated.
23:49 Michael Kennedy: Yeah, and how intense are the AIs that you're putting ... Is this deep learning? Is this just a neural network? Does it involve things like TensorFlow in GPUs? Or is it pretty simple, as far as those goes?
23:49 Marc Harper: So the way we train all of them right now, I did play with using TensorFlow, but some of the other strategies, the only way we could really do it is with an evolutionary algorithm, just to mutate, see if it's good. And so all the strategies we train now use that method, even the neural network. The neural networks are usually pretty simple. They're basically one layer deep.
23:49 Michael Kennedy: Have you given them access to previous tournaments and the whole outcome and letting them look at that? Or letting them see more than the tournament they're in?
23:49 Marc Harper: I haven't currently trained one. I did train a neural network that tries to predict the next move. I let it look at a lot of games for that, but then I had trouble turning that into a real strategy and it turns out it was better just to take a neural network and directly evolve the parameters that do well in the tournament. In that case, it doesn't actually look at the outcomes of third party games.
23:49 Michael Kennedy: I see, all right. You guys talk about a thing called Moran processes for population dynamics. What's the story there? What's that about? I'm not familiar with that.
23:49 Marc Harper: Sure, so this is the classic example of a population dynamic. You have a population, in our case, N different strategies, but if you were thinking like animals, it would be that you'd have a bunch of animals that are different sizes or they have some different characteristic, different eye color or something like that. They all interact with each other and they accrue fitness points. In this case, they were playing the prisoner's dilemma, and whatever their score is is their fitness. And then you select one of them to reproduce proportional to its fitness or its score and you randomly select one to die of natural causes, let's say. And then so one step at a time, their population evolves as one strategy does better than the other ones. I mean, it depends the intrinsics of the strategies themselves and also the makeup of their opponent. So if they play well with certain opponents, then they're better off in a population that has a lot of those kinds of opponents.
23:49 Michael Kennedy: I see. So it's the underlying dynamics that actually decide how the population of one type of thing, like the grudgers or whatever grow or shrink over time.
23:49 Marc Harper: Yeah, exactly. The questions around that are is a population stable to invasion by a mutant type, a different type, or is the strategy good at taking over a population of another type.
23:49 Michael Kennedy: Oh, interesting. Yeah, something that sounds like it could be a cool variation on tournaments, maybe you've done this, is what if you introduce an invasive species type? You run the tournament for 3/4 of the way through and then you introduce some other strategy that wasn't initially there. After others have been killed off. Have you tried this?
23:49 Owen Campbell: There's your second PR, I think. We're doing well here.
23:49 Michael Kennedy: Yeah, yeah I think that'd be cool. A lot of them, if you look at the graphs, it's super hard to talk about pictures on the audio, but if you look at some of the diagrams, and I'll link to your presentation at PyCon. You'll see that in the beginning, there will be all these different types and some of them will die out after a while. And maybe the strategies that won when they were around are not the same strategies that win if some new type comes.
23:49 Vince Knight: Yeah.
23:49 Michael Kennedy: Okay.
23:49 Vince Knight: Like if you throw a cooperator into a room full of defectors, it won't do very well, because they'll rip it apart, basically.
23:49 Marc Harper: Exactly, exactly.
23:49 Michael Kennedy: Okay, quite interesting, yeah. What did you use to visualize those results? Those graphs are really nice. Is that Matplotlib or something else?
23:49 Vince Knight: That's all Matplotlib, yeah, yeah. That was at the start we made so you could easily get various outputs of, it's all just done in Matplotlib.
23:49 Michael Kennedy: Okay.
23:49 Marc Harper: Yeah, and there's two sub-libraries in our repository, one that does something called fingerprinting, which is this idea from the literature that gives you an image that corresponds to a strategy. Those are kind of neat to look at. And then there's another one that's been around for awhile that looks at how often each strategy cooperates against each different given opponent. We have a lot of other visualizations, and they're mostly with Matplotlib as well, with the occasional Seaborn I think here and there.
23:49 Michael Kennedy: Okay.
23:49 Vince Knight: At the start, out of the three of us, it's fair to say I was the keenest to keep the library very light on dependencies. I was kind of a road block for quite a while with Marc and Owen more sensibly saying, "No, let's use all these awesome libraries to make the code better." And I was like, "No, no, no, pure Python, pure Python." and so Matplotlib was introduced, but it had this really nasty little fix so that you could still install the library without it and then eventually, I understood what was the way to do things. A lot of code got a lot neater when we started making use of all the great libraries.
23:49 Michael Kennedy: That's nice.
23:49 Owen Campbell: The fingerprinting's another good little story. I put an issue on the library. It must've been about 12 months back, now.
23:49 Vince Knight: One of the early ones, yeah.
23:49 Owen Campbell: Just a bright little idea, I thought, which was that we were starting to get people contributing strategies other than the three of us and I was starting to find it tricky to work out is this strategy the same as one that we've already got and this is back in the days when I think we only had about 30 or 40 strategies. I was starting to find it tricky then, because of course it's not enough simply to look at the code, because the same decisions can be coded in all sorts of different ways. It struck me that we could do with a better way of trying to decide whether a given strategy was at least similar to one that we'd already seen. I naively typed that up into an issue on the repository and said something like, "Maybe we should just find a handful of strategies that we play them against, and we can do something clever mathematically to work out how similar they look." Thinking that my friends, the mathematicians would go, "Yeah, that's a great idea. I'll do that this afternoon." Oh no, they say. This is a significant mathematical challenge and 12 months later here we are with some poor student of Vince's doing it as his final year project.
23:49 Vince Knight: The interesting thing is that that poor student is actually Owen's son. He's now doing his final year project with you. So he's implemented this graphical approach from the literature, which has its strengths and weaknesses but actually, I think this might be news to both Marc and Owen, as well as all the listeners, is he's just been working on a cleverer way of doing it, building a statistical model that'll spit out if two strategies are different or not. Hopefully, we'll be able to talk about that a bit more at some point.
23:49 Michael Kennedy: Well, I think that's really funny that you just throw that out there. Like, ah, you guys could just compare strings or something. No, no, this is actually a lot of work. But on the other hand, it's super cool that something constructive as a project is coming out of it. That's interesting.
23:49 Vince Knight: Things have worked the other way, too. Where I've gone, "Oh, we've gotta do this thing. It's probably gonna be really really hard." Owen and Marc are going, oh, you just need to use a class something something something and it's two lines of Python. I'm like, "Okay, cool."
23:49 Michael Kennedy: I can actually do that in a list comprehension. We're good. Have you thought of involving deep learning in the classification of similarities? That would be interesting.
23:49 Marc Harper: I did write a blog post a couple years ago where I derived a bunch of features of the strategies in the tournaments and did a little bit with it. But that was back right when we had just about 100 strategies and we weren't calculating as many things, so it's definitely worth a revisit. See if we can do more.
23:49 Vince Knight: That was the plan with these poor final year student. But actually, we've kind of got some really promising results using rather naive statistical models. We need to look into that a bit more. But it doesn't look like we need to be too sophisticated. Again, because of the way the tournament is now, sorry, the way the library is now, it can just create so much data for us which is a real strength.
23:49 Michael Kennedy: That's excellent. I think this is a real service not just for Owen's son and your student in this particular case, but I think that this kind of stuff is really valuable to students who are coming out of school and they want to get a job. If they come in and say, well, what do you know about programming, well, would you like to see my project on GitHub and maybe the paper that was published built off of it, and here's my optimizations I've done and if you can provide that to students, then they're in such a better place when they go out and say, "Hey, I want a job."
23:49 Vince Knight: We actually had a student turn up today or yesterday, I forget. You asked in your, how did everyone find this library because we have quite a few people now and she said, "Oh, actually, as part of my course, I have to contribute to an Open Source project." She'd found the actual project and seen the documentation and the community and she decided to choose us, which was great.
23:49 Michael Kennedy: Oh wow, that's really cool. Think of how the world is gonna be after 10 years of this kind of stuff. Like, all the students have to contribute to Open Source and they have to somehow be really aware of this. They're totally familiar with that's your pull request. They know what that means. It's already got so much momentum, but I can see a world where we look back at these as quaint days when Open Source was small.
23:49 Vince Knight: Another good kind of side to this project is in terms of academic research, going back to the fact that Axelrod's original tournaments can't really be reproduced and there's loads of papers that can't be reproduced. That's a problem in modern research, where so much software is needed and written, but it's not necessarily written in a sustainable way and so the Axelrod project's a really good example of, maybe I'm a bit biased, obviously, but I'd say best practice in terms of our code isn't only written and documented well, but it's extremely well tested. It's constantly being refactored and improved and it's all a wonderful example of how you should be doing research.
23:49 Michael Kennedy: Yeah, you guys have a nice Read the Docs, and all sorts of stuff, right?
23:49 Marc Harper: Just to go on to Owen's point, it's pretty rare for academic code to be even sufficiently documented to use it again, let alone enhance it or anything like that. Just because the journals don't require it a lot of times when you publish it. And too, I think, the way we have our tests, we really try to test every state of behavior of every strategy so that we know that it is as close to the real deal as we can get it.
23:49 Michael Kennedy: That is really awesome, and I think it's great. You have sort of the case study in this example of the way not to do it and the way to do it all wrapped into one. With the Axelrod original tournaments, and people are like, we don't even know if we can reproduce these strategies and yet there are papers and stuff written on it, right?
23:49 Marc Harper: Absolutely.
23:49 Michael Kennedy: How do you validate that science?
23:49 Owen Campbell: That's been a real eye opener to me, as somebody that's got no academic background whatsoever, since the day I graduated and vowed never to sit an exam again in my life. To come back into it, albeit on the fringes, however many years later and find that there are papers and papers and papers written on the back of software that isn't accessible and I look at that and say, well how is that reproducible? How is that scientific? It's been a real shock to me to find that we, in this little project, have so much of a struggle to try and reproduce other people's results.
23:49 Michael Kennedy: But I think what you guys are doing, I mean, obviously it's Open Source, it's got version control, all the way through, so somebody can go back, well this paper was written on this version. It's not just I still have the library, but I have exactly the same code. I think that's interesting. I was talking to Kyle Cranmer from the Large Hadron Collider and he was talking about how this is a problem in particular physics as well, just reproducible science in general. And they do interesting things like have an escrow service to hold the code tied to the paper, and stuff like that. I think there's people trying different things from different angles, but, yeah, very nice work. So, what's the computational story here? You have 183 strategies, 200 rounds, they all fight with each other in certain ways. How long does it take to run a typical tournament? Is it pretty quick, or is this like, you've gotta go have lunch?
23:49 Marc Harper: Well, the full tournament on all the strategies takes about an hour on a typical machine. Vince has some nice 16 core machines that can really chew through it.
23:49 Vince Knight: Yeah, so on that it's still just under an hour for the full noisy tournament, which is the one that takes the longest amount of time. Because that's another thing that's inbuilt in the library. It's completely parallelized, so you can play all these matches in parallel and the library takes care of it for you so you can use up as many quarters as you can get.
23:49 Michael Kennedy: Okay, that's cool.
23:49 Marc Harper: And some of the classifications, if the strategies are deterministic, then we don't have to repeat those matches. But if the tournament's noisy, or the strategies are stocastic, then we have to repeat those more times. So depending on exactly what strategies you choose, it can be extremely fast if they're all deterministic, or it can take a lot more time if it's a noisy tournament.
23:49 Michael Kennedy: Okay, so have you guys tried to do any fancy tricks to make it faster or something like that? I mean, you talked about figuring out if it's deterministic and then going okay, it already knows the answer to this.
23:49 Vince Knight: I would want to very cautiously say that I think we're already doing a fair few of these tricks. You know, like the parallelization.
23:49 Michael Kennedy: Yeah, that's great.
23:49 Vince Knight: Vectorizing things where we can. But again, if anyone wants to take a look and make it faster
23:49 Owen Campbell: Lighting the multiprocessing is several days of my life I'll never get back and I don't wish to repeat.
23:49 Marc Harper: Yeah, and as someone else who worked on that part of it. Wow, yes.
23:49 Vince Knight: I think we all kind of broke our knuckles on that for a bit. That was
23:49 Michael Kennedy: Yeah, that sounds really cool. So of course you want it to go as fast as possible, right. Maybe somehow bring in some numpy/scipy into it, I don't really know. Or, who knows. It seems like an interesting computational challenge in it's own right. And you guys have battled it some, it sounds like.
23:49 Marc Harper: Yeah, and part of it is memory overhead as well. If you're batching out the matches, you can do them in parallel, but if you do too many of them, then you exhaust the memory, you hit swap and then you're done for.
23:49 Vince Knight: Yeah, that was a big bit of work, when all of the sudden we realized we were using more than 16 gbs of ram and we kind of did it all. So now it's basically got no memory fingerprint anymore. We do it all too far. I'd forgotten about that, yeah.
23:49 Michael Kennedy: It sounds like an interesting algorithmic problem and then you've got the known structure to deal with and stuff. But then people are throwing these strategies at you that you have no idea on how they're gonna behave. That's an interesting twist. It sounds like a fun problem to me.
23:49 Marc Harper: We do label the strategies too if they have a long run time. So, some of them take 10 times, 100 times longer in whatever computations they do then say tit for tat. So it's another thing that we've studied, optimizing specific strategies. There's a couple really cool strategies in the library called meta strategies and they basically take a large group of the other strategies in the library, maybe all of them, and then take the consensus vote or something like that. They, by definition, are 100 times slower than the other ones.
23:49 Michael Kennedy: Yeah, because they just keep rerunning it. That's a pretty interesting idea. It's almost like the politician thing. You see what people want and just like, "I'm gonna do that." However the wind is blowing, that's how we're going to cooperate here. Yeah, so are there interesting combinations that work well? Have you tried that? Instead of running all of them, go, I think this set of them or that set, this mixture of, I'll ask these 10 and see what I get.
23:49 Marc Harper: I have played with it a lot. That was one of the best strategies in the early days, these meta strategies. Of course, you know, if you give them the top five other strategies in the library then it does well, but one change we made recently is rather than take the best performer of all the strategies in its set, if you randomly take one of the top 10 performers, it actually works better than if you always go after that top one, which is sort of a weird quirk of an ensemble machine learning method.
23:49 Michael Kennedy: Yeah, yeah, yeah, very interesting. You can study a lot of cool stuff with this, it sounds like. Maybe give us some stories where this has been used. If any of us or any two of us, I should say, get captured by the police and charged with a crime, we'll know what to do, a more informed view on what to do, but it's not just for prisoners, right. It applies to other things as well.
23:49 Marc Harper: Yeah and Owen added a pretty interesting strategy not that long ago where you can play as a human. You can pick the strategy you want to play against and you can submit C or D and practice your one on one skills versus these strategies.
23:49 Michael Kennedy: Nice. That could've been an Atari game when it first came out.
23:49 Vince Knight: One of the kind of applications of the study is to understand the evolution of social norms. As Marc said at the beginning, why, when you look around are we cooperative and then that kind of steps onto other fields of evolutionary game theory that are then applied in mathematical oncology and things like that. These ideas are all interconnected and have wide ranging applications.
23:49 Michael Kennedy: Yeah, okay, cool. You said there's some applications in mathematical oncology, for cancer, yeah, what's that?
23:49 Vince Knight: That's kind of not immediately looking at the prisoner's dilemma but the same ideas kind of transpire that you can see the spread of a tumor inside a healthy body in the same way that you can think of introducing a particular strategy into another population. Things like Moran processes and evolutionary dynamics and population dynamics have been used to understand, yeah, that's part of cancer, and so mathematical oncology.
23:49 Marc Harper: You can kind of think of cancer as a cooperator that has switched strategies to a defector, and is now trying to takeover. Can it invade that population or not?
23:49 Michael Kennedy: Oh, wow, okay. It's really interesting when these things make connections to somewhere where they're totally unexpected. I'm sure Nash wasn't thinking about cancer when he worked on his game theory.
23:49 Vince Knight: Nash got his Nobel Prize in Economics, right, and the ideas that he was thinking about when he first wrote his paper and his thesis, they kind of just rolled really and he didn't really see it coming, well I say that. I don't know that for sure. But it certainly wasn't what he was thinking of when he was doing the work.
23:49 Michael Kennedy: Yeah, yeah, yeah, very interesting.
23:49 Marc Harper: Yeah, and it's still used in economics now. There's this idea, this first approximation that everyone does what's best for them. They take all the available information and they say it's best for me to invest in this thing. That's not what most people do. Most people just copy someone else's strategy or someone else's advice. It's more of an evolutionary process than a rational process that we would think of it.
23:49 Michael Kennedy: Sure. Does it appear in politics or is politics too slow of a process? Every four years, every six years. Is that enough for people to see these strategies and evolve or what do you think?
23:49 Marc Harper: I know there's papers that are written in political science that use this kind of stuff, but I don't know how well applied to the real world they are. They might just be theoretical.
23:49 Vince Knight: I know there are lots of blog posts written about game theory and Brexit, so some combination.
23:49 Michael Kennedy: Yeah, I was thinking of Brexit. I was thinking of the US presidential election. Both of these are unexpected and I'm wondering if game theory has interesting things to say about them.
23:49 Vince Knight: Don't blame us.
23:49 Michael Kennedy: I'm not blaming you guys. I was actually in London when the Brexit vote happened and it was very interesting to walk the streets of London the day after. It was quite something. A really really neat project and I love how it applies to all these different things.
23:49 Owen Campbell: I don't know if Marc and Vince have noticed, but whilst we've been chatting on our Gitter channel, we've now had somebody new come on saying they're a student, they're on a course where they're required to contribute to a OSS project and they like the look of our project and they'd like to know how to get involved.
23:49 Marc Harper: That's awesome. I can tell you what to say.
23:49 Owen Campbell: I didn't think this was a live broadcast, but now I'm beginning to ...
23:49 Vince Knight: Gotcha! Talk Python works fast.
23:49 Michael Kennedy: Yeah, well, maybe it's just someone's hacked into my computer. What you need to tell them.
23:49 Vince Knight: I think as much as it's, well, on the one side, where the library's gone. It's a really sophisticated, rich research tool that has various applications, things. One of the other things that we've kind of really been careful to is sometimes at the cost of efficiency, we have prioritized readability and entry of newcomers not only to Python, but to programming. I think that's something that we're all pretty proud of, that the library is a good place for newcomers. In fact, at one point, the winning strategy ... It's no longer the case, but at one point the winning strategy was written by a particular high schooler in the UK, which was actually Owen's other son.
23:49 Michael Kennedy: How cool. There's a lot of connections to Owen's children here. How interesting.
23:49 Owen Campbell: They get you into all sorts of trouble, yeah.
23:49 Michael Kennedy: So Owen, here's what you need to tell that person on Gitter. There's this simple problem about fingerprinting and they should be able to knock that out right away to get started. All right, I think maybe we're kind of getting low on time here to talk about the project. There's one other thing I wanted to ask you guys about here. You said that in the notes you put down something for a thing called ugly fruitcake. What is ugly fruitcake?
23:49 Owen Campbell: That's my son's username on Twitter.
23:49 Michael Kennedy: Awesome, well, well done, Mr. Ugly Fruitcake. No, that's awesome. Excellent, excellent. So I guess we'll kind of have to leave it there. We're getting low on time for what we're talking about, but it's been really really fun to talk about. Let's talk two things really quick before we drop this, I suppose. I still want to ask you, one, what's the Python three, versus Python two story. What supporters are for each version?
23:49 Vince Knight: For a long time we were supporting both, and eventually we made what I think's one of the best decisions we've made so far is we dropped Python two. Was that on the first of December last year, I seem to remember? And that just allows us to clean up our code base so much and pull people away from legacy Python. We're using
23:49 Michael Kennedy: That's awesome. I think that's a really great move. And also you were talking about the readability and the simplicity. As a newcomer to Python, you're often hit in the face with this dichotomy. If you can avoid that, that's really nice.
23:49 Marc Harper: And even as not a newcomer, it was still challenging sometimes when we got into weird cases where iterators and generators were interacting across the different versions.
23:49 Michael Kennedy: Right, right, yeah.
23:49 Vince Knight: Or just mistakes because of division.
23:49 Michael Kennedy: Yeah, absolutely. And then also, Djaxelrod? Am I saying that correct?
23:49 Vince Knight: Yeah.
23:49 Michael Kennedy: What is Djaxelrod?
23:49 Marc Harper: Oh, Django Axelrod.
23:49 Owen Campbell: That's a longer term attempt, really, to build a web app on top of this library. Instead of installing it yourself and trying to set up tournaments on your own machine, the idea here is to say, well, it would be good to be able to tuck this library away somewhere on a much bigger machine and put a web front end on it, and in that front end, you could define the tournaments that you want, submit them to the server. It would run them and then spew the results back at you for you to get at and do some analysis with. That's a project that we've kicked off. The reason for the name, purely, is because we're using Django and the Django rest framework to try to do it at the moment. But it's in fairly early stages at the moment. Again, if anybody listening fancies getting involved, it would be an excellent area to get into.
23:49 Michael Kennedy: All right, you want to do some webwork and interested in game theory, here's you chance. It's very cool.
23:49 Owen Campbell: Absolutely.
23:49 Michael Kennedy: Okay, nice. Is that publicly available or just something you guys have?
23:49 Vince Knight: No, no, no, it's another one of the repositories on GitHub under the Axelrod, Python organization.
23:49 Michael Kennedy: All right, awesome.
23:49 Vince Knight: The organization GitHub profile has not only the library but has lots of really interesting collection of notebooks, collection of visualizations, the fingerprints. Lots of interesting repositories there as well as Djaxelrod and this
23:49 Michael Kennedy: Okay, excellent. Yeah, I'll definitely link to those as well. That's great. All right, guys, it's been super interesting. I really enjoyed our conversation, but before I let you go, quick round of questions. Owen, if you had to write some Python code, what do you open up?
23:49 Owen Campbell: I'm a Sublime text man.
23:49 Michael Kennedy: And you said that you liked the Anaconda plug in, right?
23:49 Owen Campbell: I do. It tells me where I've gone wrong. Shows me all my mistakes.
23:49 Michael Kennedy: You like people to yell at you, huh?
23:49 Owen Campbell: As long as it does it quietly, so I can ignore it when I feel like it, that's fine.
23:49 Michael Kennedy: Yeah, no, I think things like that that really give you that extra insight are super super valuable. So cool. Marc, how about yourself?
23:49 Marc Harper: So, I usually use PyCharm lately. I started using it about a year ago and I really liked it. Before that, I just used kind of a bare bones text editor. For the most part.
23:49 Michael Kennedy: Okay, nice. And you probably use a lot of Jupyter, like notebooks and stuff as well at work.
23:49 Marc Harper: Yeah, in general. I also teach a data science class that's based on Jupyter notebooks, so ... I like Jupyter a lot, actually.
23:49 Michael Kennedy: It's pretty neat. It's definitely got a lot of momentum. Vince?
23:49 Vince Knight: I also use Jupyter a bunch, by my editor's Vim.
23:49 Michael Kennedy: Okay, awesome. And PyPI package, we just passed over 100,000 PyPI packages. Which is think is- Yay!
23:49 Marc Harper: That's awesome.
23:49 Michael Kennedy: Yeah, that's so cool. So how about the favorite ones? Same order, Owen, how about you?
23:49 Owen Campbell: I think my favorite at the moment has got to be xonsh. The shell, the Python shell. I've finally got to the point now where it doesn't matter what operating system I'm on, I've got exactly the same shell and it's config files are written in Python. It's a thing of beauty.
23:49 Michael Kennedy: That is beautiful. And that's X-O-N-S-H, xonsh. It's very cool. Marc?
23:49 Marc Harper: I think requests is my favorite. It's so easy, if you're doing any kind of web scraping or anything like that. I like a lot of the different ones on there. And of course axelrod has gotta be my favorite one.
23:49 Michael Kennedy: Yeah, well, why not throw that out there, for sure, for sure. And Vince?
23:49 Vince Knight: I have to mention QCIW. That's written by a PhD student of mine, so I just want to test that he actually listened to the end. It's a library for simulating queuing processes. But I think my favorite has to be TQDM. It's a brilliant little library that you can use to wrap any iterator and it'll generate a progress bar for you for free.
23:49 Michael Kennedy: Oh, that is cool.
23:49 Vince Knight: Yeah, it's really really cool, because you don't have to do anything, you just get these progress bars which, sometimes, when I'm doing something, I might take a little bit of time and I'm not sure how long, I can just quickly import TQDM and straightaway I get an idea of, oh no, this isn't gonna take an hour, this is gonna take a couple of years. I've got to change something.
23:49 Michael Kennedy: Exactly. Fabulous, okay, great recommendations, guys. Thanks. And final call to action, people should get started with Axelrod.
23:49 Vince Knight: Yeah, come on over, come check us out on our Gitter room and just say hi and submit a strategy or anything else. But yeah, we really welcome contributors.
23:49 Michael Kennedy: I can say, look at the code. It looks definitely easy to jump into, especially if you want to do the strategies, and I feel like there's a chance to plug in more interesting intriguing things that people are not expecting and probably get some cool results.
23:49 Marc Harper: For sure.
23:49 Vince Knight: We'd love to see that.
23:49 Michael Kennedy: All right, guys. Well, this has been great chatting with you. Thanks for being on the show.
23:49 Marc Harper: Thank you so much.
23:49 Vince Knight: Thanks for having us.
23:49 Marc Harper: Thank you.
23:49 Owen Campbell: Yeah, it's been a pleasure. Thank you.