STARBORN commited on
Commit
5c2cb87
·
verified ·
1 Parent(s): 7349be4

Create generator.py

Browse files
Files changed (1) hide show
  1. utils/generator.py +166 -0
utils/generator.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Generator utilities for creating JSON and Markdown outputs
3
+ """
4
+
5
+ import json
6
+ from datetime import datetime
7
+
8
+ def generate_json_output(metadata, top_level, processes, generator_version):
9
+ """
10
+ Generate JSON output for the model card
11
+
12
+ Args:
13
+ metadata: Dictionary of metadata fields
14
+ top_level: Dictionary of top-level elements (Figure 6)
15
+ processes: Dictionary of data & process elements (Figure 7)
16
+ generator_version: Version of the generator
17
+
18
+ Returns:
19
+ String containing JSON data ready for file download
20
+ """
21
+ output = {
22
+ "df_model_card_metadata": metadata,
23
+ "df_mc_0_top_level": {
24
+ k: v for k, v in top_level.items()
25
+ if v.get("applicable") and v.get("description")
26
+ },
27
+ "df_mc_1_data_processes": {
28
+ k: v for k, v in processes.items()
29
+ if v.get("applicable") and v.get("description")
30
+ },
31
+ "generated_at": datetime.utcnow().isoformat() + "Z",
32
+ "generator_version": generator_version,
33
+ "schema_version": "1.0"
34
+ }
35
+
36
+ return json.dumps(output, indent=2)
37
+
38
+
39
+ def generate_markdown_output(metadata, top_level, processes, generator_version):
40
+ """
41
+ Generate Markdown README output for the model card
42
+
43
+ Args:
44
+ metadata: Dictionary of metadata fields
45
+ top_level: Dictionary of top-level elements (Figure 6)
46
+ processes: Dictionary of data & process elements (Figure 7)
47
+ generator_version: Version of the generator
48
+
49
+ Returns:
50
+ String containing Markdown content ready for file download
51
+ """
52
+
53
+ md = []
54
+
55
+ # Header
56
+ md.append("# Digital Forensics Model Card\n")
57
+ md.append(f"**Generated:** {datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')} UTC\n")
58
+ md.append("---\n")
59
+
60
+ # Metadata Section
61
+ md.append("## Metadata\n")
62
+ md.append(f"- **Identifier (MMCID):** {metadata.get('mmcid', 'Not specified')}")
63
+ md.append(f"- **Version (MCV):** {metadata.get('version', 'N/A')}")
64
+ md.append(f"- **Owner:** {metadata.get('owner', 'Not specified')}")
65
+ md.append(f"- **Usage Context:** {metadata.get('use_context', 'Not specified')}")
66
+ md.append(f"- **Layer/Stage (Ln):** {metadata.get('layer_n', 'N/A')}\n")
67
+
68
+ # Case Statement
69
+ if metadata.get('case_statement'):
70
+ md.append("### Case Statement")
71
+ md.append(f"{metadata['case_statement']}\n")
72
+
73
+ # Hypothesis
74
+ if metadata.get('hypothesis'):
75
+ md.append("### Hypothesis")
76
+ md.append(f"{metadata['hypothesis']}\n")
77
+
78
+ # Classification
79
+ if metadata.get('classification'):
80
+ md.append("### Classification")
81
+ for item in metadata['classification']:
82
+ md.append(f"- {item}")
83
+ md.append("")
84
+
85
+ # Reasoning Type
86
+ if metadata.get('reasoning_type'):
87
+ md.append("### Type of Reasoning")
88
+ for item in metadata['reasoning_type']:
89
+ md.append(f"- {item}")
90
+ md.append("")
91
+
92
+ # Bias
93
+ if metadata.get('bias'):
94
+ md.append("### Identified Bias")
95
+ for item in metadata['bias']:
96
+ md.append(f"- {item}")
97
+ md.append("")
98
+
99
+ if metadata.get('cause_of_bias'):
100
+ md.append("**Cause(s) of Bias:**")
101
+ for item in metadata['cause_of_bias']:
102
+ md.append(f"- {item}")
103
+ md.append("")
104
+
105
+ # Error
106
+ if metadata.get('error'):
107
+ md.append("### Error")
108
+ md.append(f"{metadata['error']}\n")
109
+
110
+ if metadata.get('cause_of_error'):
111
+ md.append("**Cause(s) of Error:**")
112
+ for item in metadata['cause_of_error']:
113
+ md.append(f"- {item}")
114
+ md.append("")
115
+
116
+ md.append("---\n")
117
+
118
+ # Top Level Elements (Figure 6)
119
+ md.append("## Top Level Elements (DF MC 0)\n")
120
+ md.append("*Based on Figure 6 - Top Level Elements*\n")
121
+
122
+ applicable_top_level = {
123
+ k: v for k, v in top_level.items()
124
+ if v.get("applicable") and v.get("description")
125
+ }
126
+
127
+ if applicable_top_level:
128
+ for key, value in applicable_top_level.items():
129
+ title = key.replace("_", " ").title()
130
+ md.append(f"### {title}")
131
+ md.append(f"{value['description']}\n")
132
+ else:
133
+ md.append("*No top-level elements specified.*\n")
134
+
135
+ md.append("---\n")
136
+
137
+ # Data & Processes (Figure 7)
138
+ md.append("## Data Types and Analytical Processes (DF MC 1)\n")
139
+ md.append("*Based on Figure 7 - DF Data types and analytical processes (Hargreaves et al., 2024)*\n")
140
+
141
+ applicable_processes = {
142
+ k: v for k, v in processes.items()
143
+ if v.get("applicable") and v.get("description")
144
+ }
145
+
146
+ if applicable_processes:
147
+ for key, value in applicable_processes.items():
148
+ title = key.replace("_", " ").title()
149
+ md.append(f"### {title}")
150
+ md.append(f"{value['description']}\n")
151
+ else:
152
+ md.append("*No data processes specified.*\n")
153
+
154
+ md.append("---\n")
155
+
156
+ # References
157
+ md.append("## References\n")
158
+ md.append("This model card is based on the following works:\n")
159
+ md.append("1. **Di Maio, P.** (2024). Towards Open Standards for Systemic Complexity in Digital Forensics. https://papers.cool/arxiv/2512.12970")
160
+ md.append("2. **Hargreaves, C., Nelson, A., & Casey, E.** (2024). An abstract model for digital forensic analysis tools—A foundation for systematic error mitigation analysis. *Forensic Science International: Digital Investigation*, 48.\n")
161
+
162
+ # Footer
163
+ md.append("---\n")
164
+ md.append(f"*Generated by [Digital Forensics Model Card Generator](https://huggingface.co/spaces/forensic-model-card-generator) v{generator_version}*")
165
+
166
+ return "\n".join(md)