Path: blob/main/tools/contributed/sumopy/agilepy/lib_misc/docgen.py
169689 views
#!/usr/bin/env python1# -*- coding: utf-8 -*-2# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo3# Copyright (C) 2016-2025 German Aerospace Center (DLR) and others.4# SUMOPy module5# Copyright (C) 2012-2021 University of Bologna - DICAM6# This program and the accompanying materials are made available under the7# terms of the Eclipse Public License 2.0 which is available at8# https://www.eclipse.org/legal/epl-2.0/9# This Source Code may also be made available under the following Secondary10# Licenses when the conditions for such availability set forth in the Eclipse11# Public License 2.0 are satisfied: GNU General Public License, version 212# or later which is available at13# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html14# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later1516# @file docgen.py17# @author Joerg Schweizer18# @date 20121920# """21##22##23# """24##__author__ = """Joerg Schweizer"""25##26##27##import networkx as nx28##2930import numpy as np31from matplotlibtools import save_fig, init_plot3233# needed for doc gen + import numpy as np34from os import system, path, getcwd, chdir35import types3637##############################################################################38# convenience functions for Doc39ARRAYTYPES = (types.TupleType, np.ndarray, types.ListType, types.XRangeType)40INTTYPES = (types.IntType, np.int32, np.int64, np.int0, np.int16, np.int8, types.LongType)41FLOATTYPES = (types.FloatType, np.float64)424344def is_arraytype(obj):45"""46Returns True if n is an array type of any kind47"""48return type(obj) in ARRAYTYPES495051def is_integer(n):52"""53Returns True if n is an integer type of any kind54"""55return type(n) in INTTYPES565758def is_float(x):59"""60Returns True if n is a float type of any kind61"""62return type(x) in FLOATTYPES636465class Document:66def __init__(self, filename, workdir=None, preample=None, is_compile=False, is_maketitle=True):67"""68Create a document and open as file69filename = filename, excluding path and extension .tex70preample = enything that goes before begin document71If preample is given then an enire Latex document72will be created. Otherwise the document will be73created as an \\input{} file within another document74"""75# print 'Doc.__init__',filename76if not workdir:77workdir = path.dirname(filename)78if not workdir:79workdir = getcwd()8081self.workdir = workdir82# print ' workdir',workdir83self.filename = filename84self.path_file = path.join(self.workdir, filename)+'.tex'85# print ' path_file',self.path_file86self.f = open(self.path_file, 'w')87self.preample = preample88self.is_maketitle = is_maketitle89if self.preample:90self.f.write(preample+"""\n\\begin{document}\n""")91if self.is_maketitle:92self.f.write("""\n\maketitle""")93# return self.f94self.is_compile = is_compile9596def section(self, name, mode='', label=None):9798self.f.write("""\n\\section"""+mode+"""{"""+name + """}\n""")99if label:100self.f.write("""\\label{"""+label + """}\n""")101102def subsection(self, name, mode='', label=None):103104self.f.write("""\n\\subsection"""+mode+"""{"""+name + """}\n""")105if label:106self.f.write("""\\label{"""+label + """}\n""")107108def subsubsection(self, name, mode='', label=None):109110self.f.write("""\n\\subsubsection"""+mode+"""{"""+name + """}\n""")111if label:112self.f.write("""\\label{"""+label + """}\n""")113114def new_line(self, mode=""):115self.f.write(mode+"""\\\\ \n\n""")116117def hline(self):118self.f.write("""\\hline \n""")119120def newpage(self):121self.f.write("""\\newpage \n""")122123def make_tableofcontents(self):124self.f.write("""\\tableofcontents125\\thispagestyle{empty}\\clearpage \n""")126127def clearpage(self):128self.f.write("""\\clearpage \n""")129130def write_objvaltable(self, obj, groupname=None,131attrsname="Attributes", valuesname="Value", symbolsname=None,132**kwargs):133134attrsman = obj.get_attrsman()135136if (groupname is None) | (not attrsman.has_group(groupname)):137attrconfigs = attrsman.get_configs()138139else:140attrconfigs = attrsman.get_group(groupname)141attrsname = groupname142143# first make a table of scalars only144if symbolsname is None:145self.begin_tabular(firstrow=[attrsname.capitalize(), valuesname.capitalize()], **kwargs)146else:147self.begin_tabular(firstrow=[attrsname.capitalize(), symbolsname.capitalize(),148valuesname.capitalize()], **kwargs)149150for attrconfig in attrconfigs:151if not attrconfig.is_colattr():152if symbolsname is None:153self.add_tabular_row([attrconfig.get_name(),154attrconfig.format_value(show_unit=True, show_parentesis=False)])155else:156if hasattr(attrconfig, 'symbol'):157symbol = "$%s$" % attrconfig.symbol158else:159symbol = ""160161self.add_tabular_row([attrconfig.get_name(),162symbol,163attrconfig.format_value()164+ "$\,%s$" % attrconfig.format_unit(show_parentesis=False),165])166self.end_tabular()167168def begin_tabular(self, firstrow=[], firstcol=[], sep="|", align="c", n_cols=0, n_rows=0,169is_hline=True, is_vline=True, is_centered=True, stretch=1.2):170self.tab_firstrow = firstrow171self.tab_firstcol = firstcol172self.tab_rowcount = 0173self.tab_sep = sep174self.tab_is_hline = is_hline175self.tab_is_vline = is_vline176self.tab_is_centered = is_centered177178if self.tab_is_centered:179self.begin_center()180181format = ""182if len(firstrow) > 0:183self.tab_n_cols = len(firstrow)184else:185self.tab_n_cols = n_cols186187if len(firstcol) > 0:188self.tab_n_rows = len(firstcol)189if is_vline:190format = "|"+align+"||"191else:192format = align+"|"193else:194self.tab_n_rows = n_rows195if is_vline:196format = "|"197198for col in range(self.tab_n_cols):199if col == (self.tab_n_cols-1):200if is_vline:201form_col = align+"|"202else:203form_col = align204else:205form_col = align+sep206207format += form_col208209if stretch != None:210self.f.write("""\\renewcommand\\arraystretch{%s}\n""" % stretch)211212self.f.write("""\\begin{tabular}{"""+format + """}\n""")213self._make_tableheader()214215def _make_tableheader(self):216217if self.tab_is_hline:218self.f.write("""\\hline\\hline \n""")219elif len(self.tab_firstrow) > 0:220self.f.write("""\\hline \n """)221else:222self.f.write("""\n """)223224if len(self.tab_firstrow) > 0:225if len(self.tab_firstcol) > 0:226227self.f.write("\t &") # make empty top left table corner228229for col in range(self.tab_n_cols):230if col == (self.tab_n_cols-1):231sep = "\t \\\\ \n"232else:233sep = "\t &"234235self._write_arrayelement(self.tab_firstrow[col], sep, is_math=False)236237if self.tab_is_hline:238self.f.write("""\\hline\\hline \n""")239else:240self.f.write("""\\hline \n """)241242def add_tabular_row(self, row):243244# print 'add_tabular_row',self.tab_rowcount245if len(self.tab_firstcol) > 0:246self._write_arrayelement(self.tab_firstcol[self.tab_rowcount], "\t &",247is_math=False)248249for col in range(self.tab_n_cols):250if col == (self.tab_n_cols-1):251sep = "\t\\\\ \n"252else:253sep = "\t &"254255self._write_arrayelement(row[col], sep, is_math=False)256257if self.tab_is_hline:258self.f.write("""\\hline \n""")259260self.tab_rowcount += 1261262def end_tabular(self):263if self.tab_is_hline:264self.f.write("""\\hline \n""")265266self.f.write("\\end{tabular} \n")267268if self.tab_is_centered:269self.end_center()270271def begin_equation(self, mode="$", label=None):272if label != None:273mode = 'enum'274self.eqn_mode = mode275if self.eqn_mode in ("$", "inline"):276self.f.write("$")277elif self.eqn_mode in ("*", "nolabels"):278self.f.write("""\\begin{equation*}\n""")279elif self.eqn_mode in ("enum", "enumerated"):280self.f.write("""\\begin{equation}\n""")281else:282self.eqn_mode = "["283self.f.write("""\\[\n""")284285if label != None:286self.write("""\\label{%s}""" % label)287288def end_equation(self):289if self.eqn_mode in ("$", "inline"):290self.f.write("$\n")291elif self.eqn_mode in ("*", "nolabels"):292self.f.write("""\\end{equation*}\n""")293elif self.eqn_mode in ("enum", "enumerated"):294self.f.write("""\\end{equation}\n""")295else:296self.eqn_mode = "["297self.f.write("""\\]\n""")298299def begin_description(self):300self.f.write("\n\\begin{description}\n")301302def item(self, item, label=None):303if label == None:304self.f.write("\n\\item %s\n" % item)305else:306self.f.write("\n\\item[%s] %s\n" % (label, item))307308def end_description(self):309self.f.write("\\end{description} \n")310311def begin_array(self, n_col=1, brace="(", arraystretch=1):312self.f.write("\\renewcommand\\arraystretch{%.2f}" % arraystretch)313self.f.write("\\left"+brace+"\\begin{array}{"+n_col*"c"+"}\n")314315def end_array(self, brace=")"):316self.f.write("\\end{array}\\right"+brace+" \n")317318def matrix(self, matrix, format=None, is_math=True, leftbrace='(', rightbrace=')', arraystretch=1):319# print 'pmatrix',matrix320# n_row,n_col=matrix.shape321n_row = len(matrix)322n_col = len(matrix[0])323self.begin_array(n_col, leftbrace, arraystretch)324for row in xrange(0, n_row):325for col in xrange(0, n_col):326# print ' ',col,row,matrix[row,col]327if col == (n_col-1):328sep = "\\\\ \n"329else:330sep = " & "331# pick matrix element at row,col and decide what to do332elem = matrix[row][col]333self._write_arrayelement(elem, sep, format_default=format, is_math=is_math)334335self.end_array(rightbrace)336337def colvec(self, vec, format=None, is_math=True):338# print 'pmatrix',matrix339n_row = len(vec)340sep = "\\\\ \n"341self.begin_array(1)342for col in xrange(0, n_row):343self._write_arrayelement(vec[col], sep, format_default=format, is_math=is_math)344345self.end_array()346347def rowvec(self, vec, format=None, is_math=True):348n_row = len(vec)349350self.begin_array(n_row)351for row in xrange(0, n_row):352# print ' ',col,row,matrix[row,col]353if row == (n_row-1):354sep = "\\\\ \n"355else:356sep = " & "357self._write_arrayelement(vec[row], sep, format_default=format, is_math=is_math)358359self.end_array()360361def _write_arrayelement(self, elem, sep, format_default=None, is_math=False):362"""363Write to document the formated characters dependend on type364"""365# print '_write_arrayelement'366# print ' elem,format_default',elem,type(elem),type(elem)==np.float64,format_default367if is_math:368mathsep = ""369else:370mathsep = "$" # create in-line mat env371372if is_arraytype(elem):373self.f.write(mathsep)374if is_arraytype(elem[0]):375self.matrix(elem, is_math=False) # write entire matrix376else:377self.rowvec(elem, is_math=False) # write entire matrix378self.f.write(mathsep+sep)379380elif format_default != None: # scalar with default format381self.f.write((format_default+sep) % (elem))382383elif is_integer(elem):384format = "%d"385self.f.write((mathsep+format+mathsep+sep) % (elem))386387elif is_float(elem):388format = "%.2f"389self.f.write((mathsep+format+mathsep+sep) % (elem))390391else: # probably a string, just as is392self.f.write(elem+sep)393394def begin_center(self):395self.f.write("""\n\\begin{center}\n""")396397def end_center(self):398self.f.write("""\\end{center}\n""")399400def include_graphics(self, filename, options=None, is_centered=True,401method='matplotlib', label=None, caption=None, envoptions='h!'):402print 'include_graphics ', filename403path_file = path.join(self.workdir, filename)404if options is None:405options = 'width = \\textwidth'406is_figure_env = (label != None) | (caption != None)407if is_figure_env:408if label != None:409self.write("""\\begin{figure}[%s]""" % envoptions)410else:411self.write("""\\begin{figure*}[%s]""" % envoptions)412413if is_centered:414self.begin_center()415# print ' method=',method416if method == 'matplotlib':417418workdir = getcwd()419chdir(self.workdir)420# print ' safe matplotlib figure and convert to pdf'421ffilename = save_fig(filename)422# print ' done safe'423chdir(workdir)424self.f.write("""\\includegraphics["""+options+"""]{"""+ffilename + """}\n""")425else:426self.f.write("""\\includegraphics["""+options+"""]{"""+filename + """}\n""")427428if is_centered:429self.end_center()430if is_figure_env:431if caption != None:432self.write("""\\caption{%s}""" % caption)433if label != None:434self.write("""\\label{%s}""" % label)435436if label != None:437self.write("""\\end{figure}""")438else:439self.write("""\\end{figure*}""")440441def save_graphics_matplotlib(self, filename):442"""443Save current matplotlib graphics in working directory.444"""445workdir = getcwd()446chdir(self.workdir)447save_fig(filename)448chdir(workdir)449450def write(self, text):451self.f.write(text+"\n")452453def stream(self, text):454self.f.write(text)455456def end(self):457if self.preample:458self.f.write("""\\end{document}\n""")459self.f.close()460if self.is_compile:461print 'compile latex ', self.path_file462system('pdflatex ' + self.path_file)463464465def ref(label, reftype=None):466if reftype == None:467return '~\\ref{%s}' % label468else:469return '%s~\\ref{%s}' % (reftype, label)470471472