Okay. So welcome to module 2 of course 2. Jimmy, what's happening in the story? Chao Zhao is getting stronger and stronger, and he finally defeated Yuan Shao in the famous Guandu battle. Then New Bay, and Guan Yu, and Zhang Fei they had to move to the Jing Province. After Chao Zhao has colonized all the provinces in the northern part, and he's moving to the South. He's aiming at New Bays, new city, Singia. All right. So technically, we introduced a very important concept here which is the notion of predicates. So predicates allow us to encapsulate some constraints, and give them a name so we can use them multiple times in the same model or indifferent models. So there is very similar to procedures and functions in conventional programming languages. Absolutely. We see that we also have a new construct called read in, that allow us to define new local variables. So local we can add a local variable anytime and this is very valuable if we want to introduce a common sub-expression which we're about to use a few times. We can just introduce a local variable to capture that. So local variables a very important thing for helping to modularize and simplify our models. Local variables are not visible anywhere else in the model, right? Right. So local variable only exists in the context where it was defined and not elsewhere. So it's nice to have new constructs, but I understand that we should be also very careful when using them. So absolutely, we're going to see, understand the versions of contexts that we have to understand the contexts of where sub-expressions in our model appear, and the first difference is root contexts. So these are things which basically appear in conjunction. That's really the only place we can use global constraints, is in a root context because otherwise we are using a reified constraints and they're not as efficient as the actual original global constraints. Okay. We also have to understand positive, negative, and mixed contexts. We understand that uninitialized local variables can only be used in positive context. Yes. This is because our solvers really only take a conjunction of constraints all existentially quantified, that's all that they can solve. When we try to introduce a local variable in a negative or a mixed contexts, we're really asking for a universally quantified variable. That's actually really just beyond the capability of our solvers. So that's an important restriction to understand. Okay. We also encountered for the first time a multiple objective optimization problem. Yeah. So when we have multiple objectives, we basically need to be able to combine those into a single one where we force the first one to be more important than the later one. Okay. The application that we've seen in this module is on banquet seating planning, which I think would be very useful for many of you. Absolutely, banquet seating planning is actually a discrete optimization problem which many of us were going to face at least one or two times in our life, to build a complicated seating plan arrangement. All right. If we move on to the workshop and the assignment, there are nicely paired workshop and assignment. These are very similar problems. They're both planning style problems where we are planning a number of actions in order to cause something to happen. So this is in fact to cause Chao Zhao's plan to weigh an elephant to be brought to fruition. In the first step in the workshop, we're moving the elephant onto the boat. In the assignment, we're moving stones onto the boat in order to get the same weight as the elephant. So I think the assignment and the workshop they are getting harder and harder. Well, that's as we go through the course, we would expect that our assignments and workshops will be more and more challenging. Okay, we'll see you at the end of next module.