1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- """Basic Checkpoint class implementation
- """
- # main imports
- import os
- import logging
- import numpy as np
- # module imports
- from macop.callbacks.Callback import Callback
- from macop.utils.color import macop_text, macop_line
- class MultiSurrogateSpecificCheckpoint(Callback):
- """
- MultiSurrogateSpecificCheckpoint is used for keep track of sub-surrogate problem indices
- Attributes:
- algo: {Algorithm} -- main algorithm instance reference
- every: {int} -- checkpoint frequency used (based on number of evaluations)
- filepath: {str} -- file path where checkpoints will be saved
- """
- def run(self):
- """
- Check if necessary to do backup based on `every` variable
- """
- # get current best solution
- population = self._algo._population
- # Do nothing is surrogate analyser does not exist
- if population is None:
- return
- currentEvaluation = self._algo.getGlobalEvaluation()
- # backup if necessary
- if currentEvaluation % self._every == 0:
- logging.info(f"Multi surrogate specific analysis checkpoint is done into {self._filepath}")
- line = ''
- fitness_list = [ s.fitness for s in population ]
- fitness_data = ' '.join(list(map(str, fitness_list)))
- for s in population:
- s_data = ' '.join(list(map(str, s._data)))
- line += s_data + ';'
- line += fitness_data
- line += '\n'
- # check if file exists
- if not os.path.exists(self._filepath):
- with open(self._filepath, 'w') as f:
- f.write(line)
- else:
- with open(self._filepath, 'a') as f:
- f.write(line)
- def load(self):
- """
- Load previous population
- """
- if os.path.exists(self._filepath):
- logging.info('Load population solutions from last checkpoint')
- with open(self._filepath) as f:
- # get last line and read data
- lastline = f.readlines()[-1].replace('\n', '')
- data = lastline.split(';')
- fitness_scores = list(map(float, data[-1].split(' ')))
- for i, solution_data in enumerate(data[:-1]):
- self._algo._population[i]._data = list(map(int, solution_data.split(' ')))
- self._algo._population[i]._score = fitness_scores[i]
- print(macop_line())
- print(macop_text(f' MultiSurrogateSpecificCheckpoint found from `{self._filepath}` file. Start running using previous `population` values'))
- for i, s in enumerate(self._algo._population):
- print(f'Population[{i}]: best solution fitness is {s.fitness}')
- else:
- print(macop_text('No backup found... Start running using new `population` values'))
- logging.info("Can't load MultiSurrogateSpecific backup... Backup filepath not valid in MultiSurrogateCheckpoint")
- print(macop_line())
|