All right, thanks everybody. So last talk before lunch is telling you about one of the near-term plans for improving the quality of general torsions in the force field and How this involves all of the different working parts that we've been assembling over the last year Okay, so this is a we're gonna trade off between a few people here because a lot of people have contributed to this And only some of them are mentioned here on the slide The basic idea is that We're going to take sets of molecules that hopefully are representative of the space that we would like to perform well on Enumerate the different pro-nation taught America states that are relevant a fragment them in some useful way That gives us one dimensional and two-dimensional torsion drive capability for them by looking at both individual bond rotations And and couplings between them and you the thing will tell us more about why that's important And I was able to actually do this to achieve high accuracy is in his last force fields We'll generate these in torsion scans using high-level qm in parallel and deposit them in an open database that Daniel Smith at Mulsey will tell us about But the workflows for doing that and the public database QC archive that he's been engineering as part of a larger effort that we've been very lucky to synergize with and then we'll fit these first generation of course will be with force balance second generation may be with Bayesian methods that hi has been working on and then there's a lot of different pieces of code That we've been working on to pull all of this together So I'm going to go ahead and yield to be pinged to tell us more about Why we're driving one and two dimensional torsions and what the tools involved in this are all right? Thank you, John I will only speak for a for a pretty short time about About some sub components of the sub project as you'll see this will this involves a multiple interrelated software tools And the and the part that all I'd like to report progress on that we kind of achieved in the last year is Is the is the following tasks? So So the task says given a molecule initial confirmation quantum calculation specification and selected torsions to drive Produce an n-dimensional potential energy profile where torsions are constrained along the specified and Orthogonal freedom are minimized Now I should be clear that this really is sorry closer. Okay. Yeah Okay, okay, this this okay, okay Yeah, so I so I should mention that this really is kind of a sub problem in the In the in the larger problem because if you want to generate a lot of high-quality torsion data You have to also identify which like, you know, which degrees of freedom to drive which is also a very difficult problem that That I will be telling us about a little bit later So but this first part was achieved through a combination of open-source tools that I will briefly tell you about So first so first is a tool called geometric. This is an open-source tool for geometry optimization. This actually Seems very similar to the force balance that I already told you about instead of optimizing force field parameters We're now optimizing geometries and this code talks to quantum chemistry codes to By passing them the Cartesian coordinates and getting the and getting the gradients in the getting the energies in the gradients in Cartesian coordinates from the quantum chemistry code Geometric itself implements several internal coordinate systems and determines the internal coordinate steps and take steps to Ensure that all of the constraints that you specify are satisfied along them in the course of the minimization and so on And this code really was written to implement a new coordinate system called translation rotation internal coordinates with the With the design goal of being efficient at optimizing things like water clusters and super molecular complexes That's not directly relevant to torsion drives But that's why this software was written in the first place And you can see that the performance is better than other Than several other codes and other coordinate systems Okay, so I'm so we're going to be relying on geometric as sort of a low-level tool and the quantum chemistry code like side Or is the even lower level tool that geometric is calling to obtain the energies and gradients at a given level of theory? Sitting one level higher than geometric is a tool called torsion drive and torsion drive torsion drive generates this Generates this grid of constrained Energy minimizations through this idea of wavefront propagation. So this figure here is supposed to illustrate the difference Between what I would call a uni you need directional Scan of constrained minimizations and the way from propagation. So imagine if Sorry Imagine if you had a starting geometry that may be at this corner in the grid And you wanted to generate a grid of two-dimensional minimized structures You might pick a leading dimension and a trailing dimension in which you know in the leading dimension you optimize You optimize along these values keeping the other value constrained And then once you and then for every one of these valleys that you optimize then you then you start new Optimizations in the trailing that's what I that's what I'm referring to as Unidirectional scan whereas in this other way from pop propagation idea you start with an initial point You start optimizations at all of the nearest at the nearest neighbor grid points And then at the nearest neighbor grid points you repeat the cycle again And in this process of way from pop propagation You will end up starting new Optimizations at grid points where you already have minimized energies But because you have changed the initial conditions of the minimization You might pick up on new local minima and this in this way from propagation. You repeat it recursively until until you end up with a complete surface and the advantages of using the way from propagation is that Is that you end up in general with lower energy structures? It is a it is more robust in terms that in terms of if you have a starting structure you You you will you're guaranteed to end up with a certain potential surface Whereas in the unidirectional scan is going to depend on the scan direction that you choose as well as your choice of leading and trailing dimensions and If we are running these optimizations in a distributed manner, which Q3 archive is doing You may actually be able to achieve the way from propagation results in less wall time because because these optimizations are launched in in waves you can actually end up with a converged result with with with fewer sets of optimizations compared to the unidirectional case even though the total number of Larger okay the total number of optimizations in the way from propagation is in this case is four times the number of grid points Whereas in the left case, it's just the number of grid points So you pay a factor of four in terms of computational cost, but you get these benefits that I've listed on the right And here are some examples with a one-dimensional and two-dimensional torsion drives This is a modified version of the molecule that that Haya provided and we carried out a unique directional scan as well as As well as a torsion drive scan shown in your two panels here And the blue curves indicate the potential energy of the minimized structure and the orange curve indicate the number of Optimization steps needed to reach a minimum So don't really worry about the jaggedness of the orange curve That just shows you how many steps the algorithm needs to reach a minimum Okay, but what I would like you to pay attention to is the kind of asymmetric nature of The of the curve on the left and the reason for that is that as you are driving the torsion in in a chosen direction Your constrained energy minimum ends well Your your minimized structures get stuck in higher energy local minimum until for example You break you break some kind of Intramolecular non-bonded interaction and then now you're in a different local minimum And the shape of the curve is going to depend on the choice of direction Whereas in the torsion drive there really is no direction that you're choosing So I would argue that the quality of the result is better on the right-hand side. Okay, um, and um, hmm Um, and I'd also like to show you an example with a two-dimensional torsion drive So this um, so this code which was originally Written to only support two-dimensional rides can now support arbitrary number of dimensions So at least we can do one and two and some cases even go up to three and in the case of two You can first see that a two-dimensional drive contains richer information than a one than a pair of one-dimensional drives That's and it also shows you that if you perform this a uni directional Or I guess you could call this a bi directional scan in in a in geometric alone But you do end up with some of these Getting stuck in these high energy local minima indicated by the red regions here Or as if you use torsion drives wavefront propagation You you do spend a little you do spend a factor of four more in in terms of CPU time But you uncover the the local minima that were previously in right plus you end up with a more reproducible result so So I so I think that is So these so these tools are basically in place so assuming that you have the molecule and you have the torsion that you want to scan the integration of these of these four tools including the QC archive that Daniel will tell will later tell you about should a should be able to generate this data for you, you know using a Completely open source needs okay, um and um and now I now I hand off the mic to Haya who will Will tell you more about the molecular Hi, I'm hi stern. I'm a graduate student in John cadera's lab, and I will talk to you Okay, and I will talk to you about some of my work on fragmenting molecules and You know different aspects of the torsion drive pipeline So before we start fragmenting molecules and driving the torsions We want to enumerate protonation and tonomeric states of these Molecules now, why do we want to do that? first of all Most molecules exist in equilibrium of different protonation states and another reason is that different protonation states will change the The torsion profile of certain bonds, so it's important for us to enumerate it now Currently, I'm using open eye to enumerate these states, and it does introduce some unreasonable states and Because of the way the torsion profile Sorry because of the way the torsion pipeline is working we do do an AM 1 calculation So that does filter out many of the unreasonable states. It is a pretty expensive filter We are working with Marcus Vieter in a postdoc in our lab on a more efficient way of Generating reasonable polymer states Okay, now once we have the states we want to get torsion parameters for We want to fragment these molecules in such a way that They are that the torsions that we want to drive are computationally efficient. So we want fragments that have you know one two to three Rotatable bonds because we want to reduce computational court on cost and also the conformational distribution that these molecules have and we do want some overlap so we can capture the the You know the torsional and the configurational distribution of molecule Now what are some pitfalls when you try to fragment molecules? So I'm gonna walk through this example of this biphenyl to demonstrate What what we want to be careful about when we fragment the molecule. So in this biphenyl Molecule we're looking at the central rotatable bond and what I'm showing over here is a torsion scan of that central bond then as you can see looking at it. This is a rotatable bond and You know, you can it's fully rotatable now as you start as you take this molecule and generate different coordination states for it the the the The torsion profile of that bond changes drastically. So if you look at is there like a Way to point So if we look at the that's the neutral form You got I mean the torsion profile looks very similar to the one we saw in the last slide But then if you have The cat ion here you see that the barrier heights increase this barrier height decreases and as you And here you introduce an anion and this looks closer to a double bond or an aromatic bond as you and it's and as you go To the zwitter ion This is a totally aromatic bond and if we look at the vibrant If we look at the vibrant bond order, which we calculate using a m1 You see the vibrant onboard the vibrant bond order goes from something that's close to a single bond to 1.5 which is an aromatic Bond and the reason and here I'm just showing that the reason why there's with a ion here is You know has has a bond order of 1.5 is because it's actually conjugated. It's part of the conjugate extended conjugated system now most chemian from addicts tools if you're going to be cutting, you know Rotatable bonds it will not it will label this as a rotatable bond and you would think that you can That you can fragment that now here I'm so the The important point of that is that you can have changes you can have some situations Far away from the from the rotatable bond that you're looking at that can change the electronic property of the bond. Yes And on the previous slide, how are you choosing your QM functional for these calculations? So for this one I used B3 lip and Was it was I think Basis sets and so So currently the the the level of theory that we're using for QM We're basing it on the benchmark study that was done by the Genentech Scientists that they showed that you know B3 lip is actually pretty good I'm just wondering because in my very limited experience with quantum it seems like protonation states can also change like which function and best describes things and So I just something that I'm wondering about personally a lot and so I was wondering what you'd seen Thanks. What one additional question as well How are you handling things where you've got parts of the torsion space? Totally inaccessible like you can get certain systems where you rotate them. They'll react for example, right? I'm saying when you've got How do you handle torsions where you can't get a complete torsion profile all over time? You know you can get a reaction occur and and then you've got to be able to detect what that happened if you're gonna Automate this right so I'm currently in the in the pipeline. We have to end of workflow We have two different ways of running the torsion scan So one of it is doing the full rotation, but then we also do these, you know restrained scans where certain certain bonds if they they're like have a bond or above a certain amount We only like go like and we don't do like we don't use the torsion drive what that does like the waveform propagation We're just going up You know the barrier if I like, you know five to ten degrees in the case of rearrangements like at what you're concerned about also I think we're computing the vibrant bond orders after the calculations as well so that we can make sure that the bond graph is Preserved and we can then label those or filter those after the fact easy That's because I say you can be sure you're not going into complete Definitely, so I Calculate the bond orders and we and use those bond orders to get a chemical graph and then check if it matches the initial chemical graph Or that will also pick up protons that That you know migrate Thanks So here what I'm showing is I'm just so currently I'm working on the kindness inhibitor set to get started With this so I had fragmented them and then These are a little small, but so I'm just showing certain These are vibrant bond orders calculated for these fragments and I'm showing how different fragments will have You know different so this is this is you know some of the fragments of the satin and if you look at this bond Okay, so you know you got a bond order of 1.02 here and that's 1.17 now 1.02 is very close to You know single bond 1.17 from like the different Um torsion drives that I have done it's it's it would like it will look different Maybe the bond that maybe the like change in the bond or it doesn't look as drastic as what it does to the torsions And if we look at this one here, I thought this was interesting where um the larger fragment actually had a bond order that was Much different than than a smaller fragment and this this has to do with how You know Substitutions further away are either an electron donating an electron Withdrawing so depending on which substitutes you take away or add on that can change things further away. So What we're trying to do is have a fragmentation scheme that will give you Fragments that are small enough so that you are not That you're that that your torsion drives are not terribly expensive And they're still going to be expensive but that you know to reduce the computational cause on cause but at the same time We don't want to we don't want to you know obliterate the the chemistry that we're trying to Generate data for so these are the criterias that we want when we're fragmenting the molecules We want to have a central charitable bond We want all the substitutions right next to it because that will give us the immediate chemical environment But then we also want the correct resonance structure, which is basically we want the correct You know bond order the correct You know electronics in that bond And then we don't want to go up to like more than one or two or three like tough sort hateable bond For computational on feasibility and then you know some things we do not want to fragment We don't want a fragment ring systems certain functional groups like a list of functions that we don't want to fragment We don't want a Fragment extended pi electron systems and this is where the Vibeck bond order can help us out so currently we have I have an initial on fragmentation scheme that Where you take your molecule? Calculate the Vibeck bond order is using a long calculation and then using chemoinformatics tools finding the Rotatable bonds and then once you find the rotatable bonds you build around it and you know you keep the Rings and certain functional groups and now once you have those fragments you check the the bonds that are going to be fragmented now What's the Vibeck bond order on that? Right, and if it's above a certain threshold which that threshold is I'm still optimizing whether threshold should be You know we keep we keep that we keep that bond And you know you keep on doing that recursively until you can fragment your molecule Now so this algorithm I'm pretty Thank you. The Vibeck bond order will depend on the geometry probably pretty strongly So you do a minimization on the first step as well. That's a very good question And I definitely looked at that a lot So for many of the bond so for the bond orders the bond orders that are involved in conjugation That's where there'll be a lot of variance with with with the geometry for the bond orders that are not really involved in the conjugation It's actually pretty tight so So yeah, I mean we we do like a but again, it's it's AM1 So we it's we're not doing like a full QM geometry minimization because that would be too expensive But the assumption that I'm going on right now which you know Still has some limitations is that because it's the bond orders that are conjugated that have higher variance I should be able to pick that up without doing the geometry optimization Well somehow you have to define the structure for which you're calculating the point orders And that will be critical in that first step that you actually get a Mini you can minimize that the at the Yeah, of course, I use the the minimal structure like a Like a from from open eye Yeah, yeah, the lowest you might still want to do an AM1 AM1 on that before a minimization at the AM1 level. I think would be probably good Maybe Christopher Bailey can clarify this we're using his AM1 computed Vibrant bond orders, and I believe there is a geometry optimization perform Maybe can you pass the microphone over to Christopher who could comment on the methodology? Yeah, so Hi is looking at some she's really trying to generalize this Approach of using the wiper bond order to drive these kinds of decisions I think AM1 is very cheap and you can run it on the complete on the whole entire small large small molecule before Fragmentation, yeah, of course. Yeah, that's what I do it I do and you could even run it on several different geometries of that as well, so I think Well, if you're you you could do that But another thing you could do is if you just got the AM1 single points at the various different geometries Then you might be able to more quickly detect when you have this kind of variance a bond order Which flags the kind of bond that you don't want to break right which I had looked at and which Which basically showed me that if you're going to have a Bond order that you don't want to break it's yeah, that's where the variance is going to be Okay, so This the above fragmentation so we want to use the vibrant bond order for We want to we want to ensure two things one is we want to ensure that we're not breaking conjugated systems And another thing we want to use the vibrant bond order is that if we have a molecule If we have a bond that has That's highly conjugated. We want to be able to extend out around that central bond To the point where we don't lose that Right, so that's that's that's slightly different than just making sure looking at each rotatable bond that you're not Fragmenting the conjugated system. So um, this is still a work in progress. Um, so What what I do here is so I have my initial molecule. That's um, that's in it Where I have the calculated vibrant bond orders and then we did the initial fragmentation scheme and then we can again recalculate these vibrant bond orders on the fragments and Look how how much they change Right, so in this case, it actually changes pretty that's like 1.09 and that's 0.99 So that's something that I would want to avoid so then just randomly you add on different Different parts of it. Um until you arrive at the bond order that is, you know close within what within what the variants of these bond orders are and um, and that's how you find the fragments that Have similar torsional profiles as the parent molecule um, okay, so this is just a little bit of Of of statistics on the kind of fragments we get out using this scheme So here we're looking at the fragmentation of 43 FDA approved kinase inhibitors and Using the initial scheme. We have 295 fragments that we got from those 43 molecules So if we look at how many fragments each molecule Produces produces most of them are, you know, reasonable like, you know between likes No, that's that's the distribution of it. Um, now Within the set I didn't find that many overlapping fragments between the set And but this is the what the distribution of the heavy atoms in the fragments and the And the amount the number of rotatable bonds which um, you know in this case most of them have You know between one and three rotatable bonds. There are Very few that have four to five Rotatable bonds too. Now in this set over here. I did not expand the states. This was without expanding states. I just took the the the, you know, the neutral forms and Fragmented but then um, when I expanded the states, we arrive at, you know, around double the amount of fragments Um, but if we look at the amount of states that get generated We find that many of these fragments actually overlap with each other. So even though we're generating a whole bunch Of more states. We're not generating that we're only doubling the amount of fragments that we have to actually Drive the torsions for and and so and so Looking at it from the, you know, expanded states for con generic series We probably will have a lot more overlapping fragments. So the the The amount of computation that you would need by just adding more to the con generic series will not increase that much Um, given that we're going to be keeping all the data in the database and That data will be reused. Um, so this is just an overview of around how many torsion drives you need for a drug like molecule Using examples of a magnet and the satin nib Um, so here I'm showing the fragments that are shared among the magnet and the satin nib states And you know, as you can see with the magnet, you've got 16 states, but you only have 15 unique unique fragments and And then, you know, the 1d and the 2d torsion drives that we get so for the 2d torsion drives currently What I'm doing is I find the rotatable bonds and then just do, you know, combinatorial The the the 2d torsion scans because I want to make sure I'm catching I'm capturing all the correlations between the torsions. Um, there might be a more intelligent ways of doing it so that you don't have to do All that there might be ways to Reduce that but currently, um, on, you know, using a little bit brute force for this. Um Okay, I think is that no. Oh, okay. So now I'll move on to another topic Um, which so now that we are generating all these fragments and we run the torsion drives. Um, we need a way to, um Store the data and make it reusable for the entire community. So daniel smith will speak about the qc archive project. Um, that That ensures that but for the for the q for the database. However, we need a way to, um Index these molecules such that they are usable for both for the Open force field chemo informatics and the qm community So for that, um, I wrote c miles, which generates these indices For molecules in the qc database now The issues that c miles is trying to address is first of all, um, when you generate a Graph a chemical graph the nodes The the the indices on the nodes are arbitrary But for the qm calculations that you want to run your, you know, your xyz Um matrix cannot be arbitrary like it needs to needs to the order needs to be Needs to be the same every time such that you can find, you know, the matches between them or, you know That they're equivalent. So what we are doing here is we are generating smiles that have these tags And um, so these tags are the map so we so these tags are the maps the map indices on these On the molecules and these map indices correspond to the order in the xyz coordinates And they're also like in c miles. There are these, you know, utility tools that help you regenerate Help you reorder the geometry that you have in that order and like once, you know, if you have a new a new a new, um A new chemical graph it maps it onto the It helps you map it onto the geometry so that you can always recover the order that you initially Submit it to the database. So that makes it You know, that makes it easy to to recover molecules that you already have Another issue that we have is, you know, these indices need to be the same if we're going to be using them to search Right, but the problem is that you're most of you are aware that even though Different packages will call something canonical smiles. They're only canonical within the package And in some cases the package version so um so You know So to ensure that we always get the same indices for, you know, the data set that we're generating C miles pins will pin the toolkit versions and we will be distributing it as a docker image such that the versions are always pinned To the same version. So we're getting the same canonical smiles um, and another You know, since we were generating this tools We figured that we also want to have some standardized representation of all totemers and protomers of Of the molecule. Um, so see miles also does that on I would say it's It's it's really good to have here. It might not be absolutely crucial Right now for the project But it's it's it's a feature that can be very useful if you want to get all the if you want to Search the database in the future and get like all the protomers of acetic acid or But the problem with With a standardized representation of the totemers is that each one that I had looked at still has some limitations and none of them cover everything Um, there might be other indices that I'm not aware of that people can point me to but for what I've looked at You know, I mean, you know in key is supposed to standardize For totemers, but it there's certain times especially like the keto enol is one well known that it doesn't it doesn't capture that Articid also has a new standardization Um function, but again, it doesn't capture everything and open eye also now has a new standardization Function, but there are some also that it doesn't Like these iso indoles It doesn't it doesn't necessarily capture those um I think so, I mean currently we have all of these indices and c miles um And I'm again working with marcus to have something that's more robust than these Um, but and you know, it's it's um, I think it can be a useful feature in the future So now i'm gonna give it over to daniel Okay, yeah any questions Chem informatics is hard dudes All right, go ahead and introduce yourself great. Uh, so i'm daniel smith I am a software scientist at mulsey. Uh, so i'm actually not formally part of the open force field project I'm actually with a different organization But we have a really nice project called qc archive which synergizes very nicely with the requirements of the open force field Uh, so we've heard a lot about uh qc archive and like what it does So I actually wanted to walk people uh through a particular example So we could see exactly how it works what it does. Um, what are the limitations or the benefits of this kind of approach? Uh, so I should note that qc archive is much more low level than everything else we've done so far So everything is very high, you know, I want to for example, get a whole bunch of uh, Torigen energy surfaces. Well, how is it that we do this? How do we marshal tens of millions of cpu hours and make sure that we never repeat those cpu hours across this project? Uh, so this is after you fragmented a molecule, uh after you've done everything in turn including preparing its original states And I'm actually a wanting to do a single torsion drive on a single molecule Um, or more of a question of not how I only do one of these, but how do I do thousands? So at the very beginning, uh Fragmenter itself will actually say, okay, I finally have a full three dimensional molecule that I want to run a torsion drive on That will be submitted to a central server somewhere From one of our clients, which are python based These things are also purely rest interfaces. So if you interface them through uh javascript or something else, you're more than welcome to So once you have submitted a single quantum chemistry torsion scan It goes through a client which finally ends up on the server Uh, and when it ends up on the server the server first says have I ever seen this before? And if I've seen it before I immediately return it. If it's a new computation. I start up a torsion drive itself Since torsion drive, uh, has wavefront propagation. We're not able to immediately fragment this So torsion drive is in fact a service where a service is able to make very small and very cpu Lightweight decisions of exactly what should happen. Um, so in this case, uh, goes to torsion drive It says should we start a new wavefront propagation or be complete? Um, how many more computations? Uh, so usually torsion drives can say hey, I need uh, maybe 50 60 jump organizations. Um, I want you to go out distribute these Across not only one local cluster with many nodes, but maybe many local clusters with many nodes So in this fashion, we're able to aggregate not only a single cluster but multiple clusters together from multiple ps Or perhaps a very interested power user in the community who would like to contribute Uh, so this can go out to look cluster of supercomputers aws, you name it We hook into everything because these things are effectively embarrassing parallel You wind up wanting these compute clusters, which will spin up geometric Um, and in this particular case side four to actually execute the geometry optimization Uh, these results go through a serialization process. Um, go back to the server Uh, torsion drive is then asked If the result is complete or if we need to compute new results And then finally once this process has finished its iterations, uh, torsion drive will say I'm complete and it'll shut down And so the next time the user queries a server, they're able to get this entire torsion drive data back And so because this is a bit more asynchronous, um, we usually Wait for a a continuous request. So I need this piece of data. Um, do you have it? Can I give it back to you? Um, if not should I So this is obviously quite a large software stack that attempts this goal Uh, so we have a couple different pieces, uh throughout So the client interface that you might find on your laptop, um, probably underneath fragments or this actually going off wearing and asking for the compute It's called to be some portal. Uh, we have a central server, uh, which will host all of the data and be able to submit New computations called piece of fractal We actually use a variety of distributed workflow tools depending on your, uh, Supercomputing cluster or if it's AWS, um, not this not a one size fits all So we're actually able to implement and uh, delegate to any number of these Uh, then we actually go through a small program called qc engine and qc engine is kind of the heart of everything We're actually able to take a single representation and farm it out to different qm programs semi empirical or things like torsion if you want, you know, any force Uh, so we're actually able to run these workflows. Um, just changing out two lines, uh, in an input So if I want to run it with semi empirical or quantum mechanics, etc I'm actually very flexible in this particular regard And then of course, uh, we can always go back and we can do different, uh, services So if you, uh, if you don't want to use qc portal and its client If you want to have like a web interface or etc You can do a raw rest calls to the client. I'm sorry to the server to get this exact data and so really at the heart of all this is something that we call the quantum chemistry schema and Effectively, this is what allows us to go through all these serialization distribution processes Where we have a central schema, which does very short descriptions of quantum chemistry molecules And we're actually able to have many different back ends that give us the exact same result back And what's really nice about this is we're no longer writing ASCII text files We're no longer parsing ASCII text files We're going directly to the quantum chemistry codes. We're saying what are every single quantity that you have We're serializing that and giving it back So for example here, um, a lot of times you want just maybe like what is the energy of a b3lp model And that's usually great, but you know, what if you want to dig into a little bit? What if you want to go back and get say like the dipole moments the algebra poles the library bond orders Usually this uh, increasingly means that you have to parse this kind of awkward ASCII text file The schema goes around that meaning that we have a formal way of getting these objects back So there's no more parsing. There's no more breakage of Basically ASCII parsing, etc And so this is online now We're continuously expanding the capabilities of this and the number of codes that hook into the back So analogous to the schema is we have the quantum chemistry engine What this engine does is it takes the schema and applies a single program to it So in this case, I'm actually able to simply take this task I can run qc engine, which is a python program and get the same result back from say Cy4 qchem and nwchem In the exact same format. So there's no question of how do I parse this thing? How do I get it back? In addition, um, we can also hook into for example, uh, CME empirical codes if you want Currently we have 4chani if you want to run any one to see how well that does for your test set And we also have things like force fields. So we're actually able to run UFF is one of our first approximations that we use for testing Which is incredibly useful the whole stack instead of waiting for quantum mechanics to actually compute And so we find that, you know, this is three orders of magnitude faster, which allows us to develop ourselves for so much faster And so I actually wanted to go a little bit into the api itself and how a qc portal call would work So again, this is very low levels. This would actually be inside fragmentary in general But if you want to access this project directly, this is So first of all, you build yourself a client you connect to a website somewhere And so that website will usually be multi central server But if you want to have private servers as well, that's perfectly doable And the first thing you can do is you can say list all the Collections that you have a collection is very analogous to workflow except it's very static in nature And usually we'll give you data back in a very specific format to the client So in this case, we have the open force field workflow that we've been dealing with working with hyatt to create And within that it looks like we're dealing with the Kemper project And we are switching between side four and already get compute basically between testing and production There's also other things called data sets, which are different kinds of collections, which are much more I guess tabular in nature. So I have like, you know, a very large number of molecules And I want to compute a single method for them. So there's a lot of different types of collections that you can So once you look at the collections in this case, I want to open up the open ff workflow I get the Kemper Cypher data set back on the Kemper Cypher data sets about 15 gigabytes at the moment So obviously you don't want to pull all of this at the same time I'm going to say what you do is you pull a metadata an object that you can deal with in python I'm going to pull the data that you're really interested in And so for example, and like I said, this this interface is very specific to Fragmenter itself. And so in this particular case, whenever I create the open force field workflow I've already determined All the fragmenter options all the rd kit options and exactly how I want this Um, so once I have done that I can I can add new fragments by simply specifying What my initial molecule looks like in this case is going to be an ethane fragment And again the constant chemistry schema And it's going to go off submit it to the server and actually start the cascade compute To actually evaluate this in a single line of code. Uh, and so of course, uh in this particular, um test set I think we ran, um, perhaps like 134 torsion scans Which resulted in maybe 80 000 QM computation. So this is a single job out of hundreds that we can add to this And we can also pull these results that quite easily. Uh, so for example Here, uh, one of the very specific things that we want is we want, um, what is the torsion energy profile of this? so instead of having to look at Well, we have torsion drives inside this torsion drives or optimization runs inside this optimization runs your individual constant chemistry Instead of dealing with all that you can just say give me the final energies and I can plot this directly Um, and see what that energy portion profile Was for this particular job So I'm able to pull back not all the data, but individual pieces that data very easily. Um, so that I'm not Basically hugging huge bandwidth. Uh, and this is a couple kilobytes versus many gigabytes And I should note again that Within of this within this run, we actually have all the wipered bond orders already there So, uh, I think we're talking about, um, what would happen, uh, with if a hydrogen is moving Well, we have, um, exactly we can go back and pinpoint exactly when that hydrogen move where it sat What happened to it, um, via the bond orders. Um, so we have all that data that we can go back to back um, I should note too is that the, uh, Quantum chemistry archive project is, uh, not just, um, about torsion data. It's actually for all kinds of data Uh, so in this particular case, uh, we're doing torsions, but we also have bond angles and proppers, uh, within Uh, the open force build collaboration. Uh, we're also doing, uh, Let's just add a potential data. Um, not quite yet, but definitely very soon Um, I looks like this was a snapshot before I was quite done with this. So I'll say it's about that But the other points that I wanted to make real quick is what's nice about the software stack Is that if you want to run it on your laptop, you can do so Or if you want to run it in master distributed fashion, you can do so as well So a lot of times you might want to say, uh, I want to run, you know, a torsion drive with any one on my laptop And that's perfectly feasible with the competition resources available So, um, it's incredibly elastic in nature, uh, able to hold small projects all the way up to very large projects And everything's actually There's all kinds of other capabilities that I was going to list here But uh, basically any kind of quantum chemistry data that you want, um, we can compute it We can organize it in a fashion, um, that's useful for And that's the flexibility of the project to do it. Um, and I believe that's all I have If you'd like to talk to me more about this, please come and find me Questions on the qc archive part I think this is going to be a fantastic resource for the community and for especially for enabling machine learning All right, just a couple more slides before lunch. Um, so, uh, the last last thing. Oh, yes, please go ahead Where's that data going to sit? Sorry, currently he's going to sit at tac. Um, the tech advance computing center Um, yeah, and it should be open for anyone. So you just Anyone can pull from that central location. Thank you I should ask if there's any questions from zoom as well All right. Uh, so once all that data is is retrieved, uh, obviously it goes in the first generation into force balance to, um, parameterize things Uh, there's an ab initio target. I believe maybe actually maybe you can just walk us through this slide very briefly Sure. Okay. All right. So I'll uh, I'll I'll go through this a little bit quickly because the Because the final result of a torsion drive is a is a set of ab initio single point energy calculations It can be directly translated into the um into the ab initio target type so that force balance can fit force field parameters to reproduce these energies and optionally gradients the um So the automation of data from qc archive into force balance on that that part still that part still needs to be written but I think that um But I think that should be pretty straightforward because they were really designed to interact with each other um, and um, and this and this is already um, and so the use of torsion drive data to parameterize force fields has uh, um, Has has been done and I'm definitely Not the first right? There's just some examples where force balance has been used to do that. Um, the uh, these figures You've already seen from from the previous talk where Where where we were um where we parameterize force field, uh a force field to reproduce these torsional energy profiles for um for a protein force field on the left And we are currently in the middle of adding parameters for phosphorylated amino acids on the right. Um, so um um, I would like to point your attention Maybe a little bit closer to the to the scatter plot of the qm versus mm energies that that we have here and um, and and mainly I'd like to mainly I'd like to show you that in the That in the initial scatter plot you have a lot of um You have a lot of blue points that are below the diagonal line, which means that you have like You have confirmations where molecular mechanics is predicting a lower energy and quantum mechanics Which means that um, if you if you run a simulation using the initial parameters You'll get a wrong equilibrium structure And that is I think first and foremost the type of problem that reparameterization should correct So that is why all of the so that's why the confirmations and energies In the status that are not equally weighted. Um, we have larger weights for lower energy points And we also increase the penalty on confirmations where the molecular mechanics energy is lower than the quantum mechanics energy So that after a few optimization cycles, you see that the predictions of the force field are not just close to the diagonal line but mostly above um and um and and and lastly Even if you have a lot of data, that's not going to completely prevent your force field Into going somewhere far away of where it is no longer accurate. Okay, so um, um, so so so a good idea Is that um after you fit your parameters you perform additional molecular mechanics minimizations And then add this quantum mechanical data as extra targets. Um, and this is basically going to um This is going to basically root out and remove the appearance of spurious molecular mechanics minima That are far away from your quantum mechanics training data. Um, this wasn't my idea and so um And and then after doing this for a few cycles, if you no longer encounter spurious molecular mechanics minima then um Um, then what's some reasonable confidence you can you can say that But the parameters are at least pretty good for this degree of freedom. So that's how we plan to use this data in the You know in the short term. Great. Thanks so much. Leifing um, so we uh after feedback from the october meeting the virtual meeting We are working on a bespoke torsion fitting tool that will reuse many of the same components, but then run on your laptop or run on a um, uh local computing resources with the idea that for a free energy calculation For example, you might have a congenic series that you'd like to generate all the fragments for And parameterize very rapidly to refit high quality torsions. We're hiring somebody to lead this project And are working on that right now and it might be something we talk more about and get some more Feedback about your compute environments. We also love input on what compound sets We should prioritize for the first sprint of generating data and fitting for the first improvement of torsion So that might be a good afternoon discussion topic as well And with that I'd like to thank everybody all the folks who's who spoke and all the folks who have contributed Also, I want to thank the folks at Pfizer for a lot of conversations about the fragmentation Schemes that they had used which very much heavily influenced our fragmentation pipeline Um, and any questions. I'm happy to answer them either from zoom or from the audience here


