~verifypn-cpn/verifypn/col_weight_fix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#ifndef STSOLVER_H
#define STSOLVER_H
#include "Structures/State.h"
#include "../lpsolve/lp_lib.h"
#include "Reachability/ReachabilityResult.h"
#include <memory>
#include <chrono>

namespace PetriEngine {
    class STSolver {
    
    struct STVariable {
        STVariable(int c, REAL v){
            colno=c;
            value=v;
        }
        int colno;
        REAL value;
    };
    
    struct place_t {
        uint32_t pre, post;
    };
        
    public:
        STSolver(Reachability::ResultPrinter& printer, const PetriNet& net, PQL::Condition * query, uint32_t depth);
        virtual ~STSolver();
        int CreateFormula();
        int Solve(uint32_t timeout);
        void PrintStatistics();
        Reachability::ResultPrinter::Result PrintResult();
        int getResult(){
            return _ret;
        }
        uint32_t getAnalysisTime(){
            return _analysisTime;
        }
        
    private:        
        std::string VarName(uint32_t index);
        void MakeConstraint(std::vector<STVariable> constraint, int constr_type, REAL rh);
        int CreateSiphonConstraints();
        int CreateStepConstraints(uint32_t i);
        int CreatePostVarDefinitions(uint32_t i);
        int CreateNoTrapConstraints();
        void constructPrePost();
        uint32_t duration() const;
        bool timeout() const;
        
        Reachability::ResultPrinter& printer;
        PQL::Condition * _query;
        std::unique_ptr<place_t[]> _places;
        std::unique_ptr<uint32_t> _transitions;
        const PetriNet& _net;
        const MarkVal* _m0;
        lprec* _lp;
        uint32_t _siphonDepth;
        uint32_t _nPlaceVariables;
        uint32_t _nCol;
        int _ret = 0;     
        uint32_t _timelimit;
        uint32_t _analysisTime;
        int _buildTime;
        bool _lpBuilt;
        bool _solved;
        int _noTrap = 0;
        std::chrono::high_resolution_clock::time_point _start;
    };
}
#endif /* STSOLVER_H */