This file is indexed.

/usr/share/pyshared/openopt/kernel/setDefaultIterFuncs.py is in python-openopt 0.38+svn1589-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
__docformat__ = "restructuredtext en"
from numpy import *

#TODO: add stopcases -10,-11,-12, -13
SMALL_DF = 2
SMALL_DELTA_X = 3
SMALL_DELTA_F = 4
FVAL_IS_ENOUGH = 10
MAX_NON_SUCCESS = 11
USER_DEMAND_STOP = 80
BUTTON_ENOUGH_HAS_BEEN_PRESSED = 88
SOLVED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON = 1000



UNDEFINED = 0

IS_NAN_IN_X = -4
IS_LINE_SEARCH_FAILED = -5
IS_MAX_ITER_REACHED = -7
IS_MAX_CPU_TIME_REACHED = -8
IS_MAX_TIME_REACHED = -9
IS_MAX_FUN_EVALS_REACHED = -10
IS_ALL_VARS_FIXED = -11
FAILED_TO_OBTAIN_MOVE_DIRECTION = -13
USER_DEMAND_EXIT = -99

FAILED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON = -1000

def stopcase(arg):
    if hasattr(arg, 'istop'): istop = arg.istop
    else: istop = arg
    
    if istop > 0: return 1
    elif istop in [0, IS_MAX_ITER_REACHED, IS_MAX_CPU_TIME_REACHED, IS_MAX_TIME_REACHED, IS_MAX_FUN_EVALS_REACHED]: return 0
    else: return -1



def setDefaultIterFuncs(className):
    d = dict()

    # positive:
    d[SMALL_DF] = lambda p: small_df(p)
    d[SMALL_DELTA_X] = lambda p: small_deltaX(p)
    d[SMALL_DELTA_F] = lambda p: small_deltaF(p)
    d[FVAL_IS_ENOUGH] = lambda p: isEnough(p)
    #d[11] = lambda p: allVarsAreFixed(p)

    # negative:
    d[IS_NAN_IN_X]  = lambda p: isNanInX(p)
    d[IS_MAX_ITER_REACHED]  = lambda p: isMaxIterReached(p)
    d[IS_MAX_CPU_TIME_REACHED]  = lambda p: isMaxCPUTimeReached(p)
    d[IS_MAX_TIME_REACHED]  = lambda p: isMaxTimeReached(p)
    if className == 'NonLin': d[IS_MAX_FUN_EVALS_REACHED] = lambda p: isMaxFunEvalsReached(p)

    return d

def small_df(p):
    if not hasattr(p, '_df') or p._df is None: return False
    if hasattr(p._df, 'toarray'):p._df = p._df.toarray()
    if p.norm(p._df) >= p.gtol or not all(isfinite(p._df)) or not p.isFeas(p.iterValues.x[-1]): return False
    return (True, '|| gradient F(X[k]) || < gtol')
    #return False if not hasattr(p, 'dF') or p.dF == None or p.norm(p.dF) > p.gtol else True

def small_deltaX(p):
    if p.iter == 0: return False
    diffX = p.iterValues.x[-1] - p.iterValues.x[-2]
    if p.scale is not None: diffX *= p.scale
    if p.norm(diffX) >= p.xtol: return False
    else: return (True, '|| X[k] - X[k-1] || < xtol')
    #r = False if p.norm(p.xk - p.x_prev) > p.xtol else True


def small_deltaF(p):
    if p.iter == 0: return False
    #r = False if p.norm(p.fk - p.f_prev) > p.ftol else True
    if  isnan(p.iterValues.f[-1]) or isnan(p.iterValues.f[-2]) or p.norm(p.iterValues.f[-1] - p.iterValues.f[-2]) >= p.ftol: # or (p.iterValues.r[-1] > p.contol and p.iterValues.r[-1] - p.iterValues.r[-2] < p.contol):
            return False
    else: return (True, '|| F[k] - F[k-1] || < ftol')


def isEnough(p):
#    asscalar(asarray(p.Fk)) was added for compatibility with ironpython
    if p.fEnough > asscalar(asarray(p.Fk)) and p.isFeas(p.xk): #TODO: mb replace by p.rk<p.contol? or other field like p.iterValues.isFeasible?
       return (True, 'fEnough has been reached')
    else: return False

def isNanInX(p):
    if any(isnan(p.xk)):
       return (True, 'NaN in X[k] coords has been obtained')
    else: return False


def isMaxIterReached(p):
    if p.iter >= p.maxIter-1: # iter numeration starts from zero
        return (True, 'Max Iter has been reached')
    else: return False

def isMaxCPUTimeReached(p):
    if p.iterCPUTime[-1] < p.maxCPUTime + p.cpuTimeElapsedForPlotting[-1]:
        return False
    else:
        return (True, 'max CPU time limit has been reached')
    #return p.cpuTimeElapsed >= p.maxCPUTime

def isMaxTimeReached(p):
    if p.currtime - p.timeStart < p.maxTime + p.timeElapsedForPlotting[-1]:
        return False
    else:
        return (True, 'max time limit has been reached')

def isMaxFunEvalsReached(p):
    #if not hasattr(p, 'nFunEvals'): p.warn('no nFunEvals field'); return 0
    if p.nEvals['f'] >= p.maxFunEvals:
        return (True, 'max objfunc evals limit has been reached')
    else:
        return False


####################################################################
def denyingStopFuncs(ProblemGroup=None):
    #mb in future it will be class-dependend,  like Matrix,  Nonlinear etc
    return {isMinIterReached : 'min iter is not reached yet', isMinTimeReached : 'min time is not reached yet', isMinCPUTimeReached:'min cputime is not reached yet', isMinFunEvalsReached:'min objective function evaluations nuber is not reached yet'}

isMinFunEvalsReached = lambda p: p.minFunEvals==0 or ('f' in p.nEvals.keys() and p.nEvals['f'] >= p.minFunEvals)

isMinTimeReached = lambda p: p.currtime - p.timeStart > p.minTime + p.timeElapsedForPlotting[-1]

isMinCPUTimeReached = lambda p: p.iterCPUTime[-1] >= p.minCPUTime + p.cpuTimeElapsedForPlotting[-1]

isMinIterReached = lambda p: p.iter >= p.minIter