class_docstr: Class to hold linear constraints information
  
  Affine constraints are defined as ``R b = q` where `R` is the constraints
  matrix and `q` are the constraints values and `b` are the parameters.
  
  This is in analogy to patsy's LinearConstraints class but can be pickled.
  
  Parameters
  ----------
  constraint_matrix : ndarray
      R matrix, 2-dim with number of columns equal to the number of
      parameters. Each row defines one constraint.
  constraint_values : ndarray
      1-dim array of constant values
  variable_names : list of strings
      parameter names, used only for display
  kwds : keyword arguments
      keywords are attached to the instance.
code: def __str__(self):
      def prod_string(v, name):
          v = np.abs(v)
          if v != 1:
              ss = str(v) + " * " + name
          else:
              ss = name
          return ss
  
      constraints_strings = []
      for r, q in zip(*self):
          ss = []
          for v, name in zip(r, self.variable_names):
              if v != 0 and ss == []:
                  ss += prod_string(v, name)
              elif v > 0:
                  ss += " + " + prod_string(v, name)
              elif v < 0:
                  ss += " - " + prod_string(np.abs(v), name)
          ss += " = " + str(q.item())
          constraints_strings.append("".join(ss))
  
      return "\n".join(constraints_strings)
  
file_path: statsmodels/statsmodels/base/_constraints.py
imports: import numpy
label_desc: Use image node_id 4 for calling the LinearConstraints obj's underlying member method code with example usage: obj.__str__() and returns: str, ss