code: def parameter_names(self, add_self=False, adjust_for_printing=False, recursive=True, intermediate=False):
          
          if adjust_for_printing: adjust = adjust_name_for_printing
          else: adjust = lambda x: x
          names = []
          if intermediate or (not recursive):
              names.extend([adjust(x.name) for x in self.parameters])
          if intermediate or recursive: names.extend([
                  xi for x in self.parameters for xi in
                   x.parameter_names(add_self=True,
                                     adjust_for_printing=adjust_for_printing,
                                     recursive=True,
                                     intermediate=False)])
          if add_self: names = map(lambda x: adjust(self.name) + "." + x, names)
          return names
docs: Get the names of all parameters of this model or parameter. It starts
          from the parameterized object you are calling this method on.
  
          Note: This does not unravel multidimensional parameters,
                use parameter_names_flat to unravel parameters!
  
          :param bool add_self: whether to add the own name in front of names
          :param bool adjust_for_printing: whether to call `adjust_name_for_printing` on names
          :param bool recursive: whether to traverse through hierarchy and append leaf node names
          :param bool intermediate: whether to add intermediate names, that is parameterized objects