Skip to content
Merged
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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

公開Web版では、インストールせずに入力、計算、結果ファイルの取得を行えます。
計算は1件ずつ処理するため、混雑時は画面に表示される順番をお待ちください。
詳細CSVは通常計算時には作成せず、「出力ファイル」タブの
「CSVファイルを出力」を押したときだけ作成します。
入力ファイルと計算成果物は一時的に保存されるため、機密情報や個人情報を含む
データはアップロードしないでください。

Expand Down
55 changes: 54 additions & 1 deletion apps/gradio/src/verification_app/form_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,8 +277,15 @@ def build_app(
graph_status = gr.Markdown("計算完了後にグラフを表示します。")
graphs = [gr.Plot(label=label) for label in GRAPH_LABELS]
with gr.Tab("出力ファイル", render_children=True):
csv_status = gr.Markdown(
"計算完了後、必要な場合だけCSVファイルを出力できます。"
)
export_csv_button = gr.Button(
"CSVファイルを出力",
interactive=False,
)
files = gr.File(
label="計算出力",
label="ダウンロード可能な計算出力",
file_count="multiple",
interactive=False,
)
Expand All @@ -295,6 +302,26 @@ def generate_graphs(result: CalculationResult | None) -> tuple[Any, ...]:
return _graph_outputs(None)
return _graph_outputs(calculation_service.generate_graphs(result))

def export_csv_files(
result: CalculationResult | None,
) -> tuple[Any, ...]:
if result is None:
return (
None,
"CSV出力対象の計算結果がありません。",
gr.update(interactive=False),
[],
"",
)
exported = calculation_service.export_csv(result)
return (
exported,
exported.csv_status,
gr.update(interactive=exported.csv_status.startswith("❌")),
list(exported.files),
exported.log,
)

calculation_started = run.click(
_calculation_started_outputs,
outputs=[
Expand All @@ -304,6 +331,8 @@ def generate_graphs(result: CalculationResult | None) -> tuple[Any, ...]:
log,
graph_status,
*graphs,
csv_status,
export_csv_button,
files,
],
queue=False,
Expand All @@ -319,6 +348,8 @@ def generate_graphs(result: CalculationResult | None) -> tuple[Any, ...]:
preview,
log,
graph_status,
csv_status,
export_csv_button,
files,
],
concurrency_limit=1,
Expand All @@ -333,6 +364,20 @@ def generate_graphs(result: CalculationResult | None) -> tuple[Any, ...]:
concurrency_id="calculation",
show_progress="full",
)
export_csv_button.click(
export_csv_files,
inputs=result_state,
outputs=[
result_state,
csv_status,
export_csv_button,
files,
log,
],
concurrency_limit=1,
concurrency_id="calculation",
show_progress="full",
)

conditional_fields = tuple(
field for field in form.schema.fields if field.enabled_when is not None
Expand Down Expand Up @@ -757,6 +802,8 @@ def _calculation_started_outputs() -> tuple[Any, ...]:
"",
"計算完了後にグラフを生成します。",
*((None,) * len(GRAPH_LABELS)),
"計算中です。CSVファイルはまだ出力できません。",
gr.update(interactive=False),
[],
)

Expand All @@ -777,6 +824,10 @@ def _calculation_outputs(result: CalculationResult) -> tuple[Any, ...]:
result.input_data,
result.log,
graph_status,
result.csv_status,
gr.update(
interactive=result.succeeded and result.csv_exports is not None,
),
list(result.files),
)

Expand Down Expand Up @@ -851,6 +902,7 @@ def _graph_outputs(result: CalculationResult | None) -> tuple[Any, ...]:
def _default_service() -> CalculationService:
import jjjexperiment.main
from jjjexperiment.constants import version_info
from jjjexperiment.csv_artifacts import capture_csv_exports

from .graphs import build_result_graphs

Expand All @@ -864,6 +916,7 @@ def _default_service() -> CalculationService:
workdir=output_dir,
build_graphs=build_result_graphs,
result_ttl_seconds=(result_ttl_seconds if result_ttl_seconds > 0 else None),
csv_export_session=capture_csv_exports,
)


Expand Down
27 changes: 21 additions & 6 deletions apps/gradio/src/verification_app/graphs.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,22 @@


def build_result_graphs(
input_data: Mapping[str, Any], output_dir: Path, version: str
input_data: Mapping[str, Any],
output_dir: Path,
version: str,
csv_exports: Any | None = None,
) -> tuple[Figure, ...]:
"""Build the five graphs provided by the legacy 260715 notebook."""
prefix = f"{input_data.get('case_name', 'default')}{version}"
output2 = _read_output(output_dir / f"{prefix}_output2.csv")
output5_heating = _read_output(output_dir / f"{prefix}_H_output5.csv")
output5_cooling = _read_output(output_dir / f"{prefix}_C_output5.csv")
output2 = _read_output(output_dir / f"{prefix}_output2.csv", csv_exports)
output5_heating = _read_output(
output_dir / f"{prefix}_H_output5.csv",
csv_exports,
)
output5_cooling = _read_output(
output_dir / f"{prefix}_C_output5.csv",
csv_exports,
)

winter = output2.loc[_WINTER]
summer = output2.loc[_SUMMER]
Expand All @@ -55,8 +64,14 @@ def build_result_graphs(
)


def _read_output(path: Path) -> pd.DataFrame:
frame = pd.read_csv(path, encoding="cp932", index_col=0)
def _read_output(path: Path, csv_exports: Any | None = None) -> pd.DataFrame:
dataframe = getattr(csv_exports, "dataframe", None)
captured = None if dataframe is None else dataframe(path)
frame = (
pd.read_csv(path, encoding="cp932", index_col=0)
if captured is None
else captured.copy(deep=False)
)
frame.index = pd.to_datetime(frame.index)
return frame

Expand Down
Loading