52beda98720241feeb1d894a7bfdfb4ef725e004
[satune.git] / src / ASTTransform / varorderingopt.cc
1 /*
2  * To change this license header, choose License Headers in Project Properties.
3  * To change this template file, choose Tools | Templates
4  * and open the template in the editor.
5  */
6
7 /*
8  * File:   VarOrderingOpt.cpp
9  * Author: hamed
10  *
11  * Created on October 11, 2018, 5:31 PM
12  */
13
14 #include "varorderingopt.h"
15 #include "csolver.h"
16 #include "tunable.h"
17 #include "satencoder.h"
18 #include "elementencoding.h"
19 #include "element.h"
20
21 VarOrderingOpt::VarOrderingOpt(CSolver *_solver, SATEncoder *_satencoder) : Transform(_solver) {
22         satencoder = _satencoder;
23 }
24
25 VarOrderingOpt::~VarOrderingOpt() {
26 }
27
28 void VarOrderingOpt::doTransform() {
29         BooleanVarOrdering direction = (BooleanVarOrdering)solver->getTuner()->getTunable(VARIABLEORDER, &boolVarOrderingDesc);
30         if ( direction == CONSTRAINTORDERING ) {
31                 return;
32         }
33
34         uint size = solver->allElements.getSize();
35         if (direction == CHORONOLOGICALORDERING) {
36                 for (uint i = 0; i < size; i++) {
37                         Element *el = solver->allElements.get(i);
38                         ElementEncoding *encoding = el->getElementEncoding();
39                         if (encoding->getElementEncodingType() == ELEM_UNASSIGNED)
40                                 continue;
41                         satencoder->encodeElementSATEncoder(el);
42                 }
43         } else {
44                 for (int i = size - 1; i > 0; i--) {
45                         Element *el = solver->allElements.get(i);
46                         ElementEncoding *encoding = el->getElementEncoding();
47                         if (encoding->getElementEncodingType() == ELEM_UNASSIGNED)
48                                 continue;
49                         satencoder->encodeElementSATEncoder(el);
50                 }
51         }
52 }