Fix compile errors
[openmx:openmx.git] / src / csolnpImportFrontend.cpp
1 /*
2  *  Copyright 2007-2012 The OpenMx Project
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *   Unless required by applicable law or agreed to in writing, software
11  *   distributed under the License is distributed on an "AS IS" BASIS,
12  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  */
16
17 #include <R.h>
18 #include <Rinternals.h>
19 #include <Rdefines.h>
20
21 #include <sys/stat.h>
22 #include <errno.h>
23
24 #include "omxDefines.h"
25 #include "omxState.h"
26 #include "omxNPSOLSpecific.h"
27 #include "omxImportFrontendState.h"
28 #include "matrix.h"
29
30 Matrix result_csolnpEqBStartFun;
31 Matrix result_csolnpEqB;
32 Matrix result_ineqLB;
33 Matrix result_ineqUB;
34 Matrix result_ineqVal;
35 //double EMPTY = -999999.0;
36
37 void setupIneqLess(struct Matrix *bl_ineqless, struct Matrix *bu_ineqless, int size)
38     {
39         int index = 0;
40         for(int offset = 0; offset < size; offset++) {
41             bl_ineqless->t[index] = NEG_INF;
42             bu_ineqless->t[index] = -0.0;
43             index++;
44         }
45     }
46
47 void setupIneqGreater(struct Matrix *lb, struct Matrix *ub, int size)
48 {
49         int index = 0;
50         for(int offset = 0; offset < size; offset++) {
51             lb->t[index] = 0.0;
52             ub->t[index] = INF;
53             lb->isColMajor = 0;
54             printf("%2f", lb->t[index]); putchar('\n');
55             printf("%2f", ub->t[index]); putchar('\n');
56             index++;
57         }
58 }
59     
60 void setupEqB(struct Matrix *eqPointer, int size)
61     {
62         int index = 0;
63         for(int offset = 0; offset < size; offset++) {
64             eqPointer->t[index] = 0.0;
65             index++;
66         }
67     }
68     
69     
70 void omxProcessConstraintsCsolnp(struct Matrix *lb_ineq, struct Matrix *ub_ineq, struct Matrix *eqb)  {
71     if (globalState->numConstraints == 0){
72         return;
73     }
74     
75     int i;
76     int size;
77         double EMPTY = -999999.0;
78     Matrix lb_ineqless = fill(1, 1, EMPTY);
79     Matrix ub_ineqless = fill(1, 1, EMPTY);
80     Matrix lb_ineqmore = fill(1, 1, EMPTY);
81     Matrix ub_ineqmore = fill(1, 1, EMPTY);
82     Matrix eqbound = fill(1, 1, EMPTY);
83     Matrix ineq_lb = fill(1, 1, EMPTY);
84     Matrix ineq_ub = fill(1, 1, EMPTY);
85     Matrix myeqb = fill(1, 1, EMPTY);
86     
87         for(int constraintIndex = 0; constraintIndex < globalState->numConstraints; constraintIndex++) {
88
89                 size = globalState->conList[constraintIndex].size;
90         
91             if (globalState->conList[constraintIndex].opCode == 0)
92             {
93                 Matrix lb_ineqless = fill(size, 1, EMPTY);
94                 Matrix ub_ineqless = fill(size, 1, EMPTY);
95                 setupIneqLess(&lb_ineqless, &ub_ineqless, size);
96             }
97             
98             if (globalState->conList[constraintIndex].opCode == 1)
99             {
100                 eqbound = fill(size, 1, EMPTY);
101                 setupEqB(&eqbound, size);
102             }
103             
104             if (globalState->conList[constraintIndex].opCode == 2)
105             {
106                 lb_ineqmore = fill(size, 1, EMPTY);
107                 ub_ineqmore = fill(size, 1, EMPTY);
108                 setupIneqGreater(&lb_ineqmore, &ub_ineqmore, size);
109             }
110             
111         printf("lb_ineqmore is: \n");
112         print(lb_ineqmore); putchar('\n');
113         printf("ub_ineqmore is: \n");
114         print(ub_ineqmore); putchar('\n');
115         
116         if (M(lb_ineqless, 0, 0) != EMPTY)
117         {
118             printf("inside lb_ineqless \n");
119             ineq_lb = copy(ineq_lb, lb_ineqless);
120             ineq_ub = copy(ineq_ub, ub_ineqless);
121         }
122         else if (M(lb_ineqmore, 0, 0) != EMPTY)
123         {
124             printf("inside lb_ineqmore \n");
125             ineq_lb = copy(ineq_lb, lb_ineqmore);
126             ineq_ub = copy(ineq_ub, ub_ineqmore);
127         }
128         else if (M(eqbound, 0, 0) != EMPTY)
129         {
130             printf("inside lb_eqb \n");
131             myeqb = copy(myeqb, eqbound);
132         }
133     }
134
135     if (ineq_lb.cols > 1)
136     {
137         ineq_lb = subset(ineq_lb, 0, 1, ineq_lb.cols - 1);
138         ineq_ub = subset(ineq_ub, 0, 1, ineq_ub.cols - 1);
139     }
140     
141     if (myeqb.cols > 1)
142     {
143         myeqb = subset(myeqb, 0, 1, myeqb.cols - 1);
144     }
145     
146     for (i = 0; i < ineq_lb.cols; i++)
147     {
148         lb_ineq->t[i] = M(ineq_lb, i, 0);
149         ub_ineq->t[i] = M(ineq_ub, i, 0);
150         printf("pointer check \n");
151         printf("%2f", lb_ineq->t[i]); putchar('\n');
152         printf("%2f", ub_ineq->t[i]); putchar('\n');
153     }
154     printf("%d", myeqb.cols); putchar('\n');
155     
156     for (i = 0; i < myeqb.cols; i++)
157     {
158         eqb->t[i] = M(myeqb, i, 0);
159         printf("%2f", eqb->t[i]); putchar('\n');
160     }
161     
162     lb_ineq->cols = ineq_lb.cols;
163     ub_ineq->cols = ineq_ub.cols;
164     eqb->cols = myeqb.cols;
165     //printf("eqb is: \n");
166     //print(eqb); putchar('\n');
167
168 }