import%20marimo%0A%0A__generated_with%20%3D%20%220.12.6%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20random%0A%20%20%20%20from%20typing%20import%20Self%0A%20%20%20%20import%20pydantic%0A%20%20%20%20from%20ortools.sat.python%20import%20cp_model%0A%20%20%20%20import%20didppy%0A%20%20%20%20return%20Self%2C%20cp_model%2C%20didppy%2C%20pydantic%2C%20random%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20%E3%82%BF%E3%83%AC%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E5%95%8F%E9%A1%8C%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%E6%98%A0%E7%94%BB%E3%81%AE%E5%90%84%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%92%E6%92%AE%E5%BD%B1%E3%81%99%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%E5%90%84%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AB%E3%81%AF%E5%87%BA%E6%BC%94%E3%81%99%E3%82%8B%E5%BD%B9%E8%80%85%E3%81%8C%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%8A%E3%82%8A%2C%20%0A%20%20%20%20%20%20%20%20%E5%90%8C%E3%81%98%E5%BD%B9%E8%80%85%E3%81%8C%E5%87%BA%E6%BC%94%E3%81%99%E3%82%8B%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AF%E5%90%8C%E6%99%82%E3%81%AB%E6%92%AE%E5%BD%B1%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84.%20%0A%20%20%20%20%20%20%20%20%E5%90%84%E5%BD%B9%E8%80%85%E3%81%AB%E3%81%AF%E5%88%9D%E5%9B%9E%E6%92%AE%E5%BD%B1%E6%97%A5%E3%81%8B%E3%82%89%E6%9C%80%E7%B5%82%E6%92%AE%E5%BD%B1%E6%97%A5%E3%81%BE%E3%81%A7%E3%81%AE%E6%97%A5%E6%95%B0%E5%88%86%E3%81%AE%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%92%E6%94%AF%E6%89%95%E3%82%8F%E3%81%AD%E3%81%B0%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84.%20%0A%20%20%20%20%20%20%20%20%E9%96%93%E3%81%AB%E6%92%AE%E5%BD%B1%E3%81%AE%E7%84%A1%E3%81%84%E6%97%A5%E3%81%8C%E3%81%82%E3%81%A3%E3%81%A6%E3%82%82%E3%81%9D%E3%81%AE%E6%97%A5%E3%81%AE%E5%A0%B1%E9%85%AC%E3%82%82%E6%94%AF%E6%89%95%E3%82%8F%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%E3%81%93%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%A7%E3%81%AF%E6%94%AF%E6%89%95%E3%81%86%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%99%E3%82%8B.%0A%0A%20%20%20%20%20%20%20%20-%20%24S%20%3D%20%5C%7B%201%2C%20%5Cdots%2C%20n%20%5C%7D%24%3A%20%E6%92%AE%E5%BD%B1%E3%82%B7%E3%83%BC%E3%83%B3%0A%20%20%20%20%20%20%20%20-%20%24A%20%3D%20%5C%7B%201%2C%20%5Cdots%2C%20m%20%5C%7D%24%3A%20%E5%BD%B9%E8%80%85%0A%20%20%20%20%20%20%20%20-%20%24A_s%20%5Csubset%20A%20%5Cspace%20(%5Cforall%20s%20%5Cin%20S)%24%3A%20%E3%82%B7%E3%83%BC%E3%83%B3%20%24s%24%20%E3%82%92%E6%92%AE%E3%82%8B%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E5%BD%B9%E8%80%85%0A%20%20%20%20%20%20%20%20-%20%24d_s%20%5Cin%20%5Cmathbb%7BN%7D%20%5Cspace%20(%5Cforall%20s%20%5Cin%20S)%24%3A%20%E3%82%B7%E3%83%BC%E3%83%B3%20%24s%24%20%E3%82%92%E6%92%AE%E3%82%8B%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E6%97%A5%E6%95%B0%0A%20%20%20%20%20%20%20%20-%20%24c_a%20%5Cin%20%5Cmathbb%7BN%7D%20%5Cspace%20(%5Cforall%20a%20%5Cin%20A)%24%3A%20%E5%BD%B9%E8%80%85%20%24a%24%20%E3%82%92%201%20%E6%97%A5%E6%8B%98%E6%9D%9F%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%82%AE%E3%83%A3%E3%83%A9%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E5%AE%9F%E8%A3%85%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Self%2C%20pydantic%2C%20random)%3A%0A%20%20%20%20class%20Actor(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%20%20%20%20%20%20%20%20id%3A%20int%0A%20%20%20%20%20%20%20%20cost%3A%20int%0A%0A%20%20%20%20class%20Scene(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%20%20%20%20%20%20%20%20id%3A%20int%0A%20%20%20%20%20%20%20%20time%3A%20int%0A%20%20%20%20%20%20%20%20actors%3A%20set%5Bint%5D%0A%0A%20%20%20%20class%20Condition(pydantic.BaseModel)%3A%0A%20%20%20%20%20%20%20%20model_config%20%3D%20pydantic.ConfigDict(frozen%3DTrue)%0A%20%20%20%20%20%20%20%20actors%3A%20list%5BActor%5D%0A%20%20%20%20%20%20%20%20scenes%3A%20list%5BScene%5D%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20example(n_scene%3A%20int%2C%20n_actor%3A%20int)%20-%3E%20Self%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20random.seed(0)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20actors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Actor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20id%3Di%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cost%3Drandom.randint(1%2C%205)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n_actor)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20scenes%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Scene(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20id%3Dj%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time%3Drandom.randint(1%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20actors%3Drandom.sample(list(range(n_actor))%2C%20random.randint(2%2C%20n_actor))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(n_scene)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Condition(actors%3Dactors%2C%20scenes%3Dscenes)%0A%20%20%20%20return%20Actor%2C%20Condition%2C%20Scene%0A%0A%0A%40app.cell%0Adef%20_(Actor%2C%20Condition%2C%20Scene)%3A%0A%20%20%20%20%23%20Toy%20problem%20from%20https%3A%2F%2Fgithub.com%2Fdomain-independent-dp%2Fdidp-rs%2Fblob%2Fmain%2Fdidppy%2Fexamples%2Ftalent-scheduling.ipynb%0A%0A%20%20%20%20_n%20%3D%204%0A%20%20%20%20_m%20%3D%204%0A%0A%20%20%20%20_actors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20Actor(id%3D0%2C%20cost%3D1)%2C%0A%20%20%20%20%20%20%20%20Actor(id%3D1%2C%20cost%3D3)%2C%0A%20%20%20%20%20%20%20%20Actor(id%3D2%2C%20cost%3D1)%2C%0A%20%20%20%20%20%20%20%20Actor(id%3D3%2C%20cost%3D2)%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20_scenes%20%3D%20%5B%0A%20%20%20%20%20%20%20%20Scene(id%3D0%2C%20time%3D1%2C%20actors%3D%7B0%2C%201%2C%203%7D)%2C%0A%20%20%20%20%20%20%20%20Scene(id%3D1%2C%20time%3D1%2C%20actors%3D%7B1%2C%202%7D)%2C%0A%20%20%20%20%20%20%20%20Scene(id%3D2%2C%20time%3D1%2C%20actors%3D%7B0%2C%202%2C%203%7D)%2C%0A%20%20%20%20%20%20%20%20Scene(id%3D3%2C%20time%3D1%2C%20actors%3D%7B0%2C%201%2C%202%7D)%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20cond1%20%3D%20Condition(actors%3D_actors%2C%20scenes%3D_scenes)%0A%20%20%20%20return%20(cond1%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Google%20OR-Tools%20%E3%81%A7%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%23%20%E6%B1%BA%E5%AE%9A%E5%A4%89%E6%95%B0%0A%0A%20%20%20%20%20%20%20%20-%20%24%5Ctext%7Binterval%7D_s%20%3D%20%5B%5Ctext%7Bstart%7D_s%2C%20%5Ctext%7Bend%7D_s)%20%5Cspace%20(%5Cforall%20s%20%5Cin%20S)%24%3A%20%E5%90%84%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AE%E6%92%AE%E5%BD%B1%E6%9C%9F%E9%96%93%E3%82%92%E8%A1%A8%E3%81%99%E5%8C%BA%E9%96%93%E5%A4%89%E6%95%B0.%0A%20%20%20%20%20%20%20%20-%20%24%5Ctext%7Bkeep%7D_a%20%5Cspace%20(%5Cforall%20a%20%5Cin%20A)%24%3A%20%E5%BD%B9%E8%80%85%20%24a%24%20%E3%81%8C%E6%8B%98%E6%9D%9F%E3%81%95%E3%82%8C%E3%81%9F%E6%97%A5%E6%95%B0%0A%0A%20%20%20%20%20%20%20%20%23%23%23%23%20%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%0A%0A%20%20%20%20%20%20%20%20%5C%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Csum_%7Ba%20%5Cin%20A%7D%20c_a%20%5Ctext%7Bkeep%7D_a%0A%20%20%20%20%20%20%20%20%5C%5D%0A%0A%20%20%20%20%20%20%20%20%23%23%23%23%20%E5%88%B6%E7%B4%84%0A%0A%20%20%20%20%20%20%20%20-%20%24%5Ctext%7Bstart%7D_s%20%2B%20d_s%20%3D%20%5Ctext%7Bend%7D_s%20%5Cspace%20(s%20%5Cin%20S)%24%0A%20%20%20%20%20%20%20%20-%20%E5%BD%B9%E8%80%85%20%24a%20%5Cin%20A%24%20%E3%81%8C%E6%8B%98%E6%9D%9F%E3%81%95%E3%82%8C%E3%81%9F%E6%97%A5%E6%95%B0%3A%20%24%5Ctext%7Bkeep%7D_a%20%3D%20%5Cmax%20%5C%7B%20%5Ctext%7Bend%7D_s%20%5Cmid%20s%20%5Cin%20S%2C%20%5Cspace%20a%20%5Cin%20A_s%20%5C%7D%20-%20%5Cmin%20%5C%7B%20%5Ctext%7Bstart%7D_s%20%5Cmid%20s%20%5Cin%20S%2C%20%5Cspace%20a%20%5Cin%20A_s%20%5C%7D%24%0A%20%20%20%20%20%20%20%20-%20%E5%90%84%E5%BD%B9%E8%80%85%E3%81%AF%E5%90%8C%E6%99%82%E3%81%AB%201%20%E3%81%A4%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%97%E3%81%8B%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%3A%0A%20%20%20%20%20%20%20%20%20%20%24%5Ctext%7Bno-overlap%7D%20%5C%7B%20I_s%20%5Cmid%20s%20%5Cin%20S%2C%20%5Cspace%20a%20%5Cin%20A_s%20%5C%7D%24%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20%C3%97%20%24%5Cto%24%20%E3%81%A9%E3%81%86%E3%82%84%E3%82%89%E6%92%AE%E5%BD%B1%E3%81%AF%E5%B9%B3%E8%A1%8C%E3%81%AB%E8%A1%8C%E3%81%88%E3%81%AA%E3%81%84%E3%82%89%E3%81%97%E3%81%84.%20%E8%AA%B2%E3%81%99%E3%81%B9%E3%81%8D%E5%88%B6%E7%B4%84%E3%81%AF%20%24%5Ctext%7Bno-overlap%7D%20%5C%7B%20I_s%20%5Cmid%20s%20%5Cin%20S%5C%7D%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Condition%2C%20cp_model)%3A%0A%20%20%20%20class%20ModelCpSat%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20cond%3A%20Condition)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model%20%3D%20cp_model.CpModel()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20horizon%20%3D%20sum(scene.time%20for%20scene%20in%20cond.scenes)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.starts%20%3D%20%5Bself.model.new_int_var(0%2C%20horizon%2C%20%22%22)%20for%20_%20in%20cond.scenes%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.intervals%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.model.new_fixed_size_interval_var(self.starts%5Bid_scene%5D%2C%20scene.time%2C%20%22%22)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20id_scene%2C%20scene%20in%20enumerate(cond.scenes)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20for%20id_act%2C%20actor%20in%20enumerate(cond.actors)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20self.model.add_no_overlap(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20%20%20%20%20self.intervals%5Bid_scene%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20%20%20%20%20for%20id_scene%2C%20scene%20in%20enumerate(cond.scenes)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20%20%20%20%20if%20id_act%20in%20scene.actors%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_no_overlap(self.intervals)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.objective%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20id_act%2C%20actor%20in%20enumerate(cond.actors)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20act_start%20%3D%20self.model.new_int_var(0%2C%20horizon%2C%20%22%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20act_end%20%3D%20self.model.new_int_var(0%2C%20horizon%2C%20%22%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_min_equality(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20act_start%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20interval.start_expr()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20scene%2C%20interval%20in%20zip(cond.scenes%2C%20self.intervals)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20id_act%20in%20scene.actors%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_max_equality(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20act_end%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20interval.end_expr()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20scene%2C%20interval%20in%20zip(cond.scenes%2C%20self.intervals)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20id_act%20in%20scene.actors%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.objective%20%2B%3D%20actor.cost%20*%20(act_end%20-%20act_start)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model.minimize(self.objective)%0A%0A%20%20%20%20%20%20%20%20def%20solve(self%2C%20timeout%3A%20int%20%3D%20180)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver%20%3D%20cp_model.CpSolver()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver.parameters.log_search_progress%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver.parameters.max_time_in_seconds%20%3D%20timeout%0A%20%20%20%20%20%20%20%20%20%20%20%20self.status%20%3D%20self.solver.solve(self.model)%0A%0A%20%20%20%20%20%20%20%20def%20print_solution(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20shoots%20%3D%20%5B(f%22Shoot%20%7Bi%7D%22%2C%20self.solver.value(interval.start_expr()))%20for%20i%2C%20interval%20in%20enumerate(self.intervals)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20shoots.sort(key%3Dlambda%20x%3A%20x%5B1%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20name%2C%20start%20in%20shoots%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%7Bname%7D%20starts%20at%20%7Bstart%7D%22)%0A%20%20%20%20return%20(ModelCpSat%2C)%0A%0A%0A%40app.cell%0Adef%20_(ModelCpSat%2C%20cond1%2C%20mo)%3A%0A%20%20%20%20model1%20%3D%20ModelCpSat(cond1)%0A%20%20%20%20model1.solve()%0A%0A%20%20%20%20mo.md(f%22Time%3A%20%7Bmodel1.solver.wall_time%3A.9f%7D%22)%0A%20%20%20%20return%20(model1%2C)%0A%0A%0A%40app.cell%0Adef%20_(model1)%3A%0A%20%20%20%20model1.print_solution()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20didp%20%E3%81%A7%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%23%20DP%20Formulation%0A%0A%20%20%20%20%20%20%20%20%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%8C%E9%80%94%E4%B8%AD%E3%81%BE%E3%81%A7%E5%AE%8C%E4%BA%86%E3%81%97%2C%20%E6%AE%8B%E3%82%8A%E3%81%8C%20%24Q%20%5Csubset%20S%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%81%A8%E3%81%99%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%E6%AC%A1%E3%81%AB%20%24s%20%5Cin%20Q%24%20%E3%82%92%E6%92%AE%E3%82%8B%E5%A0%B4%E5%90%88%2C%20%E6%8B%98%E6%9D%9F%E3%81%95%E3%82%8C%E3%82%8B%E5%BD%B9%E8%80%85%E3%81%AE%E9%9B%86%E5%90%88%20%24L(s%2C%20Q)%24%20%E3%81%AF%0A%0A%20%20%20%20%20%20%20%20%5C%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20L(s%2C%20Q)%20%3D%20A_s%20%5Ccup%20%5Cleft(%20%5Cbigcup_%7Bs'%20%5Cin%20S%20%5Csetminus%20Q%7D%20A_%7Bs'%7D%20%5Ccap%20%5Cbigcup_%7Bs'%20%5Cin%20Q%7D%20A_%7Bs'%7D%20%5Cright)%0A%20%20%20%20%20%20%20%20%5C%5D%0A%0A%20%20%20%20%20%20%20%20%E3%81%A8%E3%81%AA%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%E5%8F%B3%E8%BE%BA%E3%81%AE%E5%A4%A7%E6%8B%AC%E5%BC%A7%E5%86%85%E3%81%AF%E4%BB%8A%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%B3%20%24S%20%5Csetminus%20Q%24%20%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%A7%E6%97%A2%E3%81%AB%E5%91%BC%E3%81%B3%E5%AF%84%E3%81%9B%E3%81%A6%E3%81%84%E3%81%A6%2C%20%0A%20%20%20%20%20%20%20%20%E3%81%93%E3%81%AE%E5%85%88%E3%82%82%E6%92%AE%E5%BD%B1%E3%81%8C%E3%81%82%E3%82%8B%E3%81%9F%E3%82%81%E8%A7%A3%E6%94%BE%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%BD%B9%E8%80%85%E3%81%AE%E9%9B%86%E5%90%88%E3%82%92%E8%A1%A8%E3%81%99.%20%0A%20%20%20%20%20%20%20%20%E3%82%B7%E3%83%BC%E3%83%B3%20%24s%24%20%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%8C%E7%B5%82%E3%82%8F%E3%82%8B%E3%81%A8%E6%94%AF%E6%89%95%E3%82%8F%E3%82%8C%E3%82%8B%E3%82%AE%E3%83%A3%E3%83%A9%E3%81%8C%20%24d_s%20%5Csum_%7Ba%20%5Cin%20L(s%2C%20Q)%7D%20c_a%24%20%E3%81%A0%E3%81%91%E5%A2%97%E5%8A%A0%E3%81%97%2C%20%0A%20%20%20%20%20%20%20%20%24Q%24%20%E3%81%8C%20%24Q%20%5Csetminus%20%5C%7B%20s%20%5C%7D%24%20%E3%81%A7%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%82%8B.%20%0A%0A%20%20%20%20%20%20%20%20%5Cbegin%7Balign*%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%26%5Ctext%7Bcompute%7D%20%26%20%26V(S)%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%26%5Ctext%7Bs.t.%7D%20%26%20%26V(Q)%20%3D%20%5Cbegin%7Bdcases%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cmin_%7Bs%20%5Cin%20Q%7D%20%5Cleft(%20d_s%20%5Csum_%7Ba%20%5Cin%20L(s%2C%20Q)%7D%20c_a%20%2B%20V(Q%20%5Csetminus%20%5C%7Bs%5C%7D)%20%5Cright)%20%26%20%5Ctext%7Bif%20%7D%20Q%20%5Cneq%20%5Cemptyset%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%26%20%5Ctext%7Bif%20%7D%20Q%20%3D%20%5Cemptyset%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cend%7Bdcases%7D%0A%20%20%20%20%20%20%20%20%5Cend%7Balign*%7D%0A%0A%20%20%20%20%20%20%20%20%24V(Q)%24%20%E3%81%AF%20%24Q%24%20%E3%81%A0%E3%81%91%E3%82%92%E6%92%AE%E5%BD%B1%E3%81%99%E3%82%8B%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E8%A1%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E6%B3%A8%E6%84%8F.%0A%0A%20%20%20%20%20%20%20%20%23%23%23%23%20Force%20Transition%0A%0A%20%20%20%20%20%20%20%20%E3%82%B7%E3%83%BC%E3%83%B3%20%24s%20%5Cin%20Q%24%20%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E5%BD%B9%E8%80%85%E3%81%8C%E3%81%99%E3%81%A7%E3%81%AB%E7%8F%BE%E5%A0%B4%E3%81%AB%E6%8B%98%E6%9D%9F%E3%81%95%E3%82%8C%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%8B%E3%81%A4%2C%20%0A%20%20%20%20%20%20%20%20%24s%24%20%E3%81%8C%E3%81%9D%E3%81%AE%E5%85%A8%E5%93%A1%E3%82%92%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%99%E3%82%8B%E6%92%AE%E5%BD%B1%E3%81%AE%E5%A0%B4%E5%90%88%2C%20%E3%81%A4%E3%81%BE%E3%82%8A%0A%0A%20%20%20%20%20%20%20%20%5C%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20A_s%20%3D%20%5Cbigcup_%7Bs'%20%5Cin%20S%20%5Csetminus%20Q%7D%20A_%7Bs'%7D%20%5Ccap%20%5Cbigcup_%7Bs'%20%5Cin%20Q%7D%20A_%7Bs'%7D%20%5Cquad%20(s%20%5Cin%20Q)%0A%20%20%20%20%20%20%20%20%5C%5D%0A%0A%20%20%20%20%20%20%20%20%E3%81%AE%E3%81%A8%E3%81%8D%2C%20%E3%82%B7%E3%83%BC%E3%83%B3%20%24s%24%20%E3%82%92%E7%9B%B4%E3%81%A1%E3%81%AB%E6%92%AE%E5%BD%B1%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E6%9C%80%E9%81%A9%E3%81%A8%E3%81%AA%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%E3%81%93%E3%81%AE%E5%A0%B4%E5%90%88%2C%20%E4%B8%8A%E8%A8%98%E3%81%AE%E6%9B%B4%E6%96%B0%E8%A6%8F%E5%89%87%E3%82%88%E3%82%8A%E9%AB%98%E3%81%84%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D%E3%81%A7%E4%B8%8B%E8%A8%98%E3%81%AE%E6%9B%B4%E6%96%B0%E3%82%92%E8%A1%8C%E3%81%86.%20%0A%0A%20%20%20%20%20%20%20%20%5C%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20V(Q)%20%3D%20d_s%20%5Csum_%7Ba%20%5Cin%20A_s%7D%20c_a%20%2B%20V(Q%20%5Csetminus%20%5C%7B%20s%20%5C%7D)%0A%20%20%20%20%20%20%20%20%5C%5D%0A%0A%20%20%20%20%20%20%20%20%23%23%23%23%20Dual%20Bound%0A%0A%20%20%20%20%20%20%20%20%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%9F%A5%E8%AD%98%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A3%E3%81%BD%E3%81%84.%20%0A%20%20%20%20%20%20%20%20%E4%BB%8A%E5%9B%9E%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%A0%E3%81%A8%E4%B8%8B%E8%A8%98%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%88%B6%E7%B4%84%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B.%20%0A%0A%20%20%20%20%20%20%20%20%5C%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20V(Q)%20%5Cgeq%20%5Csum_%7Bs%20%5Cin%20Q%7D%20d_s%20%5Csum_%7Ba%20%5Cin%20A_s%7D%20c_a%0A%20%20%20%20%20%20%20%20%5C%5D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Condition%2C%20didppy)%3A%0A%20%20%20%20class%20ModelDidp%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20cond%3A%20Condition)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model%3A%20didppy.Model%20%3D%20didppy.Model()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20scene_indices%3A%20list%5Bint%5D%20%3D%20list(range(len(cond.scenes)))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20S%2C%20A%0A%20%20%20%20%20%20%20%20%20%20%20%20objtype_scene%3A%20didppy.ObjectType%20%3D%20self.model.add_object_type(number%3Dlen(cond.scenes))%0A%20%20%20%20%20%20%20%20%20%20%20%20objtype_actor%3A%20didppy.ObjectType%20%3D%20self.model.add_object_type(number%3Dlen(cond.actors))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Q%0A%20%20%20%20%20%20%20%20%20%20%20%20remaining%3A%20didppy.SetVar%20%3D%20self.model.add_set_var(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20object_type%3Dobjtype_scene%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%3Dscene_indices%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%90%84%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E5%BD%B9%E8%80%85%E3%81%AE%E9%9B%86%E5%90%88%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20didp%20%E3%81%AE%20example%20%E3%81%A7%E3%81%AF%20object_type%20%E3%81%8C%20scene%20%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8C%E5%A4%9A%E5%88%86%20actor%20%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20scene_to_actors_table%3A%20didppy.SetTable1D%20%3D%20self.model.add_set_table(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bscene.actors%20for%20scene%20in%20cond.scenes%5D%2C%20object_type%3Dobjtype_actor%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%90%84%E5%BD%B9%E8%80%85%E3%81%AE%E6%97%A5%E3%81%94%E3%81%A8%E3%81%AE%E3%82%AE%E3%83%A3%E3%83%A9%0A%20%20%20%20%20%20%20%20%20%20%20%20actor_to_cost%3A%20didppy.IntTable1D%20%3D%20self.model.add_int_table(%5Bactor.cost%20for%20actor%20in%20cond.actors%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%97%A2%E3%81%AB%E6%9D%A5%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%9F%E5%BD%B9%E8%80%85%E3%81%AE%E9%9B%86%E5%90%88.%20%E7%8F%BE%E5%9C%B0%E3%81%AB%E7%95%99%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%AF%E9%99%90%E3%82%89%E3%81%9A%2C%20%E5%B8%B0%E3%81%A3%E3%81%A6%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%82%82%E3%81%82%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%BF%85%E9%A0%88%E5%BD%B9%E8%80%85%E9%9B%86%E5%90%88%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%20scene_to_actors_table%20%E3%81%AB%20remaining%20%E3%81%AE%E8%A3%9C%E9%9B%86%E5%90%88%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E6%B1%82%E3%82%81%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20came_to_location%3A%20didppy.SetExpr%20%3D%20scene_to_actors_table.union(remaining.complement())%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%92%AE%E5%BD%B1%E3%81%AE%E3%81%82%E3%82%8B%E5%BD%B9%E8%80%85%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%BF%85%E9%A0%88%E5%BD%B9%E8%80%85%E9%9B%86%E5%90%88%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%20scene_to_actors_table%20%E3%81%AB%20remaining%20%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E6%B1%82%E3%82%81%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20standby%3A%20didppy.SetExpr%20%3D%20scene_to_actors_table.union(remaining)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%97%A2%E3%81%AB%E6%9D%A5%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AE%E3%81%82%E3%82%8B%E5%BD%B9%E8%80%85%E3%81%A8%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%92%AE%E5%BD%B1%E3%81%AE%E3%81%82%E3%82%8B%E5%BD%B9%E8%80%85%E3%81%AE%E5%85%B1%E9%80%9A%E9%83%A8%E5%88%86.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AC%A1%E3%81%AE%E6%92%AE%E5%BD%B1%E6%99%82%E3%81%AB%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%92%E6%94%AF%E6%89%95%E3%81%86%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Define%20a%20state%20function%20to%20avoid%20redundant%20evaluation%20of%20an%20expensive%20expression%0A%20%20%20%20%20%20%20%20%20%20%20%20on_location%3A%20didppy.SetExpr%20%3D%20self.model.add_set_state_fun(came_to_location%20%26%20standby)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Base%20Case%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_base_case(conditions%3D%5Bremaining.is_empty()%5D%2C%20cost%3D0)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Transition%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20s%20in%20scene_indices%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AE%8B%E3%81%A3%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%BD%B9%E8%80%85%E3%81%A8%20s%20%E3%81%AE%E6%92%AE%E5%BD%B1%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E5%BD%B9%E8%80%85%E3%81%AE%E5%92%8C%E9%9B%86%E5%90%88.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%BD%BC%E3%82%89%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%81%AE%E3%81%BF%E3%82%AE%E3%83%A3%E3%83%A9%E3%82%92%E6%94%AF%E6%89%95%E3%81%86.%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20on_location_s%3A%20didppy.SetExpr%20%3D%20scene_to_actors_table%5Bs%5D%20%7C%20on_location%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20shoot%3A%20didppy.Transition%20%3D%20didppy.Transition(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22shoot%20%7Bs%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cost%3Dcond.scenes%5Bs%5D.time%20*%20actor_to_cost%5Bon_location_s%5D%20%2B%20didppy.IntExpr.state_cost()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20effects%3D%5B(remaining%2C%20remaining.remove(s))%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preconditions%3D%5Bremaining.contains(s)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_transition(shoot)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Dual%20Bound%3A%20%E5%90%84%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%92%E6%92%AE%E5%BD%B1%E3%81%99%E3%82%8B%E6%9C%80%E4%BD%8E%E3%82%B3%E3%82%B9%E3%83%88%0A%20%20%20%20%20%20%20%20%20%20%20%20scene_to_min_cost%3A%20didppy.IntTable1D%20%3D%20self.model.add_int_table(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cond.scenes%5Bs%5D.time%20*%20sum(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cond.actors%5Ba%5D.cost%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20a%20in%20cond.scenes%5Bs%5D.actors%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%20for%20s%20in%20scene_indices%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_dual_bound(scene_to_min_cost%5Bremaining%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Force%20Transition%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20s%20in%20scene_indices%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20shoot%3A%20didppy.Transition%20%3D%20didppy.Transition(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22forced%20shoot%20%7Bs%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cost%3Dscene_to_min_cost%5Bs%5D%20%2B%20didppy.IntExpr.state_cost()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20effects%3D%5B(remaining%2C%20remaining.remove(s))%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preconditions%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20remaining.contains(s)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scene_to_actors_table%5Bs%5D%20%3D%3D%20on_location%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.model.add_transition(shoot%2C%20forced%3DTrue)%0A%0A%20%20%20%20%20%20%20%20def%20solve(self%2C%20timeout%3D180%2C%20threads%3A%20int%3D8)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solver%3A%20didppy.CABS%20%3D%20didppy.CABS(self.model%2C%20threads%3Dthreads%2C%20quiet%3DFalse%2C%20time_limit%3Dtimeout)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.solution%3A%20didppy.Solution%20%3D%20self.solver.search()%0A%0A%20%20%20%20%20%20%20%20def%20print_solution(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22Transitions%20to%20apply%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_t%20in%20self.solution.transitions%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(_t.name)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print()%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Cost%3A%20%7Bself.solution.cost%7D%22)%0A%20%20%20%20return%20(ModelDidp%2C)%0A%0A%0A%40app.cell%0Adef%20_(ModelDidp%2C%20cond1%2C%20mo)%3A%0A%20%20%20%20model2%20%3D%20ModelDidp(cond1)%0A%20%20%20%20model2.solve()%0A%20%20%20%20mo.md(f%22Time%3A%20%7Bmodel2.solution.time%3A.9f%7D%22)%0A%20%20%20%20return%20(model2%2C)%0A%0A%0A%40app.cell%0Adef%20_(model2)%3A%0A%20%20%20%20model2.print_solution()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Condition)%3A%0A%20%20%20%20cond2%20%3D%20Condition.example(n_scene%3D20%2C%20n_actor%3D10)%0A%0A%20%20%20%20cond2.model_dump()%0A%20%20%20%20return%20(cond2%2C)%0A%0A%0A%40app.cell%0Adef%20_(ModelCpSat%2C%20cond2%2C%20mo)%3A%0A%20%20%20%20model3%20%3D%20ModelCpSat(cond2)%0A%20%20%20%20model3.solve()%0A%20%20%20%20mo.md(f%22Time%3A%20%7Bmodel3.solver.wall_time%3A.9f%7D%22)%0A%20%20%20%20return%20(model3%2C)%0A%0A%0A%40app.cell%0Adef%20_(model3)%3A%0A%20%20%20%20model3.print_solution()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelDidp%2C%20cond2%2C%20mo)%3A%0A%20%20%20%20model4%20%3D%20ModelDidp(cond2)%0A%20%20%20%20model4.solve(threads%3D10)%0A%20%20%20%20mo.md(f%22Time%3A%20%7Bmodel4.solution.time%3A.9f%7D%22)%0A%20%20%20%20return%20(model4%2C)%0A%0A%0A%40app.cell%0Adef%20_(model4)%3A%0A%20%20%20%20model4.print_solution()%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
6a106227f39fe17d108d4d016db041300d528f1f6723de6e8213c609cc3c2a25