def _get_summary_struct(self):
        """
        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.
        """
        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)