Example #1
0
def tuning_MultinomialNB():
    param_grid = {
        "alpha": [1, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9]
    }
    result_list = []
    optimized_param = [0, 0, 0, 0, 0]
    for alpha in param_grid["alpha"]:
        # try:
        current_param_and_eval = [alpha]
        clf = MultinomialNB(alpha=alpha)
        f1_scores_dict = load_train_output_crossvalidation(clf)
        f1_scores_dict = round_f1_score(f1_scores_dict)
        f1_train_average = f1_scores_dict["f1_train_average"]
        f1_dev_average = f1_scores_dict["f1_dev_average"]
        f1_train_micro_average = f1_scores_dict["f1_train_micro_average"]
        f1_dev_micro_average = f1_scores_dict["f1_dev_micro_average"]
        current_param_and_eval.append(f1_train_micro_average)
        current_param_and_eval.append(f1_dev_micro_average)
        current_param_and_eval.append(f1_train_average)
        current_param_and_eval.append(f1_dev_average)

        result_list.append(current_param_and_eval)
        if current_param_and_eval[2] > optimized_param[2]:
            optimized_param = current_param_and_eval
    # except:
    #     print("An exception occurs.")

    # Generate data table
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    with doc.create(LongTable("l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "alpha", "training f1", "valid f1",
            "training f1 for each technique", "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        for i in range(len(result_list)):
            data_table.add_row(result_list[i][0:5])
        data_table.add_hline()
    with doc.create(LongTable("l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "alpha", "training f1", "valid f1",
            "training f1 for each technique", "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        data_table.add_row(optimized_param)
        data_table.add_hline()
    print("This is for MultinomialNB.")
    doc.generate_pdf("tuning_MultinomialNB", clean_tex=False)
def create_long_table(
    doc,
    parameters,
    skip_parameters=[],
    table_specs=r"|p{0.45\linewidth}|p{0.45\linewidth}|",
    header=[bold("Parameter"), bold("Value")],
):
    """
    Helper function to create long table for parameters
    Arguments:
         doc: document to add table
         parameters: parameters dict
         skip_parameters: list of parameters to skip
         table_specs: latex specific table settings
         header: list with column names
    """
    columns = len(header)
    with doc.create(LongTable(table_spec=table_specs)) as data_table:
        # Table header
        data_table.add_hline()
        data_table.add_row(header)
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_row((MultiColumn(columns,
                                        align="r",
                                        data="Continued on Next Page"), ))
        data_table.end_table_footer()
        data_table.add_row((MultiColumn(columns,
                                        align="r",
                                        data="End of Table"), ))
        data_table.end_table_last_footer()
        for item in parameters:
            if item not in skip_parameters:
                data_table.add_row([item, str(parameters[item])])
                data_table.add_hline()
Example #3
0
def genenerate_longtabu():
    geometry_options = {
        "margin": "2.54cm",
        "includeheadfoot": True
    }
    doc = Document(page_numbers=True, geometry_options=geometry_options)

    # Generate data table
    with doc.create(LongTable("l l l")) as data_table:
            data_table.add_hline()
            data_table.add_row(["header 1", "header 2", "header 3"])
            data_table.add_hline()
            data_table.end_table_header()
            data_table.add_hline()
            data_table.add_row((MultiColumn(3, align='r',
                                data='Containued on Next Page'),))
            data_table.add_hline()
            data_table.end_table_footer()
            data_table.add_hline()
            data_table.add_row((MultiColumn(3, align='r',
                                data='Not Containued on Next Page'),))
            data_table.add_hline()
            data_table.end_table_last_footer()
            row = ["Content1", "9", "Longer String"]
            for i in range(150):
                data_table.add_row(row)

    doc.generate_pdf("longtable", clean_tex=False)
def basic_table():
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)

    batch_size_list = [8, 12, 16, 32]
    learning_rate_list = [1e-5, 2e-5, 5e-5, 1e-4]
    epochs_list = [2, 4, 8, 12]

    rows = []
    for batch_size in batch_size_list:
        for learning_rate in learning_rate_list:
            for epochs in epochs_list:
                row = []
                row.append(batch_size)
                row.append(learning_rate)
                row.append(epochs)
                row.append(0)
                rows.append(row)

    # Generate data table
    with doc.create(LongTable("l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row(["batch size", "learning rate", "epochs", "F1"])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        for i in range(len(rows)):
            data_table.add_row(rows[i])

    doc.generate_pdf("hyper_tune_bert", clean_tex=False)
Example #5
0
 def genenerate_longtabu(data):
     if data == data_PU:
         with doc.create(LongTable("l l c c c c c c l")) as data_table:
             doc.append(Command('caption', 'Zadání místností pro výpočet'))
             doc.append(Command('label', 'rozmery'))
             doc.append(Command('\ '))
             data_table.append
             data_table.add_hline()
             data_table.add_row([
                 "PU", "Místnost", "Plocha",
                 NoEscape('h$_s$'),
                 NoEscape('a$_n$'),
                 NoEscape('p$_n$'),
                 NoEscape('p$_s$'), "c", "Tab. A.1"
             ])
             data_table.add_hline()
             data_table.end_table_header()
             data_table.add_hline()
             doc.append(Command('endfoot'))
             doc.append(Command('endlastfoot'))
             # data_table.end_table_footer()
             data_table.add_hline()
     if data == data_POP:
         with doc.create(LongTable("l l c c c c", pos=['l'])) as data_table:
             doc.append(Command('caption', 'Zadání okenních otvorů'))
             doc.append(Command('label', 'okna'))
             doc.append(Command('\ '))
             data_table.append
             data_table.add_hline()
             data_table.add_row([
                 "PU", "Místnost", "n otvorů", "šířka otvorů",
                 "výška otvorů", "Plocha"
             ])
             data_table.add_row(
                 [" ", " ", " ", "[m]", "[m]",
                  NoEscape('m$^2$')])
             data_table.add_hline()
             data_table.end_table_header()
             data_table.add_hline()
             data_table.add_hline()
     for i in range(0, len(data)):
         if i % 2 == 0:
             data_table.add_row(data[i])
         else:
             data_table.add_row(data[i], color="Hex")
     data_table.add_hline()
Example #6
0
def description_regression(full_data_files, description_folder):
    data_list = list()
    for d in full_data_files:
        name = d.split('/')[2].split('.')[0]
        df = pd.read_csv(d,
                         sep='\s+',
                         header=None)
        lines, columns = df.shape
        attribute = columns - 1  # Minus one because of target
        data_list.append({'Dataset': name,
                          'Size': lines,
                          'Attributes': attribute})

    df = pd.DataFrame(data_list)
    df = df.sort_values('Size', ascending=False)
    cols = ['Dataset',
            'Size',
            'Attributes']
    df = df[cols]
    df_copy = deepcopy(df)
    df_copy.to_csv(os.path.join(description_folder,
                                'data_description.csv'),
                   sep=',',
                   header=True,
                   columns=['Dataset',
                            'Size',
                            'Attributes'],
                   index=False)

    # # LaTeX
    df = df.set_index(['Dataset'])

    # Max classes per row
    max_classes = np.inf
    geometry_options = {
        "margin": "1.00cm",
        "includeheadfoot": True
    }
    doc = Document(page_numbers=True, geometry_options=geometry_options)

    # Generate data table
    with doc.create(LongTable("l l l")) as data_table:
            data_table.add_hline()
            header = ["Dataset",
                      "Size",
                      "#Attr."]
            data_table.add_row(header)
            data_table.add_hline()
            data_table.add_hline()
            for index in df.index.values:
                row = [index] + df.loc[index].values.tolist()
                data_table.add_row(row)

    doc.generate_pdf(os.path.join(description_folder,
                                  'data_description'), clean_tex=False)
Example #7
0
def k_generator(data_dir, vystup_dir):
    os.chdir(data_dir)
    data_PU = read_results('results.csv')

    data_used = []
    for i in range(0, len(data_PU)):
        data_used.append(data_PU[i][0])
        data_used.append(data_PU[i][1])
        data_used.append(data_PU[i][2])
        data_used.append(data_PU[i][4])
        a = 0.15 * ((float(data_PU[i][1]) * float(data_PU[i][2]) *
                     float(data_PU[i][4]))**0.5)
        # print(float(data_PU[i][1]), float(data_PU[i][2]), float(data_PU[i][4]))
        data_used.append(str(round(a, 2)))
        data_used.append('{} PG6 21A/183B'.format(math.ceil(a)))

    data_used = list(chunks(data_used, 6))

    with doc.create(Section('Hasicí přístroje')):
        with doc.create(Subsection('Přehled hasicích přístrojů')):
            doc.append(
                NoEscape(r'Přehled počtu a druhu všech hasicích přístrojů,\
                                které budou v objektu osazeny, je patrný z\
                                tabulky \ref{PHP_stanoveni}.'))

        for i in range(0, len(data_used)):
            data_used[i][1] = data_used[i][1].replace(".", ",")
            data_used[i][2] = data_used[i][2].replace(".", ",")
            data_used[i][3] = data_used[i][3].replace(".", ",")
            data_used[i][4] = data_used[i][4].replace(".", ",")

        with doc.create(LongTable("l c c c c l", pos=['htb'])) as data_table:
            doc.append(Command('caption', 'Počet a druh hasicích přístrojů'))
            doc.append(Command('label', NoEscape('PHP_stanoveni')))
            doc.append(Command('\ '))
            data_table.append
            data_table.add_hline()
            data_table.add_row([
                "Požární úsek", "S", "a", "c",
                NoEscape('$n_r$'), "Počet PHP - typ"
            ])
            data_table.add_row([" ", NoEscape('[m$^2$]'), "-", "-", "-", " "])
            data_table.add_hline()
            data_table.end_table_header()
            for i in range(0, len(data_used)):
                if i % 2 != 0:
                    data_table.add_row(data_used[i], color="Hex")
                else:
                    data_table.add_row(data_used[i])
            data_table.add_hline()
            # doc.append(NoEscape('\insertTableNotes'))
            os.chdir(vystup_dir)
    doc.generate_pdf("K_hasicaky", clean_tex=False)
Example #8
0
    def _document_aggregate_table(self, tests: List[Dict[str, Any]]) -> None:
        """Document a result table of aggregate tests.

        Args:
            tests: List of corresponding test dictionary to make a table.
        """
        with self.doc.create(LongTable('|c|p{8cm}|p{7.3cm}|',
                                       booktabs=True)) as tabular:
            package = Package('seqsplit')
            if package not in tabular.packages:
                tabular.packages.append(package)

            # add table heading
            tabular.add_row((MultiColumn(size=1, align='|c|', data="Test ID"),
                             MultiColumn(size=1,
                                         align='c|',
                                         data="Test Description"),
                             MultiColumn(size=1,
                                         align='c|',
                                         data="Input Value")))

            # add table header and footer
            tabular.add_hline()
            tabular.end_table_header()
            tabular.add_hline()
            tabular.add_row((MultiColumn(3,
                                         align='r',
                                         data='Continued on Next Page'), ))
            tabular.add_hline()
            tabular.end_table_footer()
            tabular.end_table_last_footer()

            for idx, test in enumerate(tests):
                if idx > 0:
                    tabular.add_hline()

                inp_data = [
                    f"{arg}={self.sanitize_value(value)}"
                    for arg, value in test["inputs"].items()
                ]
                inp_data = [WrapText(data=x, threshold=27) for x in inp_data]
                des_data = [
                    WrapText(data=x, threshold=27)
                    for x in test["description"].split(" ")
                ]
                row_cells = [
                    self.test_id,
                    IterJoin(data=des_data, token=" "),
                    IterJoin(data=inp_data, token=escape_latex(", \n")),
                ]
                tabular.add_row(row_cells)
                self.test_id += 1
Example #9
0
def long_table(num=2, title=("符号", "说明")):
    data_table = LongTable("l " * num)
    data_table.add_hline()
    data_table.add_hline()
    data_table.add_row(title)
    data_table.add_hline()
    data_table.end_table_header()
    data_table.add_hline()
    data_table.end_table_footer()
    data_table.add_hline()
    data_table.add_hline()
    data_table.end_table_last_footer()
    return data_table
Example #10
0
 def _document_sys_config(self) -> None:
     """Add a system config summary to the traceability document.
     """
     with self.doc.create(Section("System Config")):
         with self.doc.create(Itemize()) as itemize:
             itemize.add_item(
                 escape_latex(f"FastEstimator {fe.__version__}"))
             itemize.add_item(
                 escape_latex(f"Python {platform.python_version()}"))
             itemize.add_item(escape_latex(f"OS: {sys.platform}"))
             itemize.add_item(
                 f"Number of GPUs: {torch.cuda.device_count()}")
             if fe.fe_deterministic_seed is not None:
                 itemize.add_item(
                     escape_latex(
                         f"Deterministic Seed: {fe.fe_deterministic_seed}"))
         with self.doc.create(LongTable('|lr|', pos=['h!'],
                                        booktabs=True)) as tabular:
             tabular.add_row((bold("Module"), bold("Version")))
             tabular.add_hline()
             tabular.end_table_header()
             tabular.add_hline()
             tabular.add_row((MultiColumn(2,
                                          align='r',
                                          data='Continued on Next Page'), ))
             tabular.add_hline()
             tabular.end_table_footer()
             tabular.end_table_last_footer()
             color = True
             for name, module in humansorted(sys.modules.items(),
                                             key=lambda x: x[0]):
                 if "." in name:
                     continue  # Skip sub-packages
                 if name.startswith("_"):
                     continue  # Skip private packages
                 if isinstance(module, Base):
                     continue  # Skip fake packages we mocked
                 if hasattr(module, '__version__'):
                     tabular.add_row(
                         (escape_latex(name),
                          escape_latex(str(module.__version__))),
                         color='black!5' if color else 'white')
                     color = not color
                 elif hasattr(module, 'VERSION'):
                     tabular.add_row((escape_latex(name),
                                      escape_latex(str(module.VERSION))),
                                     color='black!5' if color else 'white')
                     color = not color
Example #11
0
def test_table():
    # Tabular
    t = Tabular(table_spec='|c|c|', data=None, pos=None, width=2)

    t.add_hline(start=None, end=None)

    t.add_row((1, 2), escape=False, strict=True, mapper=[bold])
    t.add_row(1, 2, escape=False, strict=True, mapper=[bold])

    # MultiColumn/MultiRow.
    t.add_row((MultiColumn(size=2, align='|c|', data='MultiColumn'), ),
              strict=True)

    # One multiRow-cell in that table would not be proper LaTeX,
    # so strict is set to False
    t.add_row((MultiRow(size=2, width='*', data='MultiRow'), ), strict=False)

    repr(t)

    # TabularX
    tabularx = Tabularx(table_spec='X X X',
                        width_argument=NoEscape(r"\textwidth"))
    tabularx.add_row(["test1", "test2", "test3"])

    # Long Table
    longtable = LongTable(table_spec='c c c')
    longtable.add_row(["test", "test2", "test3"])
    longtable.end_table_header()

    # Colored Tabu
    coloredtable = Tabu(table_spec='X[c] X[c]')
    coloredtable.add_row(["test", "test2"], color="gray", mapper=bold)

    # Colored Tabu with 'spread'
    coloredtable = Tabu(table_spec='X[c] X[c]', spread="1in")
    coloredtable.add_row(["test", "test2"], color="gray", mapper=bold)

    # Colored Tabu with 'to'
    coloredtable = Tabu(table_spec='X[c] X[c]', to="5in")
    coloredtable.add_row(["test", "test2"], color="gray", mapper=bold)

    # Colored Tabularx
    coloredtable = Tabularx(table_spec='X[c] X[c]')
    coloredtable.add_row(["test", "test2"], color="gray", mapper=bold)

    # Column
    column = ColumnType("R", "X", r"\raggedleft", parameters=2)
    repr(column)
Example #12
0
def periodAndRecur(doc, classes, recursive, mc):
    with doc.create(Subsection('Periodicity and Recurrence')):
        with doc.create(LongTable("l l l")) as data_table:
            data_table.add_hline()
            data_table.add_row(['$s$', '$period(s)$', '$Recurrence$'],
                               escape=False)
            data_table.add_hline()
            data_table.end_table_header()
            data_table.add_hline()
            data_table.end_table_last_footer()
            for c in classes:
                row = [
                    '$' + toLatexState(c) + '$', '$' + str(mc.period(c)) + '$',
                    str(c in recursive)
                ]

                data_table.add_row(row, escape=False)
Example #13
0
def edgeList(doc, eL):
    doc.append(NewPage())
    with doc.create(Subsection('Edges')):
        with doc.create(LongTable("l l l l l l l l l l l l l")) as data_table:
            data_table.add_hline()
            data_table.add_row(['$s$', '$s\'$', '$p$', ' ', ' '] * 2 +
                               ['$s$', '$s\'$', '$p$'],
                               escape=False)
            data_table.add_hline()
            data_table.end_table_header()
            data_table.add_hline()
            data_table.end_table_last_footer()
            for i in range(0, len(eL), 3):
                row = []

                triplet = eL[i]
                row += [
                    '$' + toLatexState(triplet[0]) + '$',
                    '$' + toLatexState(triplet[1]) + '$',
                    '$' + toLatexProb(triplet[2]) + '$', ' ', ' '
                ]
                if i + 1 < len(eL):
                    triplet = eL[i + 1]
                    row += [
                        '$' + toLatexState(triplet[0]) + '$',
                        '$' + toLatexState(triplet[1]) + '$',
                        '$' + toLatexProb(triplet[2]) + '$', ' ', ' '
                    ]
                    if i + 2 < len(eL):
                        triplet = eL[i + 2]
                        row += [
                            '$' + toLatexState(triplet[0]) + '$',
                            '$' + toLatexState(triplet[1]) + '$',
                            '$' + toLatexProb(triplet[2]) + '$'
                        ]
                    else:
                        row += [
                            ' ',
                        ] * 3
                else:
                    row += [
                        ' ',
                    ] * 8

                data_table.add_row(row, escape=False)
def POP_generator(df):
    data_used = df.values.tolist()
    for i in range(0, len(data_used)):
        data_used[i][1] = str(("%.2f" % data_used[i][1])).replace(".", ",")
        data_used[i][2] = str(("%.2f" % data_used[i][2])).replace(".", ",")
        data_used[i][3] = str(("%.2f" % data_used[i][3])).replace(".", ",")

    with doc.create(Section('Vymezení požárně nebezpečného prostoru')):
        with doc.create(Subsection('Procenta požárně otevřených ploch')):
            doc.append(NoEscape(r'Dále je určeno, zda je možné jednotlivé otvory ve fasádě posuzovat samostatně, a to výpočtem procenta požárně otevřených ploch z celkové plochy každé fasády. Způsob odečtení plochy fasády a plochy otevřených ploch je patrný z obrázku \ref{SchemaPOP}.'))
            with doc.create(Figure(position='htb!')) as POP:
                POP.add_image('images/POP.jpg', width='200px')
                POP.add_caption('Odečtení požárně otevřených ploch')
                POP.append(Command('label', 'SchemaPOP'))
            doc.append(NoEscape(r'Procentuální výsledky jednotlivých fasád s požárně otevřenými plochami jsou patrné z tabulky \ref{POP}.'))

        with doc.create(LongTable("lcccc", pos=['htb'])) as data_table:
            doc.append(Command('caption', 'Odstupové vzdálenosti od objektu'))
            doc.append(Command('label', 'POP'))
            doc.append(Command('\ '))
            data_table.append
            data_table.add_hline()
            data_table.add_row(["Popis", "Celková plocha", "Plocha POP",
                                "Procento POP", "POP jednotlivě"])
            data_table.add_row([" ", NoEscape('[m$^2$]'), NoEscape('[m$^2$]'),
                                NoEscape('[\%]'), NoEscape(r'\textless 40 \%')])
            data_table.add_hline()
            data_table.end_table_header()
            for i in range(0, len(data_used)):
                if i == 0:
                    # \multicolumn{9}{l}{\textbf{1. nadzemní podlaží - POP společné}}\\
                    data_table.add_row((MultiColumn(5, align='l', data=utils.bold(df_popis_POP[i])),))
                if i > 0 and df_popis_POP[i] != df_popis_POP[i-1]:
                    data_table.add_hline()
                    data_table.add_row((MultiColumn(5, align='l', data=utils.bold(df_popis_POP[i])),))
                if (i) % 2 == 0:
                    data_table.add_row(data_used[i], color="Hex")
                elif (i) % 2 != 0:
                    data_table.add_row(data_used[i])
            data_table.add_hline()

        doc.append(NoEscape(r'Ostatní v tabulce výše nezmíněné otvory na fasádách objektu jsou spočteny jako samostatné 100 \% otevřené požární plochy.'))
Example #15
0
def dataframe_to_pdf(df, pdf_path):
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)

    num_cols = len(df.columns)

    # Generate data table
    with doc.create(LongTable("l " * num_cols)) as data_table:
        data_table.add_hline()
        data_table.add_row(list(df.columns.values))
        data_table.add_hline()
        for i in range(len(df.index)):
            row_list = df.iloc[i].values.tolist()
            if "SEP" in row_list[0]:
                data_table.add_hline()
            else:
                data_table.add_row(row_list)
        data_table.add_hline()

    doc.generate_pdf(pdf_path, clean_tex=False)
Example #16
0
def make_table_of_symbols(symbols: List[str], units: List[str],
                          descriptions: List[str]):
    table_symbols_content = LongTable("l l l")
    table_symbols_content.add_hline()
    table_symbols_content.add_row(["Symbol", "Unit", "Description"])
    table_symbols_content.add_hline()
    table_symbols_content.end_table_header()
    table_symbols_content.add_hline()
    table_symbols_content.add_row(
        (MultiColumn(3, align='r', data='Continued on Next Page'), ))
    table_symbols_content.add_hline()
    table_symbols_content.end_table_footer()
    table_symbols_content.add_hline()
    table_symbols_content.add_row((MultiColumn(3, align='r', data='***End'), ))
    table_symbols_content.add_hline()
    table_symbols_content.end_table_last_footer()

    for i in range(len(symbols)):
        try:
            symbol = py2tex(symbols[i], print_latex=False,
                            print_formula=False).replace('$', '')
        except:
            symbol = symbols[i]
        try:
            unit = py2tex(units[i],
                          print_latex=False,
                          print_formula=False,
                          simplify_fractions=True).replace('$', '')
        except:
            unit = units[i]
        table_symbols_content.add_row([
            NoEscape(f'${symbol}$'),
            NoEscape(f'${unit}$'),
            NoEscape(descriptions[i])
        ])

    table_symbols_content.add_hline()

    return table_symbols_content
Example #17
0
def basic_run():
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    clf_1 = LinearSVC(dual=False)
    clf_2 = LogisticRegression(multi_class="multinomial", solver="newton-cg")
    clf_3 = MultinomialNB()
    clf_4 = RandomForestClassifier()
    LinearSVC_f1_scores_dict = load_train_output_crossvalidation(clf_1)
    LogisticRegression_f1_scores_dict = load_train_output_crossvalidation(
        clf_2)
    MultinomialNB_f1_scores_dict = load_train_output_crossvalidation(clf_3)
    RandomForest_f1_scores_dict = load_train_output_crossvalidation(clf_4)
    row_1 = basic_generate_row("LinearSVC", LinearSVC_f1_scores_dict)
    row_2 = basic_generate_row("LogisticRegression",
                               LogisticRegression_f1_scores_dict)
    row_3 = basic_generate_row("MultinomialNB", MultinomialNB_f1_scores_dict)
    row_4 = basic_generate_row("RandomForest", RandomForest_f1_scores_dict)
    rows = []
    rows.append(row_1)
    rows.append(row_2)
    rows.append(row_3)
    rows.append(row_4)

    # Generate data table
    with doc.create(LongTable("l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "Model Name", "training f1", "valid f1",
            "training f1 for each technique", "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        for i in range(len(rows)):
            data_table.add_row(rows[i])

    doc.generate_pdf("basic_run", clean_tex=False)
Example #18
0
    def make_table(headers: List, *args):
        table = LongTable('|l| l| l| p{10cm}|')
        table.add_hline()
        table.add_row([
            NoEscape(f'\\textbf{{\\textcolor{{black}}{{{i}}}}}')
            for i in headers
        ])
        table.add_hline()
        table.end_table_header()
        table.add_hline()
        table.add_row((MultiColumn(4, align='r',
                                   data='Continued on next page'), ))
        # table.add_hline()
        table.end_table_footer()
        # table.add_hline()
        # table.add_row((MultiColumn(n_cols, align='r', data=''),))
        # table.add_hline()
        table.end_table_last_footer()

        for i in range(len(args[0])):
            table.add_row([NoEscape(j[i]) for j in args])
            table.add_hline()

        return table
Example #19
0
def tuning_RandomForest():
    param_grid = {
        "max_features": ["auto", "sqrt", "log2"],
        "n_estimators": [50, 100, 200],
        "min_sample_leaf": [25, 50, 100],
        "max_depth": [None, 10, 20, 40, 80],
    }
    result_list = []
    optimized_param = [0, 0, 0, 0, 0, 0, 0, 0]
    for max_features in param_grid["max_features"]:
        for n_estimators in param_grid["n_estimators"]:
            for min_sample_leaf in param_grid["min_sample_leaf"]:
                for max_depth in param_grid["max_depth"]:
                    # try:
                    current_param_and_eval = [
                        max_features, n_estimators, min_sample_leaf, max_depth
                    ]
                    clf = RandomForestClassifier(
                        max_features=max_features,
                        n_estimators=n_estimators,
                        min_samples_leaf=min_sample_leaf,
                        max_depth=max_depth)
                    f1_scores_dict = load_train_output_crossvalidation(clf)
                    f1_scores_dict = round_f1_score(f1_scores_dict)
                    f1_train_average = f1_scores_dict["f1_train_average"]
                    f1_dev_average = f1_scores_dict["f1_dev_average"]
                    f1_train_micro_average = f1_scores_dict[
                        "f1_train_micro_average"]
                    f1_dev_micro_average = f1_scores_dict[
                        "f1_dev_micro_average"]
                    current_param_and_eval.append(f1_train_micro_average)
                    current_param_and_eval.append(f1_dev_micro_average)
                    current_param_and_eval.append(f1_train_average)
                    current_param_and_eval.append(f1_dev_average)

                    result_list.append(current_param_and_eval)
                    if current_param_and_eval[5] > optimized_param[5]:
                        optimized_param = current_param_and_eval
                # except:
                #     print("An exception occurs.")

    # Generate data table
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    with doc.create(LongTable("l l l l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "max_features", "n_estimators", "min_sample_leaf", "max_depth",
            "training f1", "valid f1", "training f1 for each technique",
            "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        for i in range(len(result_list)):
            data_table.add_row(result_list[i][0:8])
        data_table.add_hline()
    with doc.create(LongTable("l l l l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "max_features", "n_estimators", "min_sample_leaf", "max_depth",
            "training f1", "valid f1", "training f1 for each technique",
            "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        data_table.add_row(optimized_param)
        data_table.add_hline()
    print("This is for RandomForest.")
    doc.generate_pdf("tuning_RandomForest", clean_tex=False)
Example #20
0
def generatePDF(obj):
    """
    Function that generates the rendered .pdf
    """
    geometry_options = {"margin": "2cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    # Disable Page Numbering
    # https://jeltef.github.io/PyLaTeX/latest/examples/basic.html
    # https://tex.stackexchange.com/questions/7355/how-to-suppress-page-number#7357
    doc.preamble.append(Command('pagenumbering', 'gobble'))

    # Include Packages
    doc.preamble.append(Command('usepackage', 'url'))
    doc.preamble.append(Command('usepackage', 'fancyhdr'))
    doc.preamble.append(Command('usepackage', 'graphicx'))

    # Set Pagestyle (fancy is used for page header and footer)
    doc.preamble.append(Command('pagestyle', 'fancy'))

    # Header and Footer
    doc.preamble.append(
        Command(
            'cfoot',
            NoEscape(
                'Aionda Zeiterfassung - \\url{https://github.com/AiondaDotCom/tools}'
            )))
    doc.preamble.append(
        Command('chead',
                (Command('Large', bold('Arbeitnehmer: Check-In-Time')))))

    #with doc.create(Section(NoEscape('Arbeitnehmer:\\\\Check-In-Time'), numbering=False)):

    # Create Table with informations about the employee
    with doc.create(LongTable("|l|l|l|")) as headerTable:
        headerTable.add_hline()
        headerTable.add_row([
            "Name: {}".format(obj["employee"]),
            "Monat: {:02d}".format(obj["month"]),
            "Jahr: {}".format(obj["year"])
        ])
        headerTable.add_hline()

    # Generate table for time tracking informations
    with doc.create(LongTable("|c|c|r|r|r|")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            bold("Datum"),
            bold("von - bis"),
            bold("Pause"),
            bold("gesamte AZ"),
            bold(NoEscape("davon \\\"Uberstunden"))
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()

        # Insert rows
        for row in obj["zeitAufzeichnungsTable"]:
            data_table.add_row(row)
            data_table.add_hline()

        data_table.add_hline()

        # Last row shows the total amount of hours
        arbeitszeitStr = "{}".format(obj["arbeitszeitKomplettRounded"])
        data_table.add_row(["Summe", '', '', arbeitszeitStr, ''])
        data_table.add_hline()

    # Generate table with remarks
    with doc.create(LongTable("lllll")) as signTable:
        signTable.add_row(
            ['Bemerkungen:', 'Krankheitstage:', 'K', 'Schlechtwetter:', 'WA'])
        signTable.add_row(
            ['', 'Wochenende/Feiertag:', 'WF', 'Urlaubstage:', 'U'])

    # Insert vertical space
    doc.append(Command('vspace', '1cm'))

    # place for signatures
    with doc.create(LongTable("ll")) as signTable:
        if obj['signatureFile']:
            signTable.add_row([
                Command('includegraphics', signatureFile, 'width=4cm'),
                Command('vspace', NoEscape('-.1cm'))
            ])
        else:
            signTable.add_row(["", NoEscape("")])
        signTable.add_hline()
        signTable.add_row([
            NoEscape("Unterschrift Arbeitnehmer"),
            NoEscape("\hspace{4cm}Unterschrift Arbeitgeber")
        ])

    # Finally the document is rendered
    doc.generate_pdf(obj['outputFilename'], clean_tex=False)
Example #21
0
def appendix(data_dir, vystup_dir):
    os.chdir(data_dir)
    data_PU = read_results('raw_data_PU.csv')
    data_POP = read_results('raw_data_POP.csv')
    data_mid = read_results('results.csv')
    PurePath(vystup_dir)
    geometry_options = {"margin": "0.5cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    doc.preamble.append(NoEscape(r'\definecolor{Hex}{RGB}{239,239,239}'))
    doc.documentclass.options = Options('10pt')

    doc.append(Command('textbf', 'Zadání hodnot pro výpočet: '))
    doc.append(
        NoEscape(r'Tabulka \ref{rozmery} je souhrnem zadaných hodnot \
                        potřebných k výpočtu požárně výpočtového zatížení.'))

    def genenerate_longtabu(data):
        if data == data_PU:
            with doc.create(LongTable("l l c c c c c c l")) as data_table:
                doc.append(Command('caption', 'Zadání místností pro výpočet'))
                doc.append(Command('label', 'rozmery'))
                doc.append(Command('\ '))
                data_table.append
                data_table.add_hline()
                data_table.add_row([
                    "PU", "Místnost", "Plocha",
                    NoEscape('h$_s$'),
                    NoEscape('a$_n$'),
                    NoEscape('p$_n$'),
                    NoEscape('p$_s$'), "c", "Tab. A.1"
                ])
                data_table.add_hline()
                data_table.end_table_header()
                data_table.add_hline()
                doc.append(Command('endfoot'))
                doc.append(Command('endlastfoot'))
                # data_table.end_table_footer()
                data_table.add_hline()
        if data == data_POP:
            with doc.create(LongTable("l l c c c c", pos=['l'])) as data_table:
                doc.append(Command('caption', 'Zadání okenních otvorů'))
                doc.append(Command('label', 'okna'))
                doc.append(Command('\ '))
                data_table.append
                data_table.add_hline()
                data_table.add_row([
                    "PU", "Místnost", "n otvorů", "šířka otvorů",
                    "výška otvorů", "Plocha"
                ])
                data_table.add_row(
                    [" ", " ", " ", "[m]", "[m]",
                     NoEscape('m$^2$')])
                data_table.add_hline()
                data_table.end_table_header()
                data_table.add_hline()
                data_table.add_hline()
        for i in range(0, len(data)):
            if i % 2 == 0:
                data_table.add_row(data[i])
            else:
                data_table.add_row(data[i], color="Hex")
        data_table.add_hline()

    for i in range(0, len(data_PU)):
        data_PU[i][2] = data_PU[i][2].replace(".", ",")
        data_PU[i][3] = data_PU[i][3].replace(".", ",")
        data_PU[i][4] = data_PU[i][4].replace(".", ",")
        data_PU[i][5] = data_PU[i][5].replace(".", ",")
        data_PU[i][6] = data_PU[i][6].replace(".", ",")
        data_PU[i][7] = data_PU[i][7].replace(".", ",")
    genenerate_longtabu(data_PU)
    doc.append(
        NoEscape(r'Okenní otvory nutné pro výpočet součinitele b jsou\
                        uvedeny v následující tabulce \ref{okna}'))
    for i in range(0, len(data_POP)):
        data_POP[i][3] = data_POP[i][3].replace(".", ",")
        data_POP[i][4] = data_POP[i][4].replace(".", ",")
        data_POP[i][5] = data_POP[i][5].replace(".", ",")
    genenerate_longtabu(data_POP)
    doc.append(Command('textbf', 'Mezivýsledky a výsledky: '))
    doc.append(
        NoEscape(r'Mezivýsledky nutné pro stanovení parametru b jsou\
                        patrné z tabulky \ref{mezivysledky}'))

    #########################################################################
    ''' Mezivýsledky parametr B '''
    data_mid_ar = []
    for i in range(0, len(data_mid)):
        data_mid_ar.append(data_mid[i][0])
        data_mid_ar.append(data_mid[i][1])
        data_mid_ar.append(data_mid[i][8])
        data_mid_ar.append(data_mid[i][9])
        data_mid_ar.append(data_mid[i][10])
        data_mid_ar.append(data_mid[i][14])
        data_mid_ar.append(data_mid[i][15])
    data_mid_ar = list(chunks(data_mid_ar, 7))
    for i in range(0, len(data_mid_ar)):
        data_mid_ar[i][1] = data_mid_ar[i][1].replace(".", ",")
        data_mid_ar[i][2] = data_mid_ar[i][2].replace(".", ",")
        data_mid_ar[i][3] = data_mid_ar[i][3].replace(".", ",")
        data_mid_ar[i][4] = data_mid_ar[i][4].replace(".", ",")
        data_mid_ar[i][5] = data_mid_ar[i][5].replace(".", ",")
        data_mid_ar[i][6] = data_mid_ar[i][6].replace(".", ",")

    with doc.create(LongTable("l c c c c c c", pos=['l'])) as data_table:
        doc.append(Command('caption', 'Mezivýsledky pro paramter b'))
        doc.append(Command('label', 'mezivysledky'))
        doc.append(Command('\ '))
        data_table.append
        data_table.add_hline()
        data_table.add_row(["PÚ", "S", "S0", "hs", "h0", "n", "k"])
        data_table.add_row([
            " ",
            NoEscape('m$^2$'),
            NoEscape('m$^2$'), "[m]", "[m]", "[-]", "[-]"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        data_table.add_hline()
        for i in range(0, len(data_mid_ar)):
            if i % 2 == 0:
                data_table.add_row(data_mid_ar[i])
            else:
                data_table.add_row(data_mid_ar[i], color="Hex")
        data_table.add_hline()

    #########################################################################
    ''' Vysledky '''

    doc.append(
        NoEscape(r'Přehled výsledků požárních úseků je patrný z tabulky\
                        \ref{Vysledky}'))

    data_res = []
    for i in range(0, len(data_mid)):
        data_res.append(data_mid[i][0])
        data_res.append(data_mid[i][1])
        data_res.append(data_mid[i][2])
        data_res.append(data_mid[i][3])
        data_res.append(data_mid[i][4])
        data_res.append(data_mid[i][13])  # a_n
        data_res.append(data_mid[i][12])  # p_n
        data_res.append(data_mid[i][11])  # p_s
        data_res.append(data_mid[i][7])  # p_only
        data_res.append(data_mid[i][5])  # p_v
    data_res = list(chunks(data_res, 10))

    for i in range(0, len(data_res)):
        data_res[i][1] = data_res[i][1].replace(".", ",")
        data_res[i][2] = data_res[i][2].replace(".", ",")
        data_res[i][3] = data_res[i][3].replace(".", ",")
        data_res[i][4] = data_res[i][4].replace(".", ",")
        data_res[i][5] = data_res[i][5].replace(".", ",")
        data_res[i][6] = data_res[i][6].replace(".", ",")
        data_res[i][7] = data_res[i][7].replace(".", ",")
        data_res[i][8] = data_res[i][8].replace(".", ",")
        data_res[i][9] = data_res[i][9].replace(".", ",")
    with doc.create(LongTable("l c c c c c c c c c ",
                              pos=['l'])) as data_table:
        doc.append(
            Command(
                'caption', 'Přehled požárních úseků a jejich\
                            výsledky'))
        doc.append(Command('label', 'Vysledky'))
        doc.append(Command('\ '))
        data_table.append
        data_table.add_hline()
        data_table.add_row([
            "PÚ", "Plocha", "a", "b", "c",
            NoEscape('a$_n$'),
            NoEscape('p$_n$'),
            NoEscape('p$_s$'),
            NoEscape('p'),
            NoEscape('p$_v$')
        ])
        data_table.add_row([
            " ",
            NoEscape('m$^2$'), "[-]", "[-]", "[-]", "[-]",
            NoEscape('[kg/m$^2$]'),
            NoEscape('[kg/m$^2$]'),
            NoEscape('[kg/m$^2$]'),
            NoEscape('[kg/m$^2$]')
        ])

        data_table.end_table_header()
        data_table.add_hline()
        for i in range(0, len(data_res)):
            if i % 2 == 0:
                data_table.add_row(data_res[i])
            else:
                data_table.add_row(data_res[i], color="Hex")
        data_table.add_hline()
    os.chdir(vystup_dir)
    doc.generate_pdf("Appendix", clean_tex=False)
Example #22
0
    def pile_report(self, pile, pile2, F, factor=1.25):
        """添加桩基长度计算内容"""

        self.soil = pile.soil
        llist = pl.get_l(self.soil, pile.d, F, factor, pile.h1, pile.rho,
                         pile.t, pile.k2, pile2.type, pile2.completion)
        ra_1, ra_2 = pl.pile_l(llist, self.soil, pile.d, F, pile.h1, pile.rho,
                               pile.t, pile.k2, pile2.type, pile2.completion)

        if ra_1.max() > ra_2.max():
            ptype = '摩擦桩'
            ra = ra_1.max()
        else:
            ptype = '端承桩'
            ra = ra_2.max()

        t1 = f'''桩基直径:$d={pile.d:.2f}\,m$\n
        桩基周长:$u={pile.u:.2f}\,m$\n
        桩基截面积:$A_p={pile.pd:.2f}\,m^2$\n
        桩基密度:$\gamma={pile.rho:.1f}\,kN/m^3$\n
        容许承载力随深度的修正系数:$k_2={pile.k2:.1f}$\n
        各土层加权平均重度:$\gamma_2={self.soil.rho:.1f}\,kN/m^3$\n
        清底系数:$m_0={pile.m0:.1f}$
        '''

        t2 = '根据规范5.3.3可得,摩擦桩单桩承载力为'
        m1 = ['[R_a]', '=\\frac{1}{2}u\\sum_{i=1}^nq_{ik}l_i+A_pq_r']
        t3 = '根据规范5.3.4可得,端承桩单桩承载力为'
        m2 = [
            '[R_a]=', 'c_1A_pf_{rk}', '+u\\sum_{i=1}^mc_{2i}h_if_{rki}',
            '+\\frac{1}{2}\\xi_su\sum_{i=1}^nl_iq_{ik}'
        ]
        t4 = '考虑桩身自重与置换土重,桩基承载力为'
        m3 = ['R_a', '=[R_a]-G_p+G_s']
        t5 = '代入不同长度桩长,可得摩擦桩与端承桩承载力如下图所示'
        t6 = '不同桩长具体承载力如下表所示'
        t7 = f'由上述分析可知,当桩长为{max(llist)}m时,{ptype}承载力为{ra:.0f}kN,安全系数为{ra/F:.2f},桩基承载力可满足规范要求。'

        with self.doc.create(Section('地基基本情况')):
            with self.doc.create(LongTabu("p{4cm}XXXXX")) as soil_table:
                header_row1 = self.soil.prop.columns.to_list()[:-1]
                soil_table.add_hline()
                soil_table.add_row(header_row1, mapper=[bold])
                soil_table.add_hline()
                for i in self.soil.prop.index:
                    soil_table.add_row(self.soil.prop.iloc[i].to_list()[:-1])
                soil_table.add_hline()

        with self.doc.create(Section('桩基及其他参数取值')):
            self.doc.append(NoEscape(t1))

        with self.doc.create(Section('桩长计算')):
            self.doc.append(t2)
            self.doc.append(Math(data=m1, escape=False))
            self.doc.append(NoEscape('\n'))
            self.doc.append(t3)
            self.doc.append(Math(data=m2, escape=False))
            self.doc.append(NoEscape('\n'))
            self.doc.append(t4)
            self.doc.append(Math(data=m3, escape=False))
            self.doc.append(NoEscape('\n'))
            self.doc.append(t5)
            with self.doc.create(Figure(position='htbp')) as plot:
                plot.add_plot(width=NoEscape(r'1\textwidth'), dpi=300)
            self.doc.append(NoEscape('\n'))
            self.doc.append(t6)
            with self.doc.create(LongTable('p{1.5cm}|ll|ll')) as pll:
                pll.add_hline()
                pll.add_row(['桩长', '摩擦桩承载力', '安全系数', '端承桩承载力', '安全系数'])
                pll.add_hline()
                for i, j in enumerate(llist):
                    pll.add_row([
                        j, f'{ra_1[i]:.0f}', f'{ra_1[i]/F:.2f}',
                        f'{ra_2[i]:.0f}', f'{ra_2[i]/F:.2f}'
                    ])
                pll.add_hline()
            self.doc.append(t7)
Example #23
0
def generate_latex_document(trackers: List[Tracker],
                            sequences: List[Sequence],
                            results,
                            storage: Storage,
                            build=False,
                            multipart=True):

    order_marks = {1: "first", 2: "second", 3: "third"}

    def format_cell(value, order):
        cell = format_value(value)
        if order in order_marks:
            cell = Command(order_marks[order], cell)
        return cell

    logger = logging.getLogger("vot")

    table_header, table_data, table_order = extract_measures_table(
        trackers, results)
    plots = extract_plots(trackers, results)

    doc = Document(page_numbers=True)

    doc.preamble.append(Package('pgf'))
    doc.preamble.append(Package('xcolor'))
    doc.preamble.append(Package('fullpage'))

    doc.preamble.append(NoEscape(read_resource("commands.tex")))

    doc.preamble.append(
        UnsafeCommand('newcommand',
                      r'\first',
                      options=1,
                      extra_arguments=r'{\color{red} #1 }'))
    doc.preamble.append(
        UnsafeCommand('newcommand',
                      r'\second',
                      options=1,
                      extra_arguments=r'{\color{green} #1 }'))
    doc.preamble.append(
        UnsafeCommand('newcommand',
                      r'\third',
                      options=1,
                      extra_arguments=r'{\color{blue} #1 }'))

    if multipart:
        container = Chunk()
        generate_symbols(container, trackers)
        with storage.write("symbols.tex") as out:
            container.dump(out)
        doc.preamble.append(Command("input", "symbols.tex"))
    else:
        generate_symbols(doc.preamble, trackers)

    doc.preamble.append(Command('title', 'VOT report'))
    doc.preamble.append(
        Command('author', 'Toolkit version ' + toolkit_version()))
    doc.preamble.append(Command('date', datetime.datetime.now().isoformat()))
    doc.append(NoEscape(r'\maketitle'))

    if len(table_header[2]) == 0:
        logger.debug("No measures found, skipping table")
    else:

        # Generate data table
        with doc.create(LongTable("l " *
                                  (len(table_header[2]) + 1))) as data_table:
            data_table.add_hline()
            data_table.add_row([" "] + [
                MultiColumn(c[1], data=c[0].identifier)
                for c in merge_repeats(table_header[0])
            ])
            data_table.add_hline()
            data_table.add_row([" "] + [
                MultiColumn(c[1], data=c[0].title)
                for c in merge_repeats(table_header[1])
            ])
            data_table.add_hline()
            data_table.add_row(
                ["Tracker"] +
                [" " + c.abbreviation + " " for c in table_header[2]])
            data_table.add_hline()
            data_table.end_table_header()
            data_table.add_hline()

            for tracker, data in table_data.items():
                data_table.add_row([
                    UnsafeCommand("Tracker",
                                  [tracker.reference, TRACKER_GROUP])
                ] + [
                    format_cell(x,
                                order[tracker] if not order is None else None)
                    for x, order in zip(data, table_order)
                ])

    for experiment, experiment_plots in plots.items():
        if len(experiment_plots) == 0:
            continue

        doc.append(Section("Experiment " + experiment.identifier))

        for title, plot in experiment_plots:

            with doc.create(Figure(position='htbp')) as container:
                if multipart:
                    plot_name = plot.identifier + ".pdf"
                    with storage.write(plot_name, binary=True) as out:
                        plot.save(out, "PDF")
                    container.add_image(plot_name)
                else:
                    container.append(insert_figure(plot))
                container.add_caption(title)

    if build:
        temp = tempfile.mktemp()
        logger.debug("Generating to tempourary output %s", temp)
        doc.generate_pdf(temp, clean_tex=True)
        storage.copy(temp + ".pdf", "report.pdf")
    else:
        with storage.write("report.tex") as out:
            doc.dump(out)
def d_generator(data_dir, vystup_dir):
    os.chdir(data_dir)
    data_PU = read_results('results.csv')
    info_PU = read_results('raw_data_info.csv')

    # Arrange data to desired shape
    data_check = []
    data_used = []
    data_replace_p = []
    data_check_p = []
    data_replace_a = []
    l_names = []
    p_stale = []
    for i in range(0, len(data_PU)):
        data_used.append(data_PU[i][0])
        data_used.append(data_PU[i][16])
        data_used.append(data_PU[i][1])
        data_used.append(data_PU[i][2])
        data_used.append(data_PU[i][3])
        data_used.append(data_PU[i][4])
        data_used.append(data_PU[i][5])
        data_used.append(data_PU[i][6])
        data_check.append(data_PU[i][19])
        data_replace_p.append(data_PU[i][12])
        data_replace_a.append(data_PU[i][13])
        data_check_p.append(data_PU[i][7])
        l_names.append(data_PU[i][19])
        p_stale.append(data_PU[i][20])

    data_used = list(chunks(data_used, 8))
    list_avaiable = [
        'B.1 pol.1', 'B.1 pol.2', 'B.1 pol.3', 'B.1 pol.4', 'B.1 pol.5',
        'B.1 pol.6', 'B.1 pol.7', 'B.1 pol.8', 'B.1 pol.9', 'B.1 pol.10',
        'B.1 pol.11', 'B.1 pol.12', 'B.1 pol.13'
    ]
    list_avaiable2 = [
        'AZ1 Ordi.', 'AZ1 Lék.', 'AZ2 Ordi', 'AZ2 vyšet.', 'AZ2 Lék.', 'LZ1',
        'LZ2 lůž', 'LZ2 int.péče', 'LZ2 Lék', 'LZ2 biochem', 'peč. Služ',
        'soc.péče.ošetř.', 'soc.péče.lůž.', 'soc.péče.byt', 'Jesle'
    ]
    check = []
    for i in range(0, len(data_check)):
        if data_check[i] in list_avaiable or\
           data_check[i] == 'OB2 byt' or\
           data_check[i] == 'OB3' or data_check[i] == 'OB4 ubyt.' or data_check[i] == 'OB4 sklad' or\
           data_check[i] == 'CHÚC-A' or data_check[i] == 'CHÚC-B' or\
           data_check[i] == 'CHÚC-C' or data_check[i] in list_avaiable2:
            check.append(i)
    sys.path.insert(0,
                    "c:/Users/Honza/Google Drive/Work/Generator_zprav/minor/")
    from stupen import spb_def
    type_sys = info_PU[0]
    h_p = float(info_PU[1][0])
    podlazi = float(info_PU[2][0])
    if len(check) > 0:
        for item in check:
            data_used[item][4] = '-'
            '''data_used[item][4] = '-'
            if data_check[item] == 'OB2 byt':
                if (float(data_check_p[item]) - float(data_replace_p[item])) >= 0:
                    data_used[item][6] = '%.2f' % 40
                    spb_fix = spb_def(h_p, type_sys[0], [40], [1.00], podlazi, str(data_PU[item][0]))
                    data_used[item][7] = spb_fix[0]
                if (float(data_check_p[item]) - float(data_replace_p[item])) > 5:
                    data_used[item][6] = '%.2f' % 45.00
                    spb_fix = spb_def(h_p, type_sys[0], [45], [1.00], podlazi, data_PU[item][0])
                    data_used[item][7] = spb_fix[0]
                if (float(data_check_p[item]) - float(data_replace_p[item])) >= 15:
                    data_used[item][6] = '%.2f' % 50.00
                    spb_fix = spb_def(h_p, type_sys[0], [50], [1.00], podlazi, data_PU[item][0])
                    data_used[item][7] = spb_fix[0]
                data_used[item][3] = str('%.2f' % 1.00)
                # pozn = ' $^{1)}$'
                # data_used[item][0] = NoEscape(data_used[item][0] + pozn)
            if data_check[item] in list_avaiable:
                if 0 <= float(p_stale[item]) <= 5:
                    data_used[item][6] = '%.2f' % float(data_replace_p[item])
                if float(p_stale[item]) > 5:
                    data_replace_p[item] = ((float(p_stale[item]) - 5) * 1.15)\
                                            + float(data_replace_p[item])
                    data_used[item][6] = '%.2f' % data_replace_p[item]
                spb_fix = spb_def(h_p, type_sys[0],
                                  [float(data_replace_p[item])],
                                  [1.00], podlazi,
                                  data_PU[item][0])
                data_used[item][7] = spb_fix[0]
                data_used[item][3] = str('%.2f' % 1.00)
            if data_check[item] in list_avaiable2:
                data_used[item][6] = '%.2f' % float(data_replace_p[item])
                data_used[item][3] = data_replace_a[item]
                spb_fix = spb_def(h_p, type_sys[0], [float(data_used[item][6])], [float(data_used[item][3])], podlazi, data_PU[item][0])
                data_used[item][7] = spb_fix[0]
            if data_check[item] == 'OB3' or data_check[i] == 'OB4 ubyt.':
                data_used[item][6] = '%.2f' % float(data_replace_p[item])
                spb_fix = spb_def(h_p, type_sys[0],
                                  [30],
                                  [1.00], podlazi,
                                  data_PU[item][0])
                data_used[item][7] = spb_fix[0]
                data_used[item][3] = str('%.2f' % 1.00)
            if data_check[item] == 'OB4 sklad':
                data_used[item][6] = '%.2f' % float(data_replace_p[item])
                spb_fix = spb_def(h_p, type_sys[0],
                                  [60],
                                  [1.00], podlazi,
                                  data_PU[item][0])
                data_used[item][7] = spb_fix[0]
                data_used[item][3] = str('%.2f' % 1.00)'''
            if data_check[item] == 'CHÚC-A' or data_check[item] == 'CHÚC-B' or\
               data_check[item] == 'CHÚC-C':
                data_used[item][3] = '-'
                data_used[item][4] = '-'
                data_used[item][5] = '-'
                data_used[item][6] = '-'
                if h_p < 30:
                    data_used[item][7] = 'II.'
                if h_p >= 30:
                    data_used[item][7] = 'III.'
                if h_p >= 45:
                    data_used[item][7] = 'IV.'

    with doc.create(Section('Posouzení požárních úseků')):
        with doc.create(Subsection('Vyhodnocení požárních úseků')):
            doc.append(
                NoEscape(r'Z tabulky \ref{PU} je patrné požární riziko\
                                a stupeň požární bezpečnosti všech řešených\
                                požárních úseků. Není-li v poznámce pod\
                                tabulkou uvedeno jinak, je požární riziko PÚ\
                                stanoveno výpočtem (viz příloha \ref{A-1}:\
                                Výpočet požárního rizika).'))
            save_var = []
            save_id = []
            save_name = []
            save_id_check = []
            for i in range(0, len(data_check)):
                if data_check[i] == 'B.1 pol.1' or data_check[i] == 'B.1 pol.2' or\
                   data_check[i] == 'B.1 pol.3' or data_check[i] == 'B.1 pol.4' or\
                   data_check[i] == 'B.1 pol.5' or data_check[i] == 'B.1 pol.6' or\
                   data_check[i] == 'B.1 pol.7' or data_check[i] == 'B.1 pol.8' or\
                   data_check[i] == 'B.1 pol.9' or data_check[i] == 'B.1 pol.10' or\
                   data_check[i] == 'B.1 pol.11' or data_check[i] == 'B.1 pol.12' or\
                   data_check[i] == 'B.1 pol.13' or data_check[i] == 'OB2 byt' or\
                   data_check[i] == 'CHÚC-A' or data_check[i] == 'CHÚC-B' or\
                   data_check[i] == 'CHÚC-C' or data_check[i] == 'OB3' or\
                   data_check[i] == 'OB4 ubyt.' or\
                   data_check[i] == 'OB4 sklad' or\
                   data_check[i] in list_avaiable2:
                    save_var.append(data_check[i])
                    save_id_check.append(i)
            count = list(range(1, len(save_var) + 1))
            pre = ' $^{'
            suf = ')}$'
            for i in range(0, len(save_var)):
                count[i] = pre + str(count[i])
                count[i] = str(count[i]) + suf
            for n in range(0, len(save_var)):
                if n == 0:
                    new_dict = dict(zip([save_var[n]], [count[n]]))
                    save_id.append(save_id_check[n])
                    save_name.append(save_var[n])
                    # new_dict = dict(zip([save_var[n]], str(count[n])))
                if n > 0:
                    if save_var[n] in new_dict:
                        save_id.append(save_id_check[n])
                        save_name.append(save_var[n])
                    else:
                        len_dict = len(new_dict) + 1
                        len_dict = pre + str(len_dict)
                        len_dict = str(len_dict) + suf
                        save_id.append(save_id_check[n])
                        save_name.append(save_var[n])
                        new_dict[save_var[n]] = len_dict
            for i in range(0, len(save_id)):
                data_used[save_id[i]][1] = NoEscape(data_used[save_id[i]][1] +
                                                    new_dict[save_name[i]])

            doc.append(Command('begin', 'ThreePartTable'))
            if len(check) > 0:
                doc.append(Command('begin', 'TableNotes'))
                doc.append(NoEscape('\small'))
                for key in new_dict.keys():
                    pre_str = '\item'
                    if key == 'OB2 byt':
                        idx = l_names.index(key)
                        suf_str = ' Uvažováno s požárně výpočetním zatížením (p$_v$)\
                                 podle normy ČSN 73 0833 čl. 5.1.2.'

                        string = new_dict[key]
                        if 0 <= (float(data_check_p[idx]) -
                                 float(data_replace_p[idx])) < 5:
                            loc_str = pre_str + string + suf_str
                            doc.append(NoEscape(loc_str))
                        if (float(data_check_p[idx]) -
                                float(data_replace_p[idx])) > 5:
                            suf_str = suf_str + ' Stálé požární\
                            zatížení v požárním úseku je p$_s$ = 10 kg/m$^2$.\
                            Je tak přihlédnuto k poznámce stejného článku,\
                            která stanovuje požární zatížení na hodnotu\
                            p$_v$ = 45 kg/m$^2$.'

                            loc_str = pre_str + string + suf_str
                            doc.append(NoEscape(loc_str))

                    if key in list_avaiable:
                        string = new_dict[key]
                        idx = l_names.index(key)
                        polozka = str(list_avaiable.index(key) + 1)
                        suf_str_f = ' Hodnota požárně výpočtového zatížení je\
                                    stanovena paušálně z položky '

                        suf_str_ff = ' tabulky B.1 normy ČSN 73 0802.'
                        suf_str_b = ' Stálé požární zatížení je p$_s$ = '
                        suf_str_bb = ' kg/m$^2$. Při stanovení požárně výpočtového\
                                    zaížení je tak přihlédnuto k čl. B.1.2.'

                        if 0 <= (float(data_check_p[idx]) -
                                 float(data_replace_p[idx])) <= 5:
                            suf_str_f = suf_str_f + polozka + suf_str_ff
                            loc_str = pre_str + string + suf_str_f
                            doc.append(NoEscape(loc_str))
                        if 5 < (float(data_check_p[idx]) -
                                float(data_replace_p[idx])):
                            suf_str_num = str(p_stale[idx])
                            suf_str_f = suf_str_f + polozka + suf_str_ff
                            suf_str_b = suf_str_b + suf_str_num + suf_str_bb
                            loc_str = pre_str + string + suf_str_f + suf_str_b
                            doc.append(NoEscape(loc_str))

                    if key in list_avaiable2:
                        string = new_dict[key]
                        idx = l_names.index(key)
                        suf_str_f = ' Hodnota požárně výpočtového zatížení je\
                                    stanovena paušálně z '

                        suf_str_ff = ' z normy ČSN 73 0835.'
                        if key == 'AZ1 Ordi.':
                            odkaz = 'čl. 5.3.1'
                            suf_str_b = ' Jedná se o zařízení lékařské péče\
                                     zařazené do skupiny AZ1'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'AZ1 Lék.':
                            odkaz = 'čl. 5.3.1'
                            suf_str_b = ' Jedná se o lékárenské zařízení\
                                     zařazené do skupiny AZ1'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'AZ2 Ordi':
                            odkaz = 'čl. 6.2.1'
                            suf_str_b = ' Jedná se o lékárenské pracoviště\
                                     zařazené do skupiny AZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'AZ2 vyšet.':
                            odkaz = 'čl. 6.2.1'
                            suf_str_b = ' Jedná se o vyšetřovací nebo léčebnou\
                                     část budovy zařazené do skupiny AZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'AZ2 Lék.':
                            odkaz = 'čl. 6.2.1'
                            suf_str_b = ' Jedná se o lékárenské zařízení\
                                        zařazené do skupiny AZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'LZ1':
                            odkaz = 'čl. 7.2.1'
                            suf_str_b = ' Jedná se o požární úsek, který je\
                                        součástí budovy skupiny LZ1'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(No.Escape(loc_str))
                        if key == 'LZ2 lůž':
                            odkaz = 'čl. 8.2.1'
                            suf_str_b = ' Jedná se o lůžkové jednotky v\
                                        budově skupiny LZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'LZ2 int.péče':
                            odkaz = 'čl. 8.2.1'
                            suf_str_b = ' Jedná se o jednotky intenzivní péče,\
                                        ansteziologicko resustitační oddělení,\
                                        nebo o operační oddělení v budově\
                                        zařazené do skupiny LZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'LZ2 Lék':
                            odkaz = 'čl. 8.2.1'
                            suf_str_b = ' Jedná se o lékárenské zařízení v\
                                        budově skupiny LZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'LZ2 biochem':
                            odkaz = 'čl. 8.2.1'
                            suf_str_b = ' Jedná se o oddělení klinické biochemie\
                                        v budově skupiny LZ2'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'peč. Služ':
                            odkaz = 'čl. 9.3.1'
                            suf_str_b = ' Jedná se o bytovou jednotku v domě\
                                        s pečovatelskou službou'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'soc.péče.oštř.':
                            odkaz = 'čl. 10.3.1'
                            suf_str_b = ' Jedná se o ošetřovatelské oddělení v\
                                        budově sociální péče'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'soc.péče.lůž.':
                            odkaz = 'čl. 10.3.1'
                            suf_str_b = ' Jedná se o lůžkovou část ústavu\
                                        sociální péče'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'soc.péče.byt.':
                            odkaz = 'čl. 10.3.1'
                            suf_str_b = ' Jedná se o bytové jednotky v budově\
                                        sociální péče.'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                        if key == 'Jesle.':
                            odkaz = 'čl. 10.3.1'
                            suf_str_b = ' Jedná se o zrdavotnické zařízení\
                                        pro děti - jesle'
                            loc_str = pre_str + string + suf_str_f + odkaz +\
                                      suf_str_ff + suf_str_b
                            doc.append(NoEscape(loc_str))
                    if key == 'OB3':
                        string = new_dict[key]
                        pre_str = '\item'
                        suf_str = ' Požární riziko  pro ubytovací jednotku bylo\
                                    stanoveno paušálně pomocí čl. 6.1.1 normy\
                                    ČSN 73 0833.'

                        loc_str = pre_str + string + suf_str
                        doc.append(NoEscape(loc_str))

                    if key == 'OB4 ubyt.':
                        string = new_dict[key]
                        pre_str = '\item'
                        suf_str = ' Požární riziko pro ubytovací jednotku v budově OB4 bylo\
                                    stanoveno paušálně pomocí čl. 7.1.1 normy\
                                    ČSN 73 0833.'

                        loc_str = pre_str + string + suf_str
                        doc.append(NoEscape(loc_str))

                    if key == 'OB4 sklad':
                        string = new_dict[key]
                        pre_str = '\item'
                        suf_str = ' Požární riziko pro ubytovací jednotku v budově OB4 bylo\
                                    stanoveno paušálně pomocí čl. 7.1.3 normy\
                                    ČSN 73 0833.'

                        loc_str = pre_str + string + suf_str
                        doc.append(NoEscape(loc_str))

                    if key == 'CHÚC-A' or key == 'CHÚC-B' or key == 'CHÚC-C':
                        string = new_dict[key]
                        pre_str = '\item'
                        suf_str = ' CHÚC je zatříděna v souladu s čl. 9.3.2 normy\
                                    ČSN 73 0802.'

                        loc_str = pre_str + string + suf_str
                        doc.append(NoEscape(loc_str))
            if info_PU[3] == ['ANO']:
                try:
                    new_dict
                except NameError:
                    var_exist = False
                else:
                    var_exist = True
                if var_exist is False:
                    new_dict = []
                    pre_str = '\item'
                    doc.append(Command('begin', 'TableNotes'))
                    doc.append(NoEscape('\small'))
                if info_PU[5] == ['osobní výtahy, malé nákladní výtahy']:
                    if h_p <= 22.5:
                        s_vytah = [
                            'Šv', 'Výtahové šachty', '-', '-', '-', '-', '-',
                            'II.'
                        ]
                    if 22.5 < h_p <= 45.0:
                        s_vytah = [
                            'Šv', 'Výtahové šachty', '-', '-', '-', '-', '-',
                            'III.'
                        ]
                    if h_p > 45.0:
                        s_vytah = [
                            'Šv', 'Výtahové šachty', '-', '-', '-', '-', '-',
                            'IV.'
                        ]
                    len_vytah = len(new_dict) + 1
                    app_vytah = pre + str(len_vytah) + suf
                    suf_str_v = ' Výtahová šachta odpovídá čl. 8.10.2 a) normy\
                                  ČSN 73 0802. Šachta slouží pro přepravu\
                                  osob, nebo jako malý nákladní výtah.'

                    loc_str_v = pre_str + app_vytah + suf_str_v
                    doc.append(NoEscape(loc_str_v))
                if info_PU[5] == ['osobně-nákladní, nákladní výtahy']:
                    if h_p <= 30:
                        s_vytah = [
                            'Šv', 'Výtahové šachty', '-', '-', '-', '-', '-',
                            'III.'
                        ]
                    if h_p > 30:
                        s_vytah = [
                            'Šv', 'Výtahové šachty', '-', '-', '-', '-', '-',
                            'IV.'
                        ]
                    len_vytah = len(new_dict) + 1
                    app_vytah = pre + str(len_vytah) + suf
                    suf_str_v = ' Výtahová šachta odpovídá čl. 8.10.2 normy\
                                  ČSN 73 0802 bodu b). Šachta slouží jako\
                                  osobo nákladní nebo nákladní výtah.'

                    loc_str_v = pre_str + app_vytah + suf_str_v
                    doc.append(NoEscape(loc_str_v))
                app_this = pre + str(len_vytah) + suf
                s_vytah[1] = NoEscape(s_vytah[1] + app_this)
            if info_PU[4] == ['ANO']:
                try:
                    new_dict
                except NameError:
                    var_exist = False
                else:
                    var_exist = True
                if var_exist is False:
                    new_dict = []
                    pre_str = '\item'
                    doc.append(Command('begin', 'TableNotes'))
                    doc.append(NoEscape('\small'))
                if info_PU[6] == ['rozvody hořlavých látek – max 1000 mm2']:
                    if h_p <= 22.5:
                        s_inst = [
                            'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                            'II.'
                        ]
                    if 22.5 < h_p <= 45.0:
                        s_inst = [
                            'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                            'III.'
                        ]
                    if h_p > 45.0:
                        s_inst = [
                            'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                            'IV.'
                        ]
                    if info_PU[3] == ['ANO']:
                        len_inst = len_vytah + 1
                        app_vytah = pre + str(len_inst) + suf
                        suf_str_i = ' Instalační šachty jsou zatříděny v souladu s\
                                    čl. 8.12.2 c). Šachty jsou dimenzovány\
                                    pro rozvody hořlavých látek o celkovém\
                                    průřezu 1000 m$^2$'

                        loc_str_i = pre_str + app_vytah + suf_str_i
                        doc.append(NoEscape(loc_str_i))
                if info_PU[6] == [
                        'rozvody nehořlavých látek – potrubí A1,\
                                  A2'
                ]:
                    s_inst = [
                        'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                        'I.'
                    ]
                if info_PU[6] == ['rozvody nehořlavých látek – potrubí B-F']:
                    s_inst = [
                        'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                        'II.'
                    ]
                if info_PU[6] == ['rozvody hořlavých látek – 1000-8000 mm2']:
                    if h_p <= 45.0:
                        s_inst = [
                            'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                            'IV.'
                        ]
                    if h_p > 45.0:
                        s_inst = [
                            'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                            'V.'
                        ]
                if info_PU[6] == [
                        'rozvody hořlavých látek – více než 8000 mm2'
                ]:
                    s_inst = [
                        'Ši', 'Instalační šachty', '-', '-', '-', '-', '-',
                        'VI.'
                    ]
                if info_PU[3] == ['ANO']:
                    len_inst = len_vytah + 1
                else:
                    len_inst = len(new_dict) + 1
                app_this = pre + str(len_inst) + suf
                s_inst[1] = NoEscape(s_inst[1] + app_this)
                data_used.append(s_vytah)
                data_used.append(s_inst)
            if len(check) > 0 or info_PU[4] == ['ANO'
                                                ] or info_PU[3] == ['ANO']:
                doc.append(Command('end', 'TableNotes'))
            for i in range(0, len(data_used)):
                data_used[i][2] = data_used[i][2].replace(".", ",")
                data_used[i][3] = data_used[i][3].replace(".", ",")
                data_used[i][4] = data_used[i][4].replace(".", ",")
                data_used[i][5] = data_used[i][5].replace(".", ",")
                data_used[i][6] = data_used[i][6].replace(".", ",")
            with doc.create(LongTable("l l c c c c c c",
                                      pos=['htb'])) as data_table:
                doc.append(
                    Command('caption',
                            'Přehled požárních úselků a jejich SPB'))
                doc.append(Command('label', 'PU'))
                doc.append(Command('\ '))
                data_table.append
                data_table.add_hline()
                data_table.add_row([
                    "Číslo", "Popis", "Plocha",
                    MultiColumn(3, data='Součinitelé'),
                    NoEscape('p$_v$'), "SPB"
                ])
                data_table.add_row([
                    " ", " ",
                    NoEscape('[m$^2$]'), "a", "b", "c",
                    NoEscape('[kg/m$^2$]'), '[-]'
                ])
                data_table.add_hline()
                data_table.end_table_header()
                for i in range(0, len(data_used)):
                    if i % 2 != 0:
                        data_table.add_row(data_used[i], color="Hex")
                    else:
                        data_table.add_row(data_used[i])
                data_table.add_hline()
                if len(check) > 0 or info_PU[4] == ['ANO'
                                                    ] or info_PU[3] == ['ANO']:
                    doc.append(NoEscape('\insertTableNotes'))
                os.chdir(vystup_dir)
            doc.append(Command('end', 'ThreePartTable'))
    doc.generate_pdf("D_PU", clean_tex=False)
Example #25
0
    def _document_instance_table(self, tests: List[Dict[str, Any]],
                                 with_id: bool):
        """Document a result table of per-instance tests.

        Args:
            tests: List of corresponding test dictionary to make a table.
            with_id: Whether the test information includes data ID.
        """
        if with_id:
            table_spec = '|c|p{5cm}|c|c|p{5cm}|'
            column_num = 5
        else:
            table_spec = '|c|p{10cm}|c|c|'
            column_num = 4

        with self.doc.create(LongTable(table_spec, pos=['h!'],
                                       booktabs=True)) as tabular:
            package = Package('seqsplit')
            if package not in tabular.packages:
                tabular.packages.append(package)

            # add table heading
            row_cells = [
                MultiColumn(size=1, align='|c|', data="Test ID"),
                MultiColumn(size=1, align='c|', data="Test Description"),
                MultiColumn(size=1, align='c|', data="Pass Threshold"),
                MultiColumn(size=1, align='c|', data="Failure Count")
            ]

            if with_id:
                row_cells.append(
                    MultiColumn(size=1,
                                align='c|',
                                data="Failure Data Instance ID"))

            tabular.add_row(row_cells)

            # add table header and footer
            tabular.add_hline()
            tabular.end_table_header()
            tabular.add_hline()
            tabular.add_row((MultiColumn(column_num,
                                         align='r',
                                         data='Continued on Next Page'), ))
            tabular.add_hline()
            tabular.end_table_footer()
            tabular.end_table_last_footer()

            for idx, test in enumerate(tests):
                if idx > 0:
                    tabular.add_hline()

                des_data = [
                    WrapText(data=x, threshold=27)
                    for x in test["description"].split(" ")
                ]
                row_cells = [
                    self.test_id,
                    IterJoin(data=des_data, token=" "),
                    NoEscape(r'$\le $' + str(test["fail_threshold"])),
                    test["fail_number"]
                ]
                if with_id:
                    id_data = [
                        WrapText(data=x, threshold=27) for x in test["fail_id"]
                    ]
                    row_cells.append(IterJoin(data=id_data, token=", "))

                tabular.add_row(row_cells)
                self.test_id += 1
Example #26
0
def description_classification(full_data_files, description_folder):
    data_list = list()
    for d in full_data_files:
        name = d.split('/')[2].split('.')[0]
        df = pd.read_csv(d,
                         sep='\s+',
                         header=None)
        lines, columns = df.shape
        attribute = columns - 1  # Minus one because of target
        last_pos = attribute
        classes = np.unique(df[last_pos])
        n_classes = len(classes)
        distribution_list = [len(df[df[last_pos] == c]) for c in classes]
        distribution_list.sort(reverse=True)
        distribution = tuple(distribution_list)
        data_list.append({'Dataset': name,
                          'Size': lines,
                          'Attributes': attribute,
                          'Classes': n_classes,
                          'Class distribution': distribution})

    df = pd.DataFrame(data_list)
    df = df.sort_values('Size', ascending=False)
    cols = ['Dataset',
            'Size',
            'Attributes',
            'Classes',
            'Class distribution']
    df = df[cols]
    df_copy = deepcopy(df)
    df_copy['Class distribution'] = [str(value).replace(', ', ';').replace(')', '').replace('(', '')
                                     for value in df_copy['Class distribution']]
    df_copy.to_csv(os.path.join(description_folder,
                                'data_description.csv'),
                   sep=',',
                   header=True,
                   columns=['Dataset',
                            'Size',
                            'Attributes',
                            'Classes',
                            'Class distribution'],
                   index=False)

    # # LaTeX
    df = df.set_index(['Dataset'])

    # Max classes per row
    max_classes = np.inf
    geometry_options = {
        "margin": "1.00cm",
        "includeheadfoot": True
    }
    doc = Document(page_numbers=True, geometry_options=geometry_options)

    # Generate data table
    with doc.create(LongTable("l l l l l")) as data_table:
            data_table.add_hline()
            header = ["Dataset",
                      "Size",
                      "#Attr.",
                      "#Classes",
                      "Class distribution"]
            data_table.add_row(header)
            data_table.add_hline()
            data_table.add_hline()
            for index in df.index.values:
                row = [index] + df.loc[index].values.tolist()
                if len(row[-1]) > max_classes:
                    max = max_classes
                    finished = False
                    subrow = row.copy()
                    # Select subtuple and removing last parenthesis
                    subrow[-1] = str(subrow[-1][:max]).replace(')', ',')
                    data_table.add_row(subrow)
                    while finished is False:
                        last_element = row[-1][max:max + max_classes]
                        if len(last_element) == 1:
                            # To string
                            last_element = str(last_element)
                            # Remove first and last parenthesis and comma
                            last_element = last_element[1:-2]
                        else:
                            # To string
                            last_element = str(last_element)
                            # Remove first and last parenthesis
                            last_element = last_element[1:-1]
                        max = max + max_classes
                        if max >= len(row[-1]):
                            finished = True
                            last_element += ')'
                        else:
                            # Remove last parenthesis or comma if len is 1
                            last_element = last_element[:-1]
                        subrow = ['', '', '', '', last_element]
                        data_table.add_row(subrow)

                else:
                    data_table.add_row(row)

    doc.generate_pdf(os.path.join(description_folder,
                                  'data_description'), clean_tex=False)
Example #27
0
def tuning_LogisticRegression():
    param_grid = {
        "tol": [1e-3, 1e-4, 1e-5],
        "C": [1e-5, 3e-5, 1e-4, 3e-4, 1e-3],
        "max_iter": [100, 200, 300]
    }
    result_list = []
    optimized_param = [0, 0, 0, 0, 0, 0, 0]
    for tol in param_grid["tol"]:
        for C in param_grid["C"]:
            for max_iter in param_grid["max_iter"]:
                # try:
                current_param_and_eval = [tol, C, max_iter]
                clf = LogisticRegression(tol=tol,
                                         C=C,
                                         max_iter=max_iter,
                                         multi_class="multinomial",
                                         solver="newton-cg")
                f1_scores_dict = load_train_output_crossvalidation(clf)
                f1_scores_dict = round_f1_score(f1_scores_dict)
                f1_train_average = f1_scores_dict["f1_train_average"]
                f1_dev_average = f1_scores_dict["f1_dev_average"]
                f1_train_micro_average = f1_scores_dict[
                    "f1_train_micro_average"]
                f1_dev_micro_average = f1_scores_dict["f1_dev_micro_average"]
                current_param_and_eval.append(f1_train_micro_average)
                current_param_and_eval.append(f1_dev_micro_average)
                current_param_and_eval.append(f1_train_average)
                current_param_and_eval.append(f1_dev_average)

                result_list.append(current_param_and_eval)
                if current_param_and_eval[4] > optimized_param[4]:
                    optimized_param = current_param_and_eval
            # except:
            #     print("An exception occurs.")

    # Generate data table
    geometry_options = {"margin": "2.54cm", "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    with doc.create(LongTable("l l l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "tol", "C", "max_iter", "training f1", "valid f1",
            "training f1 for each technique", "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        for i in range(len(result_list)):
            data_table.add_row(result_list[i][0:7])
        data_table.add_hline()
    with doc.create(LongTable("l l l l l l l")) as data_table:
        data_table.add_hline()
        data_table.add_row([
            "tol", "C", "max_iter", "training f1", "valid f1",
            "training f1 for each technique", "valid f1 for each technique"
        ])
        data_table.add_hline()
        data_table.end_table_header()
        data_table.add_hline()
        data_table.add_row(optimized_param)
        data_table.add_hline()
    print("This is for LogisticRegression.")
    doc.generate_pdf("tuning_LogisticRegression", clean_tex=False)
Example #28
0
def latex_report(system, curves, grid, filename):
    lines = system.lines
    trafos = system.trafos
    buses = system.buses
    geometry_options = {"tmargin": "1cm",
                        "lmargin": "1cm",
                        "rmargin": "1cm",
                        "bmargin": "1cm",
                        "includeheadfoot": True}
    doc = Document(page_numbers=True, geometry_options=geometry_options)
    doc.preamble.append(Command('usepackage', 'cmbright'))
    doc.preamble.append(Command('usepackage', 'tikz'))
    doc.preamble.append(Command('usepackage', 'amsmath'))
    doc.preamble.append(Command('usepackage', 'graphicx'))
    now = datetime.datetime.now()
    doc.append(f'Report auto-generated by Elegant at '
               f'{now.day:02d}/{now.month:02d}/{now.year:02d} '
               f'{now.hour:02d}:{now.minute:02d}:{now.second:02d}')
    wye_comm = UnsafeCommand(
        'newcommand', '\\wye',
        extra_arguments=r'\mathbin{\text{\begin{tikzpicture}'
                        r'[x=1pt, y=1pt, scale=2]'
                        r'\draw '
                        r'(-0.9, 0) -- (0.9, 0) '
                        r'(-0.6, -0.5) -- (0.6, -0.5) '
                        r'(-0.3, -1) -- (0.3, -1) '
                        r'(0, 0) -- ++(0, 1.5) -- ++(1.2, 0) coordinate (tmp)'
                        r'-- +(0, -2) '
                        r'(tmp) +(45:2) -- (tmp) -- +(135:2) ;'
                        r'\end{tikzpicture}}}'
    )
    why_comm = UnsafeCommand(
        'newcommand', '\\why',
        extra_arguments=r'\mathbin{\text{\begin{tikzpicture}'
                        r'[x=1pt, y=1pt, scale=2]'
                        r'\draw '
                        r'(1.2, 1.5) coordinate (tmp)'
                        r'-- +(0, -2) '
                        r'(tmp) +(45:2) -- (tmp) -- +(135:2) ;'
                        r'\end{tikzpicture}}}'
    )
    doc.append(wye_comm)
    doc.append(why_comm)
    doc.add_color(name="lightgray", model="gray", description="0.80")
    with doc.create(Section('Buses')):
        with doc.create(Subsection('Load-Flow Solution')):
            with doc.create(LongTable('c|ccccccc')) as tbl:
                tbl.add_hline()
                tbl.add_row(('Bus', NoEscape('$|V|$ (pu)'), NoEscape('$\\delta$ (deg)'),
                             NoEscape('$P_G$ (MW)'), NoEscape('$Q_G$ (Mvar)'),
                             NoEscape('$P_L$ (MW)'), NoEscape('$Q_L$ (Mvar)'),
                             NoEscape('$Z_L$ (pu)')))
                tbl.add_hline()
                tbl.end_table_header()
                tbl.add_hline()
                tbl.add_row((MultiColumn(8, align='r', data='Continued on Next Page'),))
                tbl.add_hline()
                tbl.end_table_footer()
                tbl.add_hline()
                tbl.end_table_last_footer()

                for i, b in enumerate(buses):
                    if i % 2 == 0:
                        color = 'lightgray'
                    else:
                        color = None
                    tbl.add_row((b.bus_id + 1,
                                 NoEscape('{:.04f}'.format(b.v)),
                                 NoEscape('${:.02f}$'.format(b.delta * 180 / np.pi)),
                                 NoEscape('{:.02f}'.format(b.pg * 100)),
                                 NoEscape('{:.02f}'.format(b.qg * 100)),
                                 NoEscape('{:.02f}'.format(b.pl * 100)),
                                 NoEscape('{:.02f}'.format(b.ql * 100)),
                                 safe_repr(b.Z)),
                                color=color)
        with doc.create(Subsection('Fault Calculations')):
            with doc.create(LongTable('c|cccccccccc')) as tbl:
                tbl.add_hline()
                tbl.add_row((MultiRow(2, data='Bus'),
                             MultiColumn(2, align='c', data=NoEscape('TPG')),
                             MultiColumn(2, align='c', data=NoEscape('SLG')),
                             MultiColumn(4, align='c', data=NoEscape('DLG')),
                             MultiColumn(2, align='c', data=NoEscape('LL'))))
                tbl.add_hline(2, 11)
                tbl.add_row(('', NoEscape('$I_A$ (pu)'), NoEscape('$\\delta_A$ (deg)'),
                             NoEscape('$I_A$ (pu)'), NoEscape('$\\delta_A$ (deg)'),
                             NoEscape('$I_B$ (pu)'), NoEscape('$\\delta_B$ (deg)'),
                             NoEscape('$I_C$ (pu)'), NoEscape('$\\delta_C$ (deg)'),
                             NoEscape('$I_B$ (pu)'), NoEscape('$\\delta_B$ (deg)')))
                tbl.add_hline()
                tbl.end_table_header()
                tbl.add_hline()
                tbl.add_row((MultiColumn(11, align='r', data='Continued on Next Page'),))
                tbl.add_hline()
                tbl.end_table_footer()
                tbl.add_hline()
                tbl.end_table_last_footer()

                for i, b in enumerate(buses):
                    if i % 2 == 0:
                        color = 'lightgray'
                    else:
                        color = None
                    tbl.add_row((b.bus_id + 1,
                                 safe_repr(np.abs(b.iTPG)),
                                 NoEscape('${:.02f}$'.format(np.angle(b.iTPG) * 180 / np.pi)),
                                 safe_repr(np.abs(b.iSLG)),
                                 NoEscape('${:.02f}$'.format(np.angle(b.iSLG) * 180 / np.pi)),
                                 safe_repr(np.abs(b.iDLGb)),
                                 NoEscape('${:.02f}$'.format(np.angle(b.iDLGb) * 180 / np.pi)),
                                 safe_repr(np.abs(b.iDLGc)),
                                 NoEscape('${:.02f}$'.format(np.angle(b.iDLGc) * 180 / np.pi)),
                                 safe_repr(np.abs(b.iLL)),
                                 NoEscape('${:.02f}$'.format(np.angle(b.iLL) * 180 / np.pi))),
                                color=color)
    with doc.create(Section('Lines')):
        with doc.create(LongTable('c|cccccccc')) as tbl:
            tbl.add_hline()
            tbl.add_row((MultiRow(2, data='Line'),
                         MultiColumn(3, align='c', data='Parametrization'),
                         MultiColumn(2, align='c', data='Loss'),
                         MultiColumn(3, align='c', data='Flow')))
            tbl.add_hline(2, 9)
            tbl.add_row(('', NoEscape('$R$ (\\%pu)'), NoEscape('$X_L$ (\\%pu)'),
                         NoEscape('$B_C$ (\\%pu)'), NoEscape('$P_{loss}$ (MW)'),
                         NoEscape('$Q_{loss}$ (Mvar)'), NoEscape('$P$ (MW)'),
                         NoEscape('$Q$ (Mvar)'), NoEscape('$I/I_{max}$ (\\%)')))
            tbl.add_hline()
            tbl.end_table_header()
            tbl.add_hline()
            tbl.add_row((MultiColumn(9, align='r', data='Continued on Next Page'),))
            tbl.add_hline()
            tbl.end_table_footer()
            tbl.add_hline()
            tbl.end_table_last_footer()

            for i, lt in enumerate(lines):
                if i % 2 == 0:
                    color = 'lightgray'
                else:
                    color = None
                tbl.add_row((NoEscape('{} -- {}'.format(lt.orig.bus_id + 1, lt.dest.bus_id + 1)),
                             NoEscape('{:.04f}'.format(lt.Zpu.real * 100)),
                             NoEscape('{:.04f}'.format(lt.Zpu.imag * 100)),
                             NoEscape('{:.04f}'.format(lt.Ypu.imag * 100)),
                             NoEscape('{:.02f}'.format(lt.Sper.real * 100)),
                             NoEscape('{:.02f}'.format(lt.Sper.imag * 100)),
                             NoEscape('{:.02f}'.format(lt.S2.real * 100)),
                             NoEscape('{:.02f}'.format(lt.S2.imag * 100)),
                             NoEscape('{:.02f}'.format(np.abs(lt.Ia) / lt.imax * 100))),
                            color=color)
    with doc.create(Section('Trafos')):
        with doc.create(LongTable('c|ccccccc')) as tbl:
            tbl.add_hline()
            tbl.add_row((MultiRow(2, data='Trafo'),
                         MultiColumn(3, align='c', data='Parametrization'),
                         MultiColumn(1, align='c', data='Loss'),
                         MultiColumn(3, align='c', data='Flow')))
            tbl.add_hline(2, 8)
            tbl.add_row(('', NoEscape('$x^+$ (\\%pu)'), NoEscape('$x^0$ (\\%pu)'),
                         'Configuration', NoEscape('$Q_{loss}$ (Mvar)'),
                         NoEscape('$P$ (MW)'), NoEscape('$Q$ (Mvar)'), NoEscape('$S/S_N$ (\\%)')))
            tbl.add_hline()
            tbl.end_table_header()
            tbl.add_hline()
            tbl.add_row((MultiColumn(8, align='r', data='Continued on Next Page'),))
            tbl.add_hline()
            tbl.end_table_footer()
            tbl.add_hline()
            tbl.end_table_last_footer()

            for i, tr in enumerate(trafos):
                if i % 2 == 0:
                    color = 'lightgray'
                else:
                    color = None
                tbl.add_row((NoEscape('{} -- {}'.format(tr.orig.bus_id + 1, tr.dest.bus_id + 1)),
                             NoEscape('{:.02f}'.format(tr.Z1.imag * 100)),
                             NoEscape('{:.02f}'.format(tr.Z0.imag * 100)),
                             get_scheme(tr),
                             NoEscape('{:.02f}'.format(tr.Sper.imag * 100)),
                             NoEscape('{:.02f}'.format(tr.S2.real * 100)),
                             NoEscape('{:.02f}'.format(tr.S2.imag * 100)),
                             NoEscape('{:.02f}'.format(np.abs(tr.S2) * 1e8 / tr.snom * 100))),
                            color=color)

    filepath = filename.strip('.pdf')
    make_system_schematic(curves, grid, initial_fontsize=9)
    doc.append(NewPage())
    with doc.create(Section('System')):
        with doc.create(Figure(position='h')) as system_pic:
            system_pic.add_plot(bbox_inches='tight', width=NoEscape('\\textwidth'))
    doc.generate_pdf(filepath, clean_tex=True, compiler='latexmk', compiler_args=['-pdf'])
Example #29
0
def save_report(model, file_name, detailed_traces=2):
    print('Saving analytics report to {}.tex and {}.pdf'.format(
        file_name, file_name))

    inference_network = model._inference_network
    iter_per_sec = inference_network._total_train_iterations / inference_network._total_train_seconds
    traces_per_sec = inference_network._total_train_traces / inference_network._total_train_seconds
    traces_per_iter = inference_network._total_train_traces / inference_network._total_train_iterations
    train_loss_initial = inference_network._history_train_loss[0]
    train_loss_final = inference_network._history_train_loss[-1]
    train_loss_change = train_loss_final - train_loss_initial
    train_loss_change_per_sec = train_loss_change / inference_network._total_train_seconds
    train_loss_change_per_iter = train_loss_change / inference_network._total_train_iterations
    train_loss_change_per_trace = train_loss_change / inference_network._total_train_traces
    valid_loss_initial = inference_network._history_valid_loss[0]
    valid_loss_final = inference_network._history_valid_loss[-1]
    valid_loss_change = valid_loss_final - valid_loss_initial
    valid_loss_change_per_sec = valid_loss_change / inference_network._total_train_seconds
    valid_loss_change_per_iter = valid_loss_change / inference_network._total_train_iterations
    valid_loss_change_per_trace = valid_loss_change / inference_network._total_train_traces

    sys.stdout.write(
        'Generating report...                                           \r')
    sys.stdout.flush()

    geometry_options = {
        'tmargin': '1.5cm',
        'lmargin': '1cm',
        'rmargin': '1cm',
        'bmargin': '1.5cm'
    }
    doc = Document('basic', geometry_options=geometry_options)
    doc.preamble.append(NoEscape(r'\usepackage[none]{hyphenat}'))
    doc.preamble.append(NoEscape(r'\usepackage{float}'))
    # doc.preamble.append(NoEscape(r'\renewcommand{\familydefault}{\ttdefault}'))

    doc.preamble.append(Command('title', 'pyprob analytics: ' + model.name))
    doc.preamble.append(
        Command(
            'date',
            NoEscape(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))))
    doc.append(NoEscape(r'\maketitle'))
    # doc.append(NoEscape(r'\small'))

    print('Analytics: Current system')
    with doc.create(Section('Current system', numbering=False)):
        with doc.create(Tabularx('ll')) as table:
            table.add_row(('pyprob version', __version__))
            table.add_row(('PyTorch version', torch.__version__))

    # doc.append(NoEscape(r'\newpage'))
    print('Analytics: Inference network')
    with doc.create(Section('Inference network', numbering=False)):
        print('Analytics: Inference network.File')
        with doc.create(Section('File')):
            with doc.create(Tabularx('ll')) as table:
                # table.add_row(('File name', file_name))
                # file_size = '{:,}'.format(os.path.getsize(file_name))
                # table.add_row(('File size', file_size + ' Bytes'))
                table.add_row(('Created', inference_network._created))
                table.add_row(('Modified', inference_network._modified))
                table.add_row(('Updates to file', inference_network._updates))
        print('Analytics: Inference network.Training')
        with doc.create(Section('Training')):
            with doc.create(Tabularx('ll')) as table:
                table.add_row(
                    ('pyprob version', inference_network._pyprob_version))
                table.add_row(
                    ('PyTorch version', inference_network._torch_version))
                table.add_row(('Trained on', inference_network._trained_on))
                table.add_row(('Total training time', '{0}'.format(
                    util.days_hours_mins_secs_str(
                        inference_network._total_train_seconds))))
                table.add_row(
                    ('Total training traces',
                     '{:,}'.format(inference_network._total_train_traces)))
                table.add_row(('Traces / s', '{:,.2f}'.format(traces_per_sec)))
                table.add_row(
                    ('Traces / iteration', '{:,.2f}'.format(traces_per_iter)))
                table.add_row(
                    ('Iterations',
                     '{:,}'.format(inference_network._total_train_iterations)))
                table.add_row(
                    ('Iterations / s', '{:,.2f}'.format(iter_per_sec)))
                table.add_row(('Optimizer', inference_network._optimizer_type))
                table.add_row(('Validation set size',
                               inference_network._valid_batch.length))
        print('Analytics: Inference network.Training loss')
        with doc.create(Subsection('Training loss')):
            with doc.create(Tabularx('ll')) as table:
                table.add_row(
                    ('Initial loss', '{:+.6e}'.format(train_loss_initial)))
                table.add_row(
                    ('Final loss', '{:+.6e}'.format(train_loss_final)))
                table.add_row(('Loss change / s',
                               '{:+.6e}'.format(train_loss_change_per_sec)))
                table.add_row(('Loss change / iteration',
                               '{:+.6e}'.format(train_loss_change_per_iter)))
                table.add_row(('Loss change / trace',
                               '{:+.6e}'.format(train_loss_change_per_trace)))
        print('Analytics: Inference network.Validation loss')
        with doc.create(Subsection('Validation loss')):
            with doc.create(Tabularx('ll')) as table:
                table.add_row(
                    ('Initial loss', '{:+.6e}'.format(valid_loss_initial)))
                table.add_row(
                    ('Final loss', '{:+.6e}'.format(valid_loss_final)))
                table.add_row(('Loss change / s',
                               '{:+.6e}'.format(valid_loss_change_per_sec)))
                table.add_row(('Loss change / iteration',
                               '{:+.6e}'.format(valid_loss_change_per_iter)))
                table.add_row(('Loss change / trace',
                               '{:+.6e}'.format(valid_loss_change_per_trace)))
        with doc.create(Figure(position='H')) as plot:
            fig = plt.figure(figsize=(10, 6))
            ax = plt.subplot(111)
            ax.plot(inference_network._history_train_loss_trace,
                    inference_network._history_train_loss,
                    label='Training')
            ax.plot(inference_network._history_valid_loss_trace,
                    inference_network._history_valid_loss,
                    label='Validation')
            ax.legend()
            plt.xlabel('Training traces')
            plt.ylabel('Loss')
            plt.grid()
            fig.tight_layout()
            plot.add_plot(width=NoEscape(r'\textwidth'))
            plot.add_caption('Loss plot.')

        print('Analytics: Inference network.Neural network modules')
        with doc.create(Section('Neural network modules')):
            with doc.create(Tabularx('ll')) as table:
                table.add_row(
                    ('Total trainable parameters',
                     '{:,}'.format(inference_network._history_num_params[-1])))
                # table.add_row(('Softmax boost', inference_network.softmax_boost))
                # table.add_row(('Dropout', inference_network.dropout))
                # table.add_row(('Standardize inputs', inference_network.standardize_observes))
            with doc.create(Figure(position='H')) as plot:
                fig = plt.figure(figsize=(10, 4))
                ax = plt.subplot(111)
                ax.plot(inference_network._history_num_params_trace,
                        inference_network._history_num_params)
                plt.xlabel('Training traces')
                plt.ylabel('Number of parameters')
                plt.grid()
                fig.tight_layout()
                plot.add_plot(width=NoEscape(r'\textwidth'))
                plot.add_caption('Number of parameters.')

            doc.append(NoEscape(r'\newpage'))
            print(
                'Analytics: Inference network.Neural network modules.All modules'
            )
            with doc.create(Subsection('All modules')):
                doc.append(str(inference_network))

            for m_name, m in inference_network.named_modules():
                if (m_name != ''):
                    regex = r'(sample_embedding_layer\(\S*\)._)|(proposal_layer\(\S*\)._)|(_observe_embedding_layer.)|(_lstm)'
                    if len(list(re.finditer(regex, m_name))) > 0:
                        # if ('_observe_embedding_layer.' in m_name) or ('sample_embedding_layer.' in m_name) or ('proposal_layer.' in m_name):
                        doc.append(NoEscape(r'\newpage'))
                        with doc.create(Subsubsection(m_name)):
                            doc.append(str(m))
                            for p_name, p in m.named_parameters():
                                if not 'bias' in p_name:
                                    with doc.create(
                                            Figure(position='H')) as plot:
                                        fig = plt.figure(figsize=(10, 10))
                                        ax = plt.subplot(111)
                                        plt.imshow(np.transpose(
                                            util.weights_to_image(p),
                                            (1, 2, 0)),
                                                   interpolation='none')
                                        plt.axis('off')
                                        plot.add_plot(
                                            width=NoEscape(r'\textwidth'))
                                        plot.add_caption(m_name + '_' + p_name)
            # doc.append(NoEscape(r'\newpage'))
            # print('Analytics: Inference network.Neural network modules.Address embeddings')
            # with doc.create(Subsection('Address embeddings')):
            #     for p_name, p in inference_network.named_parameters():
            #         if ('address_embedding' in p_name):
            #             with doc.create(Figure(position='H')) as plot:
            #                 fig = plt.figure(figsize=(10,10))
            #                 ax = plt.subplot(111)
            #                 plt.imshow(np.transpose(util.weights_to_image(p),(1,2,0)), interpolation='none')
            #                 plt.axis('off')
            #                 plot.add_plot(width=NoEscape(r'\textwidth'))
            #                 plot.add_caption(FootnoteText(p_name.replace('::', ':: ')))

        gc.collect()
        doc.append(NoEscape(r'\newpage'))
        print('Analytics: Inference network.Traces')
        with doc.create(Section('Traces')):
            with doc.create(Tabularx('ll')) as table:
                table.add_row(
                    ('Total training traces',
                     '{:,}'.format(inference_network._total_train_traces)))
            print(
                'Analytics: Inference network.Traces.Distributions encountered'
            )
            with doc.create(Subsection('Distributions encountered')):
                with doc.create(Tabularx('ll')) as table:
                    # print([v[2] for v in inference_network._address_stats.values()])
                    distributions = set([
                        v[2]
                        for v in inference_network._address_stats.values()
                    ])
                    num_distributions = len(distributions)
                    table.add_row(
                        ('Number of distributions', num_distributions))
                    table.add_empty_row()
                    for distribution in distributions:
                        table.add_row((distribution, ''))
            print('Analytics: Inference network.Traces.Addresses encountered')
            with doc.create(Subsection('Addresses encountered')):
                with doc.create(Tabularx('lX')) as table:
                    num_addresses_all = len(
                        inference_network._address_stats.keys())
                    table.add_row(('Number of addresses', num_addresses_all))
                    num_addresses_controlled = len([
                        k for k, v in inference_network._address_stats.items()
                        if v[3]
                    ])
                    num_addresses_replaced = len([
                        k for k, v in inference_network._address_stats.items()
                        if v[3] and v[4]
                    ])
                    num_addresses_observed = len([
                        k for k, v in inference_network._address_stats.items()
                        if v[5]
                    ])
                    table.add_row(
                        (TextColor('red', 'Number of addresses (controlled)'),
                         TextColor('red', num_addresses_controlled)))
                    table.add_row((TextColor('green',
                                             'Number of addresses (replaced)'),
                                   TextColor('green', num_addresses_replaced)))
                    table.add_row((TextColor('blue',
                                             'Number of addresses (observed)'),
                                   TextColor('blue', num_addresses_observed)))
                    table.add_row(
                        ('Number of addresses (uncontrolled)',
                         num_addresses_all - num_addresses_controlled -
                         num_addresses_observed))
                    table.add_empty_row()
                doc.append('\n')
                with doc.create(LongTable('llllllp{12cm}')) as table:
                    # table.add_empty_row()
                    table.add_row(FootnoteText('Count'), FootnoteText('ID'),
                                  FootnoteText('Distrib.'),
                                  FootnoteText('Ctrl.'),
                                  FootnoteText('Replace'),
                                  FootnoteText('Obs.'),
                                  FootnoteText('Address'))
                    table.add_hline()

                    # address_to_abbrev = {}
                    # abbrev_to_address =
                    # abbrev_i = 0
                    # sorted_addresses = sorted(inference_network.address_histogram.items(), key=lambda x:x[1], reverse=True)
                    plt_all_addresses = []
                    plt_all_counts = []
                    plt_all_colors = []
                    plt_controlled_addresses = []
                    plt_controlled_counts = []
                    plt_controlled_colors = []
                    address_id_to_count = {}
                    address_id_to_color = {}
                    address_id_count_total = 0
                    for address, vals in inference_network._address_stats.items(
                    ):
                        address = address.replace('::', ':: ')
                        count = vals[0]
                        address_id = vals[1]
                        distribution = vals[2]
                        control = vals[3]
                        replace = vals[4]
                        observed = vals[5]
                        plt_all_addresses.append(address_id)
                        plt_all_counts.append(1 if replace else count)
                        address_id_to_count[address_id] = count
                        address_id_count_total += count
                        if control:
                            if replace:
                                color = 'green'
                                plt_controlled_counts.append(1)
                            else:
                                color = 'red'
                                plt_controlled_counts.append(count)

                            plt_controlled_addresses.append(address_id)
                            plt_controlled_colors.append(color)
                        elif observed:
                            color = 'blue'
                            plt_controlled_addresses.append(address_id)
                            plt_controlled_colors.append(color)
                            plt_controlled_counts.append(count)
                        else:
                            color = 'black'
                        table.add_row(
                            (TextColor(color,
                                       FootnoteText('{:,}'.format(count))),
                             TextColor(color, FootnoteText(address_id)),
                             TextColor(color, FootnoteText(distribution)),
                             TextColor(color, FootnoteText(control)),
                             TextColor(color, FootnoteText(replace)),
                             TextColor(color, FootnoteText(observed)),
                             TextColor(color, FootnoteText(address))))
                        plt_all_colors.append(color)
                        address_id_to_color[address_id] = color

                gc.collect()
                with doc.create(Figure(position='H')) as plot:
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    plt_x = range(len(plt_all_addresses))
                    ax.bar(plt_x, plt_all_counts, color=plt_all_colors)
                    plt.xticks(plt_x, plt_all_addresses)
                    plt.xlabel('Address ID')
                    plt.ylabel('Count')
                    # plt.grid()
                    fig.tight_layout()
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption(
                        'Histogram of all addresses. Red: controlled, green: replaced, black: uncontrolled, blue: observed.'
                    )

                with doc.create(Figure(position='H')) as plot:
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    plt_x = range(len(plt_controlled_addresses))
                    ax.bar(plt_x,
                           plt_controlled_counts,
                           color=plt_controlled_colors)
                    plt.xticks(plt_x, plt_controlled_addresses)
                    plt.xlabel('Address ID')
                    plt.ylabel('Count')
                    # plt.grid()
                    fig.tight_layout()
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption(
                        'Histogram of controlled and observed addresses. Red: controlled, green: replaced, blue: observed.'
                    )

            gc.collect()
            print('Analytics: Inference network.Traces.Trace lengths')
            with doc.create(Subsection('Trace lengths')):
                with doc.create(Tabularx('ll')) as table:
                    trace_lengths_controlled = [
                        v[3] for v in inference_network._trace_stats.values()
                    ]
                    trace_lengths_controlled_min = min(
                        trace_lengths_controlled)
                    trace_lengths_controlled_max = max(
                        trace_lengths_controlled)
                    trace_lengths_all = [
                        v[2] for v in inference_network._trace_stats.values()
                    ]
                    trace_lengths_all_min = min(trace_lengths_all)
                    trace_lengths_all_max = max(trace_lengths_all)
                    s_controlled = 0
                    s_all = 0
                    total_count = 0
                    for _, v in inference_network._trace_stats.items():
                        trace_length_controlled = v[3]
                        trace_length_all = v[2]
                        count = v[0]
                        s_controlled += trace_length_controlled * count
                        total_count += count
                        s_all += trace_length_all * count
                    trace_length_controlled_mean = s_controlled / total_count
                    trace_length_all_mean = s_all / total_count
                    table.add_row(('Trace length min',
                                   '{:,}'.format(trace_lengths_all_min)))
                    table.add_row(('Trace length max',
                                   '{:,}'.format(trace_lengths_all_max)))
                    table.add_row(('Trace length mean',
                                   '{:.2f}'.format(trace_length_all_mean)))
                    table.add_row(
                        ('Controlled trace length min',
                         '{:,}'.format(trace_lengths_controlled_min)))
                    table.add_row(
                        ('Controlled trace length max',
                         '{:,}'.format(trace_lengths_controlled_max)))
                    table.add_row(
                        ('Controlled trace length mean',
                         '{:.2f}'.format(trace_length_controlled_mean)))
                with doc.create(Figure(position='H')) as plot:
                    plt_counter = dict(Counter(trace_lengths_all))
                    plt_lengths = [
                        i for i in range(0, trace_lengths_all_max + 1)
                    ]
                    plt_counts = [
                        plt_counter[i] if i in plt_counter else 0
                        for i in range(0, trace_lengths_all_max + 1)
                    ]
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    ax.bar(plt_lengths,
                           plt_counts,
                           width=trace_lengths_all_max / 500.)
                    plt.xlabel('Length')
                    plt.ylabel('Count')
                    # plt.yscale('log')
                    # plt.grid()
                    fig.tight_layout()
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption('Histogram of trace lengths.')
                with doc.create(Figure(position='H')) as plot:
                    plt_counter = dict(Counter(trace_lengths_controlled))
                    plt_lengths = [
                        i for i in range(0, trace_lengths_controlled_max + 1)
                    ]
                    plt_counts = [
                        plt_counter[i] if i in plt_counter else 0
                        for i in range(0, trace_lengths_controlled_max + 1)
                    ]
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    ax.bar(plt_lengths, plt_counts)
                    plt.xlabel('Length')
                    plt.ylabel('Count')
                    # plt.yscale('log')
                    # plt.grid()
                    fig.tight_layout()
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption('Histogram of controlled trace lengths.')

            gc.collect()
            print(
                'Analytics: Inference network.Traces.Unique traces encountered'
            )
            with doc.create(Subsection('Unique traces encountered')):
                detailed_traces = min(len(inference_network._trace_stats),
                                      detailed_traces)
                with doc.create(Tabularx('ll')) as table:
                    table.add_row(
                        ('Unique traces encountered',
                         '{:,}'.format(len(inference_network._trace_stats))))
                    table.add_row(('Unique traces rendered in detail',
                                   '{:,}'.format(detailed_traces)))
                doc.append('\n')
                with doc.create(LongTable('llllp{15cm}')) as table:
                    # table.add_empty_row()
                    table.add_row(FootnoteText('Count'), FootnoteText('ID'),
                                  FootnoteText('Len.'),
                                  FootnoteText('Ctrl. len.'),
                                  FootnoteText('Unique trace'))
                    table.add_hline()

                    plt_traces = []
                    plt_counts = []
                    for trace_str, vals in inference_network._trace_stats.items(
                    ):
                        count = vals[0]
                        trace_id = vals[1]
                        length_all = vals[2]
                        length_controlled = vals[3]
                        addresses_controlled = vals[4]
                        addresses_controlled_str = ' '.join(
                            addresses_controlled)
                        plt_traces.append(trace_id)
                        plt_counts.append(count)
                        table.add_row(
                            (FootnoteText('{:,}'.format(count)),
                             FootnoteText(trace_id),
                             FootnoteText('{:,}'.format(length_all)),
                             FootnoteText('{:,}'.format(length_controlled)),
                             FootnoteText(addresses_controlled_str)))

                with doc.create(Figure(position='H')) as plot:
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    plt_x = range(len(plt_traces))
                    ax.bar(plt_x, plt_counts)
                    plt.xticks(plt_x, plt_traces)
                    plt.xlabel('Trace ID')
                    plt.ylabel('Count')
                    # plt.grid()
                    fig.tight_layout()
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption('Histogram of unique traces.')

                with doc.create(Figure(position='H')) as plot:
                    sorted_trace_stats = OrderedDict(
                        sorted(dict(inference_network._trace_stats).items(),
                               key=lambda x: x[1],
                               reverse=True))
                    master_trace_pairs = {}
                    transition_count_total = 0
                    for trace_str, vals in sorted_trace_stats.items():
                        count = vals[0]
                        ta = vals[4]
                        for left, right in zip(ta, ta[1:]):
                            if (left, right) in master_trace_pairs:
                                master_trace_pairs[(left, right)] += count
                            else:
                                master_trace_pairs[(left, right)] = count
                            transition_count_total += count
                    fig = plt.figure(figsize=(10, 5))
                    ax = plt.subplot(111)
                    master_graph = pydotplus.graphviz.Dot(graph_type='digraph',
                                                          rankdir='LR')
                    transition_count_max = 0
                    for p, count in master_trace_pairs.items():
                        if count > transition_count_max:
                            transition_count_max = count
                        nodes = master_graph.get_node(p[0])
                        if len(nodes) > 0:
                            n0 = nodes[0]
                        else:
                            n0 = pydotplus.Node(p[0])
                            master_graph.add_node(n0)
                        nodes = master_graph.get_node(p[1])
                        if len(nodes) > 0:
                            n1 = nodes[0]
                        else:
                            n1 = pydotplus.Node(p[1])
                            master_graph.add_node(n1)
                        master_graph.add_edge(
                            pydotplus.Edge(n0, n1, weight=count))
                    for node in master_graph.get_nodes():
                        node.set_color('gray')
                        node.set_fontcolor('gray')
                    for edge in master_graph.get_edges():
                        edge.set_color('gray')

                    master_graph_annotated = pydotplus.graphviz.graph_from_dot_data(
                        master_graph.to_string())
                    for node in master_graph_annotated.get_nodes():
                        # color = util.rgb_to_hex(util.rgb_blend((1, 1, 1), (1, 0, 0), address_id_to_count[node.obj_dict['name']] / address_id_count_total))
                        address_id = node.obj_dict['name']
                        node.set_style('filled')
                        node.set_fillcolor(address_id_to_color[address_id])
                        node.set_color('black')
                        node.set_fontcolor('black')
                    for edge in master_graph_annotated.get_edges():
                        (left, right) = edge.obj_dict['points']
                        count = master_trace_pairs[(left, right)]
                        edge.set_label(count)
                        # color = util.rgb_to_hex((1.5*(count/transition_count_total), 0, 0))
                        edge.set_color('black')
                        edge.set_penwidth(2.5 * count / transition_count_max)

                    png_str = master_graph_annotated.create_png(
                        prog=['dot', '-Gsize=90', '-Gdpi=600'])
                    bio = BytesIO()
                    bio.write(png_str)
                    bio.seek(0)
                    img = np.asarray(mpimg.imread(bio))
                    plt.imshow(util.crop_image(img), interpolation='bilinear')
                    plt.axis('off')
                    plot.add_plot(width=NoEscape(r'\textwidth'))
                    plot.add_caption(
                        'Succession of controlled addresses (accumulated over all traces). Red: controlled, green: replaced, blue: observed.'
                    )

                for trace_str, vals in OrderedDict(
                        islice(sorted_trace_stats.items(), 0,
                               detailed_traces)).items():
                    count = vals[0]
                    trace_id = vals[1]
                    doc.append(NoEscape(r'\newpage'))
                    with doc.create(Subsubsection('Unique trace ' + trace_id)):
                        sys.stdout.write(
                            'Rendering unique trace {0}...                                       \r'
                            .format(trace_id))
                        sys.stdout.flush()

                        addresses = len(plt_controlled_addresses)
                        trace_addresses = vals[4]

                        with doc.create(Tabularx('ll')) as table:
                            table.add_row(FootnoteText('Count'),
                                          FootnoteText('{:,}'.format(count)))
                            table.add_row(
                                FootnoteText('Controlled length'),
                                FootnoteText('{:,}'.format(
                                    len(trace_addresses))))
                        doc.append('\n')

                        im = np.zeros((addresses, len(trace_addresses)))
                        for i in range(len(trace_addresses)):
                            address = trace_addresses[i]
                            address_i = plt_controlled_addresses.index(address)
                            im[address_i, i] = 1
                        truncate = 100
                        for col_start in range(0, len(trace_addresses),
                                               truncate):
                            col_end = min(col_start + truncate,
                                          len(trace_addresses))
                            with doc.create(Figure(position='H')) as plot:
                                fig = plt.figure(figsize=(20 * (
                                    (col_end + 4 - col_start) / truncate), 4))
                                ax = plt.subplot(111)
                                # ax.imshow(im,cmap=plt.get_cmap('Greys'))
                                sns.heatmap(
                                    im[:, col_start:col_end],
                                    cbar=False,
                                    linecolor='lightgray',
                                    linewidths=.5,
                                    cmap='Greys',
                                    yticklabels=plt_controlled_addresses,
                                    xticklabels=np.arange(col_start, col_end))
                                plt.yticks(rotation=0)
                                fig.tight_layout()
                                plot.add_plot(
                                    width=NoEscape(r'{0}\textwidth'.format(
                                        (col_end + 4 - col_start) / truncate)),
                                    placement=NoEscape(r'\raggedright'))

                        with doc.create(Figure(position='H')) as plot:
                            pairs = {}
                            for left, right in zip(trace_addresses,
                                                   trace_addresses[1:]):
                                if (left, right) in pairs:
                                    pairs[(left, right)] += 1
                                else:
                                    pairs[(left, right)] = 1

                            fig = plt.figure(figsize=(10, 5))
                            ax = plt.subplot(111)
                            graph = pydotplus.graphviz.graph_from_dot_data(
                                master_graph.to_string())

                            trace_address_to_count = {}
                            for address in trace_addresses:
                                if address in trace_address_to_count:
                                    trace_address_to_count[address] += 1
                                else:
                                    trace_address_to_count[address] = 1

                            transition_count_max = 0
                            for p, count in pairs.items():
                                if count > transition_count_max:
                                    transition_count_max = count
                                left_node = graph.get_node(p[0])[0]
                                right_node = graph.get_node(p[1])[0]
                                edge = graph.get_edge(p[0], p[1])[0]

                                # color = util.rgb_to_hex(util.rgb_blend((1,1,1), (1,0,0), trace_address_to_count[p[0]] / len(trace_addresses)))
                                left_node.set_style('filled')
                                left_node.set_fillcolor(
                                    address_id_to_color[p[0]])
                                left_node.set_color('black')
                                left_node.set_fontcolor('black')

                                # color = util.rgb_to_hex(util.rgb_blend((1,1,1), (1,0,0), trace_address_to_count[p[0]] / len(trace_addresses)))
                                right_node.set_style('filled')
                                right_node.set_fillcolor(
                                    address_id_to_color[p[1]])
                                right_node.set_color('black')
                                right_node.set_fontcolor('black')

                                # (left, right) = edge.obj_dict['points']
                                edge.set_label(count)
                                # color = util.rgb_to_hex((1.5*(count/len(trace_addresses)),0,0))
                                edge.set_color('black')
                                edge.set_penwidth(2.5 * count /
                                                  transition_count_max)

                            png_str = graph.create_png(
                                prog=['dot', '-Gsize=90', '-Gdpi=600'])
                            bio = BytesIO()
                            bio.write(png_str)
                            bio.seek(0)
                            img = np.asarray(mpimg.imread(bio))
                            plt.imshow(util.crop_image(img),
                                       interpolation='bilinear')
                            plt.axis('off')
                            plot.add_plot(width=NoEscape(r'\textwidth'))
                            plot.add_caption(
                                'Succession of controlled addresses (for one trace of type '
                                + trace_id +
                                '). Red: controlled, green: replaced, blue: observed.'
                            )

                        with doc.create(Tabularx('lp{16cm}')) as table:
                            table.add_row(
                                FootnoteText('Trace'),
                                FootnoteText(' '.join(trace_addresses)))

    doc.generate_pdf(file_name, clean_tex=False)
    sys.stdout.write(
        '                                                               \r')
    sys.stdout.flush()
    def save_latex(self,
                   uiObj,
                   Design_Check,
                   reportsummary,
                   filename,
                   rel_path,
                   Disp_2d_image,
                   Disp_3d_image,
                   module=''):
        companyname = str(reportsummary["ProfileSummary"]['CompanyName'])
        companylogo = str(reportsummary["ProfileSummary"]['CompanyLogo'])
        groupteamname = str(reportsummary["ProfileSummary"]['Group/TeamName'])
        designer = str(reportsummary["ProfileSummary"]['Designer'])
        projecttitle = str(reportsummary['ProjectTitle'])
        subtitle = str(reportsummary['Subtitle'])
        jobnumber = str(reportsummary['JobNumber'])
        client = str(reportsummary['Client'])

        does_design_exist = reportsummary['does_design_exist']
        osdagheader = '/ResourceFiles/images/Osdag_header_report.png'
        # Add document header
        geometry_options = {
            "top": "5cm",
            "hmargin": "2cm",
            "headheight": "100pt",
            "footskip": "100pt",
            "bottom": "5cm"
        }
        doc = Document(geometry_options=geometry_options, indent=False)
        doc.packages.append(Package('amsmath'))
        doc.packages.append(Package('graphicx'))
        doc.packages.append(Package('needspace'))
        doc.append(pyl.Command('fontsize', arguments=[8, 12]))
        doc.append(pyl.Command('selectfont'))

        doc.add_color('OsdagGreen', 'RGB', '153,169,36')
        doc.add_color('PassColor', 'RGB', '153,169,36')
        doc.add_color('Red', 'RGB', '255,0,0')
        doc.add_color('Green', 'RGB', '0,200,0')
        doc.add_color('FailColor', 'HTML', '933A16')
        header = PageStyle("header")
        # Create center header
        with header.create(Head("C")):
            with header.create(Tabularx('|l|p{4cm}|l|X|')) as table:
                table.add_hline()
                # MultiColumn(4)
                table.add_row((
                    MultiColumn(
                        2,
                        align='|c|',
                        data=('' if companylogo is '' else StandAloneGraphic(
                            image_options="height=0.95cm",
                            filename=companylogo))),
                    MultiColumn(2,
                                align='|c|',
                                data=[
                                    'Created with',
                                    StandAloneGraphic(
                                        image_options="width=4.0cm,height=1cm",
                                        filename=rel_path + osdagheader)
                                ]),
                ))
                table.add_hline()
                table.add_row(('Company Name', companyname, 'Project Title',
                               projecttitle),
                              color='OsdagGreen')
                table.add_hline()
                table.add_row(
                    ('Group/Team Name', groupteamname, 'Subtitle', subtitle),
                    color='OsdagGreen')
                table.add_hline()
                table.add_row(('Designer', designer, 'Job Number', jobnumber),
                              color='OsdagGreen')
                table.add_hline()
                table.add_row(
                    ('Date', time.strftime("%d /%m /%Y"), 'Client', client),
                    color='OsdagGreen')
                table.add_hline()

        # Create right footer
        with header.create(Foot("R")):
            header.append(NoEscape(r'Page \thepage'))
        #
        # doc.preamble.append(header)
        # doc.change_document_style("header")

        # Add Heading
        # with doc.create(MiniPage(align='c')):

        doc.preamble.append(header)
        doc.change_document_style("header")
        with doc.create(Section('Input Parameters')):
            with doc.create(
                    LongTable('|p{5cm}|p{2.5cm}|p{1.5cm}|p{3cm}|p{3.5cm}|',
                              row_height=1.2)) as table:
                table.add_hline()
                for i in uiObj:
                    # row_cells = ('9', MultiColumn(3, align='|c|', data='Multicolumn not on left'))
                    if i == "Selected Section Details" or i == KEY_DISP_ANGLE_LIST or i == KEY_DISP_TOPANGLE_LIST or i == KEY_DISP_CLEAT_ANGLE_LIST:
                        # if type(uiObj[i]) == list:
                        continue
                    if type(uiObj[i]) == dict:
                        table.add_hline()
                        sectiondetails = uiObj[i]
                        image_name = sectiondetails[KEY_DISP_SEC_PROFILE]

                        Img_path = '/ResourceFiles/images/' + image_name + '.png'
                        if (len(sectiondetails)) % 2 == 0:
                            # merge_rows = int(round_up(len(sectiondetails),2)/2 + 2)
                            merge_rows = int((len(sectiondetails) / 2)) + 2
                        else:
                            merge_rows = round_up((len(sectiondetails) / 2), 2)
                        if (len(sectiondetails)) % 2 == 0:
                            sectiondetails[''] = ''

                        a = list(sectiondetails.keys())
                        # index=0
                        for x in range(1, (merge_rows + 1)):
                            # table.add_row("Col.Det.",i,columndetails[i])
                            if x == 1:
                                table.add_row((
                                    MultiRow(
                                        merge_rows,
                                        data=StandAloneGraphic(
                                            image_options=
                                            "width=5cm,height=5cm",
                                            filename=rel_path + Img_path)),
                                    MultiColumn(2, align='|c|', data=a[x]),
                                    MultiColumn(2,
                                                align='|c|',
                                                data=sectiondetails[a[x]]),
                                ))
                            elif x <= 4:
                                table.add_row((
                                    '',
                                    MultiColumn(2,
                                                align='|c|',
                                                data=NoEscape(a[x])),
                                    MultiColumn(2,
                                                align='|c|',
                                                data=NoEscape(
                                                    sectiondetails[a[x]])),
                                ))
                            else:
                                table.add_row((
                                    '',
                                    NoEscape(a[x]),
                                    sectiondetails[a[x]],
                                    NoEscape(a[merge_rows + x - 4]),
                                    sectiondetails[a[merge_rows + x - 4]],
                                ))
                            table.add_hline(2, 5)
                    elif uiObj[i] == "TITLE":
                        table.add_hline()
                        table.add_row((MultiColumn(
                            5,
                            align='|c|',
                            data=bold(i),
                        ), ))
                        table.add_hline()
                    elif i == 'Section Size*':
                        table.add_hline()
                        table.add_row((
                            MultiColumn(
                                3,
                                align='|c|',
                                data=i,
                            ),
                            MultiColumn(2,
                                        align='|c|',
                                        data="Ref List of Input Section"),
                        ))
                        table.add_hline()
                    elif len(str(uiObj[i])) > 55 and type(
                            uiObj[i]) != pyl.math.Math:
                        str_len = len(str(uiObj[i]))
                        loop_len = round_up((str_len / 55), 1, 1)
                        for j in range(1, loop_len + 1):
                            b = 55 * j + 1
                            if j == 1:
                                table.add_row((
                                    MultiColumn(3,
                                                align='|c|',
                                                data=MultiRow(loop_len,
                                                              data=i)),
                                    MultiColumn(2,
                                                align='|c|',
                                                data=uiObj[i][0:b]),
                                ))
                            else:
                                table.add_row((
                                    MultiColumn(3,
                                                align='|c|',
                                                data=MultiRow(loop_len,
                                                              data="")),
                                    MultiColumn(2,
                                                align='|c|',
                                                data=uiObj[i][b - 55:b]),
                                ))
                        table.add_hline()
                    else:
                        table.add_hline()
                        table.add_row((
                            MultiColumn(3, align='|c|', data=NoEscape(i)),
                            MultiColumn(2, align='|c|', data=uiObj[i]),
                        ))
                        table.add_hline()
            for i in uiObj:
                if i == 'Section Size*' or i == KEY_DISP_ANGLE_LIST or i == KEY_DISP_TOPANGLE_LIST or i == KEY_DISP_CLEAT_ANGLE_LIST:
                    with doc.create(Subsection("List of Input Section")):
                        # with doc.create(LongTable('|p{8cm}|p{8cm}|', row_height=1.2)) as table:
                        with doc.create(Tabularx('|p{4cm}|X|',
                                                 row_height=1.2)) as table:
                            table.add_hline()
                            table.add_row((
                                MultiColumn(
                                    1,
                                    align='|c|',
                                    data=i,
                                ),
                                MultiColumn(1,
                                            align='|X|',
                                            data=uiObj[i].strip("[]")),
                            ))
                            # str_len = len(uiObj[i])
                            # loop_len = round_up((str_len/100),1,1)
                            # table.add_hline()
                            # for j in range(1,loop_len+1):
                            #     b= 100*j+1
                            #     if j ==1:
                            #         table.add_row((MultiColumn(1, align='|c|', data=i, ),
                            #                        MultiColumn(1, align='|X|', data=uiObj[i][0:b]),))
                            #     else:
                            #         table.add_row((MultiColumn(1, align='|c|', data=" ", ),
                            #                        MultiColumn(1, align='|X|', data=uiObj[i][b-100:b]),))
                            table.add_hline()

        doc.append(
            pyl.Command('Needspace', arguments=NoEscape(r'10\baselineskip')))
        doc.append(NewPage())
        count = 0
        with doc.create(Section('Design Checks')):
            with doc.create(
                    Tabularx(
                        r'|>{\centering}p{12.5cm}|>{\centering\arraybackslash}X|',
                        row_height=1.2)) as table:
                table.add_hline()
                # Fail = TextColor("FailColor", bold("Fail"))
                # Pass = TextColor("PassColor", bold("Pass"))

                if does_design_exist != True:
                    table.add_row(bold('Design Status'),
                                  color_cell("Red", bold("Fail")))
                else:
                    table.add_row(bold('Design Status'),
                                  color_cell("OsdagGreen", bold("Pass")))
                table.add_hline()

            for check in Design_Check:

                if check[0] == 'SubSection':
                    if count >= 1:
                        # doc.append(NewPage())
                        doc.append(
                            pyl.Command(
                                'Needspace',
                                arguments=NoEscape(r'10\baselineskip')))
                    with doc.create(Subsection(check[1])):
                        #########################
                        # if uiObj== "WELDImage":
                        #     table.add_hline()
                        #     table.add_row((MultiColumn(5, align='|c|', data=bold(i), ),))
                        #     table.add_hline()
                        # else:
                        #########################
                        with doc.create(LongTable(check[2], row_height=1.2)
                                        ) as table:  # todo anjali remove
                            table.add_hline()
                            table.add_row(
                                ('Check', 'Required', 'Provided', 'Remarks'),
                                color='OsdagGreen')
                            table.add_hline()
                            table.end_table_header()
                            table.add_hline()
                            count = count + 1
                elif check[0] == "Selected":
                    if count >= 1:
                        # doc.append(NewPage())
                        doc.append(
                            pyl.Command(
                                'Needspace',
                                arguments=NoEscape(r'10\baselineskip')))
                    with doc.create(Subsection(check[1])):
                        with doc.create(LongTable(check[2],
                                                  row_height=1.2)) as table:
                            table.add_hline()
                            for i in uiObj:
                                # row_cells = ('9', MultiColumn(3, align='|c|', data='Multicolumn not on left'))

                                print(i)
                                if type(
                                        uiObj[i]
                                ) == dict and i == 'Selected Section Details':
                                    table.add_hline()
                                    sectiondetails = uiObj[i]
                                    image_name = sectiondetails[
                                        KEY_DISP_SEC_PROFILE]
                                    Img_path = '/ResourceFiles/images/' + image_name + '.png'
                                    if (len(sectiondetails)) % 2 == 0:
                                        # merge_rows = int(round_up(len(sectiondetails),2)/2 + 2)
                                        merge_rows = int(
                                            round_up((len(sectiondetails) /
                                                      2), 1, 0) + 2)
                                    else:
                                        merge_rows = int(
                                            round_up((len(sectiondetails) /
                                                      2), 1, 0) + 1)
                                    print('Hi',
                                          len(sectiondetails) / 2,
                                          round_up(len(sectiondetails), 2) / 2,
                                          merge_rows)
                                    if (len(sectiondetails)) % 2 == 0:
                                        sectiondetails[''] = ''
                                    a = list(sectiondetails.keys())
                                    # index=0
                                    for x in range(1, (merge_rows + 1)):
                                        # table.add_row("Col.Det.",i,columndetails[i])
                                        if x == 1:
                                            table.add_row((
                                                MultiRow(
                                                    merge_rows,
                                                    data=StandAloneGraphic(
                                                        image_options=
                                                        "width=5cm,height=5cm",
                                                        filename=rel_path +
                                                        Img_path)),
                                                MultiColumn(2,
                                                            align='|c|',
                                                            data=NoEscape(
                                                                a[x])),
                                                MultiColumn(
                                                    2,
                                                    align='|c|',
                                                    data=NoEscape(
                                                        sectiondetails[a[x]])),
                                            ))
                                        elif x <= 4:
                                            table.add_row((
                                                '',
                                                MultiColumn(2,
                                                            align='|c|',
                                                            data=NoEscape(
                                                                a[x])),
                                                MultiColumn(
                                                    2,
                                                    align='|c|',
                                                    data=sectiondetails[a[x]]),
                                            ))
                                        else:
                                            table.add_row((
                                                '',
                                                NoEscape(a[x]),
                                                sectiondetails[a[x]],
                                                NoEscape(a[merge_rows + x -
                                                           4]),
                                                sectiondetails[a[merge_rows +
                                                                 x - 4]],
                                            ))

                                        table.add_hline(2, 5)
                            table.add_hline()
                        count = count + 1
                else:

                    if check[3] == 'Fail':
                        table.add_row((NoEscape(check[0])), check[1], check[2],
                                      TextColor("Red", bold(check[3])))
                    else:
                        table.add_row((NoEscape(check[0])), check[1], check[2],
                                      TextColor("OsdagGreen", bold(check[3])))
                    table.add_hline()

        # 2D images
        if len(Disp_2d_image) != 0:

            if module == KEY_DISP_BCENDPLATE or module == KEY_DISP_BB_EP_SPLICE:
                if does_design_exist and sys.platform != 'darwin':
                    doc.append(NewPage())
                    weld_details = rel_path + Disp_2d_image[0]
                    detailing_details = rel_path + Disp_2d_image[1]
                    stiffener_details = rel_path + Disp_2d_image[2]

                    with doc.create(Section('2D Drawings (Typical)')):

                        with doc.create(Figure()) as image:
                            image.add_image(weld_details,
                                            width=NoEscape(r'0.7\textwidth'),
                                            placement=NoEscape(r'\centering'))
                            image.add_caption(
                                'Typical Weld Details -- Beam to End Plate Connection'
                            )
                            # doc.append(NewPage())

                        with doc.create(Figure()) as image_2:
                            image_2.add_image(
                                detailing_details,
                                width=NoEscape(r'0.7\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_2.add_caption('Typical Detailing')
                            # doc.append(NewPage())

                        with doc.create(Figure()) as image_3:
                            image_3.add_image(
                                stiffener_details,
                                width=NoEscape(r'0.9\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_3.add_caption('Typical Stiffener Details')
                            # doc.append(NewPage())

            elif module == KEY_DISP_BASE_PLATE:
                if does_design_exist and sys.platform != 'darwin':
                    doc.append(NewPage())
                    bp_sketch = rel_path + Disp_2d_image[0]
                    bp_detailing = rel_path + Disp_2d_image[1]
                    bp_weld = rel_path + Disp_2d_image[2]
                    bp_anchor = rel_path + Disp_2d_image[3]
                    bp_key = rel_path + Disp_2d_image[4]

                    with doc.create(Section('2D Drawings (Typical)')):
                        with doc.create(Figure()) as image_1:
                            image_1.add_image(
                                bp_sketch,
                                width=NoEscape(r'1.0\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_1.add_caption('Typical Base Plate Details')
                            # doc.append(NewPage())

                        with doc.create(Figure()) as image_2:
                            image_2.add_image(
                                bp_detailing,
                                width=NoEscape(r'1.0\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_2.add_caption('Typical Base Plate Detailing')
                            # doc.append(NewPage())

                        with doc.create(Figure()) as image_3:
                            image_3.add_image(
                                bp_weld,
                                width=NoEscape(r'1.0\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_3.add_caption('Typical Weld Details')
                            # doc.append(NewPage())

                        with doc.create(Figure()) as image_4:
                            image_4.add_image(
                                bp_anchor,
                                width=NoEscape(r'0.5\textwidth'),
                                placement=NoEscape(r'\centering'))
                            image_4.add_caption('Typical Anchor Bolt Details')
                            # doc.append(NewPage())

                        if len(Disp_2d_image[-1]) > 0:
                            with doc.create(Figure()) as image_5:
                                image_5.add_image(
                                    bp_key,
                                    width=NoEscape(r'0.9\textwidth'),
                                    placement=NoEscape(r'\centering'))
                                image_5.add_caption(
                                    'Typical Shear Key Details')
                                # doc.append(NewPage())

        if does_design_exist and sys.platform != 'darwin':
            doc.append(NewPage())
            Disp_top_image = "/ResourceFiles/images/top.png"
            Disp_side_image = "/ResourceFiles/images/side.png"
            Disp_front_image = "/ResourceFiles/images/front.png"
            view_3dimg_path = rel_path + Disp_3d_image
            view_topimg_path = rel_path + Disp_top_image
            view_sideimg_path = rel_path + Disp_side_image
            view_frontimg_path = rel_path + Disp_front_image
            with doc.create(Section('3D Views')):
                with doc.create(
                        Tabularx(
                            r'|>{\centering}X|>{\centering\arraybackslash}X|',
                            row_height=1.2)) as table:
                    view_3dimg_path = rel_path + Disp_3d_image
                    view_topimg_path = rel_path + Disp_top_image
                    view_sideimg_path = rel_path + Disp_side_image
                    view_frontimg_path = rel_path + Disp_front_image
                    table.add_hline()
                    table.add_row([
                        StandAloneGraphic(image_options="height=4cm",
                                          filename=view_3dimg_path),
                        StandAloneGraphic(image_options="height=4cm",
                                          filename=view_topimg_path)
                    ])
                    table.add_row('(a) 3D View', '(b) Top View')
                    table.add_hline()
                    table.add_row([
                        StandAloneGraphic(image_options="height=4cm",
                                          filename=view_sideimg_path),
                        StandAloneGraphic(image_options="height=4cm",
                                          filename=view_frontimg_path)
                    ])
                    table.add_row('(c) Side View', '(d) Front View')
                    table.add_hline()
                # with doc.create(Figure(position='h!')) as view_3D:
                #     view_3dimg_path = rel_path + Disp_3d_image
                #     # view_3D.add_image(filename=view_3dimg_path, width=NoEscape(r'\linewidth'))
                #
                #     view_3D.add_image(filename=view_3dimg_path,width=NoEscape(r'\linewidth,height=6.5cm'))
                #
                #     view_3D.add_caption('3D View')

        with doc.create(Section('Design Log')):
            doc.append(
                pyl.Command('Needspace',
                            arguments=NoEscape(r'10\baselineskip')))
            logger_msgs = reportsummary['logger_messages'].split('\n')
            for msg in logger_msgs:
                if ('WARNING' in msg):
                    colour = 'blue'
                elif ('INFO' in msg):
                    colour = 'OsdagGreen'
                elif ('ERROR' in msg):
                    colour = 'red'
                else:
                    continue
                doc.append(TextColor(colour, '\n' + msg))
        try:
            doc.generate_pdf(filename, compiler='pdflatex', clean_tex=False)
        except:
            pass