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
77 changes: 26 additions & 51 deletions .github/workflows/run-benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,42 +37,19 @@ jobs:
- name: Update environment
run: mamba env update -n model-validation -f environment_benchmarks.yml

- name: generate-config-files
- name: Run Example linear-elastic-plate-with-hole_fenics using Benchmarking package
shell: bash -l {0}
run: |
cd $GITHUB_WORKSPACE/benchmarks/linear-elastic-plate-with-hole/
python generate_config.py

- name: run_linear-elastic-plate-with-hole-benchmarks_snakemake
shell: bash -l {0}
run: |
cd $GITHUB_WORKSPACE/benchmarks/linear-elastic-plate-with-hole/
snakemake --use-conda --force --cores 'all'
snakemake --use-conda --force --cores all \
--reporter metadata4ing \
--report-metadata4ing-paramscript ../common/parameter_extractor.py \
--report-metadata4ing-config metadata4ing.config \
--report-metadata4ing-filename $SNAKEMAKE_RESULT_FILE

- name: run_linear-elastic-plate-with-hole-benchmarks_nextflow
shell: bash -l {0}
run: |
cd $GITHUB_WORKSPACE/benchmarks/linear-elastic-plate-with-hole/
nextflow run main.nf -params-file workflow_config.json -c ../common/nextflow.config -plugins nf-prov@1.4.0
cd $GITHUB_WORKSPACE/examples/linear-elastic-plate-with-hole/fenics/
python run_benchmark.py

- name: Archive Linear Elastic plate with a hole benchmark data for snakemake
uses: actions/upload-artifact@v4
with:
name: snakemake_results_linear-elastic-plate-with-hole
path: |
benchmarks/linear-elastic-plate-with-hole/${{ env.SNAKEMAKE_RESULT_FILE }}.zip
examples/linear-elastic-plate-with-hole/fenics/results/

- name: Archive Linear Elastic plate with a hole benchmark data for nextflow
uses: actions/upload-artifact@v4
with:
name: nextflow_results_linear-elastic-plate-with-hole
path: |
benchmarks/linear-elastic-plate-with-hole/nextflow_results/

process-artifacts:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -129,34 +106,32 @@ jobs:
shell: bash -l {0}
continue-on-error: true
run: |
LOG_FILE=rohub_upload_error.log

# Run Python and capture all stdout+stderr
python benchmarks/common/upload_provenance.py \
--provenance_folderpath "./${SNAKEMAKE_RESULT_FILE}.zip" \
--benchmark_name "linear-elastic-plate-with-hole" \
--username "${{ secrets.ROHUB_USERNAME }}" \
--password "${{ secrets.ROHUB_PASSWORD }}" \
2>&1 | tee "$LOG_FILE"

PYTHON_EXIT_CODE=${PIPESTATUS[0]}

# Check exit code: 0 = failure, 1 = success (per your convention)
if [ $PYTHON_EXIT_CODE -eq 0 ]; then
echo "=== RoHub upload failed — see log below ==="
cat "$LOG_FILE"
LOG_FILE="${GITHUB_WORKSPACE}/rohub_upload_error.log"

# Run Python and capture stdout+stderr
OUTPUT="$(
python benchmarks/common/upload_provenance.py \
--provenance_folderpath "./${SNAKEMAKE_RESULT_FILE}.zip" \
--benchmark_name "linear-elastic-plate-with-hole" \
--username "${{ secrets.ROHUB_USERNAME }}" \
--password "${{ secrets.ROHUB_PASSWORD }}" \
2>&1
)"
PYTHON_EXIT_CODE=$?

# Standard convention: 0 = success, non-zero = failure
if [ "$PYTHON_EXIT_CODE" -eq 0 ]; then
echo "RoHub upload succeeded"
rm -f "$LOG_FILE" || true
else
echo " RoHub upload succeeded"
rm -f "$LOG_FILE"
echo "=== RoHub upload failed — writing log to $LOG_FILE ==="
printf '%s\n' "$OUTPUT" | tee "$LOG_FILE"
fi

# Export exit code for subsequent steps if needed
echo "python_exit_code=$PYTHON_EXIT_CODE" >> $GITHUB_ENV

- name: Upload RoHub error log
if: ${{ env.python_exit_code == '0' }}
if: always()
uses: actions/upload-artifact@v4
with:
name: rohub-upload-error-log
path: rohub_upload_error.log

path: ${{ github.workspace }}/rohub_upload_error.log
if-no-files-found: ignore
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
.snakemake
site
site
examples/linear-elastic-plate-with-hole/fenics/conda_envs
examples/linear-elastic-plate-with-hole/linear-elastic-plate-with-hole
25 changes: 25 additions & 0 deletions benchmarks/common/create_provenance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import semantic_benchmark
import utils

def main():
benchmark_file = "/Users/mahdi/Documents/GitHub/NFDI4IngModelValidationPlatform/examples/linear-elastic-plate-with-hole/benchmark.json"
simulation_result_path = "/Users/mahdi/Documents/GitHub/NFDI4IngModelValidationPlatform/examples/linear-elastic-plate-with-hole/fenics/results"
benchmark_object = semantic_benchmark.BenchmarkLoader(benchmark_file).load()

for step in benchmark_object.processing_steps:
print(f"Processing Step: {step.label}")
for config in step.configurations:
print(f" Configuration: {config.label}")
for part in config.parts:
if isinstance(part, semantic_benchmark.NumericalParameter):
print(f" Numerical Parameter: {part.label} = {part.numerical_value} {part.unit}")
elif isinstance(part, semantic_benchmark.TextParameter):
print(f" Text Parameter: {part.label} = {part.string_value}")

for tool in step.employed_tools:
print(f" Employed Tool: {tool.label}")

utils.create_main_ro(simulation_result_path, benchmark_object)

if __name__ == "__main__":
main()
7 changes: 4 additions & 3 deletions benchmarks/common/provenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ def build_dynamic_query(self, parameters, metrics, tools=None, named_graph=None)
)

# Tool block with optional filter
tool_block = "?method m4i:implementedByTool ?tool .\n?tool a schema:SoftwareApplication ;\n rdfs:label ?tool_name .\n"
tool_predicate = "ssn:implementedBy" if named_graph else "m4i:implementedByTool"
tool_block = f"?method {tool_predicate} ?tool .\n?tool a schema:SoftwareApplication ;\n rdfs:label ?tool_name .\n"
if tools:
filter_cond = " || ".join(
f'CONTAINS(LCASE(?tool_name), "{t.lower()}")' for t in tools
Expand Down Expand Up @@ -152,7 +153,7 @@ def build_dynamic_query(self, parameters, metrics, tools=None, named_graph=None)
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX m4i: <http://w3id.org/nfdi4ing/metadata4ing#>
PREFIX ssn: <http://www.w3.org/ns/ssn/>

SELECT {select_vars} ?tool_name
WHERE {{
{where_block}
Expand Down Expand Up @@ -273,4 +274,4 @@ def validate_provenance(self):
for issue in result.get_issues()
)

print("RO-Crate is valid!")
print("RO-Crate is valid!")
Loading
Loading