| import datetime |
| import json |
| import tempfile |
| import uuid |
| from assets.utils.validation import validate_boamps_schema |
| from src.services.report_builder import ReportBuilder |
| import os |
|
|
|
|
| def process_component_list(fields_dict): |
| """ |
| Fonction générique pour traiter une liste de composants à partir d'un dictionnaire de champs. |
| |
| Args: |
| fields_dict (dict): Dictionnaire où les clés sont les noms des champs |
| et les valeurs sont des listes de composants Gradio ou des objets gr.State. |
| |
| Returns: |
| list: Liste de dictionnaires représentant les composants. |
| """ |
| component_list = [] |
|
|
| |
| processed_fields = {} |
| for field_name, field_values in fields_dict.items(): |
| if hasattr(field_values, 'value'): |
| processed_fields[field_name] = field_values.value if field_values.value else [ |
| ] |
| elif isinstance(field_values, list) and len(field_values) > 0: |
| |
| values = [] |
| for item in field_values: |
| if hasattr(item, '__class__') and 'gradio' in str(item.__class__): |
| |
| |
| values.append(item if item is not None else "") |
| else: |
| |
| values.append(item if item is not None else "") |
| processed_fields[field_name] = values |
| else: |
| processed_fields[field_name] = field_values if field_values else [] |
|
|
| |
| max_items = 0 |
| for field_values in processed_fields.values(): |
| if field_values: |
| max_items = max(max_items, len(field_values)) |
|
|
| |
| for i in range(max_items): |
| component = {} |
|
|
| for field_name, field_values in processed_fields.items(): |
| if i < len(field_values): |
| value = field_values[i] |
| |
| if value is not None and str(value).strip() != "": |
| component[field_name] = value |
|
|
| |
| if component: |
| component_list.append(component) |
|
|
| return component_list |
|
|
|
|
| def generate_json( |
| |
| licensing, formatVersion, formatVersionSpecificationUri, reportId, |
| reportDatetime, reportStatus, publisher_name, publisher_division, |
| publisher_projectName, publisher_confidentialityLevel, publisher_publicKey, |
| |
| taskFamily, taskStage, nbRequest, |
| trainingType, algorithmType, algorithmName, algorithmUri, foundationModelName, foundationModelUri, parametersNumber, framework, frameworkVersion, classPath, layersNumber, epochsNumber, optimizer, quantization, |
| dataUsage, dataType, dataFormat, dataSize, dataQuantity, shape, source, sourceUri, owner, |
| measuredAccuracy, estimatedAccuracy, taskDescription, |
| |
| measurementMethod, manufacturer, version, cpuTrackingMode, gpuTrackingMode, |
| averageUtilizationCpu, averageUtilizationGpu, powerCalibrationMeasurement, |
| durationCalibrationMeasurement, powerConsumption, |
| measurementDuration, measurementDateTime, |
| |
| osystem, distribution, distributionVersion, |
| |
| language, version_software, |
| |
| infraType, cloudProvider, cloudInstance, cloudService, componentName, componentType, |
| nbComponent, memorySize, manufacturer_infra, family, |
| series, share, |
| |
| country, latitude, longitude, location, |
| powerSupplierType, powerSource, powerSourceCarbonIntensity, |
| |
| quality |
| ): |
| """Generate JSON data from form inputs using optimized ReportBuilder.""" |
|
|
| try: |
| |
| builder = ReportBuilder() |
|
|
| |
| if not reportId: |
| reportId = str(uuid.uuid4()) |
| if not reportDatetime: |
| reportDatetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
|
| |
| header_data = { |
| "licensing": licensing, |
| "formatVersion": formatVersion, |
| "formatVersionSpecificationUri": formatVersionSpecificationUri, |
| "reportId": reportId, |
| "reportDatetime": reportDatetime, |
| "reportStatus": reportStatus, |
| "publisher_name": publisher_name, |
| "publisher_division": publisher_division, |
| "publisher_projectName": publisher_projectName, |
| "publisher_confidentialityLevel": publisher_confidentialityLevel, |
| "publisher_publicKey": publisher_publicKey |
| } |
| builder.add_header(header_data) |
|
|
| |
| task_data = { |
| "taskStage": taskStage, |
| "taskFamily": taskFamily, |
| "nbRequest": nbRequest, |
| "measuredAccuracy": measuredAccuracy, |
| "estimatedAccuracy": estimatedAccuracy, |
| "taskDescription": taskDescription, |
| "algorithms": { |
| "trainingType": trainingType, |
| "algorithmType": algorithmType, |
| "algorithmName": algorithmName, |
| "algorithmUri": algorithmUri, |
| "foundationModelName": foundationModelName, |
| "foundationModelUri": foundationModelUri, |
| "parametersNumber": parametersNumber, |
| "framework": framework, |
| "frameworkVersion": frameworkVersion, |
| "classPath": classPath, |
| "layersNumber": layersNumber, |
| "epochsNumber": epochsNumber, |
| "optimizer": optimizer, |
| "quantization": quantization |
| }, |
| "dataset": { |
| "dataUsage": dataUsage, |
| "dataType": dataType, |
| "dataFormat": dataFormat, |
| "dataSize": dataSize, |
| "dataQuantity": dataQuantity, |
| "shape": shape, |
| "source": source, |
| "sourceUri": sourceUri, |
| "owner": owner |
| } |
| } |
| builder.add_task(task_data) |
|
|
| |
| measures_data = { |
| "measurementMethod": measurementMethod, |
| "manufacturer": manufacturer, |
| "version": version, |
| "cpuTrackingMode": cpuTrackingMode, |
| "gpuTrackingMode": gpuTrackingMode, |
| "averageUtilizationCpu": averageUtilizationCpu, |
| "averageUtilizationGpu": averageUtilizationGpu, |
| "powerCalibrationMeasurement": powerCalibrationMeasurement, |
| "durationCalibrationMeasurement": durationCalibrationMeasurement, |
| "powerConsumption": powerConsumption, |
| "measurementDuration": measurementDuration, |
| "measurementDateTime": measurementDateTime |
| } |
| builder.add_measures(measures_data) |
|
|
| |
| system_data = { |
| "osystem": osystem, |
| "distribution": distribution, |
| "distributionVersion": distributionVersion |
| } |
| builder.add_system(system_data) |
|
|
| |
| software_data = { |
| "language": language, |
| "version_software": version_software |
| } |
| builder.add_software(software_data) |
|
|
| |
| infrastructure_data = { |
| "infraType": infraType, |
| "cloudProvider": cloudProvider, |
| "cloudInstance": cloudInstance, |
| "cloudService": cloudService, |
| "components": { |
| "componentName": componentName, |
| "componentType": componentType, |
| "nbComponent": nbComponent, |
| "memorySize": memorySize, |
| "manufacturer": manufacturer_infra, |
| "family": family, |
| "series": series, |
| "share": share |
| } |
| } |
| builder.add_infrastructure(infrastructure_data) |
|
|
| |
| environment_data = { |
| "country": country, |
| "latitude": latitude, |
| "longitude": longitude, |
| "location": location, |
| "powerSupplierType": powerSupplierType, |
| "powerSource": powerSource, |
| "powerSourceCarbonIntensity": powerSourceCarbonIntensity |
| } |
| builder.add_environment(environment_data) |
|
|
| |
| builder.add_quality(quality) |
|
|
| |
| report = builder.build() |
|
|
| |
| is_valid, message = validate_boamps_schema(report) |
| if not is_valid: |
| return message, None, "" |
|
|
| |
| filename = f"report_{taskStage}_{taskFamily}_{infraType}_{reportId}.json" |
| filename = filename.replace(" ", "-") |
|
|
| |
| json_str = json.dumps(report, indent=4, ensure_ascii=False) |
|
|
| |
| temp_dir = tempfile.gettempdir() |
| temp_path = os.path.join(temp_dir, filename) |
| with open(temp_path, "w", encoding="utf-8") as tmp: |
| tmp.write(json_str) |
|
|
| return message, temp_path, json_str |
|
|
| except Exception as e: |
| return f"Error generating JSON: {str(e)}", None, "" |
|
|