diff --git a/experiments/SIAM/xp_0_balls/make_fig_paper.sh b/experiments/SIAM/xp_0_balls/make_fig_paper.sh deleted file mode 100755 index 02554698e3ce2952dc11b52195654208a26351f2..0000000000000000000000000000000000000000 --- a/experiments/SIAM/xp_0_balls/make_fig_paper.sh +++ /dev/null @@ -1,3 +0,0 @@ -python xp_a_accuracy_sol.py --id SIAM -python xp_b_screening.py --id SIAM -python xp_c_viz_paper.py --id SIAM \ No newline at end of file diff --git a/experiments/SIAM/xp_0_balls/process_data.py b/experiments/SIAM/xp_0_balls/process_data.py deleted file mode 100644 index d8a4f63bcd5db7e8f43f704e9275d0e1713c2dd9..0000000000000000000000000000000000000000 --- a/experiments/SIAM/xp_0_balls/process_data.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -import numpy as np - -from xps.SIAM.setup import Setup -from xps.SIAM.xp_1_balls import xpparams - - -def process(setup, log=True): - - # ---- load ---- - solutions_filename = f"results/xp_setup{setup.setup_id}.npz" - solutions = np.load(solutions_filename, allow_pickle=True) - - screenings_filename = f"results/xp_setup{setup.setup_id}_screening.npz" - screenings = np.load(screenings_filename, allow_pickle=True) - - # mat_results_gap[1, i_dic, i_seq, rep, i_ratio] - mat_pvopt = solutions["mat_pvopt"] - - mat_nb_zero_detected = screenings['mat_nb_zero_detected'] - nb_test = mat_nb_zero_detected.shape[0] - list_tests = screenings["list_test"] - - # ---- log ---- - if log: - print("Experiment info") - # print(f"- run with version {solutions["version"]}") - print(f"- setup{setup.setup_id}") - print("") - - # ---- processing ---- - mat_pc_detected =np.zeros( - (nb_test, xpparams.nb_point, setup.nb_dic, setup.nb_sequence, setup.nb_ratio_lbd, setup.n_rep) - ) - - for i_dic in range(setup.nb_dic): - for i_seq in range(setup.nb_sequence): - for i_ratio in range(setup.nb_ratio_lbd): - for rep in range(setup.n_rep): - - nb_0 = np.sum(mat_pvopt[i_dic, i_seq, i_ratio, rep, :] == 0) - if nb_0 > 0: - mat_detected = mat_nb_zero_detected[:, :, i_dic, i_seq, i_ratio, rep] - mat_pc_detected[:, :, i_dic, i_seq, i_ratio, rep] = mat_detected / float(nb_0) - - - # ---- return ---- - return { - "mat_pc_detected": np.mean(mat_pc_detected, axis=5), - "list_tests": list_tests, - } - - # { - # "results_mat_nb": results_mat_nb, - # "results_mat_nbz": results_mat_nbz, - # } \ No newline at end of file diff --git a/experiments/SIAM/xp_0_balls/xp_a_accuracy_sol.py b/experiments/SIAM/xp_0_balls/xp_a_accuracy_sol.py deleted file mode 100755 index 795f54c63ff5a06c82c943601181c990126022c4..0000000000000000000000000000000000000000 --- a/experiments/SIAM/xp_0_balls/xp_a_accuracy_sol.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -import time, argparse, sys - -import numpy as np - -# Algorithm import -from src import __version__ -from src.solver.parameters import SlopeParameters, EnumLipchitzOptions -from src.solver.slope import primal_func, dual_func, slope_gp - -# Generative models -from src.utils import get_lambda_max, gamma_sequence_generator -from src.dictionaries import generate_dic - -# Screening -from src.screening.gap_test_all import GapTestAll - -# XP import -from experiments.SIAM.slopepb import SlopePb -from experiments.SIAM.setup import Setup -from experiments.SIAM.xp_1_balls import xpparams - -parser=argparse.ArgumentParser() -parser.add_argument('--erase', help='erase existing results', action="store_true") -parser.add_argument('--id', help='setup id', type=str) -args=parser.parse_args() - - -# ------------------------- -# Load Setup -# ------------------------- - -setup = Setup(args.id) -out_file_name = f"results/xp_setup{args.id}.npz" - -mat_seed = np.random.randint( - 0, 2**32-1, - size=(setup.nb_dic, setup.nb_sequence, setup.n_rep), -) - -mat_pvopt = np.zeros( - (setup.nb_dic, setup.nb_sequence, setup.nb_ratio_lbd, setup.n_rep, setup.n) -) - -mat_dvopt = np.zeros( - (setup.nb_dic, setup.nb_sequence, setup.nb_ratio_lbd, setup.n_rep, setup.m) -) - - -try: - if args.erase: - raise FileNotFoundError - - # Try to load existing results - load_results = np.load(out_file_name, allow_pickle=True) - mat_seed = load_results["mat_seed"] - mat_pvopt = load_results["mat_pvopt"] - mat_dvopt = load_results["mat_dvopt"] - -except FileNotFoundError: - pass - - -# ------------------------- -# Xp -# ------------------------- - -# For each trial -# 1. Compute high accuracy solution -# 2. Create ideal safe ball -# 3. increase radius - -nb_xp = setup.nb_dic * setup.n_rep * setup.nb_sequence * setup.nb_ratio_lbd -i_xp = 0 -for i_dic in range(setup.nb_dic): - for i_seq, seq in enumerate(setup.list_sequence): - for rep in range(setup.n_rep): - - np.random.seed(mat_seed[i_dic, i_seq, rep]) - - # ---- 1. Gen data ---- - matA = generate_dic( - setup.list_dic[i_dic], - setup.m, - setup.n, - setup.normalize - ) - - lip = np.linalg.norm(matA, ord=2)**2 - vecy = np.random.randn(setup.m) - vecy /= np.linalg.norm(vecy, 2) - - - # ---- 2. Compute parameters ---- - vec_gammas = gamma_sequence_generator( - setup.m, - setup.n, - setup.list_sequence[i_seq][0], - setup.list_sequence[i_seq][1:] - ) - - lbd_max = get_lambda_max(vecy, matA, vec_gammas) - - - # ---- 3. XP ---- - for i_ratio, ratio in enumerate(setup.list_ratio_lbd): - i_xp += 1 - - slopePb = SlopePb(matA, vecy, vec_gammas, ratio, lbdmax=lbd_max) - vecx_hat = mat_pvopt[i_dic, i_seq, i_ratio, rep, :] - vecu_hat = mat_dvopt[i_dic, i_seq, i_ratio, rep, :] - - gap = slopePb.eval_gap(vecx_hat, vecu_hat) - print(f"xp {i_xp} / {nb_xp} --- (gap={gap})") - - if (gap > xpparams.stopping_gap): - gap_old = gap - - # ---- 3a. Find solution ---- - params = SlopeParameters() - params.vecx_init = np.copy(vecx_hat) - params.lipchitz_constant = lip - params.lipchitz_update = EnumLipchitzOptions.EXACT - params.max_it = 1e7 - params.gap_stopping = xpparams.stopping_gap - params.time_stopping = np.inf - params.screening1 = GapTestAll(vec_gammas) - params.eval_gap = True - params.eval_gap_it = setup.eval_gap_it - params.accelerated = False - params.verbose = False - - out_slope = slope_gp(vecy, matA, ratio * lbd_max, vec_gammas, params) - - dv = vecy - matA @ out_slope["sol"] - dv = slopePb.make_dual_scaling(dv) - gap = slopePb.eval_gap(out_slope["sol"], dv) - - if gap <= gap_old: - mat_pvopt[i_dic, i_seq, i_ratio, rep, :] = out_slope["sol"] - mat_dvopt[i_dic, i_seq, i_ratio, rep, :] = dv - - # Save - np.savez(out_file_name, - mat_seed=mat_seed, - mat_pvopt=mat_pvopt, - mat_dvopt=mat_dvopt, - version = __version__, - allow_pickle=True - ) - - # if i_xp ==3: - # exit() \ No newline at end of file diff --git a/experiments/SIAM/xp_0_balls/xp_b_screening.py b/experiments/SIAM/xp_0_balls/xp_b_screening.py deleted file mode 100644 index d9b65cda52ceb40369447f0aeec104e71512f500..0000000000000000000000000000000000000000 --- a/experiments/SIAM/xp_0_balls/xp_b_screening.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -import argparse - -import numpy as np - -# Algorithm import -from src import __version__ -from src.dictionaries import generate_dic -from src.utils import get_lambda_max, gamma_sequence_generator - -# Screening -from src.screening.gap_test_p_1 import GapTestPequalOne -from src.screening.gap_test_p_q import GapTestPequalQ -from src.screening.gap_test_all import GapTestAll - -# XP import -from experiments.SIAM.slopepb import SlopePb -from experiments.SIAM.setup import Setup -from experiments.SIAM.xp_1_balls import xpparams - - -parser=argparse.ArgumentParser() -parser.add_argument('--id', help='setup id', type=str, default=1) -args=parser.parse_args() - -# ------------------------- -# Load Setup -# ------------------------- - -setup = Setup(args.id) -solutions_filename = f"results/xp_setup{args.id}.npz" - -try: - # Try to load existing results - load_results = np.load(solutions_filename, allow_pickle=True) - mat_seed = load_results["mat_seed"] - mat_pvopt = load_results["mat_pvopt"] - mat_dvopt = load_results["mat_dvopt"] - -except FileNotFoundError: - print("No result found") - sys.exit(1) - - -# ------------------------- -# Screening Xp -# ------------------------- - -# percentage of detected zero -mat_nb_zero_detected = np.full( - (3, xpparams.nb_point, setup.nb_dic, setup.nb_sequence, setup.nb_ratio_lbd, setup.n_rep), - np.nan, - dtype=int -) -screening_filename = f"results/xp_setup{args.id}_screening.npz" - -i_xp = 0 -nb_xp = setup.nb_dic * setup.n_rep * setup.nb_sequence * setup.nb_ratio_lbd -for i_dic in range(setup.nb_dic): - for i_seq, seq in enumerate(setup.list_sequence): - for rep in range(setup.n_rep): - - np.random.seed(mat_seed[i_dic, i_seq, rep]) - - # ---- 1. Gen data ---- - matA = generate_dic( - setup.list_dic[i_dic], - setup.m, - setup.n, - setup.normalize - ) - - vecy = np.random.randn(setup.m) - vecy /= np.linalg.norm(vecy) - - - # ---- 2. Compute parameters ---- - vec_gammas = gamma_sequence_generator( - setup.m, - setup.n, - setup.list_sequence[i_seq][0], - setup.list_sequence[i_seq][1:] - ) - - lbd_max = get_lambda_max(vecy, matA, vec_gammas) - - # ---- 3. XP ---- - for i_ratio, ratio in enumerate(setup.list_ratio_lbd): - i_xp += 1 - print(f"xp {i_xp} / {nb_xp}") - - slopePb = SlopePb(matA, vecy, vec_gammas, ratio, lbdmax=lbd_max) - vecx_hat = mat_pvopt[i_dic, i_seq, i_ratio, rep, :] - vecu_hat = mat_dvopt[i_dic, i_seq, i_ratio, rep, :] - gap = slopePb.eval_gap(vecx_hat, vecu_hat) - Atu = matA.T @ vecu_hat - - # ---- 3b. Build thin safe ball ---- - rgap = np.sqrt(2 * gap) - - # ---- 3c. Testing sphere ---- - list_tests = [ - GapTestPequalQ(), - GapTestAll(vec_gammas), - GapTestPequalOne(vec_gammas, np.arange(setup.n, dtype=np.double)), - ] - - - for i_offset, offset in enumerate(xpparams.vec_offsets): - for i_test, test in enumerate(list_tests): - out = test.apply_test(np.abs(Atu), gap, ratio * lbd_max, vec_gammas, offset_radius=offset) - mat_nb_zero_detected[i_test, i_offset, i_dic, i_seq, i_ratio, rep] = np.sum(out) - - - # Save - np.savez( - screening_filename, - mat_nb_zero_detected=mat_nb_zero_detected, - list_test = [test.get_name() for test in list_tests], - version = __version__, - allow_pickle=True - ) \ No newline at end of file diff --git a/experiments/SIAM/xp_0_balls/xp_c_viz_paper.py b/experiments/SIAM/xp_0_balls/xp_c_viz_paper.py deleted file mode 100644 index 8ecde14a22a13d95982d5beb4790ef894fe2cd31..0000000000000000000000000000000000000000 --- a/experiments/SIAM/xp_0_balls/xp_c_viz_paper.py +++ /dev/null @@ -1,139 +0,0 @@ -# -*- coding: utf-8 -*- -from decimal import Decimal -import json, argparse - -import numpy as np - -# XP import -from xps.SIAM.slopepb import SlopePb -from xps.SIAM.setup import Setup -from xps.SIAM.xp_1_balls import xpparams -from xps.SIAM.xp_1_balls.process_data import process - - -parser=argparse.ArgumentParser() -parser.add_argument('--noshow', help='do not display figures', action="store_true") -parser.add_argument('--save', help='save figure', action="store_true") -parser.add_argument('--id', help='setup id', type=str, default="SIAM") -parser.add_argument('--i_seq', type=int, default=0) -args=parser.parse_args() - -import matplotlib -if args.noshow: - matplotlib.use('PS') -else: - matplotlib.use("TkAgg") - -import matplotlib.pyplot as plt -from matplotlib.legend_handler import HandlerBase -import matplotlib.font_manager as font_manager - -# ------------------------- -# Font stuff -# ------------------------- - -fs = 20 - -font_math = font_manager.FontProperties( - fname='../fonts/cmunrm.ttf', - # weight='normal', - # style='normal', - math_fontfamily="cm", - size=fs+2 -) - -font_text = font_manager.FontProperties( - fname='../fonts/cmunrm.ttf', - # weight='normal', - # style='normal', - math_fontfamily="cm", - size=fs+2 -) - -font_ttt = font_manager.FontProperties( - # fname='../fonts/ectt1000.ttf', - fname='../fonts/computer-modern/cmuntt.ttf', - weight='bold', - style='normal', - size=fs -) - - -# ------------------------- -# Load Results -# ------------------------- - - -setup_oscar = Setup(args.id) -dic_process_oscar = process(setup_oscar) - -mat_pc_detected_oscar = dic_process_oscar["mat_pc_detected"] -list_tests_oscar = dic_process_oscar["list_tests"] - - - -# ------------------------- -# Plot Results -# ------------------------- - -i_dic = 2 -i_lbd = 1 - -fs=22 -fs_ylabels = 20 -list_colors = ["tab:blue", "tab:orange", "tab:green"] -list_legends = ["$p_q=q\\;\\forall q$", "all", "$p_q=1\\;\\forall q$"] -# "best $r_q \\;\\forall q$ " - -print("printing xp_0_ball parameters with") -print(f"- {setup_oscar.list_dic[i_dic]} dictionary") -print(f"- lbd / lbd_max = {setup_oscar.list_ratio_lbd[i_lbd]}") - - -f, ax = plt.subplots(1, 1, figsize=(.7*16, .6*9), sharex=True, sharey=True) - -# ax.set_title(f"OSCAR-{i_seq+1}", fontsize=fs+2) -ax.set_xlabel( - r"$R$", - fontsize=fs+2, - fontproperties=font_math, -) -ax.set_ylabel( - "% of zero entries detected", - fontsize=fs+2, - fontproperties=font_text -) - -for tick in ax.xaxis.get_major_ticks(): - tick.label.set_fontproperties(font_math) - tick.label.set_fontsize(20) - -for tick in ax.yaxis.get_major_ticks(): - tick.label.set_fontproperties(font_math) - tick.label.set_fontsize(20) - -for i_test in [2, 0, 1]: - ax.plot( - xpparams.vec_offsets, - 100 * mat_pc_detected_oscar[i_test, :, i_dic, args.i_seq, i_lbd], - label = list_legends[i_test], - linewidth=4., - alpha=.9, - color=list_colors[i_test] - ) - -ax.legend( - fontsize=fs-2, - prop=font_math -) - -ax.set_xscale("log") -ax.set_xlim([1e-6, 1e0]) -ax.set_ylim([-2, 102]) - -if args.save: - filename = f"figs/xp_illustration_screening{args.i_seq}.eps" - plt.savefig(filename, bbox_inches='tight') - -if not args.noshow: - plt.show() \ No newline at end of file diff --git a/experiments/SIAM/xp_1_balls/launcher.sh b/experiments/SIAM/xp_1_balls/launcher.sh index 31fa66dcf699cf03d476027d3c8b87069e47d2d3..4242a301059084f7d0d9bb90cf6712aad01ac08c 100755 --- a/experiments/SIAM/xp_1_balls/launcher.sh +++ b/experiments/SIAM/xp_1_balls/launcher.sh @@ -1,4 +1,4 @@ -python xp_a_accuracy_sol.py --id 1a -python xp_b_screening.py --id 1a -python xp_c_viz_fig1.py --noshow --save -python xp_c_viz_fig2.py --noshow --save \ No newline at end of file +python xp_a_accuracy_sol.py --id SIAM +python xp_b_screening.py --id SIAM +python xp_c_viz_fig1.py --id SIAM --save +python xp_c_viz_fig2.py --id SIAM --save \ No newline at end of file diff --git a/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py b/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py index 9a6acb08e18ed2e7dcbfedf912cf6ef16152bdcf..aba672152b0748d34dac1801371003b7df92667d 100755 --- a/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py +++ b/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import time, argparse, sys +from pathlib import Path import numpy as np @@ -33,6 +34,7 @@ args=parser.parse_args() # ------------------------- setup = Setup(args.id) +Path("results").mkdir(parents=True, exist_ok=True) out_file_name = f"results/xp_setup{args.id}.npz" mat_seed = np.random.randint( diff --git a/experiments/SIAM/xp_1_balls/xp_c_viz_fig1.py b/experiments/SIAM/xp_1_balls/xp_c_viz_fig1.py index 00c45b70f8001c45e0c3c6e61dd54a54f11c4ccf..bb124daf3745c1e20aa64a44b957f701c06570d9 100644 --- a/experiments/SIAM/xp_1_balls/xp_c_viz_fig1.py +++ b/experiments/SIAM/xp_1_balls/xp_c_viz_fig1.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import argparse +from pathlib import Path import numpy as np @@ -132,7 +133,10 @@ ax.set_xlim([1e-6, 1e0]) ax.set_ylim([-2, 102]) if args.save: - filename = f"figs/xp_illustration_screening{args.i_seq}.eps" + folderfig = "figs" + Path(folderfig).mkdir(parents=True, exist_ok=True) + + filename = folderfig + f"/xp_illustration_screening{args.i_seq}.eps" plt.savefig(filename, bbox_inches='tight') if not args.noshow: diff --git a/experiments/SIAM/xp_1_balls/xp_c_viz_fig2.py b/experiments/SIAM/xp_1_balls/xp_c_viz_fig2.py index 1048707222072ac1ba54d7c53d376077006195e4..dfcf0c1475082a9f9b7e8123bb899ea5df4630dd 100644 --- a/experiments/SIAM/xp_1_balls/xp_c_viz_fig2.py +++ b/experiments/SIAM/xp_1_balls/xp_c_viz_fig2.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import argparse +from pathlib import Path import numpy as np @@ -170,6 +171,9 @@ for i_seq in range(3): # exit() if args.save: - filename = f"figs/xp0_{setup_oscar.list_dic[i_dic]}.eps" + folderfig = "figs" + Path(folderfig).mkdir(parents=True, exist_ok=True) + + filename = folderfig + f"/xp0_{setup_oscar.list_dic[i_dic]}.eps" # plt.rcParams['pdf.fonttype'] = 42 plt.savefig(filename, bbox_inches='tight')