 Je veux juste vous donner quelques mots sur ce qu'est le Sat4j, parce que si vous avez entendu le Sat4j avant cette lecture, oui, ok, donc je vais vous donner une idée. Donc typiquement, le Sat4j était originalité par moi et par un collègue de l'Université d'Artois, et Emmanuel Lonca et Romain Wallon, Emmanuel Lonca a travaillé avec moi sur le multi-objectif et la détection de qualité. Stéphanie Hossel a été ingénieur dans notre groupe et a implementé des features, et Romain est currently doing his PHG avec moi sur les systèmes de profs et tout, et donc il est currently developing things. Ok, qu'est-ce qui était l'objectif de ce solver ? C'était d'avoir un solver qui est 100% en Java. Donc vous devez dire pourquoi ? Parce que j'ai été programmé en Java en 1998 et j'ai aimé cette langue. Tout le monde dans la communauté est en train de faire des solvers efficaces. J'étais en train de faire la compétition, donc je ne pouvais pas vraiment soumettre que je ne pouvais pas gagner, donc j'ai dit, ok, je vais designer un solver au sol. Non, mais typiquement, l'idée est que si vous voulez comprendre quel est le solver que vous avez besoin d'implément. Je veux dire que durant 2 ans, entre 2001 et 2003, j'ai pu dire à Joe Marquez Silva que le CDCL n'était pas différent d'un DPL plus d'apprentissage, et que j'étais d'accord. Mais j'allais impliquer pour moi-même le solver et voir comment le solver était en train d'être confiant et de comprendre que j'étais d'accord. Et donc je ne pense pas qu'on peut comprendre quelque chose de ces solvers sans implémenter un sol. C'est juste, vous pouvez voir beaucoup de présentations, si vous n'avez pas vraiment exprimé et souhaité sur le code solver, vous ne pouvez pas vraiment comprendre le solver. Même si vous pouvez avoir un bon visage de l'abstraction, il y a beaucoup, beaucoup de détails que vous ne trouverez pas dans les papiers et sur les présentations. Mais le truc c'était d'être efficace pour les deux problèmes. Et typiquement, c'est créé pour les gens en académie et c'est utilisé en académie, mais aussi pour les développeurs de Java. Donc j'utilise les principaux de Java pour le designer, et c'est utilisé par des gens de la communauté de Java. Et ce n'est pas juste un solver solver, donc solver, solver, solver, ça c'est un solver, c'est un solver, c'est un solver, c'est un solver, c'est un solver, c'est un solver, c'est un solver, c'est un solver. Alors si toujours vous avez des collègues. On dirait le pourcentage, le lac SAC, la DBOS. Si il y a des choses parce que j'ai des contraintes d'exorciation. Donc, oui. Non, je ne fais pas l'élimination d'exorciation. Donc je dois faire ça, mais c'est notre premier tour. Donc le fait que j'ai un exorciation natif signifie que c'est seulement une représentation compacte des contraintes, mais je n'ai pas un solver de série sur le côté pour faire tous les trucs que l'on a vu yesterday pour l'élimination d'exorciation. Je dois le faire, on verra. Pour le moment, nous sommes à benchmarker pour voir si notre utilisation est suffisante ou pas. Oui, donc c'est... Typiquement, j'ai des enseignements de software à ma université, OK? Donc j'expérimente tout. J'enseigne sur la plateforme et les étudiants savent que je peux checker ma code et voir si je follow les pratiques que j'enseigne. Et donc parfois je me dis, OK, on va essayer quelque chose et je le fais. Parce qu'on doit le faire sur le software réel. Il n'est pas intéressant. Et je voulais aussi vous montrer que c'est parfois important de prendre si vous avez un projet comme ça. Donc vous devez... OK, donc c'est le PLL area. C'est quand j'ai fait ma PhD. Et c'est l'area CDCL. Ici, vous avez Chef, OK? C'est parti. Et ça a complètement changé la façon dont la communauté sat. Donc mon premier software avec un software sat était appelé AroundSat, durant ma PhD. Puis j'ai fait un postdoc en Australie et j'ai écrit une libraire. Donc ici, le solver a été invité dans le software. Ici, c'était une nouvelle libraire, une nouvelle engine pour ADS. Donc c'était appelé JSat. Mais c'était un PLL. Donc Chef s'est parti. Donc je devais commencer à nouveau. Parce que ça ne fonctionnait pas. Donc ensuite, avec Joe Marquez Silva, on a eu un projet appelé OpenSat. L'idée était de... Il a un solver sat. Donc Maté, vous savez que Joe wrote un solver sat en Java appelé Jack West? Non, vous ne savez pas. Il était en 2002 ou 2003. Et puis Amin m'a dit que vous ne devriez jamais faire quelque chose en Java, en C ou en C++. OK. Et donc, c'était un projet avec Joe Marquez, mais il ne fonctionnait pas. Donc, parce que j'avais encore le PLL et je ne pouvais pas impliquer quelque chose. Même si j'ai voulu être compatible avec PLL et CDCL, parce que Joe a JQuest. Et puis Amin sat est parti avec le papier, avec une source en C++. Et puis j'ai décidé d'impliquer une version d'Amin sat en Java. Et c'est cet projet. OK. Donc c'était OpenSat. Donc tous ces softwares étaient OpenSource en LGPL, mais l'LGPL, parce que ça signifie que vous pouvez l'utiliser dans les compagnies. OK. Donc, depuis le début, c'était fait pour être utilisé par les gens, l'académie ou les compagnies. Et puis, après l'année, on a eu la première pb-évaluation avec Vashko et Olivier Houssel. Et puis on a ajouté la première version d'Amin sat 4j. Et en fait, nous avons seulement le système de pb-évaluation parce que c'est vraiment ce qu'on a été interprété. Et nous avons la première compétition de la compétition de CSP quand nous avons une translation de l'application de l'application de l'application de l'Amin sat. Puis après ça, nous avons l'évaluation de l'Amin sat. Et donc, nous avons l'application de l'Amin sat qui est utilisé par ajouter les sélecteurs variables pour ajouter les softwares. Et puis, en 2008, sat 4j a été intégrée avec Eclipse pour satisfaire ses dépendances. Et j'ai eu des informations sur ça. Et puis, il y a été un software disponible dans l'éclipse public licence. Pour le faire parce que LGPL est incompatible avec l'éclipse public licence. Et LGPL parce que pour l'académie, pour les gens utilisant GPL, vous avez confié avec GPL. Donc, j'ai eu l'application de l'éclipse licence pour assurer les usages dans l'éclipse et dans d'autres softwares académiques. Et en 2010, l'éclipse fondation a créé le marketplace et chaque single installation de les plug-ins de ce marketplace est dirigée par sat 4j. Donc, quelques facts. So, sat 4j est le plus lent sat solver dans le monde, je pense. C'est en Java. C'est... Donc, ce n'est pas vraiment le cas parce qu'on verra que si vous avez besoin de poursuivre, on va pouvoir répondre très rapidement pendant que les autres ne sont pas en train de le faire. Donc, c'est 45, 44 lignes de code Java. Donc, ça a été environ 15 ans. Donc, c'est un genre de travail de software engineering pour maintenir ce code. Et c'est principalement utilisé par les gens de software engineering. Donc, si vous entendez des lignes de software, typiquement, ils sont probablement utilisés sat 4j pour faire quelque chose là-bas. Parce que dans les lignes de software, vous avez ces dépendances et vous devez satisfaire ces dépendances. Et il y a un papier seminal de 2005 de la batterie où il a utilisé le sat 4j et la logique de la propagation dans cette région. Et ça a été quelque chose que l'on a utilisé. Il y a beaucoup de universités qui ont utilisé le sat 4j pour apprendre sat sur le niveau master. Et parce que c'est en Java, c'est facile donc les gens ont juste utilisé. Et ça fonctionne sur quelque chose que j'espère qu'on verra ceci dans la session. Donc, même si vous avez des lignes, je n'ai seulement utilisé unique système. Donc, vous devriez pouvoir faire des choses. Et donc, c'est tous les jours dans l'éclipse. Et juste pour vous montrer pourquoi, c'est un package. Donc, en fait, c'est le right slide. Ceci est de Ubuntu, mais j'ai la même chose de l'éclipse, mais oui. Donc, c'est ok, c'est la même chose. Mais il y a un dans l'éclipse où vous définissez aussi les dépendances. Et typiquement, ce qu'ils ont dans l'éclipse c'est que ils ont un algorithm de Greedy. Et en 2004, ils ont commencé une nouvelle plateforme et ils ont été donc-called riche client-platforme et pour vous donner une idée, IBM a 300 différents produits basés sur l'éclipse internement, SAP, Oracle, beaucoup, beaucoup de compagnies qui ont des choses. Et donc, vous avez beaucoup de plug-ins et avec leur algorithm de Greedy, avec le nombre de plug-ins qui s'étendent, ils installaient des choses qui font que le système et le stable n'étaient pas utiles. Les gens vont installer quelque chose et puis le système ne marchera plus parce qu'il y avait un package de conflits dans l'intérieur. Et donc, le truc est que peut-être vous savez, vous ne savez pas, mais installant correctement un package sur une distribution Linux ou l'éclipse c'est juste NP-complete. Pourquoi ? Parce que je peux utiliser la description de les dépendances que vous avez vécues et je ne peux pas prendre aucune formule en CNF et je peux le transmettre dans ce format. Donc, si vous pouvez poursuivre très rapidement cela signifie qu'on peut s'assurer ça. Donc, c'est vraiment un programme NP-complete. Et cela a été connu depuis 1999 dans la communauté ESP et cela a été connu dans la communauté software en 2005 parce qu'il y avait un projet appelé E-DOS qui a réveillé ce résultat pour les deux de Debian et de Red Hat distribution. Ce résultat était connu pour Debian en 1999. Pourquoi le projet de site a été utilisé en Eclipse ? Parce que ils savaient que ce programme était en NP-complete. Ils ne pouvaient pas utiliser un approche gris. Ils savaient les résultats. Et typiquement, les résultats étaient que vous avez besoin d'un site ou d'un meilleur pbo solver pour vous donner une idée l'année précédente il y avait quelqu'un qui a entendu d'E-DOS qui voulait utiliser Sat4j CWN solver dans l'inspire Linux distribution. Mais à ce moment il n'y avait que Sat4j qui a été connu et qui a été très lent. Il a dit que ce n'est pas bon à nous. Mais ce année nous avons aussi la résolution base. Et donc c'était plus efficace. Il a besoin d'un source ouvert et il a dû maintenir et supporter d'une certaine façon. Et parce que Sat4j n'était pas seulement assis sur ma page mais sur un consortium appelé OW2 ou bien ObjectWeb à ce moment OW2 maintenant. Je l'ai répondu à la liste de maire et d'autres. Ils m'ont dit OK, c'est une bonne idée d'être intégrée dans notre software. Et pour le bon facteur j'ai toujours été utilisée d'éclipses en décembre 2001. Donc Sat4j a été designé avec l'éclipse. Donc c'était aussi quelque chose de fun. Donc oui, pour vous donner une idée, donc c'est quelque chose c'est le marketplace d'éclipses. Et ici vous avez 37 millions. Donc j'ai juste pris une heure d'avant. C'est maintenant 38 millions. Mais pour chaque installation single ici il y a un appel à Sat4j pour le solver de PBO. OK. Et donc c'est sort de 10 000 calls d'éclipses je pense parce qu'il a commencé en 2010. Donc, oui et c'est seulement pour le marketplace public. Chaque fois vous installez quelque chose dans l'éclipse. Quelqu'un utilise l'éclipse ici ? Un peu. OK. Donc si vous installez quelque chose dans l'éclipse Sat4j on décide à quel point exactement vous allez mettre. Et donc oui. Donc c'est typiquement quelque chose qui fonctionne. Et ça fonctionne. Donc typiquement c'est commencé en 2008. J'avais à fixer un bug en septembre. Néanmoins. Et puis nous devons travailler sur l'optimisation fonction pour le programme. Et donc deux ans plus tard ils étaient confiants que tout était bien et depuis que le marketplace est sur je n'ai jamais encore touché tout ce code. OK. Donc, maintenant c'est le temps c'est le temps de pratiquer un peu. OK. Je ne suis pas un programme python. Right. Donc je vous donne des scripts en python parce que je crois que c'est quelque chose qui fonctionne sur tous les computers. Donc si vous êtes programme python et que vous voyez quelque chose qui n'est vraiment pas le code python de faire des choses. S'il vous plait, je vais le faire correct. OK. Donc on va y aller. Donc ici ce que je veux vous montrer c'est donc nous allons encoder le problème de recherche sur le problème de seats. Juste pour vous montrer ce qui se passe si vous utilisez ces solvaires. Donc le programme est que sat et pb n'est pas vraiment une bonne modélisation. Ce n'est pas fait pour les utilisateurs. OK. C'est fait pour les développeurs. Donc le format est très simple. Vous pouvez le faire avec les utilisateurs, typiquement. Mais ce n'est pas quelque chose que vous voulez faire. Donc vous devez écrire un script. OK. Vous ne devez pas aller écrire par la fin le format diamètre. C'est bien. Donc nous devons donc que la raison pourquoi vous allez utiliser python. Donc ce n'est pas typiquement ce que vous avez. Ici, vous avez ce p, c, n, f et 3 c'est-à-dire 3 variables. 4 c'est-à-dire 4 clauses. Et ce n'est pas x1 ou x2 ou pas x3. Pas x1 ou x2. x2 ou x3 pas x2. OK. Ce n'est pas utile pour les développeurs parce qu'ils n'ont pas de risques sur le file d'input. Mais ce n'est pas juste un sens pour les utilisateurs. OK. Donc nous voulons check je veux générer je veux un script un script python pour générer le CNF pour le problème sur le site researcher. Donc vous vous souvenez nous avons deux sets de constraints. Chaque researcher devrait avoir au moins un site. Et on ne devrait pas avoir deux researchers sur le même site. OK. Donc nous allons impliquer ça et générer ça avec un script python. Donc vous devez les avoir sur votre computer. Je vous montre ici ce que je fais. Donc ici il y a quelque chose qui est important c'est de pouvoir avoir une idée de la variable. OK. Vous devez avoir la variable de 1 à le nombre de... Donc ici nous avons M x M-1 variable. OK. Parce que nous devons mapper chaque researcher à chaque site. Donc c'est M x M-1 variable. Donc j'ai écrit une petite fonction que selon le researcher le site et le nombre total de researchers vont me donner une idée unique. Et donc c'est un classique. Donc c'est le nombre de researchers minus 1 x M-1 plus J et si vous vérifiez ça vous donnera une unique numérique avec tous les typiquement ce sera le numéro 1 sera le premier researcher sur le site 1 le second sera le researcher 1 sur le site 2 et ainsi jusqu'à M et ensuite vous continuer. Donc euh... oui j'ai un generator et ensuite à moins 1 donc c'est une simple 1 vous voulez juste euh... aller pour chaque euh... donc c'est pour euh... je suis donné une euh... euh... une researcher et je veux que euh... je veux que chaque researcher soit au moins sur le site. Donc, ici je vais juste aller de 1 jusqu'à M-1 parce que le range va euh... à ce point à minus 1. Donc, j'ai juste créé un set avec tous ces integers. J'ai j'ai un 0 à la fin et je print euh... des literaux et je dois transmettre elles dans un string pour faire ça. Ok. Donc, c'est un moyen pour euh... pour print euh... une seule fermée que correspond à mon à la fin de la fin. Ok. Maintenant euh... si je veux faire l'atmos 1 donc, remercie-toi que l'atmos 1 va utiliser l'oncote binary l'oncote pairwise donc, nous sommes juste en peintant chaque possible donc, c'est pour chaque site on va vérifier tout le possible de valeur pour la researcher et on va faire ça ils ne peuvent pas être ensemble. Ok. Donc, ici, je vais euh... pour chaque valeur de pour 2 valeurs de la researcher et je vais faire que la seconde valeur est est pas euh... est différente d'un premier l'un euh... je vais faire ces clous de binary. Ok. Et ici, je vous voyez je je re-use un var. Et, là, ma ma problème ici c'est juste euh... par défaut euh... je construis un problème avec m est 4 d'autre que je read d'autres liens de commandes que c'est et j'ai ma pre-amble donc je compute je sais que j'ai m times m-1 donc c'est m-m-m-m et ici j'ai le nombre de constraints donc c'est un un peu d'un pain tu dois savoir en avance tu dois computer combien de constraints tu vas générer donc donc c'est horrible pour l'utilisateur mais c'est très convaincu pour le développeur hein parce que tu peux initialiser toute ta structure quand tu read l'éleur et donc c'est la raison pourquoi le format est fait pour les développeurs pas pour l'utilisateur donc tu dois avoir quelque above que on fait tous les choses et ensuite tu peux ajouter dans un mapping donc c'est pas très important pour vous mais je vais vous montrer ce qui s'occupe vraiment quand tu fais des planes et ce que ça signifie sur le tricot et nous c'est important si tu veux faire ça et donc je fais deux types de constraints je fais au moins une pour toutes les recherches et l'atmos une pour tous les seats c'est ok donc tu sais que tu peux tu peux tu peux ton computer si tu tries pour le problème avec 20 recherches donc tu ne tu peux tu peux un computer parce que un solver utilise 100% de ton CPU et il peut prendre toujours et donc il peut tuer un laptop d'accord donc tu ne tu ne laisse le solver essayer de solver ce problème ok oui bien j'ai déjà tué moi-même un certain laptop donc tu ne le fais pas ok donc juste pour faire la script si tu n'as pas fait rien c'est ce que tu vas voir donc tu as PCNF 12 c'est 4 x 3 ok et tu as le nombre de clés et tu vas voir les clés et le clés ici donc si tu veux le solver donc ceci donc donc j'ai déjà des mais tu juste règle et et il vous explique ok c'est satisfiable ok ce qui est important est donc tu as le tout configuration de le solver il y a 12 variables 22 constraints et tu vois que il y a typiquement 4 il y a des clés qui sont et il y a des clés qui ne sont pas les clés et donc c'est tu as 9 conflits 9 décisions donc c'est très facile et je te dis assigné par seconde c'est 16 000 remercie que quand je te dis je te dis que le solver est très très très très c'est il devrait être 10 000 de seconde et ici c'est parce que il n'est pas beaucoup ok donc maintenant si je veux le faire pour je l'ai fait pour 10 tu vois que ça va prendre quelques secondes ok et si tu le fais avec 20 ok maintenant je peux me tuer mon computer il va prendre l'âge somatique et essayer de le solver avec le crypto mini-sat mais si tu désactivé l'activé le la parce que ça va me tuer le problème mais si tu n'as pas n'as pas de c'est pour dédicé pour ce genre de problèmes tu n'as pas pas de le solver ok et donc tu tu le tuer ici tu vois ici on est 103 1000 assignements par secondes ok donc tu vois que ce ce devrait être le normal ce même si si le c'est c'est je croise le le c'est encore ok donc ce c'était pour l'on tout maintenant e je voulais vous de la typiquement tu tu vois le le lent donc c'est le problème que on ne peut que ce 380 liables et le 3600 s'accélter donc ce sont un problème très tinnant pour la pour Donc maintenant, j'ai le même problème, exactement le même encodement, mais en utilisant le format OPB. Donc ce n'est pas un très bon script, donc c'est typiquement la même chose qu'on l'a vu. Mais nous avons utilisé une feature spécifique de Sat4j. Donc pour la première, c'est exactement le même que dans l'exemple précédente. Mais nous avons utilisé plus de 1x, le numéro. Et ensuite, nous avons le greeter ou l'équal à 1. Donc ça ne change pas. Et ici, j'ai utilisé quelque chose que j'aime, mais ce n'est pas complètement officiel. Ça signifie que si vous donnez des exemples pour l'évaluation de la pb, avec ces choses, ça complique. Parce que c'est supposed à être utilisé seulement si vous utilisez les contraintes non-lineares. Donc si vous voulez utiliser les contraintes non-lineares, vous devez avoir un moyen d'avoir des littéraux et vous le faites. Donc ici, ça me permet d'évaluer très facilement. Je prends les littéraux négatifs ici. D'ailleurs, j'ai besoin d'avoir quelque chose d'évaluer pour avoir un minus-1 et de réévaluer mes contraintes. Et j'ai exactement le même problème. Et maintenant, ce que nous allons faire, je pense que vous avez exactement, oui. Donc maintenant, j'ai ces contraintes. Et je vais utiliser le set4j, le set4j pb. Donc c'est le set, je n'ai que le set research. Ok, ici, par défaut, il doit prendre à peu près le même temps. Il doit prendre... Oui, c'est un peu plus lent, je pense. Oui, c'est un peu plus lent, mais ok. Ce n'est pas un grand délire. On va voir si vous voulez évaluer les contraintes dans le set4j. Vous le faites de cette façon. Vous évaluez les contraintes avant le nom du file. Vous me dites que ça ressemble un peu plus vite. Ok, on va essayer pour 20. Est-ce que ça fonctionne? Vous voyez que si vous regardez le nom des contraintes, vous voyez que c'est pb. C'est-à-dire que les contraintes sont pb, parce que vous devez, si vous utilisez les contraintes, vous devez avoir des contraintes pb. Et je vais évaluer mon computateur si j'attends, pour que ça fonctionne. Donc ça ne fonctionne pas. Donc nous devons avoir quelque chose de différent. Si on veut que ça fonctionne, on va utiliser le format opb, dans lequel on peut évaluer directement l'atmos. Donc c'est très important. On va voir le script. Donc ça ne change pas pour le premier, pour le least. C'est le même que le premier. Et maintenant on peut voir ici... C'est ce que je vais vous dire. Ce que nous avons à faire, c'est... C'est ce que nous voulons exprimer. Mais si nous devons utiliser la représentation de la compétition de pseudo-préhension, donc nous allons utiliser... Ici, nous sommes dans un cas où nous avons un minus-1. Mais ça va être représenté différemment dans le solver. Mais d'un point de vue basé, nous devons le faire. Donc dans Sat4j, je pouvais avoir écrit moins ou moins que 1. Mais c'est quelque chose que nous allons travailler avec aucun solver. Donc vous voyez que ici et maintenant, le problème est plus facile à évaluer. Donc, qu'est-ce qu'il y a ici ? Donc, nous allons voir. Si je donne maintenant ce format en OPB sans aucun nom. Donc c'est un format. Nous allons voir avec 20. Donc c'est une résolution. Est-ce que ça fonctionne ? Non, ça ne fonctionne pas. Donc ce que je vais utiliser maintenant est de l'utiliser. Et vous voyez maintenant que le problème s'exprime dans un second. Et c'est là où le système de prouve n'a pas de manière de prouvoir ces formuleurs avec le système de prouve résolution. Ou vous pouvez utiliser les pièces de cutting. Vous pouvez utiliser la break-in symétrie. Mais vous devez avoir quelque chose spatial. Donc ça ne veut pas... Donc ça veut dire que tous ces problèmes sont difficiles pour le système de prouve. Ça ne veut pas dire que le système de prouve est difficile à préparer parce qu'il y a un moyen facile de les solider avec d'autres approches. Mais ça veut dire... Si vous avez le right tool, ça devient très facile. Donc maintenant, peut-on faire quelque chose pour ce problème dans CNF ? Donc vous pouvez faire quelque chose. Si vous utilisez... On va demander SET4J à détecter les cardinalités dans le file original. Et on verra les cards détectés. Donc c'est 20... Ok, et vous voyez que le temps de détecter les cardinalités et de les solider, c'est juste très facile. Donc ce qui est important ici... c'est de regarder ce qui se passe. Ok. Donc ça dit... Ok, j'ai trouvé 20 clés et j'ai travaillé 3610 clés où je vais regarder les cardinalités et ça me dit... Ok, j'ai trouvé 19 cardinalités et ça m'a pris 63 ms. Ok. Et de ça, maintenant j'ai retiré les 3610 clés et j'ai ajouté les 19 clés les cardinalités que j'ai trouvé. Et maintenant, à l'intérieur de 3 000 clés j'ai seulement 39 clés. Ok. Donc vraiment, on remet les originales clés et on utilise les cardinalités à l'intérieur de ça. Et vous pouvez voir que il y a exactement... il y a exactement 19 conflits qui sont exactement le nombre de m-1. Ok. Donc, typiquement, c'est parce que il y a de l'eau. Est-ce que je peux mettre le research 1 dans le C1 ? Il y a de l'eau. Il ne peut pas mettre le research 1 dans le C2 ? Non. Et il y a de l'eau jusqu'à la fin. Et puis il s'arrête. Et c'est exactement ce qu'il fait. Donc, c'est pour voir ce que Sat4j fait. Qu'est-ce que la résolution ou la résolution pour cela ? Donc, ce n'est pas... Au moins, si vous avez des graviers sur votre computer, vous ne verrez pas. Mais... Ok. C'est ça. Donc, on va essayer de voir... Ok. Donc, je vous montre la picture ici. Donc, on verra... Donc, les bleus sont des décisions. Ici, vous avez des conflits. Et on verra facilement après ça. Donc, c'est ce qui se passe si vous faites la résolution. C'est pour le problème n'est-ce que 4. Si je veux le faire pour la résolution, c'est ce que vous avez. Ok. Donc, typiquement, le former était un classique sort de de la recherche binaire, je dirais. Typiquement, il ne peut pas le faire. C'est le plus mauvais cas. Donc, il faut essayer tout. On verra vraiment ce qui se passe quand vous faites les peintures. Donc, Mathieu n'est pas là-bas, on verra qui sait pourquoi ça se passe. Donc, la première décision est minus researcher 1 seat 1. Ok. Ça ressemble bien. Donc, la deuxième chose est minus researcher 4 seat 3. Si quelqu'un dans l'audience s'occupe de la source code, il devrait savoir pourquoi. Pourquoi ça se passe. Si quelqu'un dans l'audience s'occupe de la source code, il ne devrait pas être la dernière. Donc, vous pouvez seulement savoir que si vous utilisez la source code minisat. Donc, la façon dont le minisat n'a jamais été retiré, quand il a retiré quelque chose, il a changé les choses. Donc, quand vous avez pris le premier élément de la juristique, si tout le valeur est la même, c'est le cas quand vous commencez parce que toutes les activités sont 0, ça va mettre la dernière version à la fin, la dernière élément à la fin. Donc, vous commencez toujours avec la première variable et puis vous allez là-bas en diminuant l'ordre. Donc, c'est ce qui se passe. Donc, ici, vous avez minus R4 sur la seat 3, minus R4 sur la seat 2. Et ça propague parce que de ces constraints que il faut être la recherche 4 sur la seat 1. Ok? Et puis, ça propague beaucoup de choses, parce que ça ne peut pas être d'autres recherches sur la seat 1. Ok? Puis, vous faites une autre décision qui sera pas la recherche 3 sur la seat 3, mais puis, ça propague, il faut être la recherche 3 sur la seat 2. Et puis, ça ne peut pas être la recherche 1 ou la recherche 2 sur la seat 2. Et puis, vous propaguez que la recherche 1 doit être sur la seat 3, et puis la recherche 2 doit être sur la seat 3. Et ce n'est clairement pas possible. Et c'est ce que vous avez ici. C'est varié. Et puis, vous vous reprenez avec ces constraints ici. C'est ce que vous avez appris quand vous reprenez, quand vous faites l'analyse des conflits. Et typiquement, vous avez ce qui est faux, donc vous avez deux éléments qui sont vrais. Et ici, vous allez propaguez que la recherche 3 ne peut pas être sur la seat 3 et la recherche 3 ne peut pas être sur la seat 2. Et puis, vous Potter et기를ฺ Net Vous vous reprenez et vous reprenez ici, et il dit qu'il devrait être le cas, donc j'ai deux, trois éléments, il devrait être gritté sur trois, donc ça veut dire que la recherche 4 devrait être dans le site 2, dans le site 3, ou en 1, ok, et je propague, et ça me donne une contradiction, et donc on est terminé, ok. Donc, une fois, c'est vraiment comment ça fonctionne, donc tu fais des décisions et ensuite, juste par propagation, rien ne fonctionne, et ensuite, tu finis. Et ce n'est pas possible dans le cas de résolution, parce que tu, typiquement, juste par propagation, tu vas dans toute la décision précédente et tu es terminé. Donc, c'est comme ça que ça fonctionne pour le plan d'exploitation, ok, ok. Juste pour vous donner un peu de travail pendant le café. Ok, donc je pense que tu, par, c'est un démon, que tout ce que je t'ai dit ce matin, c'est vrai, ok, parce que tu as vu que, ok, c'est difficile de se résoudre si c'est dans le CNF, si c'est avec l'expression des contraintes cardinaires, ça fonctionne, si tu utilises le système d'exploitation qui t'amène, et que nous pouvons retirer du CNF les contraintes cardinaires, et puis nous pouvons utiliser cet engin et ça fonctionne, ok. Ok, ton tour, et donc l'idée était d'assurer que tu puisses jouer un peu avec le solver, et d'aider à utiliser le CNF ou le opb encodement, et donc quelque chose que tout le monde sait, on a cette idée de Sudoku, ici on peut essayer avec un petit, parce que c'est peut-être plus facile de se passer, donc tu dois avoir un n² par n² problème, et ici on a un n equals 2, donc c'est un 4x4, ce que tu veux avoir c'est d'utiliser les numéros 1 à 4, et d'assurer que pour chaque ligne, pour chaque columne et pour chaque bloc de 4, tu as différents numéros, ok, ce qui est exactement ce que tu as ici, et donc ça peut être facilement exprès avec les contraintes equal, donc tu peux les exprès directement dans l'opb, c'est un contraint, si tu veux utiliser le CNF format, c'est un peu plus compliqué, ok, et il y a un petit tout tool que tu peux utiliser pour vérifier la solution, ok, donc typiquement tu pourras avoir un file, ou pb ou cnf, et tu pourras utiliser either.satforgy.pb ou org.satforgy.co pour résoudre le problème, et puis tu peux utiliser ce script, décode Sudoku 4, et ça va vous montrer, ça ne va pas vérifier que tous les valeurs sont différents, ça va juste déployer le Sudoku de cette façon, pour que tu puisses vérifier si ça fonctionne ou pas, ok, et je vais vous montrer que j'ai une solution pour ça, et puis on a des problèmes, et des problèmes qu'on peut résoudre aussi, il y a beaucoup, donc certains d'entre vous ont vu cette visualisation de Satforgy en travaillant sur une spécifique bench rack, donc tu peux rouler sur ton laptop si tu veux, tu justes de rouler sur cette commande, et ça va vous permettre de voir ça, remember that you can kill your laptop running this too long, but if you want to do it for a few minutes, and if you have a very large screen, then you can have the remote control on one side and see the visualisation of the other side, and you can really control the way the solver works, so I just show you here how it works, so this is the remote control, ok it's not very nice currently because of the restart strategy, let's say that we have no restarts, so now I just removed the restarts, so you can do a restart, so the restart is the, you have this, each time I do a restart, you have a gray bar coming, each time I have, I clean the, the learn closes, I have a yellow bar saying ok, I'm cleaning, you see the number of propagations, which is 15,000, 13,000 per second, and you will see that when you learn more, the number of propagation with decrease, ok, so I can clean, it should be, and now you come back to more propagation, you can change the, here you have for instance LBD2 as a way to express, so those are settings you have in the solver, and typically everything, every setting in the solver can be changed live while the instance is running, and then we have that funny close evaluation here, so what do you find in this panel, here you have the size of the learn closes, here you have, where do you meet conflict, this is the depth of the search tree, and here it's similar, but it's how many decisions did you make before reaching a conflict, so typically this is the decision plus the propagation, ok, so how many assign variables before you reach the conflict, so this is around 270 something, and you need to decide over 155 variables before reaching a conflict, which is typically a lot, and here you see the index of the variables that are chosen, so you see that those variables are never chosen, we can try to guess what are those variables, and typically between 150 and 260, the variables are not chosen, ok, and so what we want is typically we want to find a way to choose, because here it means that there is sort of a problem, they are typically propagated, so the idea is if you have these variables, they propagate typically the others, that the reason why they are not chosen, and so what we want to do here is to be able to change the heuristic, and to see if we can have for instance some random, so this is random literal selection phase strategy, yes, but here I can use so-called random walk, which means that for 10% of the case, I will just randomly pick a variable instead of choosing the real one, and you see that now we are going to have an effect here, we are picking most of the elements, so in that case, so it's not very good for us because we are having new decision levels here, it's increased a bit, but then you can, this should be used with restarts for instance, I'm going to restart, so you see the effect of restarts, there is a gap, here I am cleaning, and sometimes the restarts helps you to decrease, so this is not too bad, this is decreasing a bit, and we solved this issue, but now look at this, we never have elements here, so it takes age, but you can sort of try to guess what's going on with your solver, ok, so the first thing is we want to try to solve our Sudoku problem, I should have the solution here, ok, so one way to solve it is the following, so we are going to use, ok, let me stop this one, so this is the representation we are going to have for, this is the row, this is the column, and this is the value, ok, so what we want to do is to, we want to have a number that is row column value, so I just multiply this by 100, this by 10, and k, and that gives me exactly row column value for each id, ok, so the first constraint I have to have is I need to express that there is exactly one value for each cell, ok, we have to do it, so how do we do that, we know that we have n2, so n2 is n square, ok, so we start with 2, n square is 4, so we take a value of k from 1 to n square, here the plus 1 is just because range doesn't include the last one, ok, and I will just here, so I am given the cell, the cell is ij, ok, I am just creating for each value of k between n and n2, I am putting that in a close, ok, in a set of literals, and that set of literals should be equal to 1, I should have exactly one value per cell, ok, I don't know if there is a better way to do it than using this joint map with a lambda, but I could only do it that way, because the language I know, so you need to do it, I want to have for each row only once each value, ok, how can you do that, you still loop on k, that will be our value between 1 et n2, and here we are given the row, so this is the first element, so now what we have to do is for each column, we are going to look at that particular value and we are going to write that for given i, for given k, if I sum up over the column for that value, particular value of k, it should be equal to 1, ok, so I will have all for, so I first got for all cells, now I am having for all rows for each value of k, so for the row 1, I will have a 9 constraints, one for value 1, so all the values for the different column sum up for value 1 should be 1, same thing for value 2, value 3 and so on, so I have a symmetric one for the column, here the value is changed, so it's k, but here it's 1, it's i that is changed, ok, and we have the block, ok, the block it will be, I will take a value between n and n2, and now I have to find that block, so typically the block, I am given the starting point in row on columns of the block, and I need to go from r to r plus n, ok, because this is n by n2, so and I take column and column plus n, and typically using this I can create all the variables for i, j and k, and this also has to be 1 for each value of k, and so the full encoding is that way, so here it's just that if there is no thing given that will be sudo coup 3, but by default I will use 2, so default is 3 and else I will read from the command line, so n2 is n square, so what is the maximum value, it's n2 times 100 plus n2 times 10 plus n2, and then I can write this famous, the number of variables is max here, so it's not exactly the number of variables, it's the maximum id of the variable, ok, that will be 444 for sudo coup, that will be 999 for the 9 sudo coup, so it's really the max id, but it means that all the solvers will reserve in a space to store that amount of variables in their data structure, so it's a bit stupid because we will use much less values on this, so maybe Maté does that, I think he does that because he said it is renumbering the variables, so Lingeling does it for sure, probably cadical also, so people who really want to minimize the amount of memory they use, they typically use another numbering inside the solver than what you provide in the input, so that they can replace and re-change the ideas, and so here I just, for each cell, so this is two loops to create the constraints on the cells, then you have the constraints for the row, constraints for the column, and then I can find another way to write this expression, I have my blocks, and so I will just create those two loops to go through all the blocks and to be able to have our thing. So you should have something like this, so this is how it looks like, so it's a bit boring because there are all similar constraints, so you have the first, now you see that only, okay, so this is the fourth, so we have only the last value changing, so it means here for the first cell it must be one, two, three, or four, for the second cell it should be, well first row, second column it should be one, two, three, and so on, and then you can see that now we are looking at, so first cell, then, so here it's second column, third column, first, yes, so now it's on the first, the value one should be, there should be only one in the first row, okay, because you change the column each time, and you do that for the values here for, same thing for here the second column, you have all the, you check that you have the value one only in one column and so on, so we have, so we should have the same thing for the row, that should be here, so now you see we have value one, if we change the row there should be only one, and so on, until here, yes, and then we have the block constraints that are here, we should have a block constraint because it's one one, one two, two one, two two, this is really a block, and here that value of the block should be equals to one, and if you have all those constraints, now you do, so it gives you a solution, okay, so this is not a surprise, but the only issue is here looking at those numbers, you only are interested in the value here for instance one one three, this is positive, it means there is row one column one the value three, then row one column two there is a value two, row one column three there is a value one, and so on, okay, so that the reason why I created the small scripts that will just take the output of the SAT solver and that will show you here the Sudoku with the right, the Sudoku presentation, and this is typically what you need to do with the SAT solver, so the SAT solver you have those Boolean variables with indexes that do not mean anything, they are just numbers, so there must be a program to translate for your original problem to DMX, okay, and you must have something that decode and that will give you, that will understand what means your solution, okay, each time you, whatever you work with a SAT, PB, MACSAT, whatever solver, you will have the translation, the program to translate to the output format, the program to translate back from the solution to the original problem, and here it's easy, I'm just taking, I expect all the values to be correctly ordered, and I just pick the last value, okay, here I take the positive one and I display this third, the fourth character, and that's it, so this is what does the Python script, okay, so who tried to do that, okay, so I would like just to show you, so I will provide the solutions, right, the script so that everybody will be able to play with that, so typically here, yes, one thing, so this is for the special case of the Sudoku, there was no int, okay, there was no int, so here I took one from the web, okay, actually do you know what is the minimal number of int you need, because the Sudoku, there is a unique solution, okay, it means that given the int, there is a unique way to fill in, so usually the smallest number of int of values that they should give you, so that you still have a single solution is 17, you cannot have less than that, if you have less than 17, then it cannot be unique, someone proved that when it was, so the Sudokus were around 2005 or something, a lot of people have been generating, in constrained programming, people have been wrote a solver to generate Sudokus for newspapers, but it has to be done in a smart way, because you know they have different level of difficulties, here we just generate something, actually because Sat4j is deterministic, it's going to always generate the same one, but then if you give the int, it works, so here you have a 33 int, and actually you just have to cut and paste, so in our case, those constraints in the solver, in the OPB file at the end, you just update the number of constraints with those 33, you need close, and it will give you the solution for the Sudokus, okay? Okay, so that was the idea of using Sudokus for this, and now something I think is important, subset sum, so subset sum is typically a problem where you are given a set of numbers, here you have a set of numbers, and the question is, is there a subset of this, which sums that you can, you can take that subset, sum up all the elements and get 53, and this isn't complete, so okay? And so the funny thing is, this is written exactly with one constraint, okay? This is exactly one constraint if you use OPB, so this is how you are going to write it, typically you have all your weights here, okay? For each weight, you put the Boolean variables, so you have 8 weights, so 8 Boolean variables, and you just tell, this equals to 53. If there is a subset that it equals to 53, it will tell you, okay? So do you think there is a solution, so that's the question, right? So let's ask Satva J, yes there is one, so you need to take the second, the third, the sixth, and the eighth, and if you sum them up, it should be 53. So second, X2, X3, X6, so X2 is 22, X3 is 14, 9, 8, 6, 15, 23, yes, so the solver, it doesn't mean that the solver is correct, but at least it works. So there is another example that you can try to, it's just one constraint to write, it's easy, and you can solve also that subset some problem with bigger numbers. So that one you could solve it probably by end, just thinking about it, but the second one, so it's not much more difficult for the solver because there are still just 10 variables, Boolean variables, but for us, it's much more complicated because we have to do the math on the numbers to find out if it's sum up to this, and so this is not as easy as this one, okay? Typically, this is something a bit more difficult, so you should be able to answer me this, so it's just something easy to do. Okay, one constraint, and the solution should be X3, 4, 5, 7, 9, and if you do the math, it should work, okay? So this is for subset some, so for your information, guess which was, so there are some subset some problem in the PBA valuation 2005 or 2006, guess which solver was the most efficient on the subset some problem? Yes, mini set plus, the plain set solver using translation into CNF, so those benchmarks are called ARDAL, and if you look at them, they are just a single constraint, and they're pretty difficult, they are 10 of them, typically a mini set plus can solve 4 of them, so it's the fastest and best solver on those ones. But for mini set, the translation does not depend on the coefficients, mini set plus? Yes, yes, but he has, so for that particular one, he has BDD encoding, totalizer sorting networks, and Synth encoding, I think, he probably uses Synth encoding for that one, and it works, that's the best solver for that. Okay, so up to now it was only some satisfaction problems, let's play a bit with an optimization problem, so you really need to have the header of the OPB file that way with the space here, you know, those are the things, but okay. So here you can express, here for instance, if I have a closed x2 or x3 or x1 or x2 or x3, and I want to minimize, to have a model which minimize 4x1 plus 3x2 plus x3, I'm going to write it that way. So I take exactly the same representation of the left-hand side, and I put it here, ending here with the comma, and so it has to be min, it has to be minimized. Okay, so the idea is, what we want to solve is the knack-tack problem, so we have some weight, we have a limitation of our weight, a capacity, we have a value, and so what we want is to find to, it's a bit like we have a luggage with limitation, and what are the things I can put for, given their values to bring back over the things with the most value, right? This is a very practical example. So are you going to do that? So you are going to do it that way? So you have one constraint, which is the constraint with the capacity. So you put, for each item, you put the Boolean variables with the capacity, and here you put the total capacity, so it's less or equal to 165. So if you want to do it the suitable and evaluation way, you will have to negate all the weight greater or equal to minus 165. Okay, but I use the set4j away. And so now I still have to use min, okay? So I'm going to negate all the weight, all the values, okay? Okay, that way finding a solution with a minimal value will be similar to finding something maximizing the value of the positive value. Minimizing the negative values is similar to maximizing the positive values. And so how does it work for set4j? So now I want to show you something, okay? So this is the linear search we have found, we have noticed, okay, this morning. So it takes a first, so here I tell you you can be lucky or not. So the first solution if one was minus 247, then 252, and so on. And the final one is that one, okay? And you see that this is found very quickly. And then you, it tells you, okay, I found the optimum after seven steps. And this is the solution, this is what you have to bring back home, and this is how much it gives you. Okay? I'm happy to, if you have any questions, actually this project on GitHub will be open. If you have any questions, just open an issue and I will answer. If you want me to add whatever problem, I will just update it. That way people from the summer school will be able to benefit from that. So do not hesitate if there is something particular. So I didn't plan really to show the visualization, but it came to my mind, so I added it. So if you need something, just tell me and I will try to add the information. And that way there is a common place for all attendees of the SAT SMG summer school. Okay, so in that case it's been 5 hours, 10 minutes since you have been. So that's really long time. If you just want to even speak the same word for 5 hours, it's fairly tiring to do all of this. Daniel has been really working for a few weeks I guess. So thanks a lot for this whole day of presentation and we really appreciate it.