@@ -32,6 +32,7 @@ LevelLoader::LevelLoader(const std::filesystem::path& base_path,
3232 int env_id, int num_envs, int verbose)
3333 : load_sequentially_(load_sequentially),
3434 n_levels_to_load_ (n_levels_to_load),
35+ env_id_(env_id),
3536 num_envs_(num_envs),
3637 cur_level_(env_id),
3738 verbose(verbose) {
@@ -54,6 +55,7 @@ LevelLoader::LevelLoader(const std::filesystem::path& base_path,
5455 throw std::runtime_error (
5556 " n_levels_to_load must be a multiple of num_envs." );
5657 }
58+ n_levels_to_load_ /= num_envs_;
5759}
5860
5961static const std::array<char , kMaxLevelObject + 1 > kPrintLevelKey {
@@ -186,16 +188,19 @@ void LevelLoader::LoadFile(std::mt19937& gen) {
186188
187189std::vector<SokobanLevel>::iterator LevelLoader::GetLevel (std::mt19937& gen) {
188190 if (n_levels_to_load_ > 0 && levels_loaded_ >= n_levels_to_load_) {
189- throw std::runtime_error (" Loaded all requested levels." );
191+ // std::cerr << "Warning: All levels loaded. Looping around now." <<
192+ // std::endl;
193+ levels_loaded_ = 0 ;
194+ cur_file_ = level_file_paths_.begin ();
195+ LoadFile (gen);
196+ // re-start from the `env_id`th level, like we do in the constructor.
197+ cur_level_ = env_id_;
190198 }
191199 // Load new files until the current level index is within the loaded levels
192200 // this is required when new files have lesser levels than the number of envs
193201 while (cur_level_ >= levels_.size ()) {
194202 cur_level_ -= levels_.size ();
195203 LoadFile (gen);
196- if (levels_.empty ()) { // new file is empty
197- throw std::runtime_error (" No levels loaded." );
198- }
199204 }
200205 // no need for bound checks since it is checked in the while loop above
201206 auto out = levels_.begin () + cur_level_;
0 commit comments