a1c00l commited on
Commit
35fb2a2
Β·
verified Β·
1 Parent(s): 9fb195a

Update src/aibom_generator/utils.py

Browse files
Files changed (1) hide show
  1. src/aibom_generator/utils.py +39 -16
src/aibom_generator/utils.py CHANGED
@@ -98,25 +98,36 @@ def validate_spdx(license_entry):
98
 
99
  def calculate_completeness_score(aibom: Dict[str, Any]) -> Dict[str, Any]:
100
  field_checklist = {}
 
 
 
 
 
 
 
101
 
 
102
  required_fields = ["bomFormat", "specVersion", "serialNumber", "version"]
103
  required_score = sum([5 if aibom.get(field) else 0 for field in required_fields])
104
  for field in required_fields:
105
  field_checklist[field] = "βœ”" if aibom.get(field) else "✘"
106
 
 
107
  metadata = aibom.get("metadata", {})
108
  metadata_fields = ["timestamp", "tools", "authors", "component"]
109
  metadata_score = sum([5 if metadata.get(field) else 0 for field in metadata_fields])
110
  for field in metadata_fields:
111
  field_checklist[f"metadata.{field}"] = "βœ”" if metadata.get(field) else "✘"
112
 
 
113
  components = aibom.get("components", [])
114
- component_scores = []
115
- model_card_scores = []
116
-
117
- for comp in components:
 
118
  comp_fields = ["type", "name", "bom-ref", "purl", "description", "licenses"]
119
- comp_score = sum([
120
  2 if comp.get("type") else 0,
121
  4 if comp.get("name") else 0,
122
  2 if comp.get("bom-ref") else 0,
@@ -124,24 +135,34 @@ def calculate_completeness_score(aibom: Dict[str, Any]) -> Dict[str, Any]:
124
  4 if comp.get("description") and len(comp["description"]) > 20 else 0,
125
  4 if comp.get("licenses") and validate_spdx(comp["licenses"]) else 0
126
  ])
127
- component_scores.append(comp_score)
128
  for field in comp_fields:
129
  field_checklist[f"component.{field}"] = "βœ”" if comp.get(field) else "✘"
130
-
 
 
 
 
 
 
 
 
 
 
 
 
131
  card = comp.get("modelCard", {})
132
  card_fields = ["modelParameters", "quantitativeAnalysis", "considerations"]
133
- card_score = sum([
134
  10 if card.get("modelParameters") else 0,
135
  10 if card.get("quantitativeAnalysis") else 0,
136
  10 if card.get("considerations") and len(card["considerations"]) > 50 else 0
137
  ])
138
- model_card_scores.append(card_score)
139
  for field in card_fields:
140
  field_checklist[f"modelCard.{field}"] = "βœ”" if field in card else "✘"
 
 
141
 
142
- avg_comp_score = (sum(component_scores) / len(component_scores)) if component_scores else 0
143
- avg_model_card_score = (sum(model_card_scores) / len(model_card_scores)) if model_card_scores else 0
144
-
145
  ext_refs = aibom.get("externalReferences", [])
146
  ext_score = 0
147
  for ref in ext_refs:
@@ -155,11 +176,12 @@ def calculate_completeness_score(aibom: Dict[str, Any]) -> Dict[str, Any]:
155
  ext_score = min(ext_score, 10)
156
  field_checklist["externalReferences"] = "βœ”" if ext_refs else "✘"
157
 
 
158
  total_score = (
159
  (required_score * 0.20) +
160
  (metadata_score * 0.20) +
161
- (avg_comp_score * 0.20) +
162
- (avg_model_card_score * 0.30) +
163
  (ext_score * 0.10)
164
  )
165
 
@@ -168,10 +190,11 @@ def calculate_completeness_score(aibom: Dict[str, Any]) -> Dict[str, Any]:
168
  "section_scores": {
169
  "required_fields": required_score,
170
  "metadata": metadata_score,
171
- "component_basic": avg_comp_score,
172
- "component_model_card": avg_model_card_score,
173
  "external_references": ext_score
174
  },
 
175
  "field_checklist": field_checklist
176
  }
177
 
 
98
 
