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
00101
00102
00103
00104
00105
00106
00107 if(m_OSInstance->instanceData->variables->var[i]->initString != ""){
00108 outStr << " initString=\"" ;
00109 outStr << m_OSInstance->instanceData->variables->var[i]->initString ;
00110 outStr << "\"";
00111 }
00112 outStr << "/>" ;
00113 if( m_bWhiteSpace == true) outStr << endl;
00114 }
00115 }
00116 outStr << "</variables>" ;
00117 if( m_bWhiteSpace == true) outStr << endl;
00118 }
00119 if(m_OSInstance->instanceData->objectives != NULL && m_OSInstance->instanceData->objectives->numberOfObjectives > 0){
00120 outStr << "<objectives " ;
00121 outStr << "numberOfObjectives=\"";
00122 outStr << m_OSInstance->instanceData->objectives->numberOfObjectives ;
00123 outStr << "\"" ;
00124 outStr << ">" ;
00125 if( m_bWhiteSpace == true) outStr << endl;
00126 for (j = 0; j < m_OSInstance->instanceData->objectives->numberOfObjectives; j++){
00127 if(m_OSInstance->instanceData->objectives->obj[j] != NULL){
00128 outStr << "<obj" ;
00129 if(m_OSInstance->instanceData->objectives->obj[j]->maxOrMin.length() > 0){
00130 outStr << " maxOrMin=\"" ;
00131 outStr << m_OSInstance->instanceData->objectives->obj[j]->maxOrMin ;
00132 outStr << "\"";
00133 }
00134 if(m_OSInstance->instanceData->objectives->obj[j]->constant != 0.0){
00135 outStr << " constant=\"" ;
00136 outStr << os_dtoa_format(m_OSInstance->instanceData->objectives->obj[j]->constant) ;
00137 outStr << "\"";
00138 }
00139 if(m_OSInstance->instanceData->objectives->obj[j]->weight != 1.0){
00140 outStr << " weight=\"" ;
00141 outStr << os_dtoa_format(m_OSInstance->instanceData->objectives->obj[j]->weight) ;
00142 outStr << "\"";
00143 }
00144 if(m_OSInstance->instanceData->objectives->obj[j]->name.length() > 0){
00145 outStr << " name=\"" ;
00146 outStr << m_OSInstance->instanceData->objectives->obj[j]->name ;
00147 outStr << "\"";
00148 }
00149 outStr << " numberOfObjCoef=\"" ;
00150 outStr << m_OSInstance->instanceData->objectives->obj[j]->numberOfObjCoef ;
00151 outStr << "\"";
00152 outStr << ">" ;
00153 if( m_bWhiteSpace == true) outStr << endl;
00154 if(m_OSInstance->instanceData->objectives->obj[j]->coef != NULL){
00155 for (i = 0; i < m_OSInstance->instanceData->objectives->obj[ j]->numberOfObjCoef; i++){
00156 if(m_OSInstance->instanceData->objectives->obj[j]->coef[i]->idx > -1 ){
00157 outStr << "<coef" ;
00158 outStr << " idx=\"" ;
00159 outStr << m_OSInstance->instanceData->objectives->obj[j]->coef[i]->idx ;
00160 outStr << "\"";
00161 outStr << ">";
00162
00163
00164 outStr << os_dtoa_format( m_OSInstance->instanceData->objectives->obj[j]->coef[i]->value) ;
00165
00166 outStr << "</coef>" ;
00167 if( m_bWhiteSpace == true) outStr << endl;
00168 }
00169 }
00170 }
00171 outStr << "</obj>" ;
00172 if( m_bWhiteSpace == true) outStr << endl;
00173 }
00174 }
00175 outStr << "</objectives>" ;
00176 if( m_bWhiteSpace == true) outStr << endl;
00177 }
00178
00179 if(m_OSInstance->instanceData->constraints != NULL && m_OSInstance->instanceData->constraints->numberOfConstraints > 0){
00180 outStr << "<constraints " ;
00181 outStr << "numberOfConstraints=\"";
00182 outStr << m_OSInstance->instanceData->constraints->numberOfConstraints ;
00183 outStr << "\"" ;
00184 outStr << ">" ;
00185 if( m_bWhiteSpace == true) outStr << endl;
00186 for (i = 0; i < m_OSInstance->instanceData->constraints->numberOfConstraints; i++){
00187 if(m_OSInstance->instanceData->constraints->con[i] != NULL){
00188 outStr << "<con" ;
00189 if(m_OSInstance->instanceData->constraints->con[i]->name.length()){
00190 outStr << " name=\"" ;
00191 outStr << m_OSInstance->instanceData->constraints->con[i]->name ;
00192 outStr << "\"";
00193 }
00194 if(m_OSInstance->instanceData->constraints->con[i]->constant != 0){
00195 outStr << " constant=\"" ;
00196 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->constant) ;
00197 outStr << "\"";
00198 }
00199 if(m_OSInstance->instanceData->constraints->con[i]->lb != -OSDBL_MAX ){
00200 outStr << " lb=\"" ;
00201 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->lb) ;
00202 outStr << "\"";
00203 }
00204 if(m_OSInstance->instanceData->constraints->con[i]->ub != OSDBL_MAX){
00205 outStr << " ub=\"" ;
00206 outStr << os_dtoa_format( m_OSInstance->instanceData->constraints->con[i]->ub) ;
00207 outStr << "\"";
00208 }
00209 outStr << "/>" ;
00210 if( m_bWhiteSpace == true) outStr << endl;
00211 }
00212 }
00213 outStr << "</constraints>" ;
00214 if( m_bWhiteSpace == true) outStr << endl;
00215 }
00216
00217 if(m_OSInstance->instanceData->linearConstraintCoefficients != NULL && m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues > 0){
00218 outStr << "<linearConstraintCoefficients " ;
00219 outStr << "numberOfValues=\"";
00220 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues ;
00221 outStr << "\"" ;
00222 outStr << ">" ;
00223 if( m_bWhiteSpace == true) outStr << endl;
00224 if( (m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx != NULL) &&
00225 (m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el != NULL) ){
00226 if(m_OSInstance->instanceData->linearConstraintCoefficients->start->el != NULL){
00227 outStr << "<start>" ;
00228 if( m_bWhiteSpace == true) outStr << endl;
00229 if(m_OSInstance->instanceData->variables != NULL && m_OSInstance->instanceData->variables->numberOfVariables > 0){
00230 if(m_bWriteBase64 == false){
00231 for(i = 0; i <= m_OSInstance->instanceData->variables->numberOfVariables; i++){
00232 outStr << "<el>" ;
00233 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->start->el[i];
00234 outStr << "</el>" ;
00235 if( m_bWhiteSpace == true) outStr << endl;
00236 }
00237 }
00238 else{
00239
00240 outStr << "<base64BinaryData sizeOf=\"4\" >" ;
00241 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->start->el,
00242 (m_OSInstance->instanceData->variables->numberOfVariables + 1)*sizeof(int) );
00243 outStr<< "</base64BinaryData>" ;
00244 if( m_bWhiteSpace == true) outStr << endl;
00245 }
00246 }
00247 outStr << "</start>" ;
00248 if( m_bWhiteSpace == true) outStr << endl;
00249 }
00250 outStr << "<rowIdx>" ;
00251 if( m_bWhiteSpace == true) outStr << endl;
00252 if(m_bWriteBase64 == false){
00253 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){
00254 outStr << "<el>" ;
00255 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el[i] ;
00256 outStr << "</el>" ;
00257 if( m_bWhiteSpace == true) outStr << endl;
00258 }
00259 }
00260 else{
00261
00262 outStr << "<base64BinaryData sizeOf=\"4\" >" ;
00263 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->rowIdx->el,
00264 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof(int) );
00265 outStr<< "</base64BinaryData>" ;
00266 if( m_bWhiteSpace == true) outStr << endl;
00267 }
00268 outStr << "</rowIdx>" ;
00269 if( m_bWhiteSpace == true) outStr << endl;
00270 }
00271 else{
00272 if( (m_OSInstance->instanceData->linearConstraintCoefficients->colIdx != NULL) &&
00273 (m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el != NULL) ){
00274 if(m_OSInstance->instanceData->linearConstraintCoefficients->start->el != NULL){
00275 outStr << "<start>" ;
00276 if( m_bWhiteSpace == true) outStr << endl;
00277 if(m_OSInstance->instanceData->constraints != NULL && m_OSInstance->instanceData->constraints->numberOfConstraints > 0){
00278 if(m_bWriteBase64 == false){
00279 for(i = 0; i <= m_OSInstance->instanceData->constraints->numberOfConstraints; i++){
00280 outStr << "<el>" ;
00281 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->start->el[i];
00282 outStr << "</el>" ;
00283 if( m_bWhiteSpace == true) outStr << endl;
00284 }
00285 }
00286 else{
00287
00288 outStr << "<base64BinaryData sizeOf=\"4\" >" ;
00289 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->start->el,
00290 (m_OSInstance->instanceData->variables->numberOfVariables + 1)*sizeof(int) );
00291 outStr<< "</base64BinaryData>" ;
00292 if( m_bWhiteSpace == true) outStr << endl;
00293 }
00294 }
00295 outStr << "</start>" ;
00296 if( m_bWhiteSpace == true) outStr << endl;
00297 }
00298 outStr << "<colIdx>";
00299 if( m_bWhiteSpace == true) outStr << endl;
00300 if(m_bWriteBase64 == false){
00301 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){
00302 outStr << "<el>" ;
00303 outStr << m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el[i] ;
00304 outStr << "</el>" ;
00305 if( m_bWhiteSpace == true) outStr << endl;
00306 }
00307 }
00308 else{
00309
00310 outStr << "<base64BinaryData sizeOf=\"4\" >" ;
00311 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->colIdx->el,
00312 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof(int) );
00313 outStr<< "</base64BinaryData>" ;
00314 if( m_bWhiteSpace == true) outStr << endl;
00315 }
00316 outStr << "</colIdx>" ;
00317 if( m_bWhiteSpace == true) outStr << endl;
00318 }
00319 }
00320 if(m_OSInstance->instanceData->linearConstraintCoefficients->value != NULL){
00321 outStr << "<value>" ;
00322 if( m_bWhiteSpace == true) outStr << endl;
00323 if(m_OSInstance->instanceData->linearConstraintCoefficients->value->el != NULL){
00324 if(m_bWriteBase64 == false){
00325 for(i = 0; i < m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues; i++){
00326 outStr << "<el>";
00327 outStr << os_dtoa_format( m_OSInstance->instanceData->linearConstraintCoefficients->value->el[i] );
00328
00329 outStr << "</el>" ;
00330 if( m_bWhiteSpace == true) outStr << endl;
00331 }
00332 }
00333 else{
00334
00335 outStr << "<base64BinaryData sizeOf=\"8\" >" ;
00336 outStr << Base64::encodeb64( (char*)m_OSInstance->instanceData->linearConstraintCoefficients->value->el,
00337 m_OSInstance->instanceData->linearConstraintCoefficients->numberOfValues*sizeof( double) );
00338 outStr<< "</base64BinaryData>" ;
00339 if( m_bWhiteSpace == true) outStr << endl;
00340 }
00341 }
00342 outStr << "</value>" ;
00343 if( m_bWhiteSpace == true) outStr << endl;
00344 }
00345 outStr << "</linearConstraintCoefficients>" ;
00346 if( m_bWhiteSpace == true) outStr << endl;
00347 }
00348 if(m_OSInstance->instanceData->quadraticCoefficients != NULL && m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms > 0){
00349 outStr << "<quadraticCoefficients";
00350 outStr << " numberOfQuadraticTerms=\"";
00351 outStr << m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms;
00352 outStr << "\" >" ;
00353 if( m_bWhiteSpace == true) outStr << endl;
00354 for(i = 0; i < m_OSInstance->instanceData->quadraticCoefficients->numberOfQuadraticTerms; i++){
00355 if(m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]){
00356 outStr << "<qTerm" ;
00357
00358 outStr << " idx=\"";
00359 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idx;
00360 outStr << "\"";
00361 outStr << " idxOne=\"";
00362 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idxOne;
00363 outStr << "\"";
00364 outStr << " idxTwo=\"";
00365 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->idxTwo;
00366 outStr << "\"";
00367 if(m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->coef != 0){
00368 outStr << " coef=\"";
00369 outStr << m_OSInstance->instanceData->quadraticCoefficients->qTerm[i]->coef;
00370 outStr << "\"";
00371 }
00372 outStr << "/>" ;
00373 if( m_bWhiteSpace == true) outStr << endl;
00374 }
00375 }
00376 outStr << "</quadraticCoefficients>";
00377 if( m_bWhiteSpace == true) outStr << endl;
00378 }
00379 if(m_OSInstance->instanceData->nonlinearExpressions != NULL && m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions > 0){
00380 outStr << "<nonlinearExpressions";
00381 outStr << " numberOfNonlinearExpressions=\"";
00382 outStr << m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions;
00383 outStr << "\" >" ;
00384 if( m_bWhiteSpace == true) outStr << endl;
00385 for(i = 0; i < m_OSInstance->instanceData->nonlinearExpressions->numberOfNonlinearExpressions; i++){
00386 if(m_OSInstance->instanceData->nonlinearExpressions->nl[i] != NULL){
00387 outStr << "<nl" ;
00388
00389 outStr << " idx=\"";
00390 outStr << m_OSInstance->instanceData->nonlinearExpressions->nl[i]->idx;
00391 outStr << "\">";
00392 if(m_OSInstance->instanceData->nonlinearExpressions->nl[i]->osExpressionTree->m_treeRoot != NULL)
00393 outStr << m_OSInstance->instanceData->nonlinearExpressions->nl[i]->osExpressionTree->m_treeRoot->getNonlinearExpressionInXML();
00394 outStr << "</nl>";
00395 }
00396 if( m_bWhiteSpace == true) outStr << endl;
00397 }
00398 outStr << "</nonlinearExpressions>";
00399 if( m_bWhiteSpace == true) outStr << endl;
00400 }
00401 outStr << "</instanceData>" ;
00402 if( m_bWhiteSpace == true) outStr << endl;
00403 }
00404 outStr << "</osil>" ;
00405 if( m_bWhiteSpace == true) outStr << endl;
00406 outStr << endl;
00407 return outStr.str();
00408 }