Alright guys, we've got an all-timer today. Jackson State versus Bethune Cookman. We jump in. Jackson State, the Tigers are driving. They punch it in for six using the Wildcat formation against the Bethune Cookman Wildcats. There's a little salt in the wound there. They celebrate it. Extra point gets blocked. We'll find out if that matters later. It doesn't really, but we get some high fives. Jackson State's kind of dominating this game. We jump in. They're a cross midfield here. They could go up three scores. Pick six city. Bethune Cookman hadn't scored yet. Two and a half quarters. Down the sideline he goes.  That's actually huge for a football player because then you got that pretty mug out there. Let them know who did it. Football players don't get that a lot. He's got the lettuce to go with it too. Look at that hair. Here we go. Down the sideline again. My favorite part of this play. Watch the ball pop out. Defense events, snacks. Yeah, I scored. I scored.  Crowd loves it. They try to give him the sideline helmet. Doesn't fit his head. Here's what you're here for. Play action. Down the seam. Jackson State. Again, nice pass. Nice catch. They go up 15 to 7 at this point, but that's not what we're talking about. Watch the mascot. Just remember the mascot for now. Let's watch. Okay, big guy. He's got to lift you up. Yep. Now you go high five, high five, spin, meat hook, whirly bird, and then high five, high five. Yep. Okay, skirt. I like that. Anyways, let's get back to our tiger. He's just getting in the action here. It's like, okay, dude, did you play football? Do you know the guys? I'm sorry. I'm sorry. I'm sorry. Sorry. I got penalized. I'm dancing. Yeah. Turn it into a sexy dance when life gives you lemons, people. I got, sure, you got the penalty, but the camera's on you. You might as well dance. Anyways, later in this game, Bethune Cookman, again, who was getting shut out before the pick six, they take a fumble back down the sideline. They end up running away with this game 36 to 15. First time these two teams have played in 30 years. And how is this game going to be remembered as the tiger game? Watch him get in there again, gets the penalty, sets them back on the kickoff later on. Oh, I'm sorry. I'm sorry. I'm sorry. No, I'm dancing. Yeah.


