| 244 | } |
| 245 | |
| 246 | FreeFormatParserReturnCode HMpsFF::parse(const HighsLogOptions& log_options, |
| 247 | const std::string& filename) { |
| 248 | HMpsFF::Parsekey keyword = HMpsFF::Parsekey::kNone; |
| 249 | |
| 250 | highsLogDev(log_options, HighsLogType::kInfo, |
| 251 | "readMPS: Trying to open file %s\n", filename.c_str()); |
| 252 | #ifdef ZLIB_FOUND |
| 253 | zstr::ifstream f; |
| 254 | try { |
| 255 | f.open(filename.c_str(), std::ios::in); |
| 256 | } catch (const strict_fstream::Exception& e) { |
| 257 | highsLogDev(log_options, HighsLogType::kInfo, e.what()); |
| 258 | return FreeFormatParserReturnCode::kFileNotFound; |
| 259 | } |
| 260 | #else |
| 261 | std::ifstream f; |
| 262 | f.open(filename.c_str(), std::ios::in); |
| 263 | #endif |
| 264 | if (f.is_open()) { |
| 265 | start_time = getWallTime(); |
| 266 | num_row = 0; |
| 267 | num_col = 0; |
| 268 | num_nz = 0; |
| 269 | cost_row_location = -1; |
| 270 | // Indicate that no duplicate rows or columns have been found |
| 271 | has_duplicate_row_name_ = false; |
| 272 | has_duplicate_col_name_ = false; |
| 273 | // parsing loop |
| 274 | while (keyword != HMpsFF::Parsekey::kFail && |
| 275 | keyword != HMpsFF::Parsekey::kEnd && |
| 276 | keyword != HMpsFF::Parsekey::kTimeout) { |
| 277 | if (cannotParseSection(log_options, keyword)) { |
| 278 | f.close(); |
| 279 | return FreeFormatParserReturnCode::kParserError; |
| 280 | } |
| 281 | switch (keyword) { |
| 282 | case HMpsFF::Parsekey::kObjsense: |
| 283 | keyword = parseObjsense(log_options, f); |
| 284 | break; |
| 285 | case HMpsFF::Parsekey::kRows: |
| 286 | keyword = parseRows(log_options, f); |
| 287 | break; |
| 288 | case HMpsFF::Parsekey::kCols: |
| 289 | keyword = parseCols(log_options, f); |
| 290 | break; |
| 291 | case HMpsFF::Parsekey::kRhs: |
| 292 | keyword = parseRhs(log_options, f); |
| 293 | break; |
| 294 | case HMpsFF::Parsekey::kBounds: |
| 295 | keyword = parseBounds(log_options, f); |
| 296 | break; |
| 297 | case HMpsFF::Parsekey::kRanges: |
| 298 | keyword = parseRanges(log_options, f); |
| 299 | break; |
| 300 | case HMpsFF::Parsekey::kQmatrix: |
| 301 | case HMpsFF::Parsekey::kQuadobj: |
| 302 | keyword = parseHessian(log_options, f, keyword); |
| 303 | break; |
no test coverage detected