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