Well, what I am going to talk about is adventures, dependencies and deployment management because this is perl. Perl5 is just a virtual machine. Cbat is the language and Cbat is a wonderful thing. Right up until you realise that you're now trying to maintain a compatible set of versions across a couple of hundred dependencies. ac mae'n fydd meddwl y benderfyn, ac mae'n mynd i'w ddweud y ddeddiadol y sgiliau awrthyr mwyfaswyllt a chaelothau, mae'r ddigon a rheiddiadolio'r filanhau ac erbyn. Dydaw i fynd i ffyrdd i 저. Mae'r ddigon yw'r automatic sylfaen o'r dyfwyllwch o'u syniadau. Mae'n ffrifoedd oedd, a'n mynd i'w ffrifio. Dyma'r ffin yw meddwl mewn bosibl, business to business email where various other stuff attach. So the initial approach to that was, well okay well don't worry about it. When I first got there, the mail service worked by you generated the master.house.wd file on the primary mail server and then clicked to reload the .dv files because it was BSDi. mor hwn yn rôl i ddim yn oed o'r cyfnodd o'r SDI-draeth. ym mwy o gweithio'r HDTP, D.com, a wnaeth y ddweud. Felly mae'n gweithio'n gweithio, ond mae'n gweithio, felly mae'n gweithio'n gwahanol gyda'r rhan o'r Llyfrgell. Felly, mae gennym dda chi'n gwirio'n gwirio, mae'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio'n gwirio. ac, ydych chi'n ymwneud hynny, rhaid i'n gweld y bod yn cyfrofiad gweithio mae'n dim yn uchiddio gyda erbyn. Diynau, rydych chi'n uchddio gydaえる cynllun y fferm ofail o'r ysgol yn y dwfond. Llyfridd i bwysig y fferm o unrhyw yn y Ffnerd Gwlad Gwlad Gwlad Gwlad Gwlad Gwlad Gwlad Gwlad. Yn gyfrofiad gyda fferm o unrhyw ffwrn i'r ffferm. Y patchy 1.3 gynhyrchu'r definitio virtual host by copying the struct for the entire server definition and then pokes in the virtual host settings. So your memory usage over having no virtual house basically increases linearly. If your manual slides, which will not overcommit memory, this means that when you're a patchy boot, it tries to allocate 4 gigabytes of swap all at once and the machine wedges for 45 minutes. This was not amazingly useful, let us say. So the solution to this was, ooh, what about this tilde foothan? So break out more of a rewrite because what could possibly go wrong and what you do is when you get a request for domain.com that's going to need to hit the CGI then, you rewrite it internally to slash tilde domain.com and then aliasdomain.com that's why we're a T.P user in our lab. And then the CGI is the one that's the right user. This was in production for several years and I'm not sure whether I'm proud or scared of it, probably both. One of the things that I got into at the time was a model of automation which, rather than having an update and delete, always work on the principle of ensuring revoke. So you're either saying this should be there in exactly this state or this should not be there at all. And working on that basis means basically you're trying to converge towards a correct configuration and ensuring revoke for both the model to be eigenpotent, which gives you a lot of freedom than revoke. But it requires carefully designed mental structure. And no, I do not consider that a patchy conflict to count as careful or designed, but I did figure it out in the last 48 hours before going live because my relevant systems team hadn't actually tested the web servers. Anyway, it took me several years to recover my faith in the existence of systems administrators that I actually like, but that's a different story. So I've been wondering for years about how do you generalise this stuff? And the answer is, it's sort of possible. If you look at things like CF engine for all its faults, it tries to converge towards a desired state. But then I got distracted because we're a consultancy. We get brought on project when a code base in a deployment is two or three years old, and it's basically... We made a complete mess of running to the point where we made enough money to be able to afford to fix it, please understand. So what you get is what you get. So the hostile environment has become interesting. So in order to be able to do anything useful, you need zero install bootstrap. Because nothing else is going to be said. And at this point you're going, but I want to be able to use Cpan. So, okay. Step zero towards being able to always use Cpan is local load, which was actually me throwing a tantrum after about the 12th person that we come freeload hash thumbs saying, I can't use Cpan, I'm not rude. You can install it to your directory. Here's how to configure Cpan.pn. No, that's not what I said. Here's how to configure Cpan.pn. No, not... I've actually got tired trying to explain it to people. Spent two days reading full chain source code and discovered that actually if you set these four environment variables, it all works. And that's local load. To be entirely honest, at the moment, local load with... there's a way to make sure that you always have the same versions you expect in there is not a bad least-worth solution available. There were a bunch of things wrong with it, but it exists and it works and the caveats are obvious. So, consider this to be a... Cartman annoys me because I know all of the things that can go wrong, but everything else annoys me more, which, you know, from a systems point of view is the closest to a recommendation you're ever going to get from anything, right? But, hang on, my continuing question. So, step one, at Fat Packer.  Basically, I know incredibly annoying trying to get single file versions of scripts. Par does not count. I can never talk anybody through configuring parser if it actually works. I had trouble configuring parser if it actually worked. So, alternative approach. Pull minus thing is correct. That gives you the same ink. So, OK, now you've got a list of modules loaded. That's not sufficient. Because distributions delay loan parts of themselves. I mean, even up until relatively recently, Carp did it. You had Carp.pn and Carp-slash-heavy.pn. So, if you had Carp.pn and Carp-slash-heavy, and if you only watched %ink, you ended up with one and not the other. And, lo and behold, nothing worked. So, well, distributions install were.catlist file. Yes, this does scream if you're using distro packages because distro packages go, we already have all our mechanisms for doing this.  Thank you very much, Darren String. Well, you can go from %ink, find the backlist for that file, generate a file list from that, and then you've got a complete list of files that you're going to need. A which point? Well, I mean, your first thought is, well, let's just bolt them on to the front of the script in the order that they're going to be required. But then, you know, again, the downloading problem, depending on what code parts you're going to find, you're going to need hot files in different orders. So, instead, what we do is you create a hash of here documents that embeds all of the code, and then you stick a code graph in a dink. And your code graph, there should be a backslash on the front of that because what it's doing is opening a scalar graph from the file handle to it, a which point, when you require a through-slash-bar.pn, it gets the content of the here document. A which point, all I have to do is bolt the code graph and the hash onto the front of the script, and you have a complete self-contained script.  Because me and Gaw had his own code for it, and then went, hey, if I use maths, I don't have to maintain mine anymore and switch.  So that gets me as far as anything pure, fixed set of dependencies I can bootstrap. That's nice. Doesn't work for access, but generally, excess is either an optimisation rebinding to a C library. If you need a binding to a C library, you already have the problem of getting the C library back. So it turns out not to be that big, it is. Has resulted in re-besyncing myself and a few other people maintaining pure pool versions of disks that would otherwise be only access. And the pool is actually scarier than the C code, but it works. And it's still much less painful than part. So, coming back to it, you still need a dependency train to feed in. The packlist approach is fine, but it broke false, and it provides that you already installed the dependencies. And the thing that aggravates me is every single set of tooling on the planet seems to rely on the gold version. You either have, I mean, you either have getLatestFromSeaPan or get whatever the versions in the Debian repository are. Or, OK, can't really get whatever versions are in my carton.wok file, which at least gives you pure application but it's still not that interesting. And then you start exploring why it's like this. And I came across a fascinating thing, the Paul Graves tube algorithm which is in, I think, chapter 14 of our list. Even if you don't write common list one, we recommend to schedule the book because it's got some fascinating ideas in it. And you run into this problem. OK, X needs greater than 1.1 of that. So you go, what's the latest version? 1.12 of that. And then Y needs greater than 1.1. Oh, well, that's fine. And then you find out that there's a bug in 1.1.12 that makes Y not work. But you already allocated 1.1.12 for X so you need to get a backtrack. Right? And the choose algorithm does this by basically faking up continuations in common list. Which is not an unreasonable way of doing that. But I thought it would be more fun to have a list with continuations so I didn't have to do that. So, there is an experimental list called kernel. Yes, K, E, R, N, E, L.  Yes, I'm sorry. But kernel is what's known as an operative list. The fascinating thing about an operative list is that you don't get handy evaluated arguments. What you get handy instead is the expressions for your arguments and the lexical environment in which you can evaluate them if you want to. So you effectively get the full power of list macros at one time as well as compile time. This is very cool and very good fun. And very useful for prototype it. Hence why when I discovered somebody who equaled them to the fairly simple version of it to Perl. And then demonstrated that you can actually my job as scripting Perl if you so decide. What's going on there, by the way, is creates a derived environment for the evaluation and binds in the name and I think E, P is the original environment and then pushed to the evaluation section. Doesn't matter. What you can write with that, oh yes, because I'm strange I've used JSONi, which is basically JSON without the syntax that E and I came up with as the syntax for those because it saved me writing an asex for a person. So you can build something like this because it's an operative system those symbols for being the R, the E are actually names they're not evaluated through to values. So you can basically rewrite this into something that passes an environment then step by step. And the thing is if you're passing an environment then step by step you can capture a continuation. You can capture a continuation what you do is to E is short for execution environment when you're inside dependency solving you're always trying to produce a working execution environment and typing that out. No, if I wanted to be that for those I'd write Java. So the idea is you try to see if there's already a clash. If you have a clash then you merge it with the current you merge the requirements with the current choice which gets you to then resolve to the correct 1.11 instead of the bogey 12 and clash restart is invoking a delimited continuation that jumps you back up to the point in the algorithm where you made the incorrect choice. At which point the code continues on as if it made the right choice in the first place. If you're in a fresh if you're in a fresh choice situation with restart corrects the continuation and then with build choice is actually calling back through to an embedded pull object but updates the collection for the execution environment because I wasn't doing the entire data structure stuff in less boring. So that works. As it's traditional with operative lists however because of the fact that they let you do everything at runtime they have to do everything at runtime this does not perform particularly well. You can watch the CPU make for about a second every time in backtracks. So I consider this to be an interesting point of concept but not particularly useful. Of course there's bonus fun here as well because of course meta.json is not normative. The requirements in there are guaranteed to be probably sort of something kind of like the final requirement but if you rely on them for anything except generating an informational web page you are screwed because dependencies will vary depending on operating system, per version and so on so you have to have my matter which means your dependencies depend on the configuring part of it means the only way to do this is to actually have a build system baked into the dependency resolver. So I went through the cfam.presources they actually managed to patch it to the point more emotively than what I wanted but cfam.presources is very much oriented around having a queue of things to build and if you're in this situation I've got basically a tree right? Cfam plus nicer architecture in a lot of ways but it insists on recursing internally which works fine with a tree but then it's fundamentally not parallelizable and very hard to control so okay well there is a third option and then Mia Garry decided that supporting plugins for cfam miners was too much work deleted the entire plugin interface and declared it a black box so that stopped being an option there I had to say my current conclusion to that is nooks to out, I'll deal with that when everything else works so in the meantime this is over the course of like several years I ended up with this fascinating problem we had a customer whose infrastructure was a bunch of random amazon web services ECG machines deployed by a sole developer who could not see that means way out of a paper bag who was no longer with the company so they had no idea what their production platform was actually running a which point I'm in a situation where I want to be able to run lots of different brands having the fatpack every time it's just going to get too much like hard work right? fatpack is fine for one script you're going to run lots of times and play work beautifully for cfam miners but it's not so good for ad hoc systems too effectively what I want is automatic fatpack but I don't want to have to think about it how do I end up not thinking about it? I want to think called object remote object remote you can say new call on call on what that does is actually dispatches to the method on in the namespace new at which point object remote takes over opens up a connection to the remote host and you get a proxy back so what it actually does is that ssh is to the host runs pull dash at which point pull is waiting for the script on stdini so at that point you shut your fatpack version of yourself across the wire and then send it on the score on the score n because n sends to pull script is done you can stop arzing now at which point it gives me spin in back so I can reuse spin in and stdiniow as my communications channel so at that point we go okay we do that door is a proxy object it has an auto-load method it takes the method thing and it's got a reference to the connection internally collapses all of the arguments to JSON shifts them over the wire to the other end all based around Paul Evans' future.pm which is if you're trying to do aced event driven code look at IOAsync IOAsync with futures is so much less painful than any other approach um so it creates a future assigns an idea to it sends the method call and the future idea at which point the other end can turn for as long as it lights and then sends the line of JSON back with the results of the computation so you can run these multiply and power up but if you're only doing something simple then I'm not going to wait to also routine that basically goes block until this is done um that of course has to be backed by a spin loop the thing is because I'm trying to hide the async stuff under the hood when you're not caring about async it has to be a re-entrant spin loop that's when it gets fun because what you have to do basically is create a list that you're waiting for um and then only when the top future um on the stack is finished at that point you can stop loop um you can't just go over another one because the point is it has you know if you have loop waiting loop waiting inside that loop waiting inside that this one has to return first so you do so which is why you need the local and that makes it operate successfully re-entrant way um we we managed to break this quite hard um doing massively power up under there at one point um the current version actually works um and then you can just return the value from the future all fine um so the goal of all of this is now I'm putting an object in that because you know having an object and a code in that ink is just fun right doing that you can then have a hook object you have to fully qualify the method now because ink is a special symbol in Perl if it sees it on its own it's always forced into package mail even if it's sub-ink um so a which point you ask for some code and then do the open file handle to it and then sort it question now is where do we get the code from we get the code by making an object a remote call back to the host because we're re-entrant and the protocol's too bad a which one the host scans through its ink and if it finds the file ships the source code across which means that I can create any pure module that's installed on the master host that I'm SSHing from and if it's installed on all of the remote systems which means all I need is code 581 plus um and an SSH connection to any of these machines um and I can then whenever problems I want to and manage to gather data and pull it back to an operations box to figure out what's going on um so at that point you put things like using endless packages processes, net stat, information um um the first week live was a huge success um we found two missing services the production was dependent on that were not documented anywhere and one bomb at hahahaha hahahaha hmm hahahaha hmm The Bobnet is now gone happily. We still track things like process lists, package lists to make sure everything's kept in sync across all of the machines, so if any of the system's automation tuning that's updating stuff has a bad name it doesn't do the right thing. The Interestaction Code, which is completely independent, pick it up and tell us it went wrong. Anyway, so, go back to the choose algorithm. Choose was inspired by Prolog. Prolog is interesting. The thing about Prolog is it's all about predicates. It's a logic programming language which is close to that to a tip and not quite. Prolog is a beautiful design in that it's just procedural enough that you can work out what it's doing as opposed to most sort of sacks old that's in the similar where they're a black box, you feed it to the input and you either get an output or nothing. But the thing about Prolog is, apparently why that can be interpreted in multiple words, so if you run it with server then to a value, but package friendly, that will return one per package installed on the server, so package list for a server. You run the same thing with package bound, but not server. You get a list of all servers that package is installed, but with both nodes you get sure or false is this installed on this machine. So that model will look kind of interesting because of the idea of expressing truth so you can basically talk about is this my desired state and what is the current state. Prolog does have a kind of odd syntax in one respect. I'm saying odd syntax from the point of view of being a phone programmer, right? So obviously I want to be able to build something that's a reasonable, decorative interface that's happening to work with and 1970s French logic programming is probably not the optimal new eyes.  Fina, TCL is awesome because it basically makes and made out of strings. The point of which I realised I was going to like TCL was the point of which I got half an hour into using it. I got annoyed that it didn't have an unless keyword and managed to input it more in pure TCL in about 20 minutes because TCL basically braces in TCL are a single quote character. So what happens is the body just gets passed through as an argument to your subrative. So you mud the test and either read part of the body or don't. I mean under the hood once you've treated a particular string as code it caches the code representation so it's not the horribly swell it sounds like. But that basically allows you to met a program using strings. It's actually quite a fun language descriptive. I found myself more and more breaking out TCL for simple things simply because while I could write it in perl I spent so much time doing live scale object-oriented applications perl. It's quite hard to shift my brain to do good scripting perl whereas if I switch to a different language I'm not quite as incompetent. Anyway, so I had this idea of basically a problem used by a solar. So the idea of a fact is that you express things by saying okay an environment satisfies a requirement if there exists some build such that that build can satisfy the requirement and the build is available in the environment. So you basically think this allows you to do the two-step resolution because it's this road-packaging event where you work on a package name and you've got a C-pound that has a requirement independent of distribution so you need the difference. And then transitive dependencies become relatively easy to handle because all you have to do is say for each transitive requirement basically what the prologue system will do is it will recur the small possibilities of the requirement of and then recur store looking to satisfy them. At which point you get the world forwards down the dependency trade branch and because the prologue is logic programming the backtracking concept is already built in so the whole old action which was bad I need to go back is just a property of the language. Okay, so the end result from a prologue is you either get here is a set of values for which your original request was true or it says no. That's insufficient. The software I'm working on could also respond with maybe. This is systems, the answer's always made, right? More precisely it's not so much false as false but the idea being this is currently false but if you take these actions it will be true. So for example if the package installed on the server your choice of your responses are either going to be true or false but if I install it then it will be true. So you can actually produce possible solutions so what you effectively get out is not just a set of values but possibly a list of actions to be taken to make those values valid. Going from that you then end up with the values for the result but a projected result after the actions are taken. So if you say do I have a patchy on this machine it's going to say the answer will be yes after I get that install patchy. The problem you then get into is how to model that because you obviously don't want this thing going away and starting installing things when you're just checking. Well what's the obvious place to deal with state management? Let's steal some ideas from Haskell because the basic principle of a model is that you have a world state and so you say the new world is the result of applying some function to the old world and that allows you to interleave state through without compromising functional purity. In this case what we need to do is basically make sure the system always backs on to a view of the world we control. A wet point we can model actions as expected new world is the result of applying the function. So it says if I want that to install a patchy I expect the world to be the same except the patchy will be installed on this machine. And then after if you actually tell it to do it it can go back and reject. So the idea is you basically solve, run, re-solve each time you get a list of actions some of them are dependent on others. Like if you're creating a file in a directory and the directory isn't there yet. The file creation action is dependent on the directory so you have to run the directory creation and then you loop back through. This is meant to be a sys admin tool, I'm not having it trust itself, I know who wrote that code because me, that's not good. So you basically keep re-munning the solver until you end up with the last admin action. So in order to test this out I wrote myself an SSH key manager. So you basically describe rules. This is actually a copy and paste from running code. So .ssh on account it finds the home directory, it declares that a directory should exist in it called .ssh and declares them up. Right, um, whom they're on? Okay, whom they're on is that's a random remote again. Well, I already solved that one. All I have to do is write something that works locally and then ship it across the wire with object remote. The other key trick is the VM form of this is pure continuation housing style. So the state of the computation at any point is always encapsulated in a continuation. That then means that rather than prologs traditionally use a thing called the choice point which basically records how to go back a variable assignment. If you don't mind burning some RAM and in this sort of situation memory is not a great experience. It's a lot easier to just carry a version of the world with the modifications or where you applied. But again that fits in nicely with the Manado style. The other trick is that means that when you get halfway through and find you don't have a piece of information you can invoke a wonderful thing called return multi-level. Basically, if you've only used exceptions for flow control return multi-level is like that except not horrible. Return multi-level takes advantage of the fact that perl labels are dynamically sculpt. Gensins are the label name, stashes that away by the code graph and then basically to the point of the return multi-level. If your full function constate when you invoke that code graph it doesn't go to that label. Because the label is dynamically sculpt it always finds the right one. Fiddles with the return value returns from the original spot. So from four layers deep inside the solver I can basically do return to top. Here's the continuation. Here's the thing you need to run that affects the world before the continuation will be run. So that then gives you the ability to basically break out of the solver loop and be able to do multiple parallel actions and then go back into solver. So you never have your set of values and actions. So initially that's going to return a create direct reaction if the SSH isn't there. If it's there but the permission is wrong you'll get a turn off direct reaction. Because it always has to return the actions to the top label you can always see what it's going to do before it does it. So then authorised keys becomes a fairly similar thing and I can say is a key installed on this? Does the authorised keys file exist? Does it contain the right lock? But at the same time that code not only represents testing if the key is installed but because there are compensation actions attached to if any of those fail it can produce the actions for make, directory and byte file. So you effectively get SSH copy ID style of behaviour built in. The phone bar is that I can build the configuration out of the same thing. Just say find me the appropriate comfort file, what lines are in the comfort file. So you don't know not the system with three modes. Query which is pure true fault. Sol which is allowed to go fault but. And ensure which is going back to my original thing which is basically to figure out the actions to take to make this correct. Run the actions and then double check it all actually worked. So at that point you basically go to test all of the SSH keys installed on a remote machine. You just write in that and no key key meets for the local file. Built on top of this one set of rules I have status which just reports all keys installed. Sync which goes and installs whatever keys are missing from whatever machines they are missing from. But notably because of the action model I don't sync minus M. I'll make minus M. The system can always produce a driver which is something that really annoys me about a lot of tools. I really hate it when I tweak a comfort file and the only way to figure out if it's going to deploy the byte file is to run a test deployment on a staging machine. That's kind of slow. I want to figure out that I've screwed up much quicker than that, thank you. So sync is pretty much literally solved for all keys installed. Well minus M is and then you switch it over to ensure to actually do the work. Which brings us back to this. So at this point the idea of a build that can satisfy a requirement might be a pre-existing binary build or we might have to go away and build one. Transitive requirement problem at that tracking is already built in and the result is going to be to install an existing package or install the result of building a package and because things are just actions that each have the projected result of the package is available none of the rest of the logic needs to care about the fact that you're supporting source and binary building power. Which I'm hoping is going to allow me to have multiple additional sources for builds like saying there's already a package in a deviant repository and you've rather used that. Advocating to install that package is just a different action that makes the information available. So the current state of this is the DCL-BSL works. The CDS solar core is not showing me much of that because I really, really, really, really want to rewrite it once more before the rest of the world looks at the code. But they basically work. What remains comes into the simple matter of programming category. If you want to have a look, that's a timing I know. Dkit.get on git.shadowcap.co.uk has my current working progress including the key manager. I am actually using the key manager because I figured the sooner I started dogfooding the better things would be. Hopefully that contains some interesting ideas and next year I will have something actually deployed. Thank you very much. Given that I believe we are out of time as I propose to do questions in the form of I am going to go through into the canteen and sit down with a coffee, but if you want to ask me things, please feel free.


