class_docstr: Constraint on the sum of parameters being greater or less than a bound.
docstr: Initialize SumConstraint
  
  Args:
      parameters: List of parameters whose sum to constrain on.
      is_upper_bound: Whether the bound is an upper or lower bound on the sum.
      bound: The bound on the sum.
code: def __init__(
      self,
      parameters: List[Parameter],
      is_upper_bound: bool,
      bound: float,
  ) -> None:
      """Initialize SumConstraint
  
      Args:
          parameters: List of parameters whose sum to constrain on.
          is_upper_bound: Whether the bound is an upper or lower bound on the sum.
          bound: The bound on the sum.
      """
      validate_constraint_parameters(parameters)
  
      self._parameters = parameters
      self._is_upper_bound: bool = is_upper_bound
      self._parameter_names: List[str] = [
          parameter.name for parameter in parameters
      ]
      self._bound: float = self._inequality_weight * bound
      self._constraint_dict: Dict[str, float] = {
          name: self._inequality_weight
          for name in self._parameter_names
      }
  
imports: from __future__ import annotations
  from typing import Dict, List, Union
  from ax.core.parameter import ChoiceParameter, FixedParameter, Parameter, RangeParameter
  from ax.core.types import ComparisonOp
  from ax.utils.common.base import SortableBase
label_desc: Use image node_id 1 to create a new SumConstraint object from inherited base classes: ParameterConstraint with example: obj = SumConstraint(parameters, is_upper_bound, bound)