generateSawMatrixIsolate function

Future<List<Map<String, dynamic>>> generateSawMatrixIsolate({
  1. required Map<String, dynamic> data,
})

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:

  1. Parsing input data (alternatives and criteria)
  2. Validating inputs
  3. Normalizing criteria weights to sum to 100%
  4. 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');
  }
}