code: def _get_summary_struct(self):
          
          g = self.graph
  
          section_titles = ['Graph']
  
          graph_summary = [(k, _precomputed_field(v)) for k, v in six.iteritems(g.summary())]
  
          sections = [graph_summary]
  
          # collect other sections
          results = [(k, _precomputed_field(v)) for k, v in six.iteritems(self._result_fields())]
          methods = [(k, _precomputed_field(v)) for k, v in six.iteritems(self._method_fields())]
          settings = [(k, v) for k, v in six.iteritems(self._setting_fields())]
          metrics = [(k, v) for k, v in six.iteritems(self._metric_fields())]
  
          optional_sections = [('Results', results), ('Settings', settings), \
                                  ('Metrics', metrics), ('Methods', methods)]
  
          # if section is not empty, append to summary structure
          for (title, section) in optional_sections:
              if len(section) > 0:
                  section_titles.append(title)
                  sections.append(section)
  
          return (sections, section_titles)
docs: Returns a structured description of the model, including (where relevant)
          the schema of the training data, description of the training data,
          training statistics, and model hyperparameters.
  
          Returns
          -------
          sections : list (of list of tuples)
              A list of summary sections.
                Each section is a list.
                  Each item in a section list is a tuple of the form:
                    ('<label>','<field>')
          section_titles: list
              A list of section titles.
                The order matches that of the 'sections' object.