among the total objectives 'objectives = ['Area', 'PowerDissipation', 'SlewRate', 'Gain', 'Bandwidth3dB', 'GainBWProd', 'UnityGainFreq', 'PhaseMargin']', i ma calculating fitness values for each objectives seperately(individual) with its desired target objectives.
in my fitness calculation for individual objectives, if any of my result objectives are satisfies or with in the desired range then the corresponding fitness values are '0.0', else the fitness values is calculated by the difference between the target and observed values multiply with individual weights. Individual Fitness values for the objectives 'Area',and 'PowerDissipation' are multiplied with the negative weights(weights are negative because the required objectives are as possible as minimum), so if these 'Area',and 'PowerDissipation' objectives are deviates from the target(target to be minimum as possible) then we get negative individual fitness values for the respective objecctives and Individual Fitness values for the objectives 'SlewRate', 'Gain', 'Bandwidth3dB', 'GainBWProd', 'UnityGainFreq',and 'PhaseMargin' are multiplied with the positive weights(weights are positive because the required objectives are as possible as maximum), so if these 'SlewRate', 'Gain', 'Bandwidth3dB', 'GainBWProd', 'UnityGainFreq',and 'PhaseMargin' objectives are deviates from the target(target to be maximum as possible) then we get negative individual fitness values for the respective objectives.

so always for all objectives, if any of the individual objective is not satisfies the requirement then its corresponding individual fitness is always negative value, if any objectives satisfies its result with in the desired target range then it is '0.0' fitnes values for its respective objectives. A fitness value closer to zero is always better, and it is away from zero in negative values is worse.

the objective goal is to implement multi-objective optimization criteria and ensure it to be maintain and synchronized in all aspects.

Calculated Reference Points: {'Area': -0.0021330498635294187, 'PowerDissipation': -3.3712529999999994, 'SlewRate': 0.0, 'Gain': -325.2371999999999, 'Bandwidth3dB': -7.7870913999999996, 'GainBWProd': 0.0, 'UnityGainFreq': 0.0, 'PhaseMargin': -2035.8519999999994}

i am getting all zeros in the hypervolume calculation for all the pareto datas
Hypervolume Values: {0: 0, 1: 0, 2: 0, 3: 0}

def update_reference_points(pareto_data, objectives):
    fitness_extremes = {obj: [] for obj in objectives}
    for data in pareto_data.values():
        for obj, fitness in zip(objectives, data['fitness']):
            fitness_extremes[obj].append(fitness)

    reference_points = {}
    for obj, extremes in fitness_extremes.items():
        worst_case = min(extremes) if extremes else 1  # Use a fallback if no data exists
        offset = abs(worst_case) * 0.7
        reference_points[obj] = worst_case - offset

    return reference_points

def calculate_individual_hypervolumes(pareto_data, reference_points, objectives):
    individual_volumes = {}
    transformed_data = {}

    for key, data in pareto_data.items():
        transformed = [abs(reference_points[obj] - fitness) for obj, fitness in zip(objectives, data['fitness'])]
        transformed_data[key] = transformed

    for key, coords in transformed_data.items():
        base_volume = np.prod(coords)
        intersect_volumes = []
        for other_key, other_coords in transformed_data.items():
            if other_key != key:
                intersection = [max(coords[i], other_coords[i]) for i in range(len(objectives))]
                intersect_volumes.append(np.prod(intersection))
        individual_volumes[key] = base_volume - sum(intersect_volumes)

    return individual_volumes