Skip to content

Handle infinite values in gradients #575

@janosg

Description

@janosg

Current situation

Optimagic does not make a check for infinite values in gradients. Some optimizers do and raise an error if any infinite values are encountered. The error message raised by optimizers is necessarily based on internal (flat) gradients.

Possible improvements

  1. Make the check in optimagic (fun and fun_and_jac of the InternalOptimizationProblem) and raise an error message based on external (non-flat) gradients
  2. Integrate this with our error handling. If error_handling is set to continue we could treat infinite values in gradients as error and replace the function value and gradient with penalty versions.

Example

This topic came up in a skillmodels application by @hmgaudecker using the fides optimizer

│ /home/skanehealth/skane-struct-bw/.pixi/envs/default/lib/python3.13/site-packages/fides/minimize │
│ .py:793 in check_finite                                                                          │
│                                                                                                  │
│   790 │   │   if not np.isfinite(grad).all():                                                    │
│   791 │   │   │   self.exitflag = ExitFlag.NOT_FINITE                                            │
│   792 │   │   │   ix = np.where(np.logical_not(np.isfinite(grad)))                               │
│ ❱ 793 │   │   │   raise RuntimeError('Encountered non-finite gradient entries'                   │
│   794 │   │   │   │   │   │   │      f' {grad[ix]} for indices {ix} '                            │
│   795 │   │   │   │   │   │   │      f'{pointstr}')                                              │
│   796                                                                                            │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
RuntimeError: Encountered non-finite gradient entries [
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan
] for indices (
    array([
        0,   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
    ]),
) at initial point.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions