Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions thicket/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,30 @@ def rajaperf_seq_O3_1M_cali(data_dir, tmpdir):
return [os.path.join(str(tmpdir), f) for f in cali_files]


@pytest.fixture
def dane_rajaperf_seq_O3_8M_cali(data_dir, tmpdir):
"""All trials of for Base Sequential optimization level O3 and problem size 8388608."""
cali_files = sorted(
glob(
f"{data_dir}/rajaperf/dane/clang14.0.6_8388608/O3/**/Base_Seq-default.cali",
recursive=True,
)
)
for cf in cali_files:
shutil.copy(cf, str(tmpdir))
return [os.path.join(str(tmpdir), f) for f in cali_files]


@pytest.fixture
def dane_rajaperf_seq_O3_8M_remark_cali(data_dir, tmpdir):
"""Remark caliper file for Base Sequential optimization level O3 and problem size 8388608."""
cali_file = f"{data_dir}/rajaperf/dane/clang14.0.6_8388608/O3/remark_data/remark_output.cali"

shutil.copy(cali_file, str(tmpdir))

return os.path.join(str(tmpdir), cali_file)


@pytest.fixture
def rajaperf_unique_tunings(data_dir, tmpdir):
"""1 trial of each unique tuning in the dataset"""
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions thicket/tests/test_remark_injestion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Copyright 2022 Lawrence Livermore National Security, LLC and other
# Thicket Project Developers. See the top-level LICENSE file for details.
#
# SPDX-License-Identifier: MIT

import pytest

import thicket as th


def test_add_remark_data(
dane_rajaperf_seq_O3_8M_cali,
dane_rajaperf_seq_O3_8M_remark_cali,
thicket_axis_columns,
):
_, _, combined_th = thicket_axis_columns

th_ens = th.Thicket.from_caliperreader(
dane_rajaperf_seq_O3_8M_cali,
disable_tqdm=True,
)

with pytest.raises(
ValueError, match="Parameter 'caliper_file' must be of type string."
):
th_ens.add_remark_data(1)

with pytest.raises(
ValueError, match="Cannot run 'run_remark_data' on columnar joined thickets."
):
combined_th.add_remark_data(dane_rajaperf_seq_O3_8M_remark_cali)

th_ens.add_remark_data(dane_rajaperf_seq_O3_8M_remark_cali)

assert sorted(th_ens.dataframe.index.get_level_values(0).unique()) == sorted(
th_ens.statsframe.dataframe.index.values
)

assert "remark_columns" in th_ens.metadata

remark_columns = th_ens.metadata["remark_columns"].iloc[0]

assert isinstance(remark_columns, list)

assert len(set(th_ens.dataframe.columns).intersection(remark_columns)) == len(
remark_columns
)
94 changes: 94 additions & 0 deletions thicket/thicket.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import collections
import copy
import os
import re
import pickle
import sys
import json
Expand Down Expand Up @@ -622,6 +623,99 @@ def from_json(json_thicket):
# make and return thicket?
return th

def add_remark_data(
self,
caliper_file,
):
if not isinstance(caliper_file, str):
raise ValueError("Parameter 'caliper_file' must be of type string.")

if self.dataframe.columns.nlevels != 1:
raise ValueError(
"Cannot run 'run_remark_data' on columnar joined thickets."
)

def process_remarks(remark_data_thicket):

static_remark_columns = set()
dynamic_remark_columns = set()

# TODO: Change this so that you use row directly
for index, row in remark_data_thicket.dataframe.iterrows():

num_nodes = len(remark_data_thicket.graph)

static_freq_dict = {}
dynamic_freq_dict = {}

node = index[0]

remark_data_thicket.dataframe.loc[node, "Remark_Attribute"].iloc[0] = re.findall(r"'([^']*)'", remark_data_thicket.dataframe.loc[node, "Remark_Attribute"].iloc[0])

for parent in node.parents:
# TODO: Delete, might be unnecessary???
if isinstance(remark_data_thicket.dataframe.loc[parent, "Remark_Attribute"].iloc[0], str):
remark_data_thicket.dataframe.loc[parent, "Remark_Attribute"].iloc[0] = re.findall(r"'([^']*)'", remark_data_thicket.dataframe.loc[parent, "Remark_Attribute"].iloc[0])
for value in remark_data_thicket.dataframe.loc[parent, "Remark_Attribute"].iloc[0]:
try:
remark_data_thicket.dataframe.loc[node, "Remark_Attribute"].iloc[0].remove(value)
# print(f"Removed value: {value} for region: {node.name}")
except Exception:
pass

static_remarks = list(set(remark_data_thicket.dataframe.loc[node, "Remark_Attribute"].iloc[0]))
dynamic_remarks = list(remark_data_thicket.dataframe.loc[node, "Remark_Attribute"].iloc[0])

static_remarks = ["~".join(i.split("~")[:3]) for i in static_remarks]
dynamic_remarks = ["~".join(i.split("~")[:3]) for i in dynamic_remarks]

unique_remarks = list(set(static_remarks))

for remark in static_remarks:
static_remark_name = f"{remark}~static"
static_remark_columns.add(static_remark_name)
if static_remark_name not in static_freq_dict.keys():
static_freq_dict[static_remark_name] = 1
continue

static_freq_dict[static_remark_name] += 1

for remark in dynamic_remarks:
dynamic_remark_name = f"{remark}~dynamic"
dynamic_remark_columns.add(dynamic_remark_name)
if dynamic_remark_name not in dynamic_freq_dict.keys():
dynamic_freq_dict[dynamic_remark_name] = 1
continue
dynamic_freq_dict[dynamic_remark_name] += 1

remark_data_thicket.dataframe.loc[node, static_freq_dict.keys()] = list(static_freq_dict.values())
remark_data_thicket.dataframe.loc[node, dynamic_freq_dict.keys()] = list(dynamic_freq_dict.values())

return list(static_remark_columns), list(dynamic_remark_columns)

remark_data_thicket = self.from_caliperreader(caliper_file, string_attributes="Remark_Attribute")

static_remark_columns, dynamic_remark_columns = process_remarks(remark_data_thicket)

remark_data_thicket.dataframe = remark_data_thicket.dataframe.reindex(
remark_data_thicket.dataframe.index.repeat(len(self.profile))
)

remark_data_thicket.dataframe.index = self.dataframe.index

self.dataframe[static_remark_columns] = remark_data_thicket.dataframe[
static_remark_columns
]

self.dataframe[dynamic_remark_columns] = remark_data_thicket.dataframe[
dynamic_remark_columns
]

self.metadata["remark_columns_static"] = [static_remark_columns] * len(self.profile)
self.metadata["remark_columns_dynamic"] = [dynamic_remark_columns] * len(self.profile)

self.dataframe.sort_index(inplace=True)

def add_ncu(
self,
ncu_report_mapping,
Expand Down
Loading