diff --git a/main.cpp b/main.cpp
index 8d236ed0ef97979ecc818f16cfbe860fd1e10696..15b85f18d5d59de10d691d006f46e314ac3dac50 100644
--- a/main.cpp
+++ b/main.cpp
@@ -119,7 +119,7 @@ int main() {
     Vector subset_differences = subset_sample_values - subset_recovered_sample_values;
     Scalar loss = subset_differences.squaredNorm();
     Vector gradient = -2 * subset_dct_matrix * subset_differences;
-    constexpr Scalar learning_rate = 0.1;
+    Scalar learning_rate = 0.1;
     while (loss > 1e-6) {
         recovered_dct -= learning_rate * gradient;
         recovered_sample_values = dct_matrix.transpose() * recovered_dct;
@@ -157,22 +157,46 @@ int main() {
     subset_recovered_sample_values = vector_subset(recovered_sample_values, subset_indices);
     subset_differences = subset_sample_values - subset_recovered_sample_values;
     loss = subset_differences.squaredNorm() + recovered_dct.cwiseAbs().sum();
-    gradient = -2 * subset_dct_matrix * subset_differences
-        + (recovered_dct.array() / recovered_dct.cwiseAbs().array()).matrix();
+    gradient = -2 * subset_dct_matrix * subset_differences;
+    for (uint32_t i = 0; i < n_samples; ++i) {
+        if (std::abs(recovered_dct[i]) > 1e-3) {
+            gradient[i] += (recovered_dct[i] > 0) ? 1 : -1;
+        }
+    }
     Scalar last_loss = std::numeric_limits<Scalar>::infinity();
-    Scalar relative_change = (loss - last_loss) / loss;
-    while (relative_change > 1e-6) {
+    Scalar relative_change = std::abs(loss - last_loss) / loss;
+    learning_rate = 0.1;
+    uint32_t count = 0;
+    while (relative_change > 1e-9) {
         recovered_dct -= learning_rate * gradient;
         recovered_sample_values = dct_matrix.transpose() * recovered_dct;
         subset_recovered_sample_values = vector_subset(recovered_sample_values, subset_indices);
         subset_differences = subset_sample_values - subset_recovered_sample_values;
+        last_loss = loss;
         loss = subset_differences.squaredNorm() + recovered_dct.cwiseAbs().sum();
-        gradient = -2 * subset_dct_matrix * subset_differences
-            + (recovered_dct.array() / recovered_dct.cwiseAbs().array()).matrix();
-        last_loss = std::numeric_limits<Scalar>::infinity();
-        relative_change = (loss - last_loss) / loss;
-        //std::cout << loss << '\n';
+        gradient = -2 * subset_dct_matrix * subset_differences;
+        for (uint32_t i = 0; i < n_samples; ++i) {
+            if (std::abs(recovered_dct[i]) > 1e-3) {
+                gradient[i] += (recovered_dct[i] > 0) ? 1 : -1;
+            }
+        }
+        relative_change = std::abs(loss - last_loss) / loss;
+        if (count % 64 == 0) {
+            learning_rate *= 0.99;
+            /*
+            std::cout << "loss: " << loss;
+            std::cout << ", learning rate: " << learning_rate;
+            std::cout << ", |grad|^2: " << gradient.squaredNorm();
+            std::cout << '\n';
+            */
+        }
+        if (count > 500000) {
+            break;
+        }
+        ++count;
     }
+    //std::cout << "g iterations: " << count;
+    //std::cout << "g squared gradient norm: " << gradient.squaredNorm();
     Scalar const final_loss_g = loss;
     python_print("dct_g", recovered_dct);
 
diff --git a/plotter.py b/plotter.py
index 7f4575dbe436846dd260cf9a4a8a5cf86ab05b03..2d9e34b2957259206f9f858d7256831a0eec04f8 100644
--- a/plotter.py
+++ b/plotter.py
@@ -9,7 +9,7 @@ subset_sample_times = np.array([0, 8.03213e-05, 0.000200803, 0.000240964, 0.0002
 subset_sample_values = np.array([0, 0.917539, 1.76932, 1.83651, 1.78761, 1.6316, 1.38558, 1.0731, 0.721928, 0.0205522, -0.27594, -0.508314, -0.664077, -0.738727, -0.735864, -0.666533, -0.547871, -0.401193, -0.249706, 0.0236569, 0.00668195, -0.205127, -0.379618, -0.575975, -0.771114, -1.06042, -1.1108, -0.951487, -0.73516, -0.43726, 0.742071, 1.13718, 1.7492, 1.91577, 1.96681, 1.70642, 1.41042, 1.02857, 0.120163, -0.341839, -0.765935, -1.12376, -1.5588, -1.56598, -1.42199, -1.20225, -0.930797, -0.634626, -0.0755387, 0.294754, 0.377636, 0.390584, 0.341783, 0.245913, 0.122481, -0.00631234, -0.117955, -0.19203, -0.212412, -0.169044, -0.0591181, 0.112454, 0.333336, 0.584794, 0.843377, 1.08309, 1.40408, 1.44291, 1.21838, 0.95598, 0.608661, -0.249515, -0.701696, -1.12623, -1.49192, -1.77159, -1.94442, -1.74113, -1.45207, -1.08332, -0.663067, -0.222778, 0.205515, 0.591886, 0.910992, 1.14409, 1.28044, 1.31795, 1.12989, 0.938508, 0.478999, 0.261091, 0.0805585, -0.0466774, -0.11149, -0.112311, -0.0551393, 0.0472029, 0.427974, 0.505792, 0.526522, 0.354329, 0.158647, -0.0988122, -0.400459, -0.722977, -1.03934, -1.32121, -1.54155, -1.71079, -1.63312, -1.44356, -0.771708, -0.33113, 0.14113, 0.6122, 1.04895, 1.42074, 1.70194, 1.87404, 1.86053, 1.41149, 1.06984, 0.686454, 0.291854, -0.0840174, -0.414358, -0.677735, -0.859784, -0.954231, -0.963144, -0.770496, -0.606599, -0.259632, -0.121617, -0.0311657, 0.00112032, -0.247029, -0.408011, -0.575983, -0.727348, -0.838913, -0.890317, -0.866221, -0.75805, -0.565119, -0.295029, 0.0367266, 0.791266, 1.71807, 1.86376, 1.89685, 1.81066, 1.60779, 1.30007, 0.907671, 0.457475, -0.488655, -0.918654, -1.28001, -1.54948, -1.71149, -1.75931, -1.69539, -1.53092, -1.28466, -0.981105, -0.648113, -0.314394, -0.00689592, 0.25156, 0.561694, 0.602629, 0.573475, 0.487607, 0.363754, 0.223933, -0.0715908, -0.0717057, -0.00857246, 0.115302, 0.289952, 0.498828, 0.929905, 1.10238, 1.24743, 1.18842, 1.03264, 0.783761, -0.36236, -0.792506, -1.54017, -1.79994, -1.95375, -1.9006, -1.38735, -0.999124, -0.559002, -0.0988865, 0.348445])
 dct_e = np.array([-0.196094, 1.18936, 0.479573, 0.663146, -0.080901, 0.577832, -0.148233, 1.01453, -0.197465, 2.00114, -0.294051, 2.11453, 0.213071, 6.16016, -0.731251, -4.70639, 0.256332, -1.53081, 0.259213, -0.0554509, -0.415897, 1.23824, -1.31813, 3.16587, 2.08398, -7.2223, -0.677869, -2.43735, -0.0684313, -1.19933, -0.423981, -0.599289, -1.02476, -0.993441, -0.0777809, -0.865453, -0.074759, -0.345011, -0.281427, -0.203953, -0.622912, 0.275884, 0.111848, -0.296558, 0.264995, 0.430286, -0.281935, 0.0723075, -0.307119, -0.364219, 0.0657357, 0.44006, 0.799354, -0.769753, 0.285176, 0.950941, -0.280907, -0.00497288, 0.296292, -0.642131, 0.889798, 1.09052, 0.400533, -0.304707, 0.246949, 0.293316, 0.323294, -0.533684, 0.474883, 0.195358, 0.637553, 0.580914, -0.0442756, -0.0349357, 0.657594, -0.154956, 0.690376, 0.0426053, 0.71097, 0.0513258, 0.60229, -0.234083, 0.0678623, -0.829127, 0.544893, -0.0570755, 0.341786, 0.779736, 0.287186, -0.0968679, 0.556942, 0.120861, 0.0556344, -0.566939, -0.413085, 0.573418, -0.0885655, 0.293251, 0.261079, -0.256654, 0.0575593, 0.94802, -0.54351, -0.436904, -0.961599, 0.230876, 0.0726653, -0.0600418, -0.528705, -0.0715482, 0.457052, 0.823255, -0.345286, -0.327319, -0.0162373, -0.663708, 0.0437903, -0.493872, -0.79755, -0.238856, -0.609117, -0.187032, 0.187882, 0.231953, -0.202489, -0.264078, -0.396135, -0.0454859, -0.0553627, -0.512516, 0.011238, -0.620677, 0.366957, -0.58604, -0.100525, -0.460264, -0.571354, -1.07625, 0.346349, -0.634828, 0.237577, 0.734295, 0.464448, -0.453415, -0.417422, 0.0399954, 0.129525, -0.628497, -1.76705, -0.512841, -0.129151, 1.00282, -0.322279, 0.391106, 0.0401609, 0.404917, 0.467034, -0.025818, -0.80657, 0.084261, -0.907793, -0.502164, 0.370733, -0.148036, -0.417506, 0.504627, -0.511599, 0.576102, 0.806729, 0.434816, -0.288823, 0.564942, -0.1185, -0.422731, -0.0933278, 0.0328392, -0.264447, 0.0941453, 0.974272, -0.557034, 0.394226, 0.210044, 0.757861, -0.577916, -0.0323905, 0.274702, 1.41617, 0.327861, -0.045681, -0.0263465, -0.332338, 0.299948, 0.196235, -0.435646, 0.223145, 0.681411, 0.332371, 0.0769544, 0.441301, 0.259661, 0.270069, -0.0829026, 0.816754, -0.0269315, 1.1196, 0.186495, -0.335414, -0.693516, 0.642428, -1.09616, 0.213204, 0.679919, 0.549171, 0.157623, 1.03292, 1.01379, -0.0463448, 0.347021, -0.017238, -0.628042, -0.532548, 0.770155, 0.0893456, 0.257188, -0.369556, 0.376224, 0.284265, 0.966083, -0.138508, 0.136536, -0.493359, 1.13903, -0.0016658, -0.455193, -0.646744, 0.676872, -0.703003, 0.797936, 0.322608, 0.587281, 0.0820393, 0.584012, -0.96235, -0.145036, -0.153075, -0.230502, -0.460132, 0.722142, 0.810725, -0.216875])
 dct_f = np.array([-0.128202, 0.625785, 0.0201692, 0.398691, 0.144763, 0.490854, 0.0956919, 0.650749, 0.0173706, 0.902481, 0.0810071, 1.23349, -0.134141, 3.10943, -0.307434, -2.28341, 0.0897043, -0.677982, 0.238718, -0.0569493, -0.0625467, 0.678633, -0.399306, 1.59969, 1.07472, -3.58733, -0.175665, -1.22954, -0.073115, -0.642949, -0.32888, -0.293621, -0.33002, -0.461082, -0.0924337, -0.261168, 0.0365576, -0.268522, -0.19366, -0.142064, -0.291814, 0.0633658, 0.0429835, -0.159101, 0.176932, 0.167059, -0.0376179, -0.0163244, -0.290812, -0.133946, 0.118496, 0.265316, 0.117899, -0.380144, 0.0815734, 0.390314, 0.0166088, -0.106858, 0.112289, -0.258428, 0.431392, 0.478348, 0.0876306, -0.154815, -0.061415, 0.150749, 0.0786899, -0.0259306, 0.14254, -0.051765, 0.260549, 0.321238, -0.0298536, -0.236221, 0.109051, -0.151414, 0.289132, 0.0607066, 0.138025, -0.072031, 0.218627, 0.0156062, 0.0406325, -0.520255, 0.247159, -0.154366, 0.206985, 0.16453, 0.157685, -0.293041, 0.0767808, 0.10905, 0.118047, -0.371501, -0.148446, 0.218044, -0.0529188, 0.00374332, 0.0224681, -0.0576681, -0.0306463, 0.257711, -0.0644529, -0.0882774, -0.50266, 0.0187881, 0.00477641, -0.0816121, -0.252274, -0.0786066, 0.261582, 0.330727, -0.0604508, -0.157064, -0.302593, -0.380228, 0.030939, -0.134265, -0.463183, -0.133715, 0.0123524, 0.0958193, 0.094654, 0.0480209, -0.0655042, -0.366965, -0.276783, 0.0918902, -0.0780344, -0.235922, -0.0770751, 0.0460241, 0.260871, -0.24325, 0.0715379, -0.147367, -0.280814, -0.315655, 0.183873, -0.293842, 0.0506389, 0.362196, 0.272027, 0.00189439, -0.285468, 0.298874, 0.0664038, -0.192419, -0.528099, -0.224467, -0.188268, 0.395158, 0.163009, 0.27742, -0.120604, 0.177714, 0.283735, 0.0160217, -0.251383, 0.00552576, -0.316482, -0.116127, 0.239018, 0.120915, 0.00778038, -0.0171491, -0.238564, 0.256053, 0.271199, 0.308677, -0.058214, 0.16632, 0.134117, -0.0719508, 0.00850059, 0.000685789, -0.0666121, 0.0378622, 0.403544, -0.277101, 0.268779, 0.185174, 0.276086, -0.283073, 0.0229385, 0.0953724, 0.561176, 0.0569767, 0.204422, -0.166952, -0.177897, 0.09501, 0.0628256, -0.0611136, -0.0329177, 0.120971, 0.0986958, 0.119868, 0.233474, -0.0227016, -0.145502, -0.117204, 0.208528, -0.151173, 0.524241, 0.0341692, -0.293842, -0.185265, 0.268604, -0.352157, -0.182337, 0.0817727, 0.234098, -0.0181577, 0.296696, 0.350259, -0.0718085, -0.000718198, -0.0585872, -0.234716, -0.332507, 0.26509, -0.0116758, 0.0687702, -0.172702, 0.14437, 0.00131067, 0.172244, -0.0201932, 0.0983488, -0.209788, 0.225785, -0.231219, 0.00300628, -0.292026, 0.0532718, -0.300906, 0.413064, 0.029319, 0.221479, -0.032181, 0.152876, -0.593108, -0.191158, -0.0322509, -0.0192836, -0.291647, 0.530207, 0.395767, -0.078254])
-dct_g = np.array([0.233221, -0.257069, -0.550398, -0.532617, 0.306023, -0.668145, 0.488208, -0.680485, -0.904723, 0.323987, -0.75011, 0.898314, -0.0316391, 0.242091, 0.82805, -0.964111, 0.187091, 0.443743, -0.006836, -0.892611, -0.116735, 0.0383497, 0.543888, -0.869287, -0.114419, 0.95436, -0.0645173, -0.341888, -0.10814, 0.486548, -0.589317, -0.657241, -0.25496, 0.879451, 0.929702, -0.490085, -0.85933, -0.752302, 0.0526757, -0.679834, 0.0354144, -0.78963, 0.683152, -0.262876, -0.152219, -0.345545, 0.427093, 0.153552, 0.743768, 0.516492, 0.673196, 0.399582, -0.22188, 0.870483, 0.211205, -0.275833, 0.0790093, -0.0898552, -0.196616, -0.519119, -0.833829, -0.156843, -0.0552401, -0.420467, -0.790062, -0.567228, 0.604037, 0.0548782, 0.337641, 0.727286, -0.512499, 0.423129, -0.472674, -0.234357, -0.837989, -0.0804745, -0.534266, 0.590705, -0.0173138, -0.993542, -0.467762, 0.329378, -0.149618, -0.626351, 0.926951, -0.731922, 0.591711, 0.892089, -0.65769, 0.212003, -0.872393, -0.305017, -0.415064, 0.0193165, 0.651673, 0.668677, 0.452886, -0.341131, 0.604169, 0.263527, -0.909319, -0.917159, -0.69337, 0.53413, -0.876537, 0.0386064, 0.8583, -0.558969, -0.590874, -0.822015, 0.399382, 0.412923, -0.0107382, -0.476443, 0.423143, -0.243268, -0.598711, -0.534785, -0.127808, -0.061003, 0.722375, 0.954477, -0.110962, -0.931514, 0.0475435, -0.936722, 0.506348, 0.183176, 0.645782, -0.340842, -0.535844, 0.0730565, -0.138763, -0.192838, 0.974649, 0.933819, 0.701061, 0.735028, -0.37679, -0.703219, 0.995197, 0.279047, -0.0638505, 0.863829, 0.381545, 0.630814, 0.0830693, 0.145613, -0.681568, 0.890501, 0.642667, -0.689172, -0.91785, -0.312773, -0.779961, -0.806923, 0.0375465, -0.95519, 0.122967, 0.713752, 0.0338162, 0.349049, 0.47435, 0.396921, -0.954401, -0.616032, 0.341982, -0.308257, -0.867419, -0.718579, 0.842235, -0.556687, -0.239771, 0.172032, -0.665374, -0.947321, 0.382253, 0.524688, 0.427391, -0.845351, 0.179619, 0.851006, 0.859396, -0.139108, 0.0119392, 0.662512, 0.838472, 0.203275, 0.447673, 0.0386733, -0.018366, -0.677161, 0.952231, 0.148721, -0.453498, 0.0628546, 0.397116, 0.334099, -0.805135, 0.0974726, 0.221475, 0.335931, -0.00974932, 0.143165, 0.177776, -0.117374, -0.697566, 0.00454946, 0.462728, -0.936687, -0.896767, 0.0441269, -0.358715, -0.929881, -0.509715, -0.785639, -0.234063, 0.103659, 0.194337, 0.222221, 0.870503, 0.544061, 0.026297, -0.0266377, 0.300255, 0.393991, -0.184925, -0.026301, -0.0404343, 0.4209, 0.0683973, -0.446706, 0.211076, -0.439793, 0.406739, 0.0609791, 0.876508, -0.529195, -0.173012, 0.194952, 0.566005, 0.840505, 0.362982, 0.642355, 0.054826, -0.539461, -0.712632, 0.799042, -0.497156, 0.303029])
+dct_g = np.array([-0.000851391, 0.812182, 0.000717756, 0.809907, 0.000900241, 0.917738, 0.000749033, 1.15795, 0.000835791, 1.62193, 0.000701021, 2.55865, 6.39499e-05, 7.38274, -0.365392, -5.39843, 0.000937966, -0.620037, 0.000923682, -0.000934204, 0.000895766, 0.495184, 0.00083622, 3.64842, 2.27359, -8.35605, -0.000955588, -1.95047, -0.000825429, -0.829454, -0.00106938, -0.350288, -0.000896813, -0.189321, -0.000911419, -0.00462112, -0.000873775, -0.00126141, -0.00107919, -0.00104999, -0.00107941, -0.000960722, -0.000953438, -0.00116742, 0.000703776, -0.000844646, -0.000709299, -0.00103849, -0.00103327, -0.00105577, 0.000816728, -0.000924531, 0.000912414, -0.000874898, 0.000940953, 0.000936466, 0.000865222, -0.000963668, 0.00106016, -0.000786654, 0.000717029, 0.000980539, 0.00101915, -0.000982648, -0.000638853, -0.00100786, 0.000850404, -0.000977216, 0.00101871, -0.000831285, 0.00113269, 0.000652622, 0.0009446, -0.000859014, 0.00107991, -0.000778459, 0.00117572, -0.000988392, 0.0009614, -0.000953972, 0.000926992, -0.00103274, 0.000765707, -0.000924638, 0.000716508, -0.000808706, 0.000975015, -0.000867629, 0.00106449, -0.000869952, 0.000982544, -0.000874038, 0.000671562, -0.000981684, -0.000983644, 0.000852325, 0.000788513, -0.000862389, -0.000644516, -0.000930621, -0.000946701, -0.000833687, -0.000897757, -0.000885385, -0.000814795, -0.00110544, -0.000823527, -0.00103523, -0.000921799, -0.000902532, -0.000931668, 0.00076057, -0.000907159, -0.000997527, -0.000959691, -0.000887081, -0.00082766, -0.000906316, -0.000733922, -0.00082827, -0.000847044, -0.00103147, 0.000702726, -0.000927271, -0.000970154, -0.00111192, -0.000989683, -0.000733875, -0.000737839, -0.000798997, -0.00071557, -0.000775354, -0.000683331, -0.000879843, -0.000691919, -0.000784618, -0.000841537, -0.000992862, -0.000956877, -0.000677055, 0.000660592, 0.00080709, 0.000883074, 0.000770463, -0.000759243, -0.000866693, -0.00072857, -0.00108437, -0.000975323, -0.000774906, -0.000801349, 0.000870644, 0.000922241, 0.000802996, 0.000739285, 0.000722587, 0.000839007, 0.000801986, -0.000738018, 0.000899697, -0.00101084, 0.000739463, -0.000942127, 0.000879426, -0.000693701, -0.000626707, 0.000937644, 0.000771342, 0.000940338, 0.000805688, 0.000846179, 0.000644826, 0.000744126, -0.00092446, 0.00102083, 0.000952457, 0.000844855, -0.000970845, 0.000877286, 0.000951266, 0.000780698, 0.000927065, 0.0010894, -0.000838937, 0.000762118, 0.000853707, 0.000941357, -0.000809598, 0.00102197, -0.000704607, -0.000717992, -0.00069311, 0.00101798, -0.00103429, 0.000993027, -0.000965518, 0.00102058, 0.00106333, 0.000930496, 0.000637145, 0.000878801, -0.000991114, 0.00108496, 0.000818405, 0.00100599, -0.000930881, -0.000817473, -0.000823709, -0.00067736, -0.000810699, -0.00068407, -0.000651194, 0.000808338, 0.000888656, 0.000995602, 0.000928179, 0.000865867, -0.000714207, -0.000808991, -0.000698807, -0.000799164, 0.000679106, -0.00102976, 0.000760702, -0.000759948, 0.000982899, -0.00076065, 0.000731775, -0.000939647, 0.000925197, -0.00111515, 0.000815017, -0.00107993, 0.000728991, -0.000841825, 0.000984775, -0.000831179, 0.000979764, -0.000847649, 0.000929749, -0.000829043, 0.000653262, -0.00104896, 0.000727772, -0.000965807, 0.000978599, -0.0010083, 0.000744049, 0.000959018, 0.000969082])
 
 if __name__ == "__main__":
     # Part (a)