Non-dominated sets: [[0, 1, 2, 3, 5]]
Domination Count: [0, 0, 0, 0, 1, 0]

for result of the non dominated sets, i am getting the following pareto data

    pareto_data = {}
    for front_index, front in enumerate(non_dominated_sets):
        if len(front) > 0:
            crowding_distances = calculate_crowding_distance(front, fitness_values, objectives)
            for i, chromosome_index in enumerate(front):
                pareto_data[chromosome_index] = {
                    "front": front_index + 1,
                    "chromosome": population[chromosome_index],
                    "fitness": [fitness_values[chromosome_index][obj] for obj in objectives],
                    "crowding_distance": crowding_distances[i]
                }
    print("Pareto Data:", pareto_data)

Pareto Data: {0: {'front': 1, 'chromosome': [6.306869319220387e-07, 5.626149743589479e-07, 7.070227725844737e-07, 1.9357957196314205e-07, 2.354967035296312e-07, 6.09425488179405e-06, 1.889215803085565e-05, 1.029863621722769e-05, 8.478769078544245e-05, 5.1493184577498213e-05, 2.5288284023510757e-05, 7.695788207596848e-13, 0.88695261998021], 'fitness': [-0.0007204753661624855, -4.440029999999999, 0.0, -144.21799999999996, 0.0, 0.0, 0.0, 0.0], 'crowding_distance': inf}, 
1: {'front': 1, 'chromosome': [7.980062208910228e-07, 6.732922513085252e-07, 9.181044599216841e-07, 7.680002117088156e-07, 1e-06, 1.0942771280543669e-05, 2.1100355174884252e-05, 8.582513729761544e-06, 7.787503231085147e-05, 1.60444427370401e-05, 2.2341727852492617e-05, 1.8242066348472144e-12, 1.139027346958045], 'fitness': [-0.0013748998269340878, -1.21786, 0.0, -73.32500000000003, -3.5396400000000003, 0.0, 0.0, -347.4000000000001], 'crowding_distance': 1.9412068692246724}, 
2: {'front': 1, 'chromosome': [4.2013232075046594e-07, 9.39110905198672e-07, 9.875187761082049e-07, 6.069080849675974e-07, 6.083597740401327e-07, 1.0722869451562882e-05, 1.0814524099059199e-05, 5.80213395542915e-06, 7.333342609727918e-05, 3.0081830930659466e-05, 2.3621131529676497e-05, 2.2766798941949073e-12, 0.9630967750171557], 'fitness': [-0.0010358878059696394, -2.92616, 0.0, -143.77000000000004, -1.1127200000000002, 0.0, 0.0, 0.0], 'crowding_distance': 3.1897786269345465}, 
3: {'front': 1, 'chromosome': [6.927609911840556e-07, 3.1528387779087777e-07, 5.570171700308809e-07, 3.725608777727349e-07, 1e-06, 4.398285490762511e-06, 1.9785065566571403e-05, 1.641916893202002e-05, 5.815502679764812e-05, 1.428691464393975e-05, 1.8232345945570182e-05, 2.080300384008238e-12, 0.9183203224408144], 'fitness': [-0.0007281446612064695, -0.7865399999999999, 0.0, -41.861999999999995, -4.950558000000001, 0.0, 0.0, -28.41300000000001], 'crowding_distance': 0.90859729823078}, 
5: {'front': 1, 'chromosome': [7.933988966285557e-07, 4.25448969255917e-07, 5.011628209389388e-07, 2.289880245416221e-07, 1e-06, 8.142958400427016e-06, 2.4101578726595616e-05, 7.87862060042575e-06, 3.601042246693565e-05, 1.5570750665321832e-05, 1.9630562300182518e-05, 1.1254257562830222e-12, 1.0785143907928738], 'fitness': [-0.0006514286169309162, -1.14086, 0.0, -29.33499999999995, -3.91222, 0.0, 0.0, -31.16700000000003], 'crowding_distance': inf}}

here for the value of "front", i am getting '1' for all the [[0, 1, 2, 3, 5]] in the pareto_data, if it is always '1' for all the pareto fronts for the non-dominated solutions, then how the pareto sort can be implement further with the front data. here the chromosome individual '4' has dominated by other individual (Domination Count: [0, 0, 0, 0, 1, 0]).

def pareto_sort(population, fitness_values, objectives):
    non_dominated_sets = []
    domination_counts = [0 for _ in population]
    dominated_by = [[] for _ in population]
    
    # Compare each pair of individuals
    for i in range(len(population)):
        for j in range(len(population)):
            if i != j:
                if dominates(fitness_values[i], fitness_values[j], objectives):
                    dominated_by[j].append(i)
                elif dominates(fitness_values[j], fitness_values[i], objectives):
                    domination_counts[i] += 1
    
    # Identify non-dominated individuals (first front)
    current_set = [i for i, count in enumerate(domination_counts) if count == 0]
    non_dominated_sets.append(current_set)
    
    # Iteratively find subsequent fronts
    front_index = 0
    while front_index < len(non_dominated_sets):
        next_front = []
        for i in non_dominated_sets[front_index]:
            for j in dominated_by[i]:
                domination_counts[j] -= 1
                if domination_counts[j] == 0:
                    next_front.append(j)
        if next_front:  # Only append if not empty
            non_dominated_sets.append(next_front)
        front_index += 1
    
    print(f"Non-dominated sets: {non_dominated_sets}")
    print(f"Domination Count: {domination_counts}")
    pareto_data = {}
    # Calculate crowding distance and prepare pareto data for each front
    for front_index, front in enumerate(non_dominated_sets):
        if len(front) > 0:
            crowding_distances = calculate_crowding_distance(front, fitness_values, objectives)
            for i, chromosome_index in enumerate(front):
                pareto_data[chromosome_index] = {
                    "front": front_index + 1,
                    "chromosome": population[chromosome_index],
                    "fitness": [fitness_values[chromosome_index][obj] for obj in objectives],
                    "crowding_distance": crowding_distances[i]
                }
    print("Pareto Data:", pareto_data)

# Determine dominance relationship
def dominates(individual_a, individual_b, objectives):
    better_in_any = False
    for obj in objectives:
        if obj in ['Area', 'PowerDissipation']:  # Minimization
            if individual_a[obj] < individual_b[obj]:
                better_in_any = True
            elif individual_a[obj] > individual_b[obj]:
                return False
        else:  # Maximization
            if individual_a[obj] > individual_b[obj]:
                better_in_any = True
            elif individual_a[obj] < individual_b[obj]:
                return False
    return better_in_any