Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle save/restore in sensitivity #988

Merged
merged 65 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
e6e4685
Add interface for save/restore
JasonMarechal25 Oct 28, 2024
39ef017
Implement xpress
JasonMarechal25 Oct 28, 2024
6a34627
Rename MPSFileWriter as FileWriter
JasonMarechal25 Oct 29, 2024
74f0c89
Abstract reading problem in workers
JasonMarechal25 Oct 29, 2024
578c647
Antares xpress
JasonMarechal25 Oct 29, 2024
7e57cbf
Save master properly
JasonMarechal25 Oct 29, 2024
e66bdc8
Revert "Antares xpress"
JasonMarechal25 Oct 29, 2024
9d9591d
Reorder "then" clauses for test
JasonMarechal25 Oct 30, 2024
e3f821c
Add saved problem
JasonMarechal25 Oct 30, 2024
34d2182
Use coin instead
JasonMarechal25 Oct 30, 2024
cba4975
Master generation MPS/save option
JasonMarechal25 Oct 31, 2024
b29aafd
No mps ext
JasonMarechal25 Oct 31, 2024
25b85ee
Parametrize tests
JasonMarechal25 Oct 31, 2024
101496a
Parametrize tests
JasonMarechal25 Oct 31, 2024
2d78e93
Factorize tests
JasonMarechal25 Nov 4, 2024
519e752
Factorize tests
JasonMarechal25 Nov 4, 2024
41ef1df
Handle all solvers
JasonMarechal25 Nov 4, 2024
cdf64ff
Add test on couplings
JasonMarechal25 Nov 5, 2024
f06a736
Add test on couplings
JasonMarechal25 Nov 6, 2024
3039354
Add tests for problems
JasonMarechal25 Nov 6, 2024
2749175
Pass problem_format in options
JasonMarechal25 Nov 7, 2024
979c2cb
Update clean step
JasonMarechal25 Nov 7, 2024
e84ea98
Cohérence des solver E2E
JasonMarechal25 Nov 8, 2024
97d7c28
Fix settings path
JasonMarechal25 Nov 12, 2024
2b9df4c
Fix rebase
JasonMarechal25 Nov 12, 2024
5a843ce
fix rebase
JasonMarechal25 Jan 7, 2025
6fc0d91
fix rebase
JasonMarechal25 Jan 8, 2025
f34a5bc
Fix end2end lpnamer test for xpress
JasonMarechal25 Jan 9, 2025
94f7b0b
Revert data
JasonMarechal25 Jan 9, 2025
efd158b
Revert data
JasonMarechal25 Jan 9, 2025
f2f6b4e
Revert data
JasonMarechal25 Jan 9, 2025
28ec74b
Revert data
JasonMarechal25 Jan 9, 2025
504d600
Revert data
JasonMarechal25 Jan 9, 2025
f17e507
Fix rebase
JasonMarechal25 Jan 9, 2025
8cd9155
Use mps by default
JasonMarechal25 Jan 9, 2025
0765d94
Improve logging format
JasonMarechal25 Jan 9, 2025
e6cb67e
Simplify expression
JasonMarechal25 Jan 10, 2025
57f04cd
When restoring a problem, set year and week properly
JasonMarechal25 Jan 10, 2025
85e6c3c
Set problem name ext to svf for problem from LpData
JasonMarechal25 Jan 10, 2025
be11460
Improve log format
JasonMarechal25 Jan 10, 2025
6a1ba3b
Improve log format
JasonMarechal25 Jan 10, 2025
66c4430
Fix mps/svf
JasonMarechal25 Jan 10, 2025
d1bc8b5
Solver config
JasonMarechal25 Jan 10, 2025
28b5f9e
Wip
JasonMarechal25 Jan 13, 2025
574aa6b
Imporve log format
JasonMarechal25 Jan 13, 2025
227f969
Synchronise structures.txt with proper filename for save/restore
JasonMarechal25 Jan 13, 2025
d3ed1d9
Rollback vcpkg
JasonMarechal25 Jan 14, 2025
f9a0fd7
Improve log message for Xpress
JasonMarechal25 Jan 14, 2025
75c4030
Fix test
JasonMarechal25 Jan 14, 2025
4941ace
Remove commented code
JasonMarechal25 Jan 14, 2025
5ce67f6
Initialize data
JasonMarechal25 Jan 15, 2025
50a70bb
Update doc
JasonMarechal25 Jan 15, 2025
3ec2ca6
Move function
JasonMarechal25 Jan 15, 2025
d2733dd
Move function
JasonMarechal25 Jan 16, 2025
9dfcf23
Remove extra file
JasonMarechal25 Jan 16, 2025
db3c016
Properly keep or clean mps/svf
JasonMarechal25 Jan 17, 2025
e4db64e
Introduce fmt::format dependency
JasonMarechal25 Jan 17, 2025
f778faf
Handle save/restore in benders
JasonMarechal25 Jan 17, 2025
c4dfeb8
Remove unnecessary shared_ptr usage
JasonMarechal25 Jan 20, 2025
f94aac0
Use fmt for simplicity
JasonMarechal25 Jan 20, 2025
3938f6a
Benders write problem format in outputs
JasonMarechal25 Jan 21, 2025
f034c7e
Sensitivity properly read/restore prob
JasonMarechal25 Jan 21, 2025
15f75de
Handle empty string for problem format (legacy case)
JasonMarechal25 Jan 21, 2025
467227b
Handle empty string for problem format (legacy case)
JasonMarechal25 Jan 21, 2025
64a6296
Merge branch 'develop' into feature/save_restore_sensitibity
JasonMarechal25 Jan 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/cpp/benders/benders_core/BendersBase.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "antares-xpansion/benders/benders_core/BendersBase.h"
#include <fmt/format.h>