99
  def calculate_completeness_score(aibom: Dict[str, Any]) -> Dict[str, Any]:
100
  field_checklist = {}
101
+ max_scores = {
102
+ "required_fields": 20,
103
+ "metadata": 20,
104
+ "component_basic": 20,
105
+ "component_model_card": 30,
106
+ "external_references": 10
107
+ }
108
 
109
+ # Required Fields (20 points max)
110
  required_fields = ["bomFormat", "specVersion", "serialNumber", "version"]
111
  required_score = sum([5 if aibom.get(field) else 0 for field in required_fields])
112
  for field in required_fields:
113
  field_checklist[field] = "βœ”" if aibom.get(field) else "✘"
114
 
115
+ # Metadata (20 points max)
116
  metadata = aibom.get("metadata", {})
117
  metadata_fields = ["timestamp", "tools", "authors", "component"]
118
  metadata_score = sum([5 if metadata.get(field) else 0 for field in metadata_fields])
119
  for field in metadata_fields:
120
  field_checklist[f"metadata.{field}"] = "βœ”" if metadata.get(field) else "✘"
121
 
122
+ # Component Basic Info (20 points max)
123
  components = aibom.get("components", [])
124
+ component_score = 0
125
+
126
+ if components:
127
+ # Use the first component as specified in the design
128
+ comp = components[0]
129
  comp_fields = ["type", "name", "bom-ref", "purl", "description", "licenses"]
130
+ component_score = sum([
131
  2 if comp.get("type") else 0,
132
  4 if comp.get("name") else 0,
133
  2 if comp.get("bom-ref") else 0,
 
135
  4 if comp.get("description") and len(comp["description"]) > 20 else 0,
136
  4 if comp.get("licenses") and validate_spdx(comp["licenses"]) else 0
137
  ])
 
138
  for field in comp_fields:
139
  field_checklist[f"component.{field}"] = "βœ”" if comp.get(field) else "✘"
140
+ if field == "purl" and comp.get(field) and not re.match(r'^pkg:huggingface/.+', comp["purl"]):
141
+ field_checklist[f"component.{field}"] = "✘"
142
+ if field == "description" and comp.get(field) and len(comp["description"]) <= 20:
143
+ field_checklist[f"component.{field}"] = "✘"
144
+ if field == "licenses" and comp.get(field) and not validate_spdx(comp["licenses"]):
145
+ field_checklist[f"component.{field}"] = "✘"
146
+
147
+ # Model Card Section (30 points max)
148
+ model_card_score = 0
149
+
150
+ if components:
151
+ # Use the first component's model card as specified in the design
152
+ comp = components[0]
153
  card = comp.get("modelCard", {})
154
  card_fields = ["modelParameters", "quantitativeAnalysis", "considerations"]
155
+ model_card_score = sum([
156
  10 if card.get("modelParameters") else 0,
157
  10 if card.get("quantitativeAnalysis") else 0,
158
  10 if card.get("considerations") and len(card["considerations"]) > 50 else 0
159
  ])
 
160
  for field in card_fields:
161
  field_checklist[f"modelCard.{field}"] = "βœ”" if field in card else "✘"
162
+ if field == "considerations" and field in card and len(card["considerations"]) <= 50:
163
+ field_checklist[f"modelCard.{field}"] = "✘"
164
 
165
+ # External References (10 points max)
 
 
166
  ext_refs = aibom.get("externalReferences", [])
167
  ext_score = 0
168
  for ref in ext_refs:
 
176
  ext_score = min(ext_score, 10)
177
  field_checklist["externalReferences"] = "βœ”" if ext_refs else "✘"
178
 
179
+ # Calculate total score
180
  total_score = (
181
  (required_score * 0.20) +
182
  (metadata_score * 0.20) +
183
+ (component_score * 0.20) +
184
+ (model_card_score * 0.30) +
185
  (ext_score * 0.10)
186
  )
187
 
 
190
  "section_scores": {
191
  "required_fields": required_score,
192
  "metadata": metadata_score,
193
+ "component_basic": component_score,
194
+ "component_model_card": model_card_score,
195
  "external_references": ext_score
196
  },
197
+ "max_scores": max_scores,
198
  "field_checklist": field_checklist
199
  }
200