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
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
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 }
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
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
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
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
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
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
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
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
00327 outStr << "</el>" ;
00328 if( m_bWhiteSpace == true) outStr << endl;
00329 }
00330 }
00331 else{
00332
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
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
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 }
00402 outStr << "</osil>" ;
00403 if( m_bWhiteSpace == true) outStr << endl;
00404 outStr << endl;
00405 return outStr.str();
00406 }