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