import numpy as np

def print_tableau(tableau, basic_vars, non_basic_vars, step):
    print(f"\n=== Tableau at Iteration {step} ===")
    rows, cols = tableau.shape
    header = ["BV"] + [f"x{j+1}" for j in non_basic_vars] + [f"s{j+1}" for j in basic_vars] + ["RHS"]
    print(" | ".join(f"{h:^8}" for h in header))
    print("-" * (12 * len(header)))

    for i, bv in enumerate(basic_vars):
        row_values = [f"s{bv+1}"] + [f"{tableau[i,j]:8.3f}" for j in range(cols)]
        print(" | ".join(row_values))
    print("-" * (12 * len(header)))
    print(" Z | " + " | ".join(f"{tableau[-1,j]:8.3f}" for j in range(cols)))

def newton(f,H,grad,x0,tol):
    x=x0
    print(x)
    step = 0
    while np.linalg.norm(grad(x)) < tol:
        x -= np.inv(H(x)) @ grad(x)
        step += 1
        print(x,step)

