import numpy as np
from pyswarm import pso
import pandas as pd
def gray_correlation(x, y):
    # Calculate the gray correlation function O, using a simplified calculation method
    abs_diff = np.abs(x - y)
    max_diff = np.max(abs_diff)
    correlation = (max_diff - abs_diff) / max_diff
    return np.mean(correlation)

def func_to_optimize(lags, x0, variables):
    # Calculate the fitness function O
    aligned_variables = [np.roll(var, int(np.round(lag))) for var, lag in zip(variables, lags)]
    o = gray_correlation(x0, aligned_variables[0])
    for var in aligned_variables[1:]:
        o = min(o, gray_correlation(x0, var))
    return -o  # Change to a maximization problem

def optimize_delays(num_vars, x0, variables):
    # Use particle swarm optimization algorithm to find the optimal delay base vector
    lb = np.ones(num_vars) * 50
    ub = np.ones(num_vars) * 80
    lags, _ = pso(func_to_optimize, lb, ub, args=(x0, variables))

    return lags



if __name__ == "__main__":
  # Read data from xlsx file
  df = pd.read_excel('wh176_240150_2023-04-25.xlsx', sheet_name=2)
  col1 = df['BW'].values
  col2 = df['Qualified_Size'].values

  # Perform delay analysis
  x0 = col1  # Assume the reference variable x0 is the data in the first column
  variables = [col2]  # Assume other process variables are from the second column

  optimal_delays = optimize_delays(len(variables), x0, variables)
  print("Optimal delay base vector:", optimal_delays)