We're back with another big game ad update. Toyota is returning after sitting last year out. Mikko at Ultra released the teaser featuring soccer star Leonel Messi and our favorite coach Jason Sudeikis. E-Trade is bringing back their E-Trade baby mascot. The NFL is promoting their global markets program and initiative to spread the game of football around the world. Lin is uncovering meaningful connections with its big game debut. Budweiser is bringing back their signature Clydesdales for their 46 Super Bowl appearance. Bud Light, the official beer sponsor of the NFL is introducing a new character to the Bud Light universe. Elf Cosmetics released a teaser featuring a slew of celebrities in Jury Beauty. Uber Eats dropped a teaser featuring celebrity power couple David and Victoria Beckham.  But MGM, Budweiser, Etsy, Hellman's, Lin and Orioles released their final spots which you can watch on adweek.com right now. Who will be the big winner of Super Bowl 58? My money is on Taylor Swift. We'll continue to keep you updated with all things ad related because when it comes to the Super Bowl, adweek is the real MVP.


Goal 13 of the Sustainable Development Goals – Climate Action How are greenhouse gases emitted and how are they produced by humans? Meet Joshua Lately Joshua's truck has been giving him troubles so he decides to inquire about a new one from a salesman at a car dealership. The salesman tells him they no longer carry trucks because they are trying to cut back on greenhouse gas emissions. He further explains that greenhouse gases are primarily emitted by burning fossil fuels like coal, oil, and natural gases. Greenhouse gases trap heat in the atmosphere and make the planet hotter. In fact, they are formed in many ways. Producing electricity and raising cattle also adds to the high levels of greenhouse gases in the atmosphere. This increased heat can have negative effects on vegetation and natural disasters. Josh decides he doesn't want to get a truck anymore and wants to help reduce the emission of greenhouse gases instead. Josh buys an electric car to lessen greenhouse gas pollution. He also decides to start walking instead of driving whenever possible and encourages his friends and family members to do so too. It's never too late to make a difference. No matter the size of the contribution, every little bit helps to make our planet safer.


