<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 This is a simple Jupyter Notebook example presenting how to use the LPVisu class.
First, import LPVisu class and necessary Python packages
Step1:  Define the problem
Step2:  Define the bounds for the two variables x1 and x2, the GUI bounds and create the visualization object (add a "fake" pivot at (1, 2) and draw objective function for value 40)
Step4:  Define a simple callback function to be called at each step of the linprog simplexe algorithm. This callback function must use a OptimizeResult object as parameter
Step5:  Solve the problem using the callback function and print the result
<ASSISTANT_TASK:>
Python Code:
from lp_visu import LPVisu
from scipy.optimize import linprog
import numpy as np
Explanation: This is a simple Jupyter Notebook example presenting how to use the LPVisu class.
First, import LPVisu class and necessary Python packages:
End of explanation
A = [[1.0, 0.0], [1.0, 2.0], [2.0, 1.0]]
b = [8.0, 15.0, 18.0]
c = [4.0, 3.0]
Explanation: Define the problem:
End of explanation
x1_bounds = (0, None)
x2_bounds = (0, None)
x1_gui_bounds = (-1, 16)
x2_gui_bounds = (-1, 10)
visu = LPVisu(A, b, c,
              x1_bounds, x2_bounds,
              x1_gui_bounds, x2_gui_bounds,
              scale = 0.8, pivot_scale = 2.0,
              xk = (1, 1), obj = 40)
Explanation: Define the bounds for the two variables x1 and x2, the GUI bounds and create the visualization object (add a "fake" pivot at (1, 2) and draw objective function for value 40):
End of explanation
def lp_simple_callback(optimizeResult):
    A simple callback function to see what is happening to print each
    step of the algorithm and to use the visualization.
    
    print("current iteration: " + str(optimizeResult["nit"]))
    print("current slack: " + str(optimizeResult["slack"]))
    print("current solution: " + str(optimizeResult["x"]))
    print()
    LPVisu(A, b, c,
           x1_bounds, x2_bounds,
           x1_gui_bounds, x2_gui_bounds,
           scale = 0.8, pivot_scale = 2.0,
           xk = optimizeResult["x"])
Explanation: Define a simple callback function to be called at each step of the linprog simplexe algorithm. This callback function must use a OptimizeResult object as parameter:
End of explanation
res = linprog(-1.0 * np.array(c), A_ub=A, b_ub=b,
              bounds=(x1_bounds, x2_bounds),
              callback=lp_simple_callback,
              options={"disp": True})
print(res)
Explanation: Solve the problem using the callback function and print the result:
End of explanation
<END_TASK>