|
| 1 | +// Run: make |
| 2 | +// Then: ./AS |
| 3 | + |
| 4 | +// Code: Ben Wooding 8 Apr 2025 |
| 5 | + |
| 6 | +#include <iostream> |
| 7 | +#include <vector> |
| 8 | +#include <functional> |
| 9 | +#include "../../../../src/IMDP.h" |
| 10 | +#include <armadillo> |
| 11 | +#include <chrono> |
| 12 | + |
| 13 | +using namespace std; |
| 14 | +using namespace arma; |
| 15 | + |
| 16 | +/* |
| 17 | + ################################# PARAMETERS ############################################### |
| 18 | + */ |
| 19 | + |
| 20 | +// Set the dimensions |
| 21 | +const int dim_x = 3; |
| 22 | +const int dim_u = 2; |
| 23 | +const int dim_w = 0; |
| 24 | + |
| 25 | +// Define lower bounds, upper bounds, and step sizes |
| 26 | +// States |
| 27 | +const vec ss_lb = {1,0, 0}; |
| 28 | +const vec ss_ub = {6,10, 10}; |
| 29 | +const vec ss_eta = {0.25,1,1}; |
| 30 | +// Inputs |
| 31 | +const vec is_lb = {0,0}; |
| 32 | +const vec is_ub = {7,30}; |
| 33 | +const vec is_eta = {1,30}; |
| 34 | + |
| 35 | +//standard deviation of each dimension |
| 36 | +const vec sigma = {sqrt(0.001), sqrt(0.001), sqrt(0.001)}; |
| 37 | + |
| 38 | +// logical expression for target region |
| 39 | +auto target_condition = [](const vec& ss) { return (ss[0] >= 4.0 && ss[0] <= 6.0) && (ss[1] >= 8.0 && ss[1] <= 10.0) && (ss[2] >= 8.0 && ss[2] <= 10.0); }; |
| 40 | + |
| 41 | +//dynamics - 3 parameters |
| 42 | +auto dynamics = [](const vec& x, const vec& u) -> vec { |
| 43 | + vec xx(dim_x); |
| 44 | + xx[0] = 0.8192*x[0] + 0.03412*x[1] +0.01265*x[2] + 0.01883*(u[0] + u[1]); |
| 45 | + xx[1] = 0.01646*x[0] + 0.9822*x[1] +0.0001*x[2] + 0.0002*(u[0] + u[1]); |
| 46 | + xx[2] = 0.0009*x[0] + 0.00002*x[1] +0.9989*x[2] + 0.00001*(u[0] + u[1]); |
| 47 | + return xx; |
| 48 | +}; |
| 49 | + |
| 50 | +/* |
| 51 | + ################################# MAIN FUNCTION ############################################## |
| 52 | + */ |
| 53 | + |
| 54 | +int main() { |
| 55 | + |
| 56 | + /* ###### create IMDP object ###### */ |
| 57 | + IMDP mdp(dim_x,dim_u,dim_w); |
| 58 | + |
| 59 | + /* ###### create finite sets for the different spaces ###### */ |
| 60 | + mdp.setStateSpace(ss_lb, ss_ub, ss_eta); |
| 61 | + mdp.setInputSpace(is_lb, is_ub, is_eta); |
| 62 | + //mdp.setDisturbSpace(ws_lb, ws_ub, ws_eta); |
| 63 | + |
| 64 | + /* ###### relabel states based on specification ###### */ |
| 65 | + mdp.setTargetSpace(target_condition, true); |
| 66 | + |
| 67 | + /*###### save the files ######*/ |
| 68 | + //mdp.saveStateSpace(); |
| 69 | + //mdp.saveInputSpace(); |
| 70 | + //mdp.saveDisturbSpace(); |
| 71 | + //mdp.saveTargetSpace(); |
| 72 | + |
| 73 | + /*###### set dynamics and noise ######*/ |
| 74 | + mdp.setDynamics(dynamics); |
| 75 | + mdp.setNoise(NoiseType::NORMAL); |
| 76 | + mdp.setStdDev(sigma); |
| 77 | + |
| 78 | + /* ###### calculate abstraction for target vectors ######*/ |
| 79 | + /// each bound can be done seperately using: |
| 80 | + //mdp.minTargetTransitionVector(); |
| 81 | + //mdp.maxTargetTransitionVector(); |
| 82 | + ///or combined using: |
| 83 | + mdp.targetTransitionVectorBounds(); |
| 84 | + |
| 85 | + /* ###### save target vectors ######*/ |
| 86 | + //mdp.saveMinTargetTransitionVector(); |
| 87 | + //mdp.saveMaxTargetTransitionVector(); |
| 88 | + |
| 89 | + /* ###### calculate abstraction for avoid vectors ######*/ |
| 90 | + mdp.minAvoidTransitionVector(); |
| 91 | + mdp.maxAvoidTransitionVector(); |
| 92 | + |
| 93 | + /* ###### save avoid vectors ######*/ |
| 94 | + //mdp.saveMinAvoidTransitionVector(); |
| 95 | + //mdp.saveMaxAvoidTransitionVector(); |
| 96 | + |
| 97 | + /* ###### calculate abstraction for transition matrices ######*/ |
| 98 | + /// each bound can be done seperately using: |
| 99 | + //mdp.minTransitionMatrix(); |
| 100 | + //mdp.maxTransitionMatrix(); |
| 101 | + ///or combined using: |
| 102 | + mdp.transitionMatrixBounds(); |
| 103 | + |
| 104 | + /* ###### save transition matrices ######*/ |
| 105 | + //mdp.saveMinTransitionMatrix(); |
| 106 | + //mdp.saveMaxTransitionMatrix(); |
| 107 | + |
| 108 | + /* ###### synthesize infinite horizon controller (true = pessimistic, false = optimistic) ######*/ |
| 109 | + //mdp.infiniteHorizonReachControllerSorted(true); |
| 110 | + |
| 111 | + /* ###### synthesize finite horizon controller (true = pessimistic, false = optimistic) ######*/ |
| 112 | + mdp.finiteHorizonReachControllerSorted(true,10); |
| 113 | + |
| 114 | + /* ###### save controller ######*/ |
| 115 | + mdp.saveController(); |
| 116 | + |
| 117 | + return 0; |
| 118 | +} |
0 commit comments