trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
bpmpd_io.hpp
1 #include <vector>
2 #include <string>
3 using std::string;
4 using std::vector;
5 #include <iostream>
6 #include <assert.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 using namespace std;
10 
11 namespace bpmpd_io {
12 
13 enum SerMode {
14  DESER,
15  SER
16 };
17 
18 #pragma GCC diagnostic push
19 #pragma GCC diagnostic ignored "-Wunused-variable"
20 
21 template <typename T>
22 void ser(int fp, T& x, SerMode mode) {
23 
24  switch (mode) {
25  case SER: {
26  T xcopy=x;
27  int n = write(fp, &xcopy, sizeof(T));
28  assert (n == sizeof(T));
29  break;
30  }
31  case DESER: {
32  int n = read(fp, &x, sizeof(T));
33  assert (n == sizeof(T));
34  break;
35  }
36  }
37 }
38 
39 template <typename T>
40 void ser(int fp, vector<T>& x, SerMode mode) {
41  int size = x.size();
42  ser(fp, size, mode);
43  switch (mode) {
44  case SER: {
45  int n = write(fp, x.data(), sizeof(T)*size);
46  assert (n == sizeof(T)*size);
47  break;
48  }
49  case DESER: {
50  x.resize(size);
51  int n = read(fp, x.data(), sizeof(T)*size);
52  assert (n == sizeof(T)*size);
53  break;
54  }
55  }
56 
57 }
58 
60 {
61  int m, n, nz, qn, qnz;
62  vector<int> acolcnt, acolidx;
63  vector<double> acolnzs;
64  vector<int> qcolcnt, qcolidx;
65  vector<double> qcolnzs;
66  vector<double> rhs, obj, lbound, ubound;
67 
68  bpmpd_input() {}
69  bpmpd_input(int m, int n, int nz, int qn, int qnz,
70  const vector<int>& acolcnt, const vector<int>& acolidx, const vector<double>& acolnzs,
71  const vector<int>& qcolcnt, const vector<int>& qcolidx, const vector<double>& qcolnzs,
72  const vector<double>& rhs, const vector<double>& obj, const vector<double>& lbound, const vector<double>& ubound) :
73  m(m), n(n), nz(nz), qn(qn), qnz(qnz), acolcnt(acolcnt), acolidx(acolidx), acolnzs(acolnzs), qcolcnt(qcolcnt), qcolidx(qcolidx), qcolnzs(qcolnzs),
74  rhs(rhs), obj(obj), lbound(lbound), ubound(ubound) {}
75 };
76 
77 const char EXIT_CHAR = 123;
78 const char CHECK_CHAR = 111;
79 
80 void ser(int fp, bpmpd_input & bi, SerMode mode) {
81 
82  char scorrect='z', s=(mode==SER) ? scorrect : 0;
83  ser(fp, s, mode);
84  if (s == EXIT_CHAR) {
85  exit(0);
86  }
87 
88 
89  ser(fp,bi.m,mode);
90  ser(fp,bi.n,mode);
91  ser(fp,bi.nz,mode);
92  ser(fp,bi.qn,mode);
93  ser(fp,bi.qnz,mode);
94  ser(fp,bi.acolcnt,mode);
95  ser(fp,bi.acolidx,mode);
96  ser(fp,bi.acolnzs,mode);
97  ser(fp,bi.qcolcnt,mode);
98  ser(fp,bi.qcolidx,mode);
99  ser(fp,bi.qcolnzs,mode);
100  ser(fp,bi.rhs,mode);
101  ser(fp,bi.obj,mode);
102  ser(fp,bi.lbound,mode);
103  ser(fp,bi.ubound,mode);
104 }
105 
106 
107 
108 
110 {
111 
112  vector<double> primal, dual;
113  vector<int> status;
114  int code;
115  double opt;
116  bpmpd_output() {}
117  bpmpd_output(const vector<double>& primal, const vector<double>& dual, const vector<int>& status, int code, double opt) :
118  primal(primal), dual(dual), status(status), code(code), opt(opt) {}
119 };
120 
121 void ser(int fp, bpmpd_output & bo, SerMode mode)
122 {
123  char scorrect=CHECK_CHAR, s=(mode==SER) ? scorrect : 0;
124  ser(fp, s, mode);
125  if (s == EXIT_CHAR) {
126  exit(0);
127  }
128  ser(fp, bo.primal, mode);
129  ser(fp, bo.dual, mode);
130  ser(fp, bo.status, mode);
131  ser(fp, bo.code, mode);
132  ser(fp, bo.opt, mode);
133 
134 
135 }
136 
137 
138 #pragma GCC diagnostic pop
139 
140 
141 }