/home/coin/SVN-release/OS-2.0.1/OS/src/OSCommonInterfaces/OSiLWriter.cpp

Go to the documentation of this file.
00001 /* $Id: OSiLWriter.cpp 2698 2009-06-09 04:14:07Z kmartin $ */
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 //#define USE_DTOA
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                         // get variable information
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                                         /* we no longer do init
00105                                         if(CoinIsnan(m_OSInstance->instanceData->variables->var[i]->init) == false){
00106                                                 outStr << " init=\"" ;
00107                                                 outStr << os_dtoa_format(m_OSInstance->instanceData->variables->var[i]->init) ;
00108                                                 outStr <<  "\"";
00109                                         }
00110                                         
00111                                         if(m_OSInstance->instanceData->variables->var[i]->initString != ""){
00112                                                 outStr << " initString=\"" ;
00113                                                 outStr << m_OSInstance->instanceData->variables->var[i]->initString ;
00114                                                 outStr <<  "\"";
00115                                         }
00116                                         */
00117                                         outStr << "/>" ;
00118                                         if( m_bWhiteSpace == true) outStr << endl;
00119                                 }
00120                         } // end the for loop
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                                                                 //outStr << m_OSInstance->instanceData->objectives->obj[j]->coef[i]->value ;
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                 // Now the constraints
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                 // now the linearConstraintsCoefficients
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                                                                 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ;
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                                                 //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ;
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                                                                         //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ;
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                                                         //outStr << "<base64BinaryData sizeOf=\"4\" numericType=\"int\" >" ;
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                                                         //outStr <<   m_OSInstance->instanceData->linearConstraintCoefficients->value->el[i] ;
00334                                                         outStr << "</el>" ;
00335                                                         if( m_bWhiteSpace == true) outStr << endl;              
00336                                                 }
00337                                         }
00338                                         else{
00339                                                 //outStr << "<base64BinaryData sizeOf=\"8\" numericType=\"double\" >" ;
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                                         // the following attributes are required 
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                                         // the following attribute is required 
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         } // end instanceData if
00409         outStr << "</osil>" ;
00410         if( m_bWhiteSpace == true) outStr << endl;
00411         outStr << endl;
00412         return outStr.str();
00413 } // end writeOSiL

Generated on Thu Oct 8 03:02:58 2009 by  doxygen 1.4.7