 Okay, thank you very much for staying till the end. I also would like to thank the organisers as the last speaker. It's an honour to thank you for this wonderful organisation. I'm here to present a project that is from the world of academia from scientific software. I'm going to say the goal of my story is actually to explain how you can modernise your software. In scientific software we have a lot of legacy packages around that have been used very well and that we would like to keep on using, but how do we make them modern? Modern means mainly that you can use them in the cloud and that you can reach as many people as quickly as possible. People who are outside your very specific area of knowledge. I will say only very, very little about solving polynomial systems. I think that's not the point here, but it's mainly also that it has helped me a lot, me who is interested in solving polynomial systems. If my talk would end in one minute, then this would be the slide that I hope you would remember. At the left here, or yes at your left, is the picture from the user manual, which illustrates that other fields, other than mathematics, are interested in polynomials and polynomial systems. This picture here reproduces a problem from the research literature in mechanical design. The other half of the slide is another picture about Jupyter Hub, and actually this logo here, perhaps I should have scaled it up a little bit. This is SageMath, one of the, I mean it should probably say the free and open source alternative to the big M's in mathematical computing, which are Maple, Matlab, Magma and Mathematica. So in making the software modern, this is actually one of the end products that we can run our software in Jupyter Hub. This is a caricature, but there is a ground of truth in there. If you work in academia, then you most often get credit for writing a lot of papers, not necessarily for producing high quality software. Nevertheless, I mean my software actually dates back in a time when computing was still a totally different thing that while computing is now. So there is a very good software, there is a very good publication tool, ACM transactions on mathematical software, which is a good journal, but it archives software. It actually doesn't play much role into supporting the development process. Here are some milestones. So one, so the project is actually 10 years old. One of my students, Kathy Peeray, made the first interface. So this is phc.py. So we actually had first a binary interface. Another milestone was Euro SciPy. It benefited for me that the conference was in Brussels. And academia may not care sometimes so much about software, but our National Science Foundation does, fortunately. So a lot of funding during the past four or five years came from this sustainable software element. Mathematically, this fits within the computer algebra community. With the web interface, we got, I got support from Shungsheng Yu and Jasmine Otto in setting up the Jupyter Hub. I will try to explain something about this later. So the software has been developed for now for more than 20 years. And the core of it, we don't want to rewrite software that is working very well and software that is working very efficiently. So the C interface was developed for parallel computing. So the MPI here stands for Message Passing Interface. So this is kind of the standard for distributed parallel, distributed memory parallel computing. So it's an old legacy standard, but it still works fine. So this was tied up in C. And actually there is one big header file that actually exports all the functionality that is available in PhcPack. So the goal of the project is actually to export everything what the ADA programmer can do to the Python programmer. There is this great model that says that if you give your user a scripting interface, you give your user an audience. You give your software an audience to participate. Now how do you do this? Writing an interface can be done very quickly if everything that is on input is a string and everything on output is also a string. So the Hello World consists in four simple steps. You find where your Python header is. Of course you have to tolerate some C programming styles. Then for the functions that you want to export, you wrap them. So you have this py object here. So you can also return other things than strings. But at first focus just on strings. Then you have to, what you actually are defining is an extension module. So just like a Python module with functions, you're going to export your C functions to the Python user. So you have to define that modules, kind of a table. And then you have one initializer function. So these are the four steps that you need to go through. And they are actually very standard. Compiling might be sometimes tricky. So there is the distutils package that is going to help you with that, finding all the flags. Of course I here implicitly assumed that we're all using the GCC compiler environment. So you can link everything statically. So even on computers that do not have the right libraries. So for example you can, the code was made with the GNU 80 compiler, but you can actually redistribute that statically linked library.archive. So that gives you the shared object. And what that means is that in a Python session the user can just do import. The name of this file here. So you can do import this. And if you're at the right location you can use all the functions that have been defined. So if you have a piece of code that you want to export to a new programmer community, a younger programming community that doesn't really know, that works in a completely different way, then you also have to define your documentation quite carefully. Sphinx is actually quite good at generating automatic documentation. Of course you need to write documentation strings. A tool is only a tool. But if you write proper documentation strings for every Python function, Sphinx will actually extract and you will have a reference manual actually quite for free. So there is a quick start. So a quick start gives you a very simple interactive step-by-step questionnaire. And you have the basic setup. You can write in restructured text which is very easy, certainly compared to latex. So latex is the standard tool for typesetting mathematical formulas. You can include latex also into restructured text. That's also possible. But a great thing for Sphinx is also you have your restructured text and you can generate automatically PDFs and HTML from it. The getting started is also something that you can write very directly. The difficult things to write in documentation are the user's manual and the tutorial. The tutorial actually felt was the hardest case. And in some sense you also want to do this as automatic as possible. And this is there where you then make the full circle with Jupyter Hub. So you try to include as much technology as possible. In your tutorial you would like that you introduce a natural way of working with it but you as a programmer also need to use it of course properly. The Python equal system is important. So all these plots here were made by Matplotlib. With this slide I want to say something about polynomial system solving and mechanical engineering. You have these five points here and you want to design a mechanism. So these blue bars and these green bars here so that it passes through all these five points. This is useful. I mean this is actually a classic. It's a variation of the Chebyshev mechanism. Every mechanical engineer must know this. As you can see it translates linear motion into rotational motion. So there is a thing that starts to turn as you slide from one precision point to the other. This is useful if you want to build your own steam engine for example. So in the first interface, in the first very basic way ten years ago we were taking strings on input and we were returning strings. So we have the classical command line interface and that was actually mapped in a very straightforward manner to the shared object so to the code that was exported. So you don't want that in Python you really have to redefine your parsing of your polynomials. It's a good programming exercise but you can easily get tripped up. So actually what happens is that the parsing of the strings get done by the AIDA code and that is known to work well. Here again the picture from the tutorial and the purpose of this slide is actually to show how it benefits of the Python computational ecosystem. So you visualize and you interpret the results with Matplotlib. The symbolic equations are generated with Sympi. So you can have the high level view of having a computer algebra system in Python usage but you can also extend your Python with Sympi. Sympi is a very nice and fairly complete symbolic computing environment too but of course it lacks the solving. So the solving is what we, well it does have some solving but it is not as far as powerful as our software is. So I was presenting this in 2013 in EuroPsyPy and one of my users comes up so it was a poster session and he asks me, well fine Python but what can you do more now with Python? Well here is what you can do more. You can actually visualize the process of solving step by step. So the way we solve polynomial systems is by deforming a system we know into something that we don't know. So we actually are taking solutions that we know and you have these parts that are tracked and you can actually now build very similar to the idea of Python of a generator. You have the next method. You can ask what is the next point when you do a step. So next, next, next and you just visualize it. For me as a researcher I showed this once to my PhD students. I was very proud of this picture but one of the questions that came, hey, why does it turn out here? So we have some answers for that because I mean this picture when I was constructing it so you see both end up at one, two, one, two. So this is what we call a singular solution and I was expecting to see troubles there but the troubles are actually over here. So if you have another way of using things you actually discover other issues about the things that you are using. It's also all about giving control. So you actually, you give more control to the programmer with this scripting interface. Why Python? Well, Python actually provides all the tools that you need for a self-contained web server. So here are the ingredients, the three ingredients, the three main ingredients for our first web interface. So with CGI scripting you can probably know all that. You can write your HTML forms with a pure Python script and you can also process it with a pure Python script. We use databases but there is this wonderful interface that allows you to actually once and for all get the proper MySQL commands and then actually you wrap them into your own application. So you have then your, and what we actually create are actually generic folder names where the data of the users are stored, also generic user names. And then there is the mailing, so you can actually, and you can develop all these three pieces independently and then test them first on local hosts when it works. So you can actually make the signup process also completely automatic with a couple of scripts. So that was applied for our first interface and it's still running so we have the user authentication and the account setup done on one separate computer and then Jupyter Hub runs on another computer. This is the Jupyter environment and what I want to highlight here is the coding snippets. I was once invited at the MapleSoft conference. Maple is one of the big commercial, it's still one of the biggest commercial computer algebra software packages and at an evening dinner people were making fun of a CEO who had once asked, can you do computer algebra by clicking? So that was about 10 years ago, we were all laughing at this. But actually this was, this actually with Jupyter Hub with the coding snippets has actually now become a reality. What you can do is, and this is also important for the user manual, you can actually put in the representative uses in these menus. So if you want to use the black box over that would be recommended if you don't know if you're the first user. Then here is how you can do it. So you don't need to type anything, you just navigate the menus. When you click on this coding snippet here it drops into a cell and you run it. So you can design your user manual just like you would design a menu structure. So and actually this is quite a very novel way for solving polynomial systems. The big thing again is you want to get started as quickly as possible with your application. Jupyter Hub provides every user with an own Jupyter session. So it's like, Jupyter Hub actually exposes, you can still call it a web interface, but it's a web interface 2.0. It adds also a lot of additional functionality. You can, you also have the possibility of, and that's also what we do, we actually allow that users open up just terminals. So you also have still the complete command line interface to the software. You can use Sage, but you can also use a plain Python, Python 2 or Python 3. If you set this up, so I did this with Jasmine Auto and you need to be a little bit careful. At some point we were very happy that we got the terminal up and running, but then in the terminal you type in who am I, which is a nice question to ask, and it answered back root. So you do not want that any of your users become root. So you have to be a little bit, you have to be a little bit sensitive about what it is that you are exporting. So here are the, what you actually do with Jupyter Hub, you override one of their templates. So we had the existing user administration from our previous server, and we were actually simply recycling everything. So users who had an account on our older interface immediately had an account on this new interface. So this is then my last slide. So the current version is converging to 1.0.0. The highlights are is that we have now actually, I can say that everything, what the Python programmer can, what the Ada programmer could do, also the Python programmer can do. We have some new functionality and we have also the clouds interface. So there are still things that need to be done. What I didn't talk about is the GPU environment. So in order to have modern scientific software, you also will need to take advantage of the fast GPUs. And it's not just running in batch. We can do this now too. But you would like to control when you are calling your GPU or when you do it with a simple multi-treading or multitasking. You want to pipeline your computations. So one computation is followed by the next computation and the user should be able to have some flexibility there. Thank you for your attention. Is there any questions? Yes. Very good question. So the question is, can you use the code to solve partial differential equations? Yes. So there are some attempts. So partial differential equations are typically being solved by mapping them into a linear system. So we solve nonlinear systems. So there have been attempts being done if you have a partial differential equation with polynomial nonlinearities in there, you can actually map it into a polynomial system. And then you can also solve it. Any other questions? Okay, then it is my honor and opportunity to thank the organizers for this wonderful conference. If you notice that there are some trash next to your chair, that would be super nice of you to pick it up and dump it in the trash while leaving. Thank you very much.