Skip to content

PSD-NOMAD crash due to "std::out_of_range" #145

Closed
@idwwwoqq808

Description

@idwwwoqq808

I was repeating an optimization experiment using PSD-NOMAD. It repeated for a few times without any problem and then crashed with "std::out_of_range" error. Is there a way to solve it?
This problem need to repeat execution several times to trigger.
File Content
nomad4_param.txt

DIMENSION 60
BB_EXE "$python3 obj_func.py"
BB_OUTPUT_TYPE  OBJ
LOWER_BOUND ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 )
UPPER_BOUND ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 100 100 100 100 100 100 )
BB_INPUT_TYPE ( B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B I I I I I I I I I I )
HISTORY_FILE nomad4_history.txt
MAX_BB_EVAL 248
DISPLAY_DEGREE 2
PSD_MADS_OPTIMIZATION true
PSD_MADS_NB_SUBPROBLEM 8
CACHE_FILE nomad4.cache
DIRECTION_TYPE ORTHO 2N

nomad4.cache (externally generated)

CACHE_HITS 1
BB_OUTPUT_TYPE OBJ
(   1  1  1  0  0  1  1  1  1  0  1  1  0  1  1  1  1  1  1  1  0  0  1  0  0  0  1  0  0  0  1  1  1  1  0  1  1  1  1  0  0  0  0  1  0  1  1  0  0  0 -50 14 -19 -37 52  8 -49 79 23 91) EVAL_OK ( 1.3862614188120563 )

Code
obj_func.py

import numpy as np
import sys

sys.path.insert(0,'/home/idwwwoqq808/workspace/optimizer/EnsOpt')
from test_func  import Test_Function2
obj_func = Test_Function2()
x_file = sys.argv[1]
x_vec = np.loadtxt(x_file)
fx = obj_func(x_vec)
print(fx)

test_func.py

import numpy as np
import time, copy, sys, random
import ioh #Github: https://iohprofiler.github.io/IOHproblem/PBO
def GriewankConvex(x:np.ndarray):
    term1 = np.power(x,2)
    term3 = copy.deepcopy(term1)
    term1 = term1.sum()/4e3

    term2 = np.cos(x/np.sqrt(np.arange(1, 1+x.size)))
    term2 = term2.cumprod()[-1]

    term3 = np.sqrt(term3.sum()) / 33.0

    fx = term1 - term2 +1 + term3
    return fx
class Test_Function2:
    _cont_granu = 1e-2

    def __init__(self):
        self.dim = 60
        self.sub_idx = [ np.arange(0,30), np.arange(10,40), np.arange(20,50), np.arange(50,self.dim) ]
        inv_granu = np.rint(1/self._cont_granu).astype(int)
        self.lb = np.hstack((np.zeros(50), np.ones(10)*(-inv_granu) )).astype(int)
        self.ub = np.hstack((np.ones(50), np.ones(10)*inv_granu)).astype(int)
        self.var_type = ['categorical']*50 + ['discrete']*10
        assert self.lb.size == self.dim
        assert self.ub.size == self.dim

    def __call__(self,X):
        if not (type(X) is np.ndarray):
            X = np.array(X)

        if 1==len(X.shape):
            try:
                Y = self.ComboFunc(X)
            except Exception as e:
                print(X)
                raise e
        else:
            Y = np.zeros(X.shape[0])
            for i in range(X.shape[0]):
                Y[i] = self.ComboFunc(X[i])
        return Y

    def ComboFunc(self, x:np.ndarray):
        x_part0, x_part1, x_part2, x_part3 = self.SplitInputVector(x)
        func0 = ioh.get_problem(
            "LABS", # Objective is to maximize
            instance = 1,
            dimension = 30,
            problem_class = ioh.ProblemClass.INTEGER
        )
        term0 = -1/3 * (func0(x_part0.tolist()) - 3.3)
        func1 = ioh.get_problem(
            "OneMaxRuggedness2", # Objective is to maximize
            instance = 0,
            dimension = 30,
            problem_class = ioh.ProblemClass.INTEGER
        )
        term1 = 0 -1/17 * (func1(x_part1.tolist()) -23)
        func2 = ioh.get_problem(
            "MIS", # Objective is to maximize
            instance = 0,
            dimension = 30,
            problem_class = ioh.ProblemClass.INTEGER
        )
        term2 = -1e-3 * (func2(x_part2.tolist()) -10)
        func3 = GriewankConvex
        term3 = 1/3 * func3(x_part3)
        return term0 + term1 + term2 + term3

    def SplitInputVector(self, x:np.ndarray) -> Union[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
        x_part0 = np.rint(x[self.sub_idx[0]]).astype(int)
        x_part1 = np.rint(x[self.sub_idx[1]]).astype(int)
        x_part2 = np.rint(x[self.sub_idx[2]]).astype(int)
        x_part3 = np.rint(x[self.sub_idx[3]]) * self._cont_granu
        return x_part0, x_part1, x_part2, x_part3

Terminal Output

All variables are granular. MAX_EVAL is set to 1000000 to prevent algorithm from circling around best solution indefinitely
Warning: Dimension 60 is greater than (or equal to) 50. Models are disabled.
Version 4.3.1 
 
NOMAD 4 has been created by 
    Viviane Rochon Montplaisir 
    Christophe Tribes 

The copyright of NOMAD 4 is owned by 
    Charles Audet 
    Sebastien Le Digabel 
    Viviane Rochon Montplaisir 
    Christophe Tribes 

NOMAD 4 has been funded by Rio Tinto, Hydro-Québec, Huawei-Canada, 
 NSERC (Natural Sciences and Engineering Research Council of Canada), 
 InnovÉÉ (Innovation en Énergie Électrique) and 
 IVADO (The Institute for Data Valorization) 

Download  : https://www.gerad.ca/nomad or 
 https://github.com/bbopt/nomad 
License   : see LICENSE file 
User guide: https://nomad-4-user-guide.readthedocs.io 
Help      : run nomad -h KEYWORD on the command line 
Examples  : see 'examples' directory 

Please report bugs to [email protected] or 
create an issue at https://github.com/bbopt/nomad 


terminate called after throwing an instance of 'std::out_of_range'
  what():  map::at
Aborted (core dumped)

Environment
Python version: 3.10.6
OS: Ubuntu 22.04

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions