00001 00017 #include "OSiLWriter.h" 00018 #include "OSInstance.h" 00019 #include "OSParameters.h" 00020 #include "OSCommonUtil.h" 00021 #include "OSBase64.h" 00022 #include "OSMathUtil.h" 00023 00024 #include <sstream> 00025 00026 using std::cout; 00027 using std::endl; 00028 using std::ostringstream; 00029 00030 //#define USE_DTOA 00031 00032 00033 OSiLWriter::OSiLWriter( ) { 00034 m_bWriteBase64 = false; 00035 m_bWhiteSpace = false; 00036 } 00037 00038 OSiLWriter::~OSiLWriter(){ 00039 } 00040 00041 std::string OSiLWriter::writeOSiL( const OSInstance *theosinstance){ 00042 00043 m_OSInstance = theosinstance; 00044 ostringstream outStr; 00045 int i, j; 00046 if(m_OSInstance == NULL) return outStr.str(); 00047 outStr << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ; 00048 outStr << "<osil xmlns=\"os.optimizationservices.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"os.optimizationservices.org http://www.optimizationservices.org/schemas/OSiL.xsd\" >" ; 00049 outStr << "<instanceHeader>" ; 00050 if( m_bWhiteSpace == true) outStr << endl; 00051 if(m_OSInstance->instanceHeader != NULL){ 00052 if(m_OSInstance->instanceHeader->name.length() > 0){ 00053 outStr << "<name>" + m_OSInstance->instanceHeader->name + "</name>" ; 00054 } 00055 00056 if(m_OSInstance->instanceHeader->source.length() > 0){ 00057 outStr << "<source>" + m_OSInstance->instanceHeader->source + "</source>" ; 00058 } 00059 if(m_OSInstance->instanceHeader->description.length() > 0){ 00060 outStr << "<description>" + m_OSInstance->instanceHeader->description + "</description>"; 00061 } 00062 } 00063 outStr << "</instanceHeader>" ; 00064 if( m_bWhiteSpace == true) outStr << endl; 00065 if(m_OSInstance->instanceData != NULL){ 00066 outStr << "<instanceData>" ; 00067 if( m_bWhiteSpace == true) outStr << endl; 00068 if(m_OSInstance->instanceData->variables != NULL && m_OSInstance->instanceData->variables->numberOfVariables > 0){ 00069 outStr << "<variables " ; 00070 outStr << "numberOfVariables=\""; 00071 outStr << m_OSInstance->instanceData->variables->numberOfVariables ; 00072 outStr << "\"" ; 00073 outStr << ">" ; 00074 if( m_bWhiteSpace == true) outStr << endl; 00075 // get variable information 00076 for(i = 0; i < m_OSInstance->instanceData->variables->numberOfVariables; i++){ 00077 if(m_OSInstance->instanceData->variables->var[i] != NULL){ 00078 outStr << "<var" ; 00079 if(m_OSInstance->instanceData->variables->var[i]->name.length() > 0){ 00080 outStr << " name=\"" ; 00081 outStr << m_OSInstance->instanceData->variables->var[i]->name ; 00082 outStr << "\""; 00083 } 00084 if( m_OSInstance->instanceData->variables->var[i]->type != 'C'){ 00085 outStr << " type=\"" ; 00086 outStr << m_OSInstance->instanceData->variables->var[i]->type ; 00087 outStr << "\""; 00088 } 00089 if( m_OSInstance->instanceData->variables->var[i]->lb != 0.0){ 00090 outStr << " lb=\"" ; 00091 outStr << os_dtoa_format( m_OSInstance->instanceData->variables->var[i]->lb) ; 00092 outStr << "\""; 00093 } 00094 if( m_OSInstance->instanceData->variables->var[i]->ub != OSDBL_MAX 00095 && m_OSInstance->instanceData->variables->var[i]->ub != OSNAN ) { 00096 outStr << " ub=\"" ; 00097 outStr << os_dtoa_format( m_OSInstance->instanceData->variables->var[i]->ub) ; 00098 outStr << "\""; 00099 } 00100 if(CommonUtil::ISOSNAN(m_OSInstance->instanceData->variables->var[i]->init) == false){ 00101 outStr << " init=\"" ; 00102 outStr << os_dtoa_format(m_OSInstance->instanceData->variables->var[i]->init) ; 00103 outStr << "\""; 00104 } 00105 if(m_OSInstance->instanceData->variables->var[i]->initString != ""){ 00106 outStr << " initstring=\"" ; 00107 outStr << m_OSInstance->instanceData->variables->var[i]->initString ; 00108 outStr << "\""; 00109 } 00110 outStr << "/>" ; 00111 if( m_bWhiteSpace == true) outStr << endl; 00112 } 00113 } // end the for loop 00114 outStr << "</variables>" ; 00115 if( m_bWhiteSpace == true) outStr << endl; 00116 } 00117 if(m_OSInstance->instanceData->objectives != NULL && m_OSInstance->instanceData->objectives->numberOfObjectives > 0){ 00118 outStr << "<objectives " ; 00119 outStr << "numberOfObjectives=\""; 00120 outStr << m_OSInstance->instanceData->objectives->numberOfObjectives ; 00121 outStr << "\"" ; 00122 outStr << ">" ; 00123 if( m_bWhiteSpace == true) outStr << endl; 00124 for (j = 0; j < m_OSInstance->instanceData->objectives->numberOfObjectives; j++){ 00125 if(m_OSInstance->instanceData->objectives->obj[j] != NULL){ 00126 outStr << "<obj" ; 00127 if(m_OSInstance->instanceData->objectives->obj[j]->maxOrMin.length() > 0){ 00128 outStr << " maxOrMin=\"" ; 00129 outStr << m_OSInstance->instanceData->objectives->obj[j]->maxOrMin ; 00130 outStr << "\""; 00131 } 00132 if(m_OSInstance->instanceData->objectives->obj[j]->constant != 0.0){ 00133 outStr << " constant=\"" ; 00134 outStr << os_dtoa_format(m_OSInstance->instanceData->objectives->obj[j]->constant) ; 00135 outStr << "\""; 00136 } 00137 if(m_OSInstance->instanceData->objectives->obj[j]->weight != 1.0){ 00138 outStr << " weight=\"" ; 00139 outStr << os_dtoa_format(m_OSInstance->instanceData->objectives->obj[j]->weight) ; 00140 outStr << "\""; 00141 } 00142 if(m_OSInstance->instanceData->objectives->obj[j]->name.length() > 0){ 00143 outStr << " name=\"" ; 00144 outStr << m_OSInstance->instanceData->objectives->obj[j]->name ; 00145 outStr << "\""; 00146 } 00147 outStr << " numberOfObjCoef=\"" ; 00148 outStr << m_OSInstance->instanceData->objectives->obj[j]->numberOfObjCoef ; 00149 outStr << "\""; 00150 outStr << ">" ; 00151 if( m_bWhiteSpace == true) outStr << endl; 00152 if(m_OSInstance->instanceData->objectives->obj[j]->coef != NULL){ 00153 for (i = 0; i < m_OSInstance->instanceData->objectives->obj[ j]->numberOfObjCoef; i++){ 00154 if(m_OSInstance->instanceData->objectives->obj[j]->coef[i]->idx > -1 ){ 00155 outStr << "<coef" ; 00156 outStr << " idx=\"" ; 00157 outStr << m_OSInstance->instanceData->objectives->obj[j]->coef[i]->idx ; 00158 outStr << "\""; 00159 outStr << ">"; 00160 // 00161 // 00162 outStr << os_dtoa_format( m_OSInstance->instanceData->objectives->obj[j]->coef[i]->value) ; 00163 //outStr << m_OSInstance->instanceData->objectives->obj[j]->coef[i]->value ; 00164 outStr << "</coef>" ; 00165 if( m_bWhiteSpace == true) outStr << endl; 00166 } 00167 } 00168 } 00169 outStr << "</obj>" ; 00170 if( m_bWhiteSpace == true) outStr << endl; 00171 } 00172 } 00173 outStr << "</objectives>" ; 00174 if( m_bWhiteSpace == true) outStr << endl; 00175 } 00176 // Now the constraints 00177 if(m_OSInstance->instanceData->constraints != NULL && m_OSInstance->instanceData->constraints->numberOfConstraints > 0){ 00178 outStr << "<constraints " ; 00179 outStr << "numberOfConstraints=\""; 00180 outStr << m_OSInstance->instanceData->constraints->numberOfConstraints ; 00181 outStr << "\"" ; 00182 outStr << ">" ; 00183 if( m_bWhiteSpace == true) outStr << endl; 00184 for (i = 0; i < m_OSInstance->instanceData->constraints->numberOfConstraints; i++){ 00185 if(m_OSInstance->instanceData->constraints->con[i] != NULL){ 00186 outStr << "<con" ; 00187 if(m_OSInstance->instanceData->constraints->con[i]->name.length()){ 00188 outStr << " name=\"" ; 00189 outStr << m_OSInstance->instanceData->constraints->con[i]->name ; 00190 outStr << "\""; 00191 } 00192 if(m_OSInstance->instanceData->constraints->con[i]->constant != 0){ 00193 outStr << " constant=\"" ; 00194 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->constant) ; 00195 outStr << "\""; 00196 } 00197 if(m_OSInstance->instanceData->constraints->con[i]->lb != -OSDBL_MAX ){ 00198 outStr << " lb=\"" ; 00199 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->lb) ; 00200 outStr << "\""; 00201 } 00202 if(m_OSInstance->instanceData->constraints->con[i]->ub != OSDBL_MAX){ 00203 outStr << " ub=\"" ; 00204 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->ub) ; 00205 outStr << "\""; 00206 } 00207 outStr << "/>" ; 00208 if( m_bWhiteSpace == true) outStr << endl; 00209 } 00210 } 00211 outStr << "</constraints>" ; 00212 if( m_bWhiteSpace == true) outStr << endl; 00213 } 00214 // now the linearConstraintsCoefficients 00215 if(m_OSInstance->instanceData->linearConstraintCoefficients != NULL && m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues > 0){ 00216 outStr << "<linearConstraintCoefficients " ; 00217 outStr << "numberOfValues=\""; 00218 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues ; 00219 outStr << "\"" ; 00220 outStr << ">" ; 00221 if( m_bWhiteSpace == true) outStr << endl; 00222 if( (m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx != NULL) && 00223 (m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el != NULL) ){ 00224 if(m_OSInstance->instanceData->linearConstraintCoefficients->start->el != NULL){ 00225 outStr << "<start>" ; 00226 if( m_bWhiteSpace == true) outStr << endl; 00227 if(m_OSInstance->instanceData->variables != NULL && m_OSInstance->instanceData->variables->numberOfVariables > 0){ 00228 if(m_bWriteBase64 == false){ 00229 for(i = 0; i <= m_OSInstance->instanceData->variables->numberOfVariables; i++){ 00230 outStr << "<el>" ; 00231 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->start->el[i]; 00232 outStr << "</el>" ; 00233 if( m_bWhiteSpace == true) outStr << endl; 00234 } 00235 } 00236 else{ 00237 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ; 00238 outStr << "<base64BinaryData sizeOf=\"4\" >" ; 00239 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->start->el, 00240 (m_OSInstance->instanceData->variables->numberOfVariables + 1)*sizeof(int) ); 00241 outStr<< "</base64BinaryData>" ; 00242 if( m_bWhiteSpace == true) outStr << endl; 00243 } 00244 } 00245 outStr << "</start>" ; 00246 if( m_bWhiteSpace == true) outStr << endl; 00247 } 00248 outStr << "<rowIdx>" ; 00249 if( m_bWhiteSpace == true) outStr << endl; 00250 if(m_bWriteBase64 == false){ 00251 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){ 00252 outStr << "<el>" ; 00253 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el[i] ; 00254 outStr << "</el>" ; 00255 if( m_bWhiteSpace == true) outStr << endl; 00256 } 00257 } 00258 else{ 00259 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ; 00260 outStr << "<base64BinaryData sizeOf=\"4\" >" ; 00261 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el, 00262 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof(int) ); 00263 outStr<< "</base64BinaryData>" ; 00264 if( m_bWhiteSpace == true) outStr << endl; 00265 } 00266 outStr << "</rowIdx>" ; 00267 if( m_bWhiteSpace == true) outStr << endl; 00268 } 00269 else{ 00270 if( (m_OSInstance->instanceData->linearConstraintCoefficients->colIdx != NULL) && 00271 (m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el != NULL) ){ 00272 if(m_OSInstance->instanceData->linearConstraintCoefficients->start->el != NULL){ 00273 outStr << "<start>" ; 00274 if( m_bWhiteSpace == true) outStr << endl; 00275 if(m_OSInstance->instanceData->constraints != NULL && m_OSInstance->instanceData->constraints->numberOfConstraints > 0){ 00276 if(m_bWriteBase64 == false){ 00277 for(i = 0; i <= m_OSInstance->instanceData->constraints->numberOfConstraints; i++){ 00278 outStr << "<el>" ; 00279 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->start->el[i]; 00280 outStr << "</el>" ; 00281 if( m_bWhiteSpace == true) outStr << endl; 00282 } 00283 } 00284 else{ 00285 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ; 00286 outStr << "<base64BinaryData sizeOf=\"4\" >" ; 00287 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->start->el, 00288 (m_OSInstance->instanceData->variables->numberOfVariables + 1)*sizeof(int) ); 00289 outStr<< "</base64BinaryData>" ; 00290 if( m_bWhiteSpace == true) outStr << endl; 00291 } 00292 } 00293 outStr << "</start>" ; 00294 if( m_bWhiteSpace == true) outStr << endl; 00295 } 00296 outStr << "<colIdx>"; 00297 if( m_bWhiteSpace == true) outStr << endl; 00298 if(m_bWriteBase64 == false){ 00299 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){ 00300 outStr << "<el>" ; 00301 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el[i] ; 00302 outStr << "</el>" ; 00303 if( m_bWhiteSpace == true) outStr << endl; 00304 } 00305 } 00306 else{ 00307 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ; 00308 outStr << "<base64BinaryData sizeOf=\"4\" >" ; 00309 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el, 00310 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof(int) ); 00311 outStr<< "</base64BinaryData>" ; 00312 if( m_bWhiteSpace == true) outStr << endl; 00313 } 00314 outStr << "</colIdx>" ; 00315 if( m_bWhiteSpace == true) outStr << endl; 00316 } 00317 } 00318 if(m_OSInstance->instanceData->linearConstraintCoefficients->value != NULL){ 00319 outStr << "<value>" ; 00320 if( m_bWhiteSpace == true) outStr << endl; 00321 if(m_OSInstance->instanceData->linearConstraintCoefficients->value->el != NULL){ 00322 if(m_bWriteBase64 == false){ 00323 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){ 00324 outStr << "<el>"; 00325 outStr << os_dtoa_format( m_OSInstance->instanceData->linearConstraintCoefficients->value->el[i] ); 00326 //outStr << m_OSInstance->instanceData->linearConstraintCoefficients->value->el[i] ; 00327 outStr << "</el>" ; 00328 if( m_bWhiteSpace == true) outStr << endl; 00329 } 00330 } 00331 else{ 00332 //outStr << "<base64BinaryData sizeOf=\"8\" numericType=\"double\" >" ; 00333 outStr << "<base64BinaryData sizeOf=\"8\" >" ; 00334 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->value->el, 00335 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof( double) ); 00336 outStr<< "</base64BinaryData>" ; 00337 if( m_bWhiteSpace == true) outStr << endl; 00338 } 00339 } 00340 outStr << "</value>" ; 00341 if( m_bWhiteSpace == true) outStr << endl; 00342 } 00343 outStr << "</linearConstraintCoefficients>" ; 00344 if( m_bWhiteSpace == true) outStr << endl; 00345 } 00346 if(m_OSInstance->instanceData->quadraticCoefficients != NULL && m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms > 0){ 00347 outStr << "<quadraticCoefficients"; 00348 outStr << " numberOfQuadraticTerms=\""; 00349 outStr << m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms; 00350 outStr << "\" >" ; 00351 if( m_bWhiteSpace == true) outStr << endl; 00352 for(i = 0; i < m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms; i++){ 00353 if(m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]){ 00354 outStr << "<qTerm" ; 00355 // the following attributes are required 00356 outStr << " idx=\""; 00357 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idx; 00358 outStr << "\""; 00359 outStr << " idxOne=\""; 00360 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idxOne; 00361 outStr << "\""; 00362 outStr << " idxTwo=\""; 00363 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idxTwo; 00364 outStr << "\""; 00365 if(m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->coef != 0){ 00366 outStr << " coef=\""; 00367 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->coef; 00368 outStr << "\""; 00369 } 00370 outStr << "/>" ; 00371 if( m_bWhiteSpace == true) outStr << endl; 00372 } 00373 } 00374 outStr << "</quadraticCoefficients>"; 00375 if( m_bWhiteSpace == true) outStr << endl; 00376 } 00377 if(m_OSInstance->instanceData->nonlinearExpressions != NULL && m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions > 0){ 00378 outStr << "<nonlinearExpressions"; 00379 outStr << " numberOfNonlinearExpressions=\""; 00380 outStr << m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions; 00381 outStr << "\" >" ; 00382 if( m_bWhiteSpace == true) outStr << endl; 00383 for(i = 0; i < m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions; i++){ 00384 if(m_OSInstance->instanceData->nonlinearExpressions->nl[i] != NULL){ 00385 outStr << "<nl" ; 00386 // the following attribute is required 00387 outStr << " idx=\""; 00388 outStr << m_OSInstance->instanceData->nonlinearExpressions->nl[i]->idx; 00389 outStr << "\">"; 00390 if(m_OSInstance->instanceData->nonlinearExpressions->nl[i]->osExpressionTree->m_treeRoot != NULL) 00391 outStr << m_OSInstance->instanceData->nonlinearExpressions->nl[i]->osExpressionTree->m_treeRoot->getNonlinearExpressionInXML(); 00392 outStr << "</nl>"; 00393 } 00394 if( m_bWhiteSpace == true) outStr << endl; 00395 } 00396 outStr << "</nonlinearExpressions>"; 00397 if( m_bWhiteSpace == true) outStr << endl; 00398 } 00399 outStr << "</instanceData>" ; 00400 if( m_bWhiteSpace == true) outStr << endl; 00401 } // end instanceData if 00402 outStr << "</osil>" ; 00403 if( m_bWhiteSpace == true) outStr << endl; 00404 outStr << endl; 00405 return outStr.str(); 00406 } // end writeOSiL