generateSawMatrixIsolate function
Generates SAW (Simple Additive Weighting) decision matrix in an isolate.
This function creates an initial decision matrix structure where each alternative is evaluated against all criteria. The matrix is generated in a separate isolate to prevent UI blocking when dealing with large datasets.
The process includes:
- Parsing input data (alternatives and criteria)
- Validating inputs
- Normalizing criteria weights to sum to 100%
- Creating matrix structure with empty ratings (value = 0)
data Map containing required keys:
- 'list_criteria':
List<Map<String, dynamic>>representing criteria - 'list_alternative':
List<Map<String, dynamic>>representing alternatives
Returns List<Map<String, dynamic>> representing the generated matrix in JSON format
Throws Exception if:
- Required keys are missing
- Criteria or alternative data is null
- Validation fails
- An error occurs during matrix generation
Implementation
Future<List<Map<String, dynamic>>> generateSawMatrixIsolate({
required Map<String, dynamic> data,
}) async {
try {
// Validate required keys exist in input data
if (!data.containsKey('list_criteria') ||
!data.containsKey('list_alternative')) {
throw Exception(
'Missing required keys: list_criteria or list_alternative');
}
final rawCriteria = data['list_criteria'];
final rawAlternative = data['list_alternative'];
// Validate data is not null
if (rawCriteria == null || rawAlternative == null) {
throw Exception('Criteria or alternative data is null');
}
// Extract lists from raw data
final listCriteria = List<Map<String, dynamic>>.from(rawCriteria);
final listAlternative = List<Map<String, dynamic>>.from(rawAlternative);
// Parse JSON data into DTO objects
final criteriaParsed =
listCriteria.map((e) => SawCriteriaDto.fromJson(e)).toList();
final alternativeParsed =
listAlternative.map((e) => SawAlternativeDto.fromJson(e)).toList();
// Validate parsed inputs
_validateInputsIsolate(alternativeParsed, criteriaParsed);
// Normalize criteria weights to ensure they sum to 100%
final normalizedCriteria = _normalizeCriteriaWeightsIsolate(criteriaParsed);
// Generate the decision matrix structure
final result = _generateMatrixDataIsolate(
alternativeParsed,
normalizedCriteria,
);
// Convert result to JSON format for returning to main isolate
return result.map((e) => e.toJson()).toList();
} catch (e, stackTrace) {
throw Exception(
'Failed to generate SAW matrix in isolate: $e\n$stackTrace');
}
}