From d0c0619f268459e3fc91ebf34574c73869d4a5a9 Mon Sep 17 00:00:00 2001
From: Erik Strand <erik.strand@cba.mit.edu>
Date: Wed, 15 Apr 2020 23:03:14 -0400
Subject: [PATCH] Generalize plotting infrastructure

Now each optimizer has 2d and 10d plot targets. But only CGD's work so
far.
---
 apps/plots.py                                  |  6 ++++--
 cmake/make_plot_target.cmake                   | 18 ++++++++++--------
 .../conjugate_gradient_descent/CMakeLists.txt  |  3 ++-
 .../optimizers/gradient_descent/CMakeLists.txt |  3 ++-
 .../optimizers/nelder_mead/CMakeLists.txt      |  3 ++-
 5 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/apps/plots.py b/apps/plots.py
index 777ffd2..277cd65 100644
--- a/apps/plots.py
+++ b/apps/plots.py
@@ -48,11 +48,13 @@ def add_points(fig, ax, points):
     ax.plot(x, y, 'k.')
     return fig, ax
 
-# points is a list of numpy arrays of dim n x 2
+# polygons is a list of numpy arrays, for which each row gives a vertex
 def add_polygons(fig, ax, polygons):
     for polygon in polygons:
-        p = mpl.patches.Polygon(polygon, True, fill=False, color="black", zorder=2)
+        # only plot first two dims
+        p = mpl.patches.Polygon(polygon[:,0:2], True, fill=False, color="black", zorder=2)
         ax.add_patch(p)
+        # theoretically patch collections could be more efficient
         #p = PatchCollection(patches, alpha=0.4)
         #ax.add_collection(p)
     return fig, ax
diff --git a/cmake/make_plot_target.cmake b/cmake/make_plot_target.cmake
index 3c58735..5c0ea60 100644
--- a/cmake/make_plot_target.cmake
+++ b/cmake/make_plot_target.cmake
@@ -1,22 +1,24 @@
 # TODO Enable arguments to be passed to the C++ executable
-function(make_plot_target TARGET)
+function(make_plot_target TARGET ID)
+    message(${ID})
+    cmake_parse_arguments(PLOT "" "" "ARGS" ${ARGN})
     if (VISUALIZE)
         add_custom_command(
-            OUTPUT ${TARGET}_log.json ${TARGET}_vis.json
-            COMMAND ${TARGET} ${TARGET}_log.json ${TARGET}_vis.json
+            OUTPUT ${TARGET}_log_${ID}.json ${TARGET}_vis_${ID}.json
+            COMMAND ${TARGET} ${TARGET}_log_${ID}.json ${TARGET}_vis_${ID}.json ${PLOT_ARGS}
             WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
             DEPENDS ${TARGET}
         )
 
         add_custom_command(
-            OUTPUT ${TARGET}_plot.pdf
-            COMMAND python3 ${CMAKE_SOURCE_DIR}/apps/plots.py ${TARGET}_vis.json ${TARGET}_plot.pdf
+            OUTPUT ${TARGET}_plot_${ID}.pdf
+            COMMAND python3 ${CMAKE_SOURCE_DIR}/apps/plots.py ${TARGET}_vis_${ID}.json ${TARGET}_plot_${ID}.pdf
             WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-            DEPENDS ${CMAKE_SOURCE_DIR}/apps/plots.py ${TARGET}_vis.json 
+            DEPENDS ${CMAKE_SOURCE_DIR}/apps/plots.py ${TARGET}_vis_${ID}.json
         )
 
-        add_custom_target(${TARGET}_plot
-            DEPENDS ${TARGET}_plot.pdf
+        add_custom_target(${TARGET}_plot_${ID}
+            DEPENDS ${TARGET}_plot_${ID}.pdf
         )
     endif()
 endfunction()
diff --git a/optimization/optimizers/conjugate_gradient_descent/CMakeLists.txt b/optimization/optimizers/conjugate_gradient_descent/CMakeLists.txt
index 85359f4..273708d 100644
--- a/optimization/optimizers/conjugate_gradient_descent/CMakeLists.txt
+++ b/optimization/optimizers/conjugate_gradient_descent/CMakeLists.txt
@@ -3,5 +3,6 @@ if (VISUALIZE)
         main.cpp
     )
     target_link_libraries(conjugate_gradient_descent optimization_lib clara)
-    make_plot_target(conjugate_gradient_descent)
+    make_plot_target(conjugate_gradient_descent 2d ARGS -d 2)
+    make_plot_target(conjugate_gradient_descent 10d ARGS -d 10)
 endif()
diff --git a/optimization/optimizers/gradient_descent/CMakeLists.txt b/optimization/optimizers/gradient_descent/CMakeLists.txt
index cf64b2f..e66c143 100644
--- a/optimization/optimizers/gradient_descent/CMakeLists.txt
+++ b/optimization/optimizers/gradient_descent/CMakeLists.txt
@@ -3,5 +3,6 @@ if (VISUALIZE)
         main.cpp
     )
     target_link_libraries(gradient_descent optimization_lib clara)
-    make_plot_target(gradient_descent)
+    make_plot_target(gradient_descent 2d ARGS -d 2)
+    make_plot_target(gradient_descent 10d ARGS -d 10)
 endif()
diff --git a/optimization/optimizers/nelder_mead/CMakeLists.txt b/optimization/optimizers/nelder_mead/CMakeLists.txt
index feb0408..e057569 100644
--- a/optimization/optimizers/nelder_mead/CMakeLists.txt
+++ b/optimization/optimizers/nelder_mead/CMakeLists.txt
@@ -3,5 +3,6 @@ if (VISUALIZE)
         main.cpp
     )
     target_link_libraries(nelder_mead optimization_lib clara)
-    make_plot_target(nelder_mead)
+    make_plot_target(nelder_mead 2d ARGS -d 2)
+    make_plot_target(nelder_mead 10d ARGS -d 10)
 endif()
-- 
GitLab