Guest User

Untitled

a guest
Jul 9th, 2024
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1.  
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from sympy import symbols, expand
  5. import time
  6. from tqdm import tqdm
  7. from mpl_toolkits.mplot3d import Axes3D
  8.  
  9. # Function to generate a random 3SAT formula
  10. def generate_3sat_formula(n, m):
  11. np.random.seed(0)
  12. variables = symbols(f'x1:{n+1}')
  13. clauses = []
  14. for _ in range(m):
  15. clause = []
  16. for _ in range(3):
  17. var = np.random.choice(variables)
  18. if np.random.rand() > 0.5:
  19. clause.append(var)
  20. else:
  21. clause.append(1 - var)
  22. clauses.append(clause)
  23. return variables, clauses
  24.  
  25. # Function to convert a clause to polynomial
  26. def clause_to_polynomial(clause):
  27. x_j, x_k, x_l = clause
  28. polynomial = expand(x_j + (1 - x_k) + x_l - 2*x_j*(1 - x_k) - 2*x_j*x_l - 2*(1 - x_k)*x_l + 4*x_j*(1 - x_k)*x_l)
  29. return polynomial
  30.  
  31. # Controlled simplification of polynomials
  32. def efficient_simplify(polynomials):
  33. simplified_polynomials = []
  34. for poly in tqdm(polynomials, desc='Simplification'):
  35. simplified_polynomials.append(expand(poly))
  36. return simplified_polynomials
  37.  
  38. # Measure time for each step with large input
  39. def measure_large_input_time(n, m):
  40. variables, clauses = generate_3sat_formula(n, m)
  41.  
  42. # Measure time for Input Transformation
  43. start_time = time.time()
  44. polynomials = [clause_to_polynomial(clause) for clause in tqdm(clauses, desc='Input Transformation')]
  45. transformation_time = time.time() - start_time
  46.  
  47. # Measure time for Simplification
  48. start_time = time.time()
  49. simplified_polynomials = efficient_simplify(polynomials)
  50. simplification_time = time.time() - start_time
  51.  
  52. return transformation_time, simplification_time
  53.  
  54. # Set input sizes for testing
  55. n = 500 # initial number of variables
  56. m = 1000 # initial number of clauses
  57.  
  58. # Prepare lists to store results
  59. variables_list = []
  60. clauses_list = []
  61. transformation_times = []
  62. simplification_times = []
  63.  
  64. # Measure times for increasing sizes
  65. for i in range(1, 6):
  66. current_n = n * i
  67. current_m = m * i
  68. transformation_time, simplification_time = measure_large_input_time(current_n, current_m)
  69. variables_list.append(current_n)
  70. clauses_list.append(current_m)
  71. transformation_times.append(transformation_time)
  72. simplification_times.append(simplification_time)
  73.  
  74. # Plot the results
  75. fig = plt.figure(figsize=(14, 8))
  76.  
  77. # Input Transformation times 3D plot
  78. ax = fig.add_subplot(121, projection='3d')
  79. ax.scatter(variables_list, clauses_list, transformation_times, c='blue', marker='o')
  80. ax.set_xlabel('Number of Variables')
  81. ax.set_ylabel('Number of Clauses')
  82. ax.set_zlabel('Transformation Time (seconds)')
  83. ax.set_title('3D Plot of Input Transformation Time')
  84.  
  85. # Simplification times 3D plot
  86. ax = fig.add_subplot(122, projection='3d')
  87. ax.scatter(variables_list, clauses_list, simplification_times, c='orange', marker='o')
  88. ax.set_xlabel('Number of Variables')
  89. ax.set_ylabel('Number of Clauses')
  90. ax.set_zlabel('Simplification Time (seconds)')
  91. ax.set_title('3D Plot of Simplification Time')
  92.  
  93. plt.tight_layout()
  94. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment