Comments (4)
Plus précisément :
Le delta de mon ArcEventRecorder contient les valeurs déjà traitées dans la propagation initiale
Autrement dit, le CoarseEventRecorder à mal informé l'ArcEventRecorder que ces valeurs avaient déjà été traitées
Ce problème concerne à coup sûr les Variables Graphes mais comme la machinerie des Recorder est la même (en gros seuls le DeltaMonitor change) il est possible que ce problème touche aussi les IntVar
Ceci se produit donc lorsque
- Le propagateur est incrémental
- Les domaines sont tels que la propagation initiale fait quelque chose
Charles, tu me manques!
from choco-solver.
Chers amis,
je vais poursuivre mon monologue avec un exemple simple :
J'ai une variable x={1,2,3} et deux propagateurs unaires P1 et P2 liés à x
P1 est un propagateur qui supprime des valeurs selon une table et P2 sert à maintenir le nombre NB de valeurs
dans le domaine de x. Je note Pi la propagation initiale et Pf une propagation fine
Propagation initiale de P1
Pi(P1) : on supprime la valeur 3
-> On schedule une requête liée au fait que x ait perdu la valeur 3
Propagation initiale de P2, on compte le nombre de valeurs dans le domaine de x
Pi(P2) : x = {1,2} donc NB = 2
Propagation fine on décrémente NB du nombre de valeurs retirées de x
Pf(P2,var=x, delta={3}) : NB = NB-1
=> NB=1 alors que x={1,2}
=> Ca fait n'importe quoi
Je n'ai pas encore codé cet exemple mais d'après ce que j'ai vu dans le code je pense qu'il y a réellement un
problème dans Galak y compris pour les variables entières. En tout cas ce bug se produit pour les variables graphes.
J'en revient donc à ce que j'ai dit précédemment : "un propagateur ne devrait se réveiller qu'aux évènements qui sont postérieurs à sa propagation initiale"
from choco-solver.
J'ai pour le moment un moyen de résoudre le problème mais il n'est pas encore très satisfaisant :
j'introduit une nouvelle méthode "initialPropagation()" dans l'interface IDeltaMonitor
qui est implémentée comme suit:
@OverRide //(IntDelta)
public void initialPropagation() {
first = delta.size();
}
@OverRide //(GraphDelta)
public void initialPropagation() {
first[NR] = delta.getNodeRemovalDelta().size();
first[NE] = delta.getNodeEnforcingDelta().size();
first[AR] = delta.getArcRemovalDelta().size();
first[AE] = delta.getArcEnforcingDelta().size();
}
Au début de chaque propagation initiale d'un propagateur Pi, on applique cette méthode sur tous les FineEventRecorders de Pi.
=> Vous voyez l'idée? Lorsqu'on exécutera la request, on iterera sur les valeurs du delta qui sont postérieures à la propagation initiale de Pi.
=> C'est simple et performant mais ça nécessite de modifier le coarseEventRecorder comme suit:
@OverRide
public boolean execute() throws ContradictionException {
if (!propagator.isActive()) {
evtmask |= EventType.FULL_PROPAGATION.strengthened_mask;
propagator.setActive();
}
if (evtmask > 0) {
propagator.coarseERcalls++;
int _evt = evtmask;
evtmask = 0;
// DEBUT MODIF JG
int nbR = propagator.nbRecorders();
IEventRecorder rec;
for(int i=0;i<nbR;i++){
rec = propagator.getRecorder(i);
if(rec instanceof AbstractFineEventRecorder){
for(Variable v:rec.getVariables()){
((AbstractFineEventRecorder) rec).getDeltaMonitor(v).initialPropagation();
}
}
}
// FIN MODIFS JG
propagator.propagate(_evt);
}
return true;
}
Par contre ça ne fonctionne pas tel quel car le "clear()" des deltas des "requêtes" est fait de manière LAZY et uniquement une fois la propagation initiale finie (tant que la propagation initiale n'est pas faite le propagateur n'est pas actif). Donc on remet à 0 l'index "first". Pour le moment ma rustine consiste à ajouter un "if(firstClear())" dans la méthode clear() ce qui n'est pas terrible mais mieux que rien. Mais je pense qu'on pourrait modifier la gestion des clear(). De toutes façons, à termes je rebasculerai sur un clear NON LAZY.
from choco-solver.
Problème résolu
- unfreeze après chaque exécution de FineEvent
- vitrualize après chaque exécution de CoarseEvent
-Gestion LAZY et non LAZY correcte sur tout type de variable
Reste le problème de la gestion des vues à domaines qui est discutée dans une autre issue
from choco-solver.
Related Issues (20)
- [BUG] Module descriptor seems overkill HOT 5
- `getGraphVal()` is missing from the Solution object.
- [Question] Excuse me, I want to quickly get the intersection of all variable solutions, how to do? HOT 1
- License change planned? HOT 2
- [BUG] Choco does not check for timeout during initialization phase HOT 2
- `Settings` object should become immutable once the model is setup HOT 2
- Add more Statistics (like peak depth) in Choco-Solver FlatZinc Frontend
- Reified global constraints are decomposed in Minizinc parser HOT 1
- Minizinc 2.8.1 compatibility issues HOT 7
- [BUG] MiniZinc/Choco 231102, `aaa1ae7b9`, `minimum_arg`, wrong solution HOT 1
- [BUG] MiniZinc/Choco 231102, `aaa1ae7b9`, `network_flow_cost`, missing solution HOT 1
- [BUG] MiniZinc/Choco 240130, `c90bf40a9`, reified count, missing solutions
- [BUG] MiniZinc/Choco 240130, `c90bf40a9`, `^`, missing solutions HOT 3
- [BUG] MiniZinc/Choco 240130, `c90bf40a9`, `count`, wrong solutions HOT 1
- [BUG] Cannot parser args correctly in fzn-choco HOT 1
- Lazy creation of variables
- [Documentation] Wrong specs in Implied and Reif constraints/propagators
- Makes it possible to create a constraint without a propagator
- [FEATURE] MultivaluedDecisionDiagram : Making the compact method optionnal
- [BUG] IsEntailed for InverseChanneling not working with negative bounds HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from choco-solver.