#include <memory>
#include <mutex>
Expand All @@ -8,6 +9,7 @@
#include "antares-xpansion/benders/benders_core/LastIterationPrinter.h"
#include "antares-xpansion/benders/benders_core/LastIterationReader.h"
#include "antares-xpansion/benders/benders_core/LastIterationWriter.h"
#include "antares-xpansion/benders/benders_core/ProblemFormatStream.h"
#include "antares-xpansion/xpansion_interfaces/LogUtils.h"
#include "antares-xpansion/helpers/solver_utils.h"

Expand Down
4 changes: 2 additions & 2 deletions src/cpp/benders/benders_core/ProblemFormatStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ auto fmt::formatter<ProblemsFormat>::format(ProblemsFormat problems_format,
string_view result = "Unknown";
switch (problems_format) {
case ProblemsFormat::MPS_FILE:
result = "MPS_FILE";
result = "MPS";
break;
case ProblemsFormat::SAVED_FILE:
result = "SAVED_FILE";
result = "SAVED";
break;
default:
result = "Unknown";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include "WorkerMaster.h"
#include "antares-xpansion/helpers/Timer.h"
#include "antares-xpansion/xpansion_interfaces/ILogger.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "common.h"
/**
* std execution policies don't share a base type so we can't just select
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ inline std::ostream &operator<<(std::ostream &stream,
ProblemsFormat const &rhs) {
switch (rhs) {
case ProblemsFormat::MPS_FILE:
stream << "MPS_FILE";
stream << "MPS";
break;
case ProblemsFormat::SAVED_FILE:
stream << "SAVED_FILE";
stream << "SAVED";
break;
default:
stream << "Unknown";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

#pragma once

#include "antares-xpansion/xpansion_interfaces/ILogger.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "SimulationOptions.h"
#include "antares-xpansion/benders/output/OutputWriter.h"
#include "antares-xpansion/xpansion_interfaces/ILogger.h"
namespace Benders {

class StartUp {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
#include <filesystem>

#include "SolverIO.h"
#include "antares-xpansion/benders/output/OutputWriter.h"
#include "antares-xpansion/multisolver_interface/Solver.h"
#include "antares-xpansion/xpansion_interfaces/ILogger.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "common.h"

/*!
Expand Down
4 changes: 4 additions & 0 deletions src/cpp/benders/factories/BendersFactory.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@

#include "antares-xpansion/benders/factories/BendersFactory.h"

#include <fmt/format.h>

#include <filesystem>

#include "antares-xpansion/benders/benders_by_batch/BendersByBatch.h"
#include "antares-xpansion/benders/benders_core/CouplingMapGenerator.h"
#include "antares-xpansion/benders/benders_core/MasterUpdate.h"
#include "antares-xpansion/benders/benders_core/StartUp.h"
#include "antares-xpansion/benders/benders_core/ProblemFormatStream.h"
#include "antares-xpansion/benders/benders_mpi/BendersMpiOuterLoop.h"
#include "antares-xpansion/benders/benders_mpi/OuterLoopBenders.h"
#include "antares-xpansion/benders/factories/LoggerFactories.h"
Expand Down Expand Up @@ -121,6 +124,7 @@ void BendersMainFactory::SetupLoggerAndOutputWriter(
writer_->write_log_level(options_.LOG_LEVEL);
writer_->write_master_name(options_.MASTER_NAME);
writer_->write_solver_name(options_.SOLVER_NAME);
writer_->WriteProblemFormat(fmt::format("{}", options_.PROBLEMS_FORMAT));
}

bool BendersMainFactory::isCriterionListEmpty() const {
Expand Down
1 change: 0 additions & 1 deletion src/cpp/benders/factories/WriterFactories.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include "antares-xpansion/benders/factories/WriterFactories.h"

#include "antares-xpansion/benders/output/JsonWriter.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "antares-xpansion/benders/output/VoidWriter.h"
#include "antares-xpansion/benders/benders_core/common.h"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <filesystem>
#include <string>

#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "antares-xpansion/benders/output/OutputWriter.h"

Writer build_void_writer();

Expand Down
1 change: 1 addition & 0 deletions src/cpp/benders/output/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ target_sources(output_core PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/JsonWriter.cpp
include/antares-xpansion/benders/output/VoidWriter.h
include/antares-xpansion/benders/output/JsonWriter.h
include/antares-xpansion/benders/output/OutputWriter.h
)

target_include_directories(output_core
Expand Down
3 changes: 3 additions & 0 deletions src/cpp/benders/output/JsonWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,7 @@ void JsonWriter::WriteProblem(const ProblemData &problem_data) {
_output[ERROR_C][PROBLEMPATH_C] = problem_data.path.string();
_output[ERROR_C][PROBLEM_STATUS_C] = problem_data.status;
}
void JsonWriter::WriteProblemFormat(const std::string format) {
_output[OPTIONS_C][PROBLEM_FORMAT_C] = format;
}
} // namespace Output
1 change: 1 addition & 0 deletions src/cpp/benders/output/VoidWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,6 @@ std::string VoidWriter::solution_status() const { return ""; }
void VoidWriter::WriteProblem(const ProblemData &problem_data) {
// keep this method empty
}
void VoidWriter::WriteProblemFormat(const std::string format) {}

} // namespace Output
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
#include <filesystem>
#include <fstream>

#include "antares-xpansion/benders/output/OutputWriter.h"
#include "antares-xpansion/xpansion_interfaces/Clock.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"

namespace Output {

Expand Down Expand Up @@ -79,5 +79,6 @@ class JsonWriter : public OutputWriter {
void write_duration(const double duration) override;
std::string solution_status() const override;
void WriteProblem(const ProblemData &problem_data) override;
void WriteProblemFormat(const std::string format) override;
};
} // namespace Output
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ const std::string ANTARES_C("antares"), VERSION_C("version"),
SOLVER_NAME_C("SOLVER_NAME"), PROBLEMNAME_C("problem_name"),
PROBLEMPATH_C("problem_path"),
CUMULATIVE_NUMBER_OF_SUBPROBLEM_RESOLVED_C(
"cumulative_number_of_subproblem_resolutions");
"cumulative_number_of_subproblem_resolutions"),
PROBLEM_FORMAT_C{"PROBLEM_FORMAT"}
;
struct CandidateData {
std::string name;
double invest;
Expand Down Expand Up @@ -126,6 +128,7 @@ class OutputWriter {
virtual void write_duration(const double duration) = 0;
virtual std::string solution_status() const = 0;
virtual void WriteProblem(const ProblemData &problem_data) = 0;
virtual void WriteProblemFormat(const std::string format) = 0;
};
} // namespace Output
using Writer = std::shared_ptr<Output::OutputWriter>;
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@

#pragma once

#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"

#include "antares-xpansion/benders/output/OutputWriter.h"
namespace Output {
/*!
* \class VoidWriter
Expand Down Expand Up @@ -71,5 +70,6 @@ class VoidWriter : public OutputWriter {
void write_duration(const double duration) override;
std::string solution_status() const override;
void WriteProblem(const ProblemData &problem_data) override;
void WriteProblemFormat(const std::string format) override;
};
} // namespace Output
3 changes: 3 additions & 0 deletions src/cpp/sensitivity/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,12 @@ target_include_directories(sensitivity_core
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/private>
)

find_package(fmt REQUIRED)
target_link_libraries(sensitivity_core
PUBLIC
antaresXpansion::logger_lib
PRIVATE
fmt::fmt
)

add_library(${PROJECT_NAME}::sensitivity_core ALIAS sensitivity_core)
35 changes: 25 additions & 10 deletions src/cpp/sensitivity/SensitivityInputReader.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
#include "antares-xpansion/sensitivity/SensitivityInputReader.h"

#include <fmt/format.h>

#include <boost/algorithm/string/trim.hpp>
#include <fstream>
#include <utility>

#include "antares-xpansion/xpansion_interfaces/LogUtils.h"
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"
#include "antares-xpansion/benders/benders_core/common.h"
#include "antares-xpansion/benders/benders_core/ProblemFormat.h"
#include "antares-xpansion/benders/benders_core/ProblemFormatStream.h"
#include "antares-xpansion/benders/output/OutputWriter.h"
#include "antares-xpansion/multisolver_interface/SolverFactory.h"
#include "antares-xpansion/xpansion_interfaces/LogUtils.h"

const std::string EPSILON_C("epsilon");
const std::string CAPEX_C("capex");
Expand All @@ -19,8 +22,8 @@ Json::Value read_json(const std::filesystem::path &json_file_path) {
if (json_file.good()) {
json_file >> json_data;
} else {
throw std::runtime_error(LOGLOCATION +
"unable to open : " + json_file_path.string());
throw std::runtime_error(fmt::format("{}: unable to open : {}",
LOGLOCATION, json_file_path.string()));
}
return json_data;
}
Expand All @@ -45,9 +48,9 @@ std::vector<std::string> SensitivityInputReader::get_projection() const {
return projection;
}

SolverAbstract::Ptr SensitivityInputReader::get_last_master() const {
std::shared_ptr<SolverAbstract> SensitivityInputReader::get_last_master() const {
SolverFactory factory;
SolverAbstract::Ptr last_master;
std::shared_ptr<SolverAbstract> last_master;

if (_benders_data[Output::OPTIONS_C]["SOLVER_NAME"].asString() == "COIN") {
last_master = factory.create_solver("CBC");
Expand All @@ -58,13 +61,25 @@ SolverAbstract::Ptr SensitivityInputReader::get_last_master() const {
last_master->set_threads(1);
last_master->set_output_log_level(
_benders_data[Output::OPTIONS_C]["LOG_LEVEL"].asInt());
last_master->read_prob_mps(_last_master_path);
auto problem_format = _benders_data[Output::OPTIONS_C][Output::PROBLEM_FORMAT_C].asString();
auto format = problem_format.empty() ? ProblemsFormat::MPS_FILE : problemsFormatFromString(problem_format);
switch (format) {
case ProblemsFormat::MPS_FILE:
last_master->read_prob_mps(_last_master_path);
break;
case ProblemsFormat::SAVED_FILE:
last_master->restore_prob(_last_master_path);
break;
default:
throw std::runtime_error(fmt::format("{}: unsupported format : {}",
LOGLOCATION, format));
}
return last_master;
}

std::map<std::string, std::pair<double, double>>
SensitivityInputReader::get_candidates_bounds(
SolverAbstract::Ptr last_master,
SolverAbstract *last_master,
const std::map<std::string, int> &name_to_id) const {
std::map<std::string, std::pair<double, double>> candidates_bounds;

Expand Down Expand Up @@ -145,7 +160,7 @@ SensitivityInputData SensitivityInputReader::get_input_data() const {
input_data.last_master = get_last_master();
input_data.basis_file_path = _basis_file_path;
input_data.candidates_bounds =
get_candidates_bounds(input_data.last_master, input_data.name_to_id);
get_candidates_bounds(input_data.last_master.get(), input_data.name_to_id);
input_data.capex = _json_data[CAPEX_C].asBool();
input_data.projection = get_projection();
return input_data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct SensitivityInputData {
double benders_capex;
std::map<std::string, double> benders_solution;
std::map<std::string, int> name_to_id;
SolverAbstract::Ptr last_master;
std::shared_ptr<SolverAbstract> last_master;
std::filesystem::path basis_file_path;
std::map<std::string, std::pair<double, double>> candidates_bounds;
bool capex;
Expand All @@ -37,13 +37,13 @@ class SensitivityInputReader {
std::filesystem::path _basis_file_path;
std::filesystem::path _structure_file_path;

SolverAbstract::Ptr get_last_master() const;
std::shared_ptr<SolverAbstract> get_last_master() const;
double get_best_ub() const;
double get_benders_capex() const;
std::map<std::string, double> get_benders_solution() const;
std::map<std::string, int> get_name_to_id() const;
std::vector<std::string> get_projection() const;
std::map<std::string, std::pair<double, double>> get_candidates_bounds(
SolverAbstract::Ptr last_master,
SolverAbstract *last_master,
const std::map<std::string, int> &name_to_id) const;
};
1 change: 0 additions & 1 deletion src/cpp/xpansion_interfaces/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ target_sources(xpansion_interfaces
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/ILogger.h
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/IWriterLogger.h
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/LogUtils.h
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/OutputWriter.h
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/StringManip.h
${CMAKE_CURRENT_SOURCE_DIR}/include/antares-xpansion/xpansion_interfaces/Clock.h
)
Expand Down
11 changes: 8 additions & 3 deletions src/python/antares_xpansion/config_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -694,11 +694,16 @@ def structure_file_path(self):

def last_master_file_path(self):
# The 'last_iteration' literal is only hard-coded in Worker.cpp, should we introduce a new variable in _config.options_default ?
return os.path.join(
use_xpress = str(self.options["solver"]).upper() == "XPRESS"
base_path = os.path.join(
self.simulation_lp_path(),
self._config.options_default["MASTER_NAME"] +
"_last_iteration.mps",
)
"_last_iteration")
if use_xpress:
base_path += ".svf"
else:
base_path += ".mps"
return base_path

def last_master_basis_path(self):
return os.path.join(
Expand Down
5 changes: 1 addition & 4 deletions src/python/antares_xpansion/sensitivity_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@
Class to control the sensitivity analysis
"""

import glob
import os
import shutil
import subprocess
import sys
import zipfile
from pathlib import Path

from antares_xpansion.logger import step_logger
Expand Down Expand Up @@ -52,7 +49,7 @@ def launch(
old_cwd = os.getcwd()
os.chdir(xpansion_simulation_output)
self.logger.info(f"Current directory is now {os.getcwd()}")

self.logger.info(f"Launching sensitivity analysis : {self._get_sensitivity_cmd()}")
returned_l = subprocess.run(
self._get_sensitivity_cmd(),
shell=False,
Expand Down
2 changes: 1 addition & 1 deletion tests/cpp/TestDoubles/WriterStub.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
//

#pragma once
#include "antares-xpansion/xpansion_interfaces/OutputWriter.h"

class WriterNOOPStub : public Output::OutputWriter {
public:
Expand All @@ -24,4 +23,5 @@ class WriterNOOPStub : public Output::OutputWriter {
void write_duration(const double duration) override {}
std::string solution_status() const override { return std::string(); }
void WriteProblem(const Output::ProblemData& problem_data) override {}
void WriteProblemFormat(const std::string format) override {}
};
Loading