In the early 1800s, the Bell family moved from North Carolina to the Red River in Tennessee and built themselves a farm on over 1,000 acres of land. It was 1817 when a string of bizarre occurrences gave birth to the infamous urban legend known as the Bell Witch. John Bell, the patriarch of the family, first spotted supernatural signs in the shape of a strange dog-like creature in his cornfield. Some in the local community stated that the spirit was that of the Bell Witch, a woman who'd been buried on the Bell farm, it had been disturbed when they moved there. In December of 1820, John Bell mysteriously passed away, supposedly at the hand of the Bell Witch. His cause of death was never determined and he simply dropped dead. Then, just as mysteriously as the Bell Witch had appeared, she disappeared and only paranormal stories remained in her place. The family were finally freed of the curse and some still say the scary urban legends are mostly true.


Mav Admin that was just released discusses a few changes in the PFA and the PRT program overall. The most important that's critical for them is the time difference between when you are weighed in or get your measurements to the day that you have to execute the physical portion. But it gives that command fitness leader more time to appropriately get everybody in line, maybe go by department, weigh in, measure and then can line up when that department division or command is going to do a swim, a run and so forth. So this 45 day increase actually helps everyone all the way around the program, the sailor, the leaders of the program and so forth so it's a great change. It is suicide prevention awareness month but 365 days a year we're bystanders and we're intervening sometimes with just a handshake or a, hey let me get you a cup of coffee and sometimes that's all another person needs. This month is where we open up and discuss it so that we get others to open up and freely discuss it. So with mental health it is not a stigma. I hear that a lot that whether it's a stigma with mental health and with asking for help or recognizing that you need help. I would offer to you that this is 2013 enough with the stigma. Why am I doing a deployment health survey? Why do I have to do a pre-deployment? Why do I have to do a post-deployment and a post-deployment reassessment and so forth? I'm so tired of filling out these forms and yada yada yada. Well you know a lot of great people paid with their lives in order for us to learn that we need to do these kinds of forms so that we can make an assessment to ourselves and that our medical providers can help assess where we're at in our mental health as well as our physical health. Don't wait for things to happen to you. Make them happen for you.