docs: def pheno(self, x, into_bounds=None, copy=True, copy_always=False,
                archive=None, iteration=None):
          """maps the genotypic input argument into the phenotypic space,
          see help for class `GenoPheno`
  
          Details
          -------
          If ``copy``, values from ``x`` are copied if changed under the transformation.
  
          """
          # TODO: copy_always seems superfluous, as it could be done in the calling code
          input_type = type(x)
          if into_bounds is None:
              into_bounds = (lambda x, copy=False:
                                  x if not copy else array(x, copy=copy))
          if copy_always and not copy:
              raise ValueError('arguments copy_always=' + str(copy_always) +
                               ' and copy=' + str(copy) + ' have inconsistent values')
          if copy_always:
              x = array(x, copy=True)
              copy = False
  
          if self.isidentity:
              y = into_bounds(x) # was into_bounds(x, False) before (bug before v0.96.22)
          else:
              if self.fixed_values is None:
                  y = array(x, copy=copy)  # make a copy, in case
              else:  # expand with fixed values
                  y = list(x)  # is a copy
                  for i in sorted(self.fixed_values.keys()):
                      y.insert(i, self.fixed_values[i])
                  y = array(y, copy=False)
              copy = False
  
              if self.scales is not 1:  # just for efficiency
                  y *= self.scales
  
              if self.typical_x is not 0:
                  y += self.typical_x
  
              if self.tf_pheno is not None:
                  y = array(self.tf_pheno(y), copy=False)
  
              y = into_bounds(y, copy)  # copy is False
  
              if self.fixed_values is not None:
                  for i, k in list(self.fixed_values.items()):
                      y[i] = k
  
          if input_type is np.ndarray:
              y = array(y, copy=False)
          if archive is not None:
              archive.insert(y, geno=x, iteration=iteration